ykeupacl 发表于 2025-4-16 13:09:19

请问能否修改USB描述符,自定义串口名称?

能否修改USB描述符,自定义串口名称?
usb_desc.c里面的描述符,我尝试修改了下,但没有成功,串口识别的都是“USB 串行设备”

国芯人工智能 发表于 2025-4-16 13:12:00

在嵌入式开发中,修改USB描述符以实现自定义串口名称是一个常见的需求。USB描述符是USB设备与主机通信时传递的关键信息,包括设备描述符、配置描述符、接口描述符、端点描述符等。通过修改这些描述符,可以自定义设备在主机上显示的名称、厂商信息、产品ID等。

1. USB描述符的基本结构
USB描述符通常以结构体的形式定义在固件代码中。以常见的USB CDC(Communication Device Class)设备为例,描述符通常包括以下几个部分:
设备描述符(Device Descriptor):描述设备的基本信息,如厂商ID、产品ID、设备版本等。
配置描述符(Configuration Descriptor):描述设备的配置信息,包括接口和端点的配置。
接口描述符(Interface Descriptor):描述设备的接口信息,如接口类、子类、协议等。
端点描述符(Endpoint Descriptor):描述设备的端点信息,如端点地址、传输类型、最大包大小等。
字符串描述符(String Descriptor):描述设备的字符串信息,如厂商名称、产品名称、序列号等。

2. 修改USB描述符的步骤
要修改USB描述符以实现自定义串口名称,通常需要以下几个步骤:

2.1 修改字符串描述符
字符串描述符是用于存储设备名称、厂商名称等字符串信息的部分。要自定义串口名称,首先需要修改字符串描述符中的相关字段。

例如,假设你希望在设备管理器中显示“My Custom Serial Port”作为串口名称,可以在字符串描述符中添加或修改相应的字符串。

c
// 示例:修改字符串描述符
const uint8t CustomStringDescriptor[] = {
    0x1E,// 描述符长度
    0x03,// 字符串描述符类型
    'M', 0x00, 'y', 0x00, ' ', 0x00, 'C', 0x00, 'u', 0x00, 's', 0x00, 't', 0x00, 'o', 0x00, 'm', 0x00,
    ' ', 0x00, 'S', 0x00, 'e', 0x00, 'r', 0x00, 'i', 0x00, 'a', 0x00, 'l', 0x00, ' ', 0x00, 'P', 0x00,
    'o', 0x00, 'r', 0x00, 't', 0x00
};

2.2 更新设备描述符
在设备描述符中,通常会引用字符串描述符的索引。确保设备描述符中的字符串索引指向你修改后的字符串描述符。

c
// 示例:更新设备描述符中的字符串索引
const USBDeviceDescriptorTypeDef DeviceDescriptor = {
    .bLength = sizeof(USBDeviceDescriptorTypeDef),
    .bDescriptorType = USBDESCTYPEDEVICE,
    .bcdUSB = 0x0200,
    .bDeviceClass = 0x02,
    .bDeviceSubClass = 0x00,
    .bDeviceProtocol = 0x00,
    .bMaxPacketSize0 = 64,
    .idVendor = 0x1234,
    .idProduct = 0x5678,
    .bcdDevice = 0x0100,
    .iManufacturer = 0x01,// 厂商字符串索引
    .iProduct = 0x02,       // 产品字符串索引
    .iSerialNumber = 0x03,// 序列号字符串索引
    .bNumConfigurations = 0x01
};

2.3 更新配置描述符
在配置描述符中,确保接口描述符中的字符串索引指向你修改后的字符串描述符。

c
// 示例:更新配置描述符中的字符串索引
const USBConfigDescriptorTypeDef ConfigDescriptor = {
    .bLength = sizeof(USBConfigDescriptorTypeDef),
    .bDescriptorType = USBDESCTYPECONFIGURATION,
    .wTotalLength = sizeof(USBConfigDescriptorTypeDef),
    .bNumInterfaces = 0x01,
    .bConfigurationValue = 0x01,
    .iConfiguration = 0x04,// 配置字符串索引
    .bmAttributes = 0x80,
    .bMaxPower = 0x32,
    .Interface = {
      .bLength = sizeof(USBInterfaceDescriptorTypeDef),
      .bDescriptorType = USBDESCTYPEINTERFACE,
      .bInterfaceNumber = 0x00,
      .bAlternateSetting = 0x00,
      .bNumEndpoints = 0x02,
      .bInterfaceClass = 0x02,
      .bInterfaceSubClass = 0x02,
      .bInterfaceProtocol = 0x01,
      .iInterface = 0x05// 接口字符串索引
    },
    .Endpoint = {
      // 端点描述符
    }
};

3. 验证修改
完成上述修改后,重新编译并烧录固件到设备中。连接设备到主机后,检查设备管理器中的串口名称是否已更新为自定义的名称。

4. 常见问题及解决方法
修改后名称未更新:确保字符串描述符的索引在设备描述符和配置描述符中正确引用。此外,检查字符串描述符的格式是否正确,特别是描述符长度和类型字段。
设备无法识别:如果设备无法被主机识别,可能是描述符结构或内容有误。建议使用USB分析工具(如USBlyzer、Wireshark等)捕获USB通信数据,检查描述符是否正确传递。

5. 总结
通过修改USB描述符中的字符串描述符,并确保设备描述符和配置描述符正确引用这些字符串,可以实现自定义串口名称。在实际操作中,建议仔细检查描述符的结构和内容,确保其符合USB规范。如果遇到问题,可以使用USB分析工具进行调试,以快速定位并解决问题。

希望以上内容能帮助你成功修改USB描述符并实现自定义串口名称。如有进一步问题,欢迎继续交流。

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-4-16 13:25:13


这里的串口名称应该是软件自定义显示的

比如把
PID 01 显示为串口
PID 02 显示为CDC

修改PRODUCTDESC查看设备管理器里的设备描述字符串。可以在你自己的软件里用这个描述符做串口名称

DebugLab 发表于 2025-4-16 13:37:25

可以通过字符串描述符修改设备管理器中显示的

ISP软件中的是固定格式无法修改

ykeupacl 发表于 2025-4-16 22:24:18

ercircle 发表于 2025-4-16 13:25
这里的串口名称应该是软件自定义显示的

比如把


我尝试改过产品描述符了,“总线已报告设备描述”能自由修改,但串口调试软件上的名称还是改不了,我期望的是能修改这个名称{:ciya:}


页: [1]
查看完整版本: 请问能否修改USB描述符,自定义串口名称?