您的位置:首页 > 其它

usb5-usb设备驱动

2013-09-06 11:31 267 查看
原创kylin_zeng: http://blog.sina.com.cn/u/2312748742

usb驱动程序:做host的,usb设备驱动:
一、利用usb_register 来注册usb驱动:
static inline int usb_register(struct usb_driver
*driver);

linux内核中,使用struct usb_driver结构来描述usb驱动
struct usb_driver
{
const char *name; //驱动程序名

 
int (*probe)(struct usb_interface *intf,const strct
usb_device_id *id);
void (*disconnect)(struct usb_interface *intf);
const struct usb_device_id *id_table;
}

struct usb_device_id  //可以代表一个设备或者一类设备。
{
_u16 match_flags;
_u16 idVendor;//制造商id
_u16 idProduct;//产品id
_u16 bcdDevice_Io;
_u16 bcdDevice_hi;
_u8   b_DeviceClass ;
_u8 b_DeviceSubClass;
_u8 b_DeviceProtocol;
_u8 bInterfaceClass;
_u8 bInterfaceSubClass;
_u8 bInterfaceProtocol;
kernel_ulong_t driver_info;
}

1)用USB_DEVICE来定义一种usb设备的:USB_DEVICE(vend,prod);
    例如 usb ov511摄像头:
    #define VEND_OMNIVISION
0x05a9
    #define PROD_OV511
   
 0x0511
   
USB_DEVICE(VEND_OMNIVISION,PROD_OV511)
    
    

2)用USB_INTERFACE_INFO来协助定义一类usb设备。USB_INTERFACE_INFO(cl,sc,pr);
cl:binterfaceclass value
sc: binterfaceSubClass value
pr: binterfaceProtocol value

二、设备描述符
1)
用struct usb_device 来描述一个usb设备。
struct usb_device
{
int devnum; //usb 设备号
char devpath[16];//设备id字符串
enum usb_device_state state; //设备状态;未连接,已配置
enum usb_device_speed speed; //高速,全速,低速。
........
struct usb_device_descriptor descriptor; //usb设备描述符
struct usb_host_config *config;
........
char *product; //产品名
char *manufacturer; //厂商
char *serial; //设备串号
}

用struct usb_device_descriptor
对应usb描述符中的设备描述符,这个是根据usb协议来定的。
struct usb_device_descriptor 
{
_u8 blength;
_u8 bDescriptorType;
_le16 bcdUSB;
_u8 bDeviceClass;
_u8 b_DeviceSubClass;
_u8 b_DeviceProtocol;
_u8 bMaxPacketSize0;
_le16 idVendor;
_le16 idProduct;
_le16 bcdDevice;
_u8 iManufacturer;
_u8 iProduct;
_u8 iSerialNumber;
_u8 bNumConfigurations;
}_attribute_((packed));//按字节对齐;

2)
用struct usb_host_config来描述usb配置
struct usb_host_config
{
struct usb_config_descriptor desc;//配置描述符
char *string; //配置字符串(如果存在)
......
struct usb_interface* interface[USB_MAXINTERFACES];

}
struct usb_config_descriptor //描述一个配置描述符
{
_u8 bLength;
_u8 bDecriptorType;
_le16 wtolallength;
_u8 bNuminterfaces;
_u8 bconfigurationValue;
_u8 iConfiguration;
_u8 bmAttibutes;
_u8 bMaxPower;
}_attribute_((packed));

struct usb_interface //来描述usb接口
{
struct usb_host_interface *altsetting;//接口设置数值
struct usb_host_interface *cur_altsetting;//当前设置
unsigned num_altsetting;//设置数
}

配置VS设置?
一个配置包含一个或多个接口,一个接口包含一个或多个设置。
如:一个手机可以有多种配置。可以作为电话,u盘等。这属于不同的配置。
而在电话这个配置里在通话场景中又有室外模式,会议模式等。每种模式都是一个设置。
struct usb_host_interface//接口设置
{
struct usb_interface_descriptor desc;// 接口描述符
struct usb_host_endpoint *endpoint;//接口包含的端点

}

struct usb_interface_descriptor // 接口描述符
{
 __u8  bLength;
//描述符的size
 __u8  bDescriptorType;
//描述符的类型

 __u8
 bInterfaceNumber;//接口号
 __u8
 bAlternateSetting;//用与选择接口的设置
 __u8  bNumEndpoints;
//本接口对应的端口的数量
 __u8
 bInterfaceClass;//指明本接口属于哪一个类
 __u8
 bInterfaceSubClass;//根据bInterfaceClass确定
 __u8
 bInterfaceProtocol;//协议码
 __u8
 iInterface;//字符串描述符中本接口描述符的索引
} __attribute__ ((packed));

struct usb_host_endpoint //接口包含的端点
{
struct usb_endpoint_descriptor desc;//端点描述符
  struct  list_head
urb_list;//urb
}

struct usb_endpoint_descriptor //端点描述符
{
__u8  bLength; 
__u8
 bDescriptorType; 
  __u8
 bEndpointAddress; 
  __u8
 bmAttributes; 
  __le16
wMaxPacketSize; 
  __u8  bInterval;
__u8  bRefresh; 
__u8  bSynchAddress; 

} __attribute__ ((packed));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: