Usb 在HID设备中的何处放置用户定义的字符串?
我有一个HID设备,我正试图添加两条信息通过USB读取。首先,我希望能够读取编译时创建的固件版本字符串。其次,我希望能够使用两个跳线设置设备的角色,并发送一个0,1,2,3。每种方法的前半部分都工作得很好,我现在被困在应该将这些信息放置在什么位置,以便能够在主机端读取这些信息 我曾考虑将其添加为按钮或类似的数据类型,但这感觉非常粗糙。我也考虑过更改PID或产品字符串,但这些感觉应该在固件更新期间保持不变。我目前的想法是向设备描述符添加自定义字符串Usb 在HID设备中的何处放置用户定义的字符串?,usb,stm32,hid,Usb,Stm32,Hid,我有一个HID设备,我正试图添加两条信息通过USB读取。首先,我希望能够读取编译时创建的固件版本字符串。其次,我希望能够使用两个跳线设置设备的角色,并发送一个0,1,2,3。每种方法的前半部分都工作得很好,我现在被困在应该将这些信息放置在什么位置,以便能够在主机端读取这些信息 我曾考虑将其添加为按钮或类似的数据类型,但这感觉非常粗糙。我也考虑过更改PID或产品字符串,但这些感觉应该在固件更新期间保持不变。我目前的想法是向设备描述符添加自定义字符串 const uint8_t USBD_Devic
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规范中定义 不过,让您的设备返回一些自定义字符串以响应具有正确索引的“Get String Descriptor”请求是可以的。普通USB驱动程序只会请求设备/接口/配置描述符中引用的DRING,因此它们永远不会看到您要添加的额外字符串。字符串描述符是实现固件版本字符串的好方法。(顺便说一下,您还应该将固件版本信息放入bcdDevice中。)您可以为字符串选择一个索引号,然后将该编号硬编码到任何需要读取它的软件中;没有理由试图将该数字强制输入某个描述符中 您可以使用跳线设置设备的“角色”,但跳线有点像键或按钮,因此我建议您使用HID协议以某种标准方式报告它们。也许你应该在另一个问题中询问他们