
一、USB 系统简介
1. 设备状态的转换
2. USB 设备逻辑组织

在 USB 协议中,接口(interface)由一个或多个端点组成,代表一个基本功能单元。配置
(Configuration)由一个或多个接口组成。一个 USB 设备可以具有一个或多个配置。
3. Linux 下 USB 驱动整体框架
Linux 下 USB 设备侧驱动程序分为三个层次:
• UDC Drivers 直接访问硬件,控制 Usb 设备和 Host 间的底层通信,向上层提供硬件
相关操作的回调函数。
• Gadget API 是 UDC Drivers 回调函数的封装。
• Gadget drivers 是 USB 设备具体功能的实现。
4. Setup 过程介绍
USB 协议规定每个 DEVICE 必须有一个编号为 0 的 CONTROL 端点,此端点在 RESET 后即可
用,无需 HOST 做任何配置。Host 通过端点 0 完成 SETUP 过程。以下是 fastboot 的 setup 过程:
• <RESET>
• <GET DESCRIPTOR : DEVICE>
SETUP(0xB4) ADDR(0) ENDP(0) Data(80 06 00 01 00 00 40 00)
IN(0x96) ADDR(0) ENDP(0) Data(
__ 00: 12 01 00 02 00 00 00 40 B4 0B FF 0F 00 01 01 01
__ 16: 01 01)
• <RESET>
• <SET ADDRESS>
SETUP(0xB4) ADDR(0) ENDP(0) Data(00 05 04 00 00 00 00 00)
• <GET DESCRIPTOR : DEVICE>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 01 00 00 12 00)
IN(0x96) ADDR(4) ENDP(0) Data(
__ 00: 12 01 00 02 00 00 00 40 B4 0B FF 0F 00 01 01 01
__ 16: 01 01)
• <GET DESCRIPTOR : CONFIGURATION>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 02 00 00 09 00)
IN(0x96) ADDR(4) ENDP(0) Data(09 02 20 00 01 01 01 80 80)

• <GET DESCRIPTOR : STRING>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 03 00 00 FF 00)
IN(0x96) ADDR(4) ENDP(0) Data(04 03 09 04)
• <GET DESCRIPTOR : STRING>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 01 03 09 04 FF 00)
IN(0x96) ADDR(4) ENDP(0) Data(
__ 00: 12 03 66 00 61 00 73 00 74 00 62 00 6F 00 6F 00
__ 16: 74 00)
• <GET DESCRIPTOR : CONFIGURATION>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 02 00 00 FF 00)
IN(0x96) ADDR(4) ENDP(0) Data(
__ 00: 09 02 20 00 01 01 01 80 80 09 04 00 00 02 FF 42
__ 16: 03 00 07 05 82 02 00 02 00 07 05 01 02 00 02 01)
• <GET DESCRIPTOR : STRING>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 03 00 00 FF 00)
IN(0x96) ADDR(4) ENDP(0) Data(04 03 09 04)
• <GET DESCRIPTOR : STRING>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 01 03 09 04 FF 00)
IN(0x96) ADDR(4) ENDP(0) Data(
__ 00: 12 03 66 00 61 00 73 00 74 00 62 00 6F 00 6F 00
__ 16: 74 00)
• <GET DESCRIPTOR : DEVICE>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 01 00 00 12 00)
IN(0x96) ADDR(4) ENDP(0) Data(
__ 00: 12 01 00 02 00 00 00 40 B4 0B FF 0F 00 01 01 01
__ 16: 01 01)
• <GET DESCRIPTOR : CONFIGURATION>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 02 00 00 09 00)
IN(0x96) ADDR(4) ENDP(0) Data(09 02 20 00 01 01 01 80 80)
• <GET DESCRIPTOR : CONFIGURATION>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 02 00 00 20 00)
IN(0x96) ADDR(4) ENDP(0) Data(
__ 00: 09 02 20 00 01 01 01 80 80 09 04 00 00 02 FF 42
__ 16: 03 00 07 05 82 02 00 02 00 07 05 01 02 00 02 01)
• <GET STATUS>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 00 00 00 00 00 02 00)
IN(0x96) ADDR(4) ENDP(0) Data(00 00)
• <SET CONFIGURATION>
SETUP(0xB4) ADDR(4) ENDP(0) Data(00 09 01 00 00 00 00 00)
• <GET DESCRIPTOR : CONFIGURATION>
SETUP(0xB4) ADDR(4) ENDP(0) Data(80 06 00 02 00 00 20 00)
IN(0x96) ADDR(4) ENDP(0) Data(
__ 00: 09 02 20 00 01 01 01 80 80 09 04 00 00 02 FF 42
__ 16: 03 00 07 05 82 02 00 02 00 07 05 01 02 00 02 01)
评论0