USB笔记1_UsbMouse
本篇主要来自《圈圈教你玩usb》的UsbMouse实例
一、USB枚举过程
1.1 Device设备端代码片段
1 | while(1) //死循环 |
1.2 Device设备端日志
1.2.1 SETUP数据包,获取设备描述符
1 | USB端点0输出中断。 // host端带返回值的请求,device需要知道输出什么,所以先读8字节 |
日志显示已经成功接收到主机发送过来的8字节数据。在第一次接收到数据后,会停顿一段时间。这段时间主机一直在请求输入。
但是目前还没有返回数据,所以D12一直在回答NAK,即没有数据准备好。结果USB主机经过一段时间的等待之后,终于不耐烦了,
发送了一次总线复位,然后又重新输出这8个字节的数据,然后又是等待输入数据。尝试几次后主机只好无奈的放弃了。
这是改USB端口上不再有数据活动,从而D12进入了挂起状态。同时在计算机端弹出无法识别的USB设备对话框。
主机端内核日志:
[ 9536.933549] usb 2-1: new full-speed USB device number 16 using ci_hdrc
[ 9542.053622] usb 2-1: device descriptor read/64, error -110
#define ETIMEDOUT 110 /* Connection timed out */
1.2.2 设置地址
1 | USB总线复位。 |
1.2.3 SETUP数据包,基于新地址,重新获取设备描述符
1 | USB端点0输出中断。 |
二、描述符
2.1 各描述符之间的关系
设备描述符(Device Descriptor)
配置描述符(Configuration Descriptor)
接口描述符(Interface Descriptor)
HID描述符(HID Device Descriptor)
报告描述符(Report Descriptor)
一个设备描述符可以包含多个配置描述符,通常1个
一个配置描述符可以包含多个接口描述符。
一个接口描述符可以包含多个端点描述符。
接口描述符跟着配置描述符走的,无法单独存在。
2.2 各描述符简介:
2.2.1 设备描述符(Device Descriptor)
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x8888
idProduct 0x0001
bcdDevice 1.00
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
1 | //USB设备描述符的定义 |
2.2.2 配置描述符(Configuration Descriptor)- 接口描述符(Interface Descriptor) - HID描述符(HID Device Descriptor)
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 34
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 2 Mouse
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 33 US
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 52
Report Descriptor: (length is 52)
略
1 | //USB配置描述符集合的定义 |
2.2.3 报告描述符(Report Descriptor)
1 | //USB报告描述符的定义 |
三、QA
Q:lsusb获取Report Descriptor异常
A:Report Descriptors:
UNAVAILABLE
获取Report Descriptors
http://www.slashdev.ca/2010/05/08/get-usb-report-descriptor-with-linux/