您的当前位置:首页USB驱动开发(一)

USB驱动开发(一)

2021-10-20 来源:六九路网
一 USB的框架

提到USB的框架,先看一张很经典的架构图

总结一句话就是:设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有一个或多个设置,接口有零或多个端点。 设备描述符是用来记录设备的通用信息,比如供应商ID、产品ID和修订ID,支持的设备类、子类和适用的协议以及默认端点的最大包大小等 struct usb_device_descriptor {

_ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型编号 _ _le16 bcdUSB; //USB版本号 _ _u8 bDeviceClass; //USB分配的设备类code _ _u8 bDeviceSubClass; // USB分配的子类code _ _u8 bDeviceProtocol; //USB分配的协议code _ _u8 bMaxPacketSize0; //endpoint0最大包大小 _ _le16 idVendor; //厂商编号 _ _le16 idProduct; //产品编号 _ _le16 bcdDevice; //设备出厂编号 _ _u8 iManufacturer; //描述厂商字符串的索引 _ _u8 iProduct; //描述产品字符串的索引 _ _u8 iSerialNumber; //描述设备序列号字符串的索引 _ _u8 bNumConfigurations; //可能的配置数量

} _ _attribute_ _ ((packed)); 配置描述符可以包含一个或多个配置,比如USB设备的低功耗模式和高功耗模式可分别对应一个配置。但是存在多个配置时,在使用USB设备前,必须为其选择一个合适的配置。USB设备的每一个配置都必须有一个配置描述符。

struct usb_config_descriptor { _ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型编号 _ _le16 wTotalLength; //配置所返回的所有数据的大小 _ _u8 bNumInterfaces; // 配置所支持的接口数

_ _u8 bConfigurationValue; //Set_Configuration命令需要的参数值 _ _u8 iConfiguration; //描述该配置的字符串的索引值 _ _u8 bmAttributes; //供电模式的选择 _ _u8 bMaxPower; //设备从总线提取的最大电流

} _ _attribute_ _ ((packed)); 接口描述符是用来实现某一个功能的,一个配置下面可以有多个接口,比如说:既可以播放音频又可以播放视频,这样就需要两个接口来实现了,接口是端点的集合。 struct usb_interface_descriptor { _ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型 _ _u8 bInterfaceNumber; // 接口的编号 _ _u8 bAlternateSetting; //备用的接口描述符编号 _ _u8 bNumEndpoints; //该接口使用的端点数,不包括端点0 _ _u8 bInterfaceClass; //接口类型 _ _u8 bInterfaceSubClass; //接口子类型 _ _u8 bInterfaceProtocol; //接口所遵循的协议 _ _u8 iInterface; //描述该接口的字符串索引值

} _ _attribute_ _ ((packed)); 端点是USB设备中的实际物理单元,USB数据传输就是在主机和USB设备各个端点之间进行的,USB设备中的每一个端点都有唯一的端点号,每个端点所支持的数据传输方向一般而言也是确定的:输入OR输出。 struct usb_endpoint_descriptor { _ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型 _ _u8 bEndpointAddress; //端点地址:0~3位是端点号,第7位是方向(0-OUT,1-IN) _ _u8 bmAttributes;

//端点属性:bit[0:1] 的值为00表示控制,为01表示同步,为02表示批量,为03表示中断 _ _le16 wMaxPacketSize; // 本端点接收或发送的最大信息包的大小 _ _u8 bInterval; //轮询数据传送端点的时间间隔 //对于批量传送的端点以及控制传送的端点,此域忽略 //对于同步传送的端点,此域必须为1

//对于中断传送的端点,此域值的范围为1~255 _ _u8 bRefresh; _ _u8 bSynchAddress; } _ _attribute_ _ ((packed)); 我是这样理解的:一个设备对应一个描述符,配置是可以把这个设备配置成不同的传输模式,而接口则是实现这个功能的,比如说实现视频传输,音频传输等,一个接口代表一个功能,而端点则是为了实现这些功能的具体形式,是数据流的传输,数据流的传输是通过URB来实现,先大致有个概念。

因篇幅问题不能全部显示,请点此查看更多更全内容