客户端USB设备驱动查询

Client USB device driver query

OS 如何将 USB 设备与其设备驱动程序映射?我知道在客户端 USB 固件的接口描述符中,如果没有为设备选择 class 类型,则开发人员必须提供自己的设备驱动程序。

我很想知道 OS 如何将插入的 USB 设备与其设备驱动程序进行映射? USB 客户端固件中的描述符是否包含自定义设备驱动程序的文件名?请告诉我。

作为爱好,I have done quite a bit of work with the USB hardware,刚开始的时候也有同样的问题。

OS 可以任意映射 USB 设备。但是,为了更准确地回答您的问题,USB 设备将并且必须 return 一个 class 和接口代码。当然,class 代码可以是用户定义的 0xFF,设备现在必须需要一个唯一的驱动程序。

在我看来,这就是 USB 的亮点所在。 return USB 规范中指定的有效 class 代码的所有 USB 设备都将并且必须遵循特定的事件序列,并且将 "work right out of the box" 如指示的那样。但是,这并不意味着它不能拥有额外的功能。

例如。指针设备(如鼠标)在首次插入时可能始终遵循引导协议。这是 USB 规范中使用和指定的协议,因此遵循此协议的任何 OS 都可以使用此指针设备。该协议为指针输入指定了一个简单的三(或更多)字节数据包。

Byte   Description
 0       Button(s)
 1       X Displacement
 2       Y Displacement
 3       (Device Specific) (optional)

任何遵循 USB 规范的指针设备很可能具有此协议,并且将使用此协议,除非另有说明。这样任何支持 USB 的 OS 都可以使用指针设备。

每个 USB 设备也有供应商、设备和协议定义。一旦 OS 找到了这个设备,它就可以在它的驱动程序中搜索可以支持这个设备的驱动程序。该驱动程序一旦加载,就可以告诉设备现在使用不同的协议。即:Return 不同的输入报告。

这是一个例子。假设您有一款精美的游戏鼠标,具有三个位移方向(X、Y 和 Z)和六个按钮。由于 OS 正在启动,它可能不知道如何使用该鼠标。因此,制造商创建鼠标使用上面显示的启动协议,直到可以加载驱动程序。一旦加载了知道如何使用三个方向位移和所有六个按钮的驱动程序,它就可以通过控制数据包告诉鼠标,也许还有 SET INTERFACE 命令,现在开始发送不同的报告,现在使用鼠标的全部功能。

所以,只要设备符合 USB 规范, 有一个 class 代码不是用户定义的 (0xFF),设备将被识别,即使是最低限度的使用 and/or 也是为了表明需要驱动程序的声明。

至于自定义设备驱动程序的文件名,这完全取决于设备制造商。然而,通常情况并非如此。通常,OS 将检索包含制造商、设备、协议和其他字段的设备描述符。然后它会将任何驱动程序与这些字段匹配。如果找不到兼容的驱动程序,它会要求一个。

例如,我在研究中使用的一种定点设备具有以下几个字节的 18 字节设备描述符:

  Offset   Field       Value
     0    Length       0x12
     1    Type         0x01
     2    Release Num  0x0110
     4    Device Class 0x00
     5    Sub Class    0x00
     6    Protocol     0x00
     7    MaxPacketSz  0x08
     8    VendorID     0x04FC
    10    Product ID   0x0003
    ...

注意它指定了供应商和产品。使用这两个值,可以找到兼容的驱动程序。

现在,请注意 class 代码为零。这不是错误,是完全有效的 class 代码,只是意味着将使用接口描述符。

因此,希望有了这些信息,特别是设备描述符中的制造商和产品代码,您现在可以了解 OS 如何为任何设备找到正确的驱动程序。