这里首先感谢电脑圈圈的USB那本书还有稻谷成熟了68013的固件研究
首先我们需要理解什么是USB。大家不要把它想复杂了,其实USB就是一种串行通信方式,它具有自己特有的通信协议,就是USB通信协议,有些人可能问,什么是协议,我觉得协议就好像 两个人之间的暗号,同样两个设备通信的话,也要事先规定好一个暗号,按照这个暗号的方式,两个设备就可以进行交流了。
下面我们开始说明一下USB的这个“暗号”,要明白USB的暗号,首先要明白以下几个概念(排名暂不分先后):USB描述符,USB的包,USB事务,USB请求。这四个概念必须要分清楚,其实按照这个顺序了解即可。理解这四个概念以后,对于USB 的枚举就会很容易理解了。
(1)USB描述符
USB描述符其实就是用来描述这个USB设备的,描述这个USB有什么结构,每个结构有什么特点。将来这个描述符表是存在一个a51的文件中的。描述符其实就类似于一个结构体。结构体中包含好几个字段(变量),每个字段表示不同含义。这里我只介绍设备描述符,配置描述符,接口描述符,端点描述符四种,其他都一样,大家再看书吧。
首先介绍设备描述符,下面类结构体就是设备描述符的结构
DeviceDscr:
db DSCR_DEVICE_LEN ;12H 设备描述符的长度(描述符的第一个字节一般存的都是这个描述符的总长度)
db DSCR_DEVICE ;;01H 描述度的类型(第二个字节一般表示描述的类型,01H表示描述符是设备描述符)
dw 0002H ;; USB的规范版本号,USB2.0所以是2 (BCD)
db 00H ;; USB 设备类别代码,如HID设备对应的设备代码03H,还有显示设备为04H
db 00H ;; 对于前述设备再分类,比如说显示器,有好多种,可以继续分类,若上述为显示设备,01H表示CRT显示器
db 00H ;; 设备协议,为0时表示不使用设备类协议。
db 64 ;; 这个表示端点0支持的最大数据包长度。这个很重要,大家要记住,后面会用 到
dw 0B404H ;; Vendor ID设备商ID VID
dw 0410H ;; Product ID (Sample Device)产品ID PID 主机是根据相应PID VID 去加载驱动的。
dw 0000H ;; USB设备版本号
db 1 ;; 供应商字符串索引
db 2 ;; 产品字符串索引
db 0 ;; 产品序列号索引
db 1 ;; 支持的最大配置数
其次是配置描述符结构
db DSCR_CONFIG_LEN ;; 配置描述符长度 09H
db DSCR_CONFIG ;; 描述符类型02H,即配置描述符
db (FullSpeedConfigDscrEnd-FullSpeedConfigDscr) mod 256 ;配置描述信息的总长度(包含配置描述符,接口描述符,端点描述符),这里不是配置信息的总长度
db (FullSpeedConfigDscrEnd-FullSpeedConfigDscr) / 256 ;; 配置信息总长度的高字节
db 1 ;; Number of interfaces所支持的接口数
db 1 ;; Configuration number当前配置值
db 0 ;; Configuration string字符串描述符索引
db 10000000b ;; 配置特性(b7 - buspwr, b6 - selfpwr, b5 - rwu)
db 50 ;; Power requirement (div 2 ma)USB总线上的所需消耗的电流,一个二进制1表示2mA。
再次是接口描述符的结构
db DSCR_INTRFC_LEN ;;接口描述符长度09H
db DSCR_INTRFC ;; 描述符类型04H
db 0 ;; 接口号
db 0 ;; 可替换设置值
db 4 ;; 支持的端点数,4个,端点2,4,6,8.不包含端点0
db 0ffH ;; 接口类代码
db 00H ;; 子类代码
db 00H ;; 协议代码
db 0 ;; 接口字符串描述符
最后,重点是端点描述符
db DSCR_ENDPNT_LEN ;; 端点描述符长度07H
db DSCR_ENDPNT ;; 端点描述符类型05H
db 04H ;; 要配置的端点号,最高位表示传输方向,0表示out,1表示in
db ET_BULK ;; 传输类型,批量传输
db 40H ;; 最大数据包的长度低字节Maximun packet size (LSB)
db 00H ;; 最大数据包的长度高字节Max packect size (MSB)
db 00H ;; 访问间隔,用于中断传输方式
上面我们把四种描述符简单介绍了一下,大家多少应该有个印象,我现在解释一下四个描述符的分工及作用。
首先设备描述符,一个USB只对应一个USB设备描述符,它是USB 描述符最总体,最高层的描述符。这里引用电脑圈圈的例子,如果把一个USB设备比作一个教学楼,对USB的设备描述符就相当于对这个教学楼的总体描述信息。在设备描述符中决定了USB的配置数,即设备描述符的下一层既是配置描述符,配置描述符是用来表示这个USB设备有什么用处的,USB设备可有多个配置,但是同一时刻只有一个配置有效,即只有一个作用有效。例如把教学楼分为考试用和平时上课用,这两种配置是不能同时发生的。配置描述符下面就是接口描述符了,接口描述符,是将usb的用途再进行细分,比如说教学楼配置为平时上课用的时候,其可以分为两种接口,一种是用来学生上课,一种是用来教师休息室。最后就是端点描述符了,端点最后就相当于教室了,若干个教室用于教师休息室,若干个教师可以用于学生上课。
其实这四个描述符中,就设备描述符和端点描述符对应了实际东西,设备描述符对应了USB这个设备,有些同学会问端点是什么,端点其实就是数据传输的BUF,是一块RAM,可以理解成一块FIFO。数据传输的时候都是先把数据传送到这个BUF,在发送出去,或者由固件程序读取。固件程序是指在USB芯片68013中的跑的程序。所以端点描述符对应的就是一块RAM。
没想到描述符写了这么久,还有一些别的描述符,我没有介绍,大家可以参考 薛园园的 USB应用技术开发大全,看看别的描述符如何定义的。写了好长时间了,下次我再介绍USB包和USB事务吧。这两个概念构成了USB 的传输方式。