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));
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));
相关文章推荐
- 和菜鸟一起学linux总线驱动之初识USB设备枚举
- 《Linux总线、设备与驱动》USBHID设备驱动
- Linux设备驱动之usb设备驱动详解
- USB设备驱动(1.2)——软件结构
- Linux USB 驱动开发(一)—— USB设备基础概念
- Linux硬件驱动:USB设备驱动开发篇
- winusb —— 不再为你的usb设备编写驱动
- usb转rs232驱动无效,已经电脑自动扫描检测硬件改动.设备无法运行错误代码10
- USB设备驱动开发-USB协议相关
- Linux下的硬件驱动——USB设备(上)(转)
- USB 设备驱动开发之几个重要结构体分析
- 《Linux4.0设备驱动开发详解》笔记--第十六章:USB主机、设备与Gadget驱动
- USB gadget设备驱动解析(3)
- Linux下USB Core的工作原理及设备驱动技术
- Linux下的硬件驱动——USB设备(上)
- Linux usb子系统(三):通过usbfs操作设备的用户空间驱动
- USB设备驱动开发-USB协议相关(二)
- USB设备驱动
- linux 2.4内核下自定义USB设备驱动编写
- Linux下的硬件驱动——USB设备(上)(驱动配置部分)