在USB中USBHOST是通过各种描述符来识别设备的.docx
- 文档编号:27279172
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:19
- 大小:61.33KB
在USB中USBHOST是通过各种描述符来识别设备的.docx
《在USB中USBHOST是通过各种描述符来识别设备的.docx》由会员分享,可在线阅读,更多相关《在USB中USBHOST是通过各种描述符来识别设备的.docx(19页珍藏版)》请在冰豆网上搜索。
在USB中USBHOST是通过各种描述符来识别设备的
USBHID报告及报告描述符简介
在USB中,USBHOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(ReportDescriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。
USBHID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数值数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。
报告是一个数据包,里面包含的是所要传送的数据。
输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USBHOST可以分析出报告里面的数据所表示的意思。
它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。
一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。
当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。
更详细的说明请参看USBHID协议,该协议可从下载。
USB报告描述符可以通过使用HIDDescriptortool来生成,这个工具可以到下载,为了方便大家,我顺便上传了一份。
下面通过由HIDDescriptortool生成的USB鼠标和USB键盘来说明一下报告描述符和报告。
codecharKeyBoardReportDescriptor[63]={
5A5A5A7f
1.1.0
CTL a3000000 01000400 GETSTATUS 17us
DI 01010100 .... 27us
CTL 23011000 01000000 CLEARFEATURE 110us
CTL a3000000 01000400 GETSTATUS 56us
DI 01010000 .... 14us
CTL 23030400 01000000 SETFEATURE 109ms
DI 02 . 90ms
CTL a3000000 01000400 GETSTATUS 23us
DI 03011000 .... 22us
CTL 23011400 01000000 CLEARFEATURE 8us
CTL a3000000 01000400 GETSTATUS 19ms
DI 03010000 .... 34us
......!
.... 67ms
CTL a3000000 01000400 GETSTATUS 49us
DI 03010000 .... 27us
CTL 23030400 01000000 SETFEATURE 24us
DI 02 . 112ms
CTL a3000000 01000400 GETSTATUS 21us
DI 03011000 .... 25us
CTL 23011400 01000000 CLEARFEATURE 8us
......!
.... 75ms
0201 ..
...... 50ms
CTL a3000000 02000400 GETSTATUS 214ms
DI 00010000 .... 34us
......!
.... 67ms
0201 ..
...... 50ms
............. 83ms
50000705 82024000 00070502 02400000 P.....@......@..
45ms
.. 53ms
46ms
70ms
3200 2.
53ms
.......
00000024 00000000 00000000 000000 ...$...........
以下是我在做USB键盘时,通过串口发回的调试信息,从这也可以看到枚举的过程。
系统启动................................
断开USB连接........................
USBD12芯片初始化
设置地址.....................
地址为:
0
连接USB...............
USB总线复位................................
USB总线挂起................................
USB总线复位................................
USB总线挂起................................
USB总线复位................................
USB标准请求................................
获取描述符................................
获取设备描述符................................
USB总线复位................................
USB标准请求................................
设置地址.....................
地址为:
2
USB标准请求................................
获取描述符................................
获取设备描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
获取配置描述符................................
USB标准请求................................
获取描述符................................
获取字符串描述符................................
获取语言ID................................
USB标准请求................................
获取描述符................................
获取字符串描述符................................
获取设备序列号................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
获取配置描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
获取字符串描述符................................
获取语言ID................................
USB标准请求................................
获取描述符................................
获取字符串描述符................................
获取产品字符串................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
获取字符串描述符................................
获取语言ID................................
USB标准请求................................
获取描述符................................
获取字符串描述符................................
获取产品字符串................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
获取设备描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
获取配置描述符................................
USB标准请求................................
获取描述符................................
获取配置描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
获取描述符................................
USB标准请求................................
设置配置................................
USB类请求................................
设置空闲................................
USB标准请求................................
获取描述符(从接口)..............................
获取报告描述符................................
USB标准请求................................
获取描述符(从接口)..............................
USB标准请求................................
获取描述符(从接口)..............................
USB标准请求................................
获取描述符(从接口)..............................
USB标准请求................................
获取描述符(从接口)..............................
USB标准请求................................
获取描述符(从接口)..............................
USB标准请求................................
获取描述符(从接口)..............................
USB标准请求................................
获取描述符(从接口)..............................
USB 最主要的的是要理解 USB主机发送命令给设备,设备要对主机的命令进行响应, USB通讯的基本单位为 “包” 理解好“包”这个概念是学习USB的关键所在。
包有如下分类:
分别是令牌包、数据包、握手包和特殊包(其实是由PID决定的)
令牌包:
可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的)其中输入包、输出包和设置包的格式都是一样的:
SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)
帧起始包:
SYNC+PID+11位FRAM+CRC5(五位的校验码)
数据包:
分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。
但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:
SYNC+PID+0~1023字节+CRC16
握手包:
结构最为简单的包,格式如下
SYNC+PID
下面举几个例子来说明USB的通讯过程:
1:
主机想要向设备传送一串数据。
过程如下:
(1) 主机向从机发送 “令牌包”,令牌包的类型为输出包,表示主机要向从机发送数据了。
(2) 主机向从机发送完令牌以后,USB处理器件根据发送的令牌,会将中断状态寄存器标志置位,从机CPU通过查询USB处理器件的中断状态寄存器,对主机的令牌包进行响应
(3) 从机判别出中断类型,于是,准备从主机接收数据。
(4) 从机准备好了,于是主机开始发送“数据包” 这时,USB处理器件会自动将从主发送过来的数据放入它的内部缓冲区内,接收完这个数据包后,从机向主机发送“应答包” 这就是一个完整的通讯过程。
由以上可以看出,USB若是想要传送数据,那么主机必须先发一个 IN 或OUT的令牌包,然后发送DATA0,或DATA1数据包。
简单的用现实生活中的事件进行描述:
老板想让员工去做一件事情,老板 先会发出命令,告诉要做什么事情,员工准备好以后呢,老板再把做这件事情的经费发放给员工,当员工把发放的经费清点以后,发现数目正确,他会给老板一个回应信息,告诉老板,钱已经收到了,而且数目正确。
老板想让员工做的事:
对应USB通讯里的令牌包。
老板想要发放的经费:
对应USB通讯里的数据包。
员工给老板的回应:
对应USB通讯里的握手包。
这里尤其需要
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- USB USBHOST 通过 各种 描述 识别 设备