usb5-usb设备驱动

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));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值