记得十多年前,单位开办网银业务,客户需要用k宝,这是一个类似U盘的支付安全工具,需要安装驱动,客户使用中经常出现各种各样的问题,作为公司从事信息技术工作的我据此开始了USB技术的开发研究历程,“USB应用开发技术大全”、“USB开发手册”便是启蒙的读物。多年来自己一直想征服“USB技术开发”这匹烈马,但几经波折,拿起来放下,放下后又拿起来,多少个满头雾水的时日,回想起来这条路确实不平坦,在自学的路上,身边没有老师的指点,走了不少弯路。如果你身边有一个USB老师帮助你,那就太庆幸了,在学习过程中,你可以时不时的吃点烤串喝点啤酒。如果你没有任何的USB基础还是单枪匹马,我敢说兄弟你辛苦了,望望满天的繁星,回来再看看那碗渐渐不再冒出热气的白米饭,轻轻的说:“USB想说爱你不容易”。本文是自己研究USB技术的一点体会,如果你刚刚接触它,本文或许对你有所帮助。
自从1996年USB1.0发布后,USB已经到目前的USB3.0,通讯速度从1.5Mbps到5Gbps,USB一路走来,逐步取代了串口、并口,成为各类智能设备的主要通讯接口,支持了鼠标、键盘、打印机、扫描仪、摄像头、充电器、闪存盘、MP3机、手机、数码相机、移动硬盘、外置光驱/软驱、USB网卡等,几乎所有的外部设备,作为计算机技术人员,迟早会用到USB技术,都说学USB难,那究竟难在哪里呢,本人体会主要有如下的几点:
1、USB体系过于庞大,为了完成USB通讯硬件上就有USB主控制器、USB集线器和USB功能设备几个方面,每个方面都涉及到功能原理、设备驱动等多个方面,理解起来却有一定的难度。
2、不知从那个角度出发来测试、验证所学的USB技术,按照一般的思路,首先学习USB基础理论,然后是USB驱动开发,最后是USB设备固件开发,如果你是一个专门的硬件设计及驱动工程师,这难不倒你,往往我们从事的是应用层面的研发人员,让我们开发一个USB设备的驱动程序来支持一个USB设备,这好比猪还没杀死又让我们去杀牛,问题是越搞越难,我几次都是在这里望而却步、鸣金收兵了。
3、我不知道各类系统比如windows或linux或android对USB都做了哪些工作,我在相应的系统上测试USB设备或写一个USB通讯程序的话从哪里下手。
总之就是看完USB的技术书籍后,我似乎USB技术很明白了,什么USB事务、数据包、描述符及请求之类,但真正给我一个USB设备我不知怎么去理解他,更不用说怎么和他进行通讯,看上去还是云里雾里。这是相当长一段时间里我的苦恼。
学习USB技术,基础是要打牢的,我以为上层的技术人员不要太理会底层数据通讯的具体细节,但像USB的控制传输、中断传输、块传输、同步传输的传输方式及USB的设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符是一定要熟练掌握的,而且每种描述符包含的字段要仔细理解并熟记于心,这方面网上资料很多,一般技术书籍也都有详细讲解,理解起来也不难。USB的工作机制就像公司老板到峨眉山敬香,从公司到峨眉山可以走公路或许走空路、水路或铁路,但空路、水路、铁路不一定能到达,公路一定会的,这里走公路就类似USB的控制传输,空路、水路、铁路类似中断传输、块传输、等时传输,之所以USB设计这么多的传输方式完全是为了满足各类设备通讯的需要,比如键盘设备,客户什么时间敲键盘无法确定,就需要用中断传输机制,及时将客户敲击的键盘信息传递到主机。像U盘这类设备,可以按固定的协议标准在U盘和主机之间传送数据,就可以用块传输,像USB的视频播放器,工作时总有一个固定的、连续的视频流,这类设备就用等时传输,这三种传输在具体的USB设备中可有可无,但控制传输不论什么样的USB设备一定会有的,他保证USB设备插入到电脑后的最基本通讯能力。然而峨眉山上有几尊菩萨,每尊菩萨有何宝贝老板一无所知,于是叫来了秘书小乔,让他先到峨眉山去一次,打打前站,并特意告诉他一定要走公路(控制传输),于是小乔即刻出发,风风火火的来到了峨眉山,小乔先后见到了观音菩萨(设备描述符),普贤菩萨(配置描述符),文殊菩萨(接口描述符)、地藏王菩萨(端点描述符)、日光菩萨(字符串描述符),秘书小乔精明能干、能说会道,即可功夫就和菩萨混的烂熟,菩萨手中的宝贝轻易拿到手了(当然还有其他菩萨,但主要的是这几个)。
观音菩萨(设备描述符)共18件宝贝:
序号 字段名称 长度(字节) 值 意义
0 bLength 1 0x12 设备描述符的字节数大小
1 bDescriptorType 1 0x01 设备描述符类型编号
2 bcdUSB 2 协议版本2.31其值就是0x0231 USB版本号
4 bDeviceClass 1 类 USB分配设备类代码(1-FE)FF为厂商自定义
5 bDeviceSubClass 1 子类 USB分配子类代码
6 bDeviceProtocol 2 协议 USB分配设备协议代码
7 bMa xPack et Size0 1 控制传输端点0包大小 端点0最大包大小
8 idVendor 2 ID编号 厂商编号
10 idProduct 2 ID编号 产品编号
12 bcdDevice 2 BCD码 设备出厂编号
14 iManufacturer 1 索引 描述厂商字符串索引
15 iProduct 1 索引 描述产品字符串的索引
16 iSerialNumber 1 索引 描述设备序列号字符串的索引
17 bNumConf igur at ions 1 配置描述符个数 可能配置数量
普贤菩萨(配置描述符)共9件宝贝:
序号 字段名称 长度(字节) 值 意义
0 bLength 1 0x09 配置描述符的字节数大小
1 bDescriptorType 1 0x02 配置描述符类型编号
2 wTotalLength 2 数字 这是一个以2 字节二进制数为内容的字段。该字段表示该配置所返回的所有描述符( 包括配置、接口和端点描述符) 的大小总和。
4 bNumInterfaces 1 接口描述符个数 此配置所支持的接口数量
5 bConfigurationValue 1 数字 Set_Configuration /Get_Configuration命令需要的参数值
6 iConfiguration 1 索引 描述该配置的字符串的索引值
7 bmAttributes 1 位图 供电模式的选择,第7位D7保留固定为1;D6值为1表示自供电,值为0表示总线供电; D5值为1表示支持远程唤醒,值为0则不支持;D4~D0没有意义固定为0
8 MaxPower 1 字段值*2(mA) 设备从总线提取的最大电流(<=500mA)
文殊菩萨(接口描述符)共9件宝贝:
序号 字段名称 长度(字节) 值 意义
0 bLength 1 0x09 接口描述符的字节数大小
1 bDescriptorType 1 0x04 接口描述符类型编号
2 bInterfaceNumber 1 数字 该接口编号
3 bAlternateSetting 1 数字
4 bNumEndpoints 1 如果为0则说明只用了端点0 该接口使用的端点数 ,不包括端点0
5 bInterfaceClass 1 类 接口类型
6 bInterfaceSubClass 1 子类 接口子类类型
7 bInterfaceProtocol 1 协议 接口遵循的协议
8 iInterface 1 索引 描述该接口的字符串索引值
地藏王菩萨(端点描述符)共7件宝贝:
序号 字段名称 长度(字节) 值 意义
0 bLength 1 0x07 端点描述符的字节数大小
1 bDescriptorType 1 0x05 端点描述符类型编号
2 bEndpointAddress 1 端点 端点地址及输入输出属性
3 bmAttributes 1 位图 端点的传输类型属性
4 wMaxPacketSize 2 数字 端点收、发的最大包的大小
6 bInterval 1 数字 主机查询端点的时间间隔
日光菩萨(字符串描述符)共3件宝贝:
序号 字段名称 长度(字节) 值 意义
0 bLength 1 数字 字符串描述符的字节数大小
1 bDescriptorType 1 0x03 字符串描述符类型编号
2 bStringN 数字 UNICODE 编码的字符串
小乔拿到菩萨的宝贝后,精心打理,生怕丢失,不明之处还特意问了文殊菩萨从公司到峨眉山有几种走法(在bNumEndpoints中有说明),随后小乔又问了地藏王菩萨(端点描述符)怎么走,地藏王菩萨(端点描述符)告诉小乔,从你们公司到峨眉山来的时候(out)可乘飞机,回去的时候(in)可坐高铁(bEndpointAddress字段有说明),小乔不敢怠慢一路风雨兼程赶回公司向老板禀报此行。老板听了秘书小乔的汇报后,便精心准备,选了良辰吉日,飞往峨眉山敬香去了。
USB设备就像峨眉山的寺庙,USB的各类描述符就像庙里的菩萨,研究各类USB设备最重要的是要熟悉这些菩萨并熟悉他们手中的宝贝,这对我们非常重要,有了这些宝贝那我们就能够继续操作使用USB设备了。接下来“USB想说爱你不容易(二)------宝马雕车香满路”(https://blog.csdn.net/donghailin/article/details/102603589)
USB学习入门(一)-------东风夜放花千树
最新推荐文章于 2022-02-23 10:44:47 发布