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);
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 // 接口描述符
{
} __attribute__ ((packed));
struct usb_host_endpoint //接口包含的端点
{
struct usb_endpoint_descriptor desc;//端点描述符
}
struct usb_endpoint_descriptor //端点描述符
{
__u8
bLength;
__u8
bDescriptorType;
__u8
bRefresh;
__u8
bSynchAddress;
} __attribute__ ((packed));