USB 设备开发:从入门到实践指南(一)
内容提要
介绍了《圈圈教你玩USB》一书,讲解了使用手机或树莓派4b设备进行USB设备开发的方法,以及相关工具如USB Tree View、Wireshark和Bus Hound。详细讨论了USB协议中的各种描述符,包括设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符和HID报告描述符。提及了后续研究方向。
延伸解读
工具选择:免费与付费的权衡
文章对比了USB Tree View、Wireshark和Bus Hound三款工具。USB Tree View免费但无法解析HID描述符;Wireshark配合USBPcap免费,但需过滤同一主机控制器上的其他设备流量;Bus Hound能直接抓取指定设备流量,但需付费且免费版有抓包限制。读者可根据研究阶段和预算选择:入门学习可先用免费工具组合,若需精准抓包再考虑付费工具。
树莓派4b模拟USB设备的硬件限制
树莓派4b的四个USB母口只能作为USB主机,只有Type-C供电口可作为USB设备。这意味着用树莓派模拟USB设备时,必须通过Type-C口连接目标主机,且该口同时负责供电。文章提到,连接后主机不会立即识别设备,需运行配置脚本后才会枚举。这一硬件限制影响了实验搭建方式,也解释了为何选择树莓派而非手机:安卓对USB设备开发支持不友好,且封装层掩盖了底层细节。
描述符与脚本的对应关系
文章将USB描述符与bash脚本中的配置项一一对应:设备描述符的idVendor、idProduct等由脚本中的echo命令设置;配置描述符的MaxPower对应脚本中的250;接口描述符的bInterfaceClass和bInterfaceProtocol由functions/hid.usb0下的protocol和subclass文件控制;端点描述符的包大小由report_length决定。这种对应关系帮助读者理解Linux USB gadget驱动如何通过文件系统接口暴露配置,为后续微调描述符提供了操作入口。
HID报告描述符与数据格式的匹配
文章解析了键盘HID报告描述符的四个部分:8个控制键(1字节)、1字节常量、1字节LED输出、6字节按键数组。这正好对应发送的8字节数据包:第一字节为控制键,第二字节固定为0,后六字节为按键值。发送全0包表示释放所有按键。这种匹配关系说明描述符定义了数据格式,修改描述符必须同步调整发送逻辑,否则主机无法正确解析。
Q&A
为什么选择树莓派4b而不是手机进行USB设备开发?
因为安卓对USB设备开发的支持不友好,且在安卓层封装USB开发会导致难以理解USB底层细节,而树莓派4b可以模拟USB设备,更适合学习USB协议。
USB Tree View工具的主要功能是什么?
USB Tree View可以展示主机上USB设备树的主从情况、USB描述符信息等数据,帮助理解USB设备连接结构。
如何使用树莓派4b模拟一个USB键盘?
需要开启dwc2驱动(在config.txt中添加dtoverlay=dwc2),然后运行一个bash脚本,该脚本利用Linux USB gadget驱动配置HID功能,从而模拟USB键盘。
USB协议中的描述符有哪些类型?各自的作用是什么?
USB描述符包括设备描述符(告知主机设备基本信息)、配置描述符(定义配置和电源属性)、接口描述符(定义接口类型和端点数量)、端点描述符(定义端点通信方式)、字符串描述符(提供标识信息)和HID报告描述符(定义HID设备数据格式)。
在Wireshark中如何过滤特定USB设备的流量?
由于Wireshark抓取的是主机控制器上的所有USB流量,需要通过过滤表达式排除其他USB设备的流量,例如使用USBPcap捕获时,可以根据总线号、设备号和端点号进行过滤。
HID报告描述符中如何定义键盘的控制按键和普通按键?
控制按键部分定义了8个控制键(如左Ctrl、左Shift等),每个按键占1位,共1字节;普通按键部分定义了6个按键,每个按键占1字节,共6字节,用于表示按下的普通键。
为什么模拟键盘发送数据时需要发送两个8字节的数据包?
第一个数据包告知主机哪些按键被按下,第二个全为0的数据包告知主机所有按键已释放,模拟完整的按键按下和释放操作。
文章提到的下一步研究方向有哪些?
下一步研究方向包括:微调HID报告描述符、模拟鼠标、研究手柄、研究非HID协议设备(如U盘、网卡、打印机)以及研究Linux内核USB驱动系统细节。