本文将介绍当 USB 设备连接到PC 上标准的 USB 端口时,PC 上到底发生了什么。
连接戴尔制造的键盘。 示波器用于分析通信内容。
当 PC 检测到设备时,它会首先检测设备是低速还是高速设备。
从示波器来看,低速设备的“D-”为高电平,高速设备的“D+”为高电平。 然后,PC 重置识别后,它将开始与设备通信。
首次连接设备时,设备会向 PC 发送设置数据包。 由于在此阶段未将目标 ID 地址分配给设备,因此目标 ID 地址和终结点都显示为 0。 设置使用此 0 的地址完成,然后发送数据。
电脑后续设置数据将根据每个设备的特定格式进行标识。 此数据包为“00 05 0C 00 00 00 00 00 00”。 以十六进制表示。
第一个字节表示请求类型。
对于这次连接的键盘, bmRequestType 为“00” , 因此二进制表示法为00000000 。 再按D7 、 D6 · D5 、 D4 ~ D0和位进行分组 , 将其改成十进制数 。 D7 是 0,因为 D7 是 0“从 PC 作为主机发送到设备”,因为 D6D5 也是 0“是标准请求”,因为 D4 到 D0 也是 0,“收件人是设备”您可以看到它指向。
电脑下一个字节 (05) 表示它是特定请求。 确认后,您将看到“参见表 9-3”。
由于 bRequest 的值是“05”,因此您可以看到内容是“SET_ADDRESS”。
然后,检查请求指示的“w 值”、“wINdex”和“wLength”值。
w 值、w 索引和 w 长度都是两个字节。
电脑从示波器的角度来看,wValue 是“0C 00”,wINdex 和 wLength 是“00 00”。
这三个都有特定的请求,所以让我们来看看。 w 值表示设备地址。
由于 wValue 是“0C 00”,它们在转换时排序,因此它们实际上表示“000C”,即“设备地址”是“C”。
wINdex 和 wLength 是“零”在这种情况下。
尝试在电脑上运行lsusb命令。 将显示所有 USB 设备,但您可以看到检测到“12(十六进制 C)”设备。 刚刚连接的戴尔键盘似乎在示波器中检测到良好。
设置命令分配 C 0C,终结点为指定 0。
当然,也有数据包从USB键盘发送到您的计算机。
USB 设备向 PC 发送数据包后,从 PC 返回给设备的请求为“6”。
“6”是“GET_DESCRIPTOR”,这意味着 PC 请求设备的描述符。 当计算机中的设备识别 USB 设备时,它不知道它是什么。 可能是鼠标,也可能是硬盘驱动器。 因此,PC 要求设备描述其内容。
接下来的数字是“10 01”。 这表示连接的设备是 USB 1.1。
它还标识制造商和产品的序列号。
电脑