为什么驱动程序请求 USB 设备发送 USB 描述符?
Why does the driver request the USB device to send the USB descriptors?
据我了解,USB 设备通过向主机发送设备描述符来介绍自己,主机使用描述符中嵌入的信息来查找和加载正确的 driver/drivers。我不明白的是为什么驱动程序需要设备的配置、接口、端点和字符串描述符。我知道描述符将设备描述为一个整体,例如配置数量、接口、端点、类型、数据包的大小、数据包中每个字节的用途等。为什么驱动程序不能从一开始就包含这些信息?为什么 USB 设备会保留此信息?
我想主要原因是因为它是这样设计的。设计师本可以像你说的那样轻易地走另一条路。
可能更有帮助,我能想到几个原因为什么他们确实这样决定:
- 考虑一下 USB 出现的背景。 PC 外设连接一团糟。您有串行 (UART) 端口、PS/2 键盘和鼠标、各种模式的并行端口(例如 ECP 和 EPP)、游戏端口和 MIDI、各种 SCSI 变体等。其中大多数不允许自以标准化方式描述设备,要求为每种类型的设备定制驱动程序,并且主要是手动加载驱动程序。仅设备描述符就可以解决选择正确驱动程序的问题,但不一定能解决每个设备都需要自定义驱动程序的问题。
- 各种标准设备 class 规范(例如 HID、音频)定义了它们自己的 class 特定描述符,用于将设备变体传递给标准驱动程序。仅出于这个原因,广义描述符机制就很有用。
如果没有标准化的接口描述符,- Composite devices 目前的形式实际上是不可能的。您可能必须让每个复合设备都充当连接多个设备的集线器。
- 许多(大多数?)标准设备 class 规范要求实施标准化协议的端点数量最少,(例如,仅批量 USB 大容量存储定义 1 个批量输入和 1 个批量输出端点)虽然设备可以免费添加更多供应商特定的扩展,或者……
- …标准设备 class 或 USB 标准本身的未来扩展,同时保持两种方式的向后兼容性(旧 driver/new 设备,新 driver/old 设备)。想想 UASP 设备回退到常规大容量存储传输。
虽然对于实现所有这些事情并不是绝对必要的,但以这种方式使设备自描述似乎总体上是成功的。
据我了解,USB 设备通过向主机发送设备描述符来介绍自己,主机使用描述符中嵌入的信息来查找和加载正确的 driver/drivers。我不明白的是为什么驱动程序需要设备的配置、接口、端点和字符串描述符。我知道描述符将设备描述为一个整体,例如配置数量、接口、端点、类型、数据包的大小、数据包中每个字节的用途等。为什么驱动程序不能从一开始就包含这些信息?为什么 USB 设备会保留此信息?
我想主要原因是因为它是这样设计的。设计师本可以像你说的那样轻易地走另一条路。
可能更有帮助,我能想到几个原因为什么他们确实这样决定:
- 考虑一下 USB 出现的背景。 PC 外设连接一团糟。您有串行 (UART) 端口、PS/2 键盘和鼠标、各种模式的并行端口(例如 ECP 和 EPP)、游戏端口和 MIDI、各种 SCSI 变体等。其中大多数不允许自以标准化方式描述设备,要求为每种类型的设备定制驱动程序,并且主要是手动加载驱动程序。仅设备描述符就可以解决选择正确驱动程序的问题,但不一定能解决每个设备都需要自定义驱动程序的问题。
- 各种标准设备 class 规范(例如 HID、音频)定义了它们自己的 class 特定描述符,用于将设备变体传递给标准驱动程序。仅出于这个原因,广义描述符机制就很有用。 如果没有标准化的接口描述符,
- Composite devices 目前的形式实际上是不可能的。您可能必须让每个复合设备都充当连接多个设备的集线器。
- 许多(大多数?)标准设备 class 规范要求实施标准化协议的端点数量最少,(例如,仅批量 USB 大容量存储定义 1 个批量输入和 1 个批量输出端点)虽然设备可以免费添加更多供应商特定的扩展,或者……
- …标准设备 class 或 USB 标准本身的未来扩展,同时保持两种方式的向后兼容性(旧 driver/new 设备,新 driver/old 设备)。想想 UASP 设备回退到常规大容量存储传输。
虽然对于实现所有这些事情并不是绝对必要的,但以这种方式使设备自描述似乎总体上是成功的。