我有一个HID设备,我正在尝试添加两条要通过USB读取的信息。首先,我希望能够读取在编译时创建的固件版本字符串。其次,我希望能够使用两个跳线来设置设备的角色,并发送一个0、1、2、3。每个选项的前半部分都工作正常,我现在停留在应该将这些信息准确放置在主机端的位置。
我已经考虑过将它添加为按钮或类似按钮这样的数据类型,但这感觉很hacky。我也考虑过更改PID或Product字符串,但是这些感觉在固件更新中应该保持不变。我目前的做法是在设备描述符中添加一个自定义字符串。
const uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] =
{
0x12, /*bLength */
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
0x00, /*bcdUSB */
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
0x00, /*bDeviceProtocol*/
USB_MAX_EP0_SIZE, /*bMaxPacketSize*/
LOBYTE(USBD_VID), /*idVendor*/
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID), /*idProduct*/
HIBYTE(USBD_PID), /*idProduct*/
0x00, /*bcdDevice fw revision */
0x01,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
USBD_CFG_MAX_NUM /*bNumConfigurations*/
} ; /* USB_DeviceDescriptor */
然后我会添加类似的内容:
USBD_IDX_USR_STR /*Index of custom user string*/
这可以接受吗?如果是这样,我如何让主机知道设备描述符中这个新字节的含义?是否有某种元描述符定义每个设备描述符的字节偏移量?]
如果不可接受,我应该在哪里放置类似固件版本或角色的字符串?
不能将数据添加到USB设备描述符,因为它的大小和结构在USB规范中定义。
不过,让您的设备返回一些自定义字符串以响应具有正确索引的“获取字符串描述符”请求是很好的。普通的USB驱动程序无论如何都只会请求设备/接口/配置描述符中引用的dring,因此它们永远不会看到您想要添加的额外字符串。字符串描述符是实现固件版本字符串的好方法。 (顺便说一下,您还应该将固件版本信息放入bcdDevice中。)您将为该字符串选择一个索引号,然后将其硬编码到任何需要读取它的软件中;没有理由试图将该数字强加到描述符中。
您也许可以使用跳线设置设备的“角色”,但是跳线有点像按键或按钮,因此我建议您使用HID协议以某种标准方式报告它们。也许您应该在一个单独的问题中询问它们。