在哪里将用户定义的字符串放在HID设备中?

问题描述 投票:0回答:1

我有一个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 stm32 hid
1个回答
0
投票

不能将数据添加到USB设备描述符,因为它的大小和结构在USB规范中定义。

不过,让您的设备返回一些自定义字符串以响应具有正确索引的“获取字符串描述符”请求是很好的。普通的USB驱动程序无论如何都只会请求设备/接口/配置描述符中引用的dring,因此它们永远不会看到您想要添加的额外字符串。字符串描述符是实现固件版本字符串的好方法。 (顺便说一下,您还应该将固件版本信息放入bcdDevice中。)您将为该字符串选择一个索引号,然后将其硬编码到任何需要读取它的软件中;没有理由试图将该数字强加到描述符中。

您也许可以使用跳线设置设备的“角色”,但是跳线有点像按键或按钮,因此我建议您使用HID协议以某种标准方式报告它们。也许您应该在一个单独的问题中询问它们。

© www.soinside.com 2019 - 2024. All rights reserved.