This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294KCPDT:Tiva USB 描述符硬编码序列号

Guru**** 2482225 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/717161/tm4c1294kcpdt-tiva-usb-descriptor-hardcoded-serial-number

器件型号:TM4C1294KCPDT

使用 TM4C1294KC 和修订版2.1.1.71的 Tiva USB 库的客户

 

他们 注意到、USB 描述符结构似乎被硬编码为一个3的字符串索引。 这指向硬编码的序列号字符串, 它们不能按单位更改。 因此 ,无法通过 WHQL 序列号测试。

 

我们是否可以将字符串索引设置为0?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Lawrence、

    您能否提供一些更具体的详细信息? 有多个 USB 描述符。 他们能否识别哪一个以及在哪一个文件中? 他们还使用什么 USB 模式? 批量? CDC? 复合?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    拉尔夫

    客户提供:

    此问题与设备描述符 iSerialNumber 有关,我认为它与我们使用的 USB 模式无关,因为这是在设备级别,而不是配置/接口/端点。

    对于描述符的 iSerialNumber 字段、Tiva 代码似乎会自动响应字符串索引0x03、然后操作系统会将存储在索引0x03中的字符串读取为序列号。 从代码结构来看、似乎没有办法通过字符串索引0x03为每个产品提供自己的唯一序列号、因此我们基于 Tiva 的产品报告的序列号都是相同的字符串。

    由于序列号字段不有用、是否可以更改器件描述符、因此 iSerialNumber 的字符串索引为0x0而不是0x3、这意味着没有特定于器件的序列号?


    此致、

    劳伦斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Lawrence、

    感谢您提供有关 iSerialNumber 的详细信息、这有助于我缩小他们描述的内容。

    与他们的想法相反、它与 USB 模式相关、因为它是自己的描述符。 例如、CDC 器件描述符位于 usbdcdcdc.c g_pui8CDCSerDeviceDescriptor 下。 您可以在此处看到产品序列号的硬编码0x03。 HID、MSC、Composite 等都具有相同的0x03设置。 根据我看到的情况、我预计他们在将其更改为0x00时不会遇到任何问题。 但是、对于他们希望在该模式的器件描述符变量中使用的每种模式、他们都需要对其进行更改。

    例如、再次使用 g_pui8CDCSerDeviceDescriptor、这就是它在 usbdcdc.c 中的外观:

    //
    //
    //设备描述符。 它存储在 RAM 中、以便允许
    在运行时根据客户端的要求更改多个字段。
    ////
    *****************
    uint8_t g_pui8CDCSerDeviceDescriptor[]=
    {
    18、 //此结构的大小。
    USB_DTYPE_DEVICE、 //此结构的类型。
    USBShort (0x110)、 // USB 版本1.1 (如果我们说2.0、主机
    //假设高速-请参阅 USB 2.0规范
    // 9.2.6.6)
    USB_class_CDC、 // USB 器件类(规范5.1.1)
    0、 // USB 器件子类(规范5.1.1)
    USB_CDC_Protocol_none、 // USB 器件协议(规范5.1.1)
    64、 //默认管道的最大包大小。
    USBShort (0)、 //供应商 ID (在期间填写
    // USBDCDCInit)。
    USBShort (0)、 //产品 ID (在期间填写)
    // USBDCDCInit)。
    USBShort (0x100)、 //设备版本 BCD。
    1、 //制造商字符串标识符。
    2、 //产品字符串标识符。
    3、 //产品序列号。
    1 //配置数量。
    }; 

    因此、他们需要更改行:

    3、 //产品序列号。
    

    这是 iSerialNumber、可以通过查看 usblib.h 中的设备描述符定义来验证它:

    //
    //
    //! 此结构描述了 USB
    //!中定义的 USB 设备描述符 2.0规范第9.1.1节。
    ////
    *****************
    typedef 结构
    {
    //
    //! 该描述符的长度(以字节为单位)。 所有器件描述符都是
    //! 18字节长。
    //
    uint8_t bLength;
    
    //
    //! 描述符的类型。 对于器件描述符、这将是
    //! USB_DTYPE_DEVICE (1)。
    //
    uint8_t b 描述符类型;
    
    //
    //! BCD 格式的 USB 规范版本号。 对于 USB 2.0、这是
    //! 将是0x0200。
    //
    uint16_t bcdusb;
    
    //
    //! 器件类代码。
    //
    uint8_t bDeviceClass;
    
    //
    //! 器件子类代码。 此值限定中的值
    //! b DeviceClass 字段。
    //
    uint8_t bDeviceSubClass;
    
    //
    //! 器件协议代码。 该值由的值限定
    //! bDeviceClass 和 bDeviceSubClass。
    //
    uint8_t bDeviceProtocol;
    
    //
    //! 端点0的最大数据包大小。 有效值为8、16、32
    //! 和64。
    //
    uint8_t bMaxPacketSize0;
    
    //
    //! 由 USB-IF 分配的器件供应商 ID (VID)。
    //
    uint16_t idVendor;
    
    //
    //! 由制造商分配的器件产品 ID (PID)。
    //
    uint16_t idProduct;
    
    //
    //! BCD 格式的器件版本号。
    //
    uint16_t bcdDevice;
    
    //
    //! 描述制造商的字符串描述符的索引。
    //
    uint8_t 制造商;
    
    //
    //! 描述产品的字符串描述符的索引。
    //
    uint8_t iProduct;
    
    //
    //! 描述器件串行的字符串描述符的索引
    //! 数字。
    //
    uint8_t iSerialNumber;
    
    //
    //! 器件提供的可能配置的数量。 这种情况
    //! 字段表示不同配置描述符的数量
    //! 器件提供的功能。
    //
    uint8_t bNumConfigurations;
    }
    packed tDeviceDescriptor; 

    希望这些信息能帮助他们解决问题。