usb驱动开发7之接口描述符
前面struct usb_interface里表示接口设置的struct usb_host_interface被有意的飘过了,咱们在这节主要讲讲这个结构体,同样在include/linux/usb.h文件里定义。
/* host-side wrapper for one interface setting's parsed descriptors */
struct usb_host_interface {
struct usb_interface_descriptor desc;
/* array of desc.bNumEndpoint endpoints associated with this
* interface setting. these will be in no particular order.
*/
struct usb_host_endpoint *endpoint;
char *string; /* iInterface string, if present */
unsigned char *extra; /* Extra descriptors */
int extralen;
};
和前面分析一下,我们先略过usb_interface_descriptor结构体的分析,大餐总是喜欢最后吃。
endpoint,一个数组,表示这个设置所使用到端点。
string,用来保存从设备里取出来的字符串描述符信息的,既然字符串描述符可有可无,那这里的指针也有可能为空了。
xtra,extralen,关于额外的描述符。除了前面提到的四大描述符还有字符串描述符外,还有为一组设备也就是一类设备定义的描述符,和厂商为设备特别定义的描述符,extra指的就是它们,extralen表示它们的长度。
desc,接口的描述符。前面看了端点描述符,现在又有了接口描述符,那么什么叫描述符呢?实际上,usb的描述符是一个带有预定义格式的数据结构,里面保存了usb设备的各种属性还有相关信息,姓甚名谁啊,哪儿生产的啊等等,我们可以通过向设备请求获得它们的内容来深刻的了解感知一个usb设备。主要有四种usb描述符,设备描述符,配置描述符,接口描述符和端点描述符,协议里规定一个usb设备是必须支持这四大描述符的,当然也有其它一些设备为了显得个性些支持其特有描述符,但这四大描述符是一个都不能少的。
这些描述符放哪儿?当然是在设备里。usb设备里都会有一个叫EEPROM的东东,没错,就是放在它那儿,它就是用来存储设备本身信息的,EEPROM就是电可擦写的可编程ROM,它与Flash虽说都是要电擦除的,但它可以按字节擦除,Flash只能一次擦除一个block,所以如果要改动比较少的数据的话,使用它还是比较合适的,但是世界上没有完美的东西,此物成本相对Flash比较高,所以一般来说usb设备里只拿它来存储一些本身特有的信息,要想存储数据,还是用Flash吧。
具体到接口描述符,它当然就是描述接口本身的信息的。一个接口可以有多个设置,使用不同的设置,描述接口的信息会有些不同,所以接口描述符并没有放在struct usb_interface结构里,而是放在表示接口设置的struct usb_host_interface结构里。定义在include/linux/usb/ch9.h文件里:
/* USB_DT_INTERFACE: Interface descriptor */
struct usb_interface_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bInterfaceNumber;
__u8 bAlternateSetting;
__u8 bNumEndpoints;
__u8 bInterfaceClass;
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;
__u8 iInterface;
} __attribute__ ((packed));
再次强调一下,浏览ch9.h文件里的内容一定要同时对照协议规范去看。__attribute__意思就是告诉编译器,这个结构的元素都是1字节对齐的,不要再添加填充位了。因为这个结构和spec里的Table 9.12是完全一致的,包括字段的长度,如果不给编译器这么个暗示,编译器就会依据你平台的类型在结构的每个元素之间添加一定的填充位,如果你拿这个添加了填充位的结构去向设备请求描述符,你想想会是什么结果。
bLength,描述符的字节长度。协议里规定,每个描述符必须以一个字节打头来表明描述符的长度。接口描述符的bLength应该是9没错,ch9.h文件里紧挨着接口描述符的定义就定义了这个长度。
#define USB_DT_INTERFACE_SIZE 9
bDescriptorType,描述符的类型。各种描述符的类型都在ch9.h文件里有定义,对应spec Table 9.5。对于接口描述符来说,值为USB_DT_INTERFACE,也就是0x04。
#define USB_DT_INTERFACE 0x04
bInterfaceNumber,接口号。每个配置可以包含多个接口,这个值就是它们的索引值。
bAlternateSetting,接口使用的是哪个可选设置。协议里规定,接口默认使用的设置总为0号设置。
bNumEndpoints,接口拥有的端点数量。这里并不包括端点0,端点0是所有的设备都必须提供的,所以这里就没必要多此一举的包括它了。
bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol。这个世界上有许许多多的usb设备,它们各有各的特点,为了区分它们, usb协议规范把usb设备分成了很多类,然而每个类又分成子类。这很好理解,比如我们一个大学,先是分成很多个学院,然后每个学院又被分为很多个系,然后可能每个系下边又分了各个专业。usb协议也是如此,首先每个Device或Interface属于一个Class,然后Class下面又分了SubClass,完了SubClass下面又按各种设备所遵循的不同的通信协议继续细分。usb协议里边为每一种Class,每一种SubClass,每一种Protocol定义一个数值,比如mass storage 的Class就是0x08,hub的Class就是0x09。
iInterface,接口对应的字符串描述符的索引值。除了前面提到的四大描述符,还有字符串描述符,不过那四大描述符是每个设备必须支持的,这个字符串描述符却是可有可无的。
现在总结下怎么分析描述符?一是对照usb协议规范第九章(非常重要,读个十遍吧先),二是采用避重就轻(从小到大)顺序慢慢分析源码,当然你也可以先去看设备描述符,不过我第一次就是这么做的,后来发现很多看着看着就模糊了。所以,从小处着手,相信我们会有突破!!!
usb驱动开发7之接口描述符的更多相关文章
- usb驱动开发8之配置描述符
前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),下面是看配置描述符还是看设备描述符呢??我们知道,设备大于配置,配置大于接口,接口可以有多种设置. 我 ...
- usb驱动开发6之端点描述符
学到这里不容易,先说一段故事吧. 二兄弟住一大楼的第80层,某深夜回家忘看通知(内容今夜停电). 兄弟俩背着沉重的大背包,在楼底下商量一下,决定一鼓作气,爬楼梯回家.两人抖擞精神,开始爬楼.爬到20楼 ...
- usb驱动开发24之接口驱动
从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match, ...
- usb驱动开发9之设备描述符
前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),配置描述符,最后分析设备如何包括这些描述符.首先记住,在usb的世界里,设备大于配置,配置大于接口,接 ...
- HarmonyOS USB DDK助你轻松实现USB驱动开发
HDF(Hardware Driver Foundation)驱动框架是HarmonyOS硬件生态开放的基础,为开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动能力,让开发者能精准且高效地开发驱 ...
- usb驱动开发之大结局
从usb总线的那个match函数usb_device_match()开始到现在,遇到了设备,遇到了设备驱动,遇到了接口,也遇到了接口驱动,期间还多次遇到usb_device_match(),又多次与它 ...
- USB驱动开发大全【转】
本文转载自:http://www.360doc.com/content/12/0504/19/8363527_208666082.shtml 编写USB驱动程序步骤:1所有usb驱动都必须创建主要结构 ...
- usb驱动开发18之设备生命线
现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符.接口描述符还是端点描述符都挤在一起,所以得想办法将 ...
- usb驱动开发17之设备生命线
拜会完了山头的几位大哥,还记得我们从哪里来要到哪里去吗?时刻不能忘记自身的使命啊.我们是从usb_submit_urb()最后的那个遗留问题usb_hcd_submit_urb()函数一路走来,现在就 ...
随机推荐
- Mybatis学习记录(五)----Mybatis的动态SQL
1. 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...
- Java从零开始学四十五(Socket编程基础)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- iOS多线程-05-多图下载
效果图 常见问题及解决方法 图片重复下载 将内存保存在内存或沙盒中. 若下载的图片量较大,则会出现UI界面不流畅的现象 在子线程中执行下载操作,然后回到主线程成中进行UI界面的刷新. 由于cell的循 ...
- IOS之UI--小实例项目--综合使用
前言: 本博文是基于前一个小实例项目:IOS之UI--小实例项目--添加商品和商品名 进行继续综合学习积累的. 内容大纲 01-综合使用01-plist的使用 02-综合使用02-模型取代字典的好处分 ...
- SPC.NET,为5年的开发做个结尾
从08年到如今从事asp.net开发已五年,起初只是一个简单的喜好,想做个东西出来.于是SPC.NET的前生诞生了,直至今日. 不得不说,一个人开发一个软件是很辛苦的事情,以下是SPC.NET的一些特 ...
- mmap 与 read/write
mmap与read/write两条路线对文件的访问比较 我们知道无论是通过mmap或read/write访问文件在内核中都必须经过缓存, 当需要从文件读写内容时,都经过内存拷贝的方式与内核中的缓存进行 ...
- statement和preparedstatement用法区别
1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 ...
- Windows环境下maven 安装与环境变量配置
Maven是一个项目管理的Java 工具,在JavaEE中,我们可以使用Maven方便地管理团队合作的项目,现在我们在学习JavaEE框架,使用Maven可以管理类库,有效方便地供团队中的其他人员使用 ...
- 如何通过js实现图片预览功能
一.效果预览 效果图: 二.实现代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...
- 深度学习笔记------linux下配置安装caffe-cpu only模式
本文适合初学者学习配置caffe的最简单方法.这是我在看了网上各种大神的方法后总结的最傻瓜式的配置方法了. 本人也是在不断地配置caffe过程中受打击与成长@.@ 第一步.配置caffe所需的依赖环境 ...