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.

[参考译文] 编译器/OMAP-L138:将 USB 文件添加到引导加载程序时出错

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/660293/compiler-omap-l138-error-while-adding-usb-files-to-bootloader

器件型号:OMAP-L138

工具/软件:TI C/C++编译器

我有一个在 ARM 中工作正常的 USB 代码,现在我想将其集成到引导加载程序中,不幸的是,当我将库和一些与 USB 相关的其他头文件复制到引导加载程序项目时,它显示了很多错误。 任何帮助都将得到批准

此致

安东尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    //
    //
    //! 此结构描述了通用描述符标头。 这些字段为//
    ! 所有有效 USB 描述符的开头。
    ////
    *****************
    typedef 结构
    {
    //
    //! 表示的此描述符的长度(包括此长度字节)
    //! 以字节为单位。
    //
    unsigned char bLength;
    
    //
    //! 描述符的类型标识符、其信息紧随其后。 原因
    //! 标准描述符、例如、此字段可以包含
    //! USB_DTYPE_DEVICE 来标识器件描述符或 USB_DTYPE_终结 点
    //! 以标识端点描述符。
    //
    无符号字符 bDescriptionType;
    }
    USBLIB_packed tDescriptionorHeader;
    
    //*********
    //
    //! 此结构描述了 USB
    //!中定义的 USB 设备描述符 2.0规范第9.1.1节。
    ////
    *****************
    typedef 结构
    {
    //
    //! 该描述符的长度(以字节为单位)。 所有器件描述符都是
    //! 18字节长。
    //
    unsigned char bLength;
    
    //
    //! 描述符的类型。 对于器件描述符、这将是
    //! USB_DTYPE_DEVICE (1)。
    //
    unsigned char b 描述符类型;
    
    //
    //! BCD 格式的 USB 规范版本号。 对于 USB 2.0、这是
    //! 将是0x0200。
    //
    unsigned short bcdusb;
    
    //
    //! 器件类代码。
    //
    unsigned char bDeviceClass;
    
    //
    //! 器件子类代码。 此值限定中的值
    //! b DeviceClass 字段。
    //
    unsigned char bDeviceSubClass;
    
    //
    //! 器件协议代码。 该值由的值限定
    //! bDeviceClass 和 bDeviceSubClass。
    //
    unsigned char bDeviceProtocol;
    
    //
    //! 端点0的最大数据包大小。 有效值为8、16、32
    //! 和64。
    //
    unsigned char bMaxPacketSize0;
    
    //
    //! 由 USB-IF 分配的器件供应商 ID (VID)。
    //
    无符号短整型 idVendor;
    
    //
    //! 由制造商分配的器件产品 ID (PID)。
    //
    无符号短整型 idProduct;
    
    //
    //! BCD 格式的器件版本号。
    //
    unsigned short bcdDevice;
    
    //
    //! 描述制造商的字符串描述符的索引。
    //
    unsigned char 制造商;
    
    //
    //! 描述产品的字符串描述符的索引。
    //
    unsigned char iProduct;
    
    //
    //! 描述器件串行的字符串描述符的索引
    //! 数字。
    //
    unsigned char iSerialNumber;
    
    //
    //! 器件提供的可能配置的数量。 这种情况
    //! 字段表示不同配置描述符的数量
    //! 器件提供的功能。
    //
    unsigned char bNumConfigurations;
    }
    USBLIB_packed tDeviceDescriptor;
    
    //*************
    ////
    tDeviceDescriptor.bDeviceClass 字段中使用的 USB Device Class 代码。
    // bDeviceSubClass 和 bDeviceProtocol 字段的定义是特定于器件
    的//并可在相应的器件类头文件中找到。
    ////
    *****************
    #define USB_class_device 0x00
    #define USB_class_audio 0x01
    #define USB_class_CDC 0x02
    #define USB_class_HID 0x03
    #define USB_class_physical 0x05
    #define USB_class_image 0x06
    #define USB_class_printer 0x07
    #define USB_class_mass_storage 0x08
    #define USB_class_hub 0x09
    #define USB_class_CDC_data 0x0A
    #define USB_class_smart_card 0x0B
    #define USB_class_security 0x0D
    #define USB_class_video 0x0E
    #define USB_class_health医护0x0F
    #define USB_class_DIAG_device 0xdc
    #define USB_class_wireless 0xe0
    #define USB_class_misc 0xef
    #define USB_class_app_specific 0xFE
    #define USB_class_vend_specific 0xff
    #define USB_class_events 0xFFFFFFFF
    
    //*********
    //
    ////未定义子类和协议的通用值。
    ////
    *****************
    #define USB_subclass_undefined 0x00
    #define USB_Protocol_undefined 0x00
    
    //*********
    //
    //以下是其他子类值。
    ////
    *****************
    #define USB_MISC_SUBCLASS_SYNC 0x01
    #define USB_MISC_SUBCLASS_COMMON 0x02
    
    //*********
    //
    //以下是其他协议值。
    ////
    *****************
    #define USB_MISC_PROTOCOL_IAD 0x01
    
    //*********
    //
    //! 此结构描述
    了//!中定义的 USB 器件限定符描述符 USB 2.0规范、第9.2.2节。
    ////
    *****************
    typedef 结构
    {
    //
    //! 该描述符的长度(以字节为单位)。 所有器件限定符
    //! 描述符的长度为10字节。
    //
    unsigned char bLength;
    
    //
    //! 描述符的类型。 对于器件描述符、这将是
    //! USB_DTYPE_DEVICE_QUAL (6)。
    //
    unsigned char b 描述符类型;
    
    //
    //! BCD 格式的 USB 规范版本号。 对于 USB 2.0、这是
    //! 将是0x0200。
    //
    unsigned short bcdusb;
    
    //
    //! 器件类代码。
    //
    unsigned char bDeviceClass;
    
    //
    //! 器件子类代码。 此值限定中的值
    //! b DeviceClass 字段。
    //
    unsigned char bDeviceSubClass;
    
    //
    //! 器件协议代码。 该值由的值限定
    //! bDeviceClass 和 bDeviceSubClass。
    //
    unsigned char bDeviceProtocol;
    
    //
    //! 端点0以某种速度运行时的最大数据包大小
    //! 而不是高速。
    //
    unsigned char bMaxPacketSize0;
    
    //
    //! 支持的其他速度配置的数量。
    //
    unsigned char bNumConfigurations;
    
    //
    //! 保留供将来使用。 必须设置为零。
    //
    unsigned char b 保留;
    }
    USBLIB_packed tDeviceQualifierDescriptor;
    
    //*********
    //
    //! 此结构描述
    了//!中定义的 USB 配置描述符 USB 2.0规范第9.6.3节。 此结构也适用于
    //! 第9.4.4节中定义的 USB 其他速度配置描述符。
    ////
    *****************
    typedef 结构
    {
    //
    //! 该描述符的长度(以字节为单位)。 所有配置描述符
    //! 为9字节长。
    //
    unsigned char bLength;
    
    //
    //! 描述符的类型。 对于配置描述符、这将是
    //! 为 USB_DTYPE_CONFIGURATION (2)。
    //
    unsigned char b 描述符类型;
    
    //
    //! 为此配置返回的数据总长度。 这种情况
    //! 包括所有描述符的组合长度(配置、
    //! 为此返回的接口、端点和类或供应商特定)
    //! 配置。
    //
    无符号短整型 wTotalLength;
    
    //
    //! 此配置支持的接口数。
    //
    unsigned char bNumInterfaces;
    
    //
    //! 用作 SetConfiguration 标准请求参数的值
    //! 以选择此配置。
    //
    unsigned char bConfigurationValue;
    
    //
    //! 描述此配置的字符串描述符的索引。
    //
    unsigned char iConfiguration;
    
    //
    //! 配置的属性。
    //
    unsigned bmchar Attributes;
    
    //
    //! USB 器件在这种情况下的最大总线功耗
    //! 在器件完全运行时进行配置。 这表示
    //! 以2mA 为单位、例如、100表示200mA。
    //
    unsigned char bMaxPower;
    }
    USBLIB_packed tConfigDescriptor;
    
    //*************
    //
    //构建分配给字段的值时使用的标志
    // tConfigDescriptor.bmAttributes。 请注意、位7是保留的并且必须被设定
    //为1。
    ////
    *****************
    #define USB_CONF_ATTR_PWR_M 0xC0
    
    #define USB_CONF_ATTR_SELF 0xC0
    #define USB_CONF_ATTR_BUS_PWR 0x80
    #define USB_CONF_ATTR_RWAKE 0xA0
    
    //*********
    //
    //! 此结构描述了 USB
    //!中定义的 USB 接口描述符 2.0规范第9.6.5节。
    ////
    *****************
    typedef 结构
    {
    //
    //! 该描述符的长度(以字节为单位)。 所有接口描述符
    //! 为9字节长。
    //
    unsigned char bLength;
    
    //
    //! 描述符的类型。 对于接口描述符、这将是
    //! 应为 USB_DTYPE_interface (4)。
    //
    unsigned char b 描述符类型;
    
    //
    //! 该接口的编号。 这是中的一个基于零的索引
    //! 此配置支持的并发接口阵列。
    //
    unsigned char bInterfaceNumber;
    
    //
    //! 用于为接口选择此备用设置的值
    //! 在 bInterfaceNumber 中定义。
    //
    unsigned char bAlternateSetting;
    
    //
    //! 此接口使用的端点数量(不包括端点)
    //! 零)。
    //
    unsigned char bNumEndpoints;
    
    //
    //! 由 USB-IF 分配的接口类代码。
    //
    unsigned char bInterfaceClass;
    
    //
    //! 由 USB-IF 分配的接口子类代码。
    //
    unsigned char bInterfaceSubClass;
    
    //
    //! 由 USB-IF 分配的接口协议代码。
    //
    unsigned char bInterfaceProtocol;
    
    //
    //! 描述此接口的字符串描述符的索引。
    //
    unsigned char iInterface;
    }
    USBLIB_packed tInterfaceDescriptor;
    
    //*********
    //
    //! 这个结构描述了 USB
    //!中定义的 USB 端点描述符 2.0规范第9.6.6节。
    ////
    *****************
    typedef 结构
    {
    //
    //! 该描述符的长度(以字节为单位)。 所有端点描述符
    //! 为7字节长。
    //
    unsigned char bLength;
    
    //
    //! 描述符的类型。 对于端点描述符、这将是
    //! 应为 USB_DTYPE_终结 点(5)。
    //
    unsigned char b 描述符类型;
    
    //
    //! 端点的地址。 此位域包含端点号
    //! 使用标志 USB_EP_DESC_OUT 或 USB_EP_DESC_IN 进行 OR 运算以指示
    //! 端点方向。
    //
    unsigned char bEndpointAddress;
    
    //
    //! 端点传输类型 USB_EP_ATTR_CONTROL、USB_EP_ATTR_ISOC
    //! USB_EP_ATTR_BULK 或 USB_EP_ATTR_INT、如果等时、则为附加
    //! 指示使用类型和同步方法的标志。
    //
    unsigned bmchar Attributes;
    
    //
    //! 此端点能够发送或的最大数据包大小
    //! 选择此配置时接收。 用于高速
    //! 等时端点或中断端点、位11和位12用于
    //! 传递附加信息。
    //
    unsigned short wMaxPacketSize;
    
    //
    //! 以帧或表示的数据传输的轮询间隔
    //! 微帧、具体取决于运行速度。
    //
    unsigned char bInterval;
    }
    USBLIB_packed tEndpointDescriptor;
    
    //*************
    //
    //构建分配给字段的值时使用的标志
    // tEndpointDescriptor.bEndpointAddress。
    ////
    *****************
    #define USB_EP_DESC_OUT 0x00
    #define USB_EP_DESC_IN 0x80
    #define USB_EP_DESC_NUM_M 0x0F
    
    //*********
    //
    //掩码用于从
    端点描述符的// wMaxPacketSize 字段中提取最大包大小(以字节为单位)。
    ////
    *****************
    #define USB_EP_MAX_PACKE_COUNT_M 0x07FF
    
    //*********
    //
    //// tEndpointDescriptor.bmAttributes 中使用的 Endpoint 属性。
    ////
    *****************
    #define USB_EP_ATTR_CONTROL 0x00
    #define USB_EP_ATTR_ISOC 0x01
    #define USB_EP_ATTR_BULK 0x02
    #define USB_EP_ATTR_INT 0x03
    #define USB_EP_ATTR_TYPE_M 0x03
    
    #define USB_EP_ATTR_ISOC_M 0x0C
    #define USB_EP_ATTR_ISOC_NOSYNC 0x00
    #define USB_EP_ATTR_ISOC_异 步 0x04
    #define USB_EP_ATTR_ISOC_ADAPE 0x08
    #define USB_EP_ATTR_ISOC_SYNC 0x0C
    #define USB_EP_ATTR_USAGE_M 0x30
    #define USB_EP_ATTR_USAGE_DATA 0x00
    #define USB_EP_ATTR_USAGE_FEEDBACK 0x10
    #define USB_EP_ATTR_USAGE_IMPFEEDBACK 0x20
    
    //*********
    //
    //! 此结构描述了定义
    的索引0的 USB 字符串描述符//! USB 2.0规范第9.6-7节中的说明。 请注意、语言数量
    //! IDS 是可变的、可以通过检查 bLength 来确定。
    //!的数量 描述符中存在的语言 ID 由(((bLength - 2)/2)给出。
    ////
    *****************
    typedef 结构
    {
    //
    //! 该描述符的长度(以字节为单位)。 该值将会变化
    //! 具体取决于描述符中提供的语言代码的数量。
    //
    unsigned char bLength;
    
    //
    //! 描述符的类型。 对于字符串描述符、这将是
    //! USB_DTYPE_STRING (3)。
    //
    unsigned char b 描述符类型;
    
    //
    //! 第一种支持的语言的语言代码(LANGID)。 请注意
    //! 此描述符可能支持多种语言、在这种情况下、为
    //! wLANGID 数组中的元素数量将增加、bLength 将增加
    //! 进行相应更新。
    //
    无符号短整型 wLANGID[1];
    }
    USBLIB_packed tString0描述符;
    
    //*************
    //
    //! 此结构描述了所有字符串索引的 USB 字符串描述符
    //! USB 2.0规范第9.6-7节中定义的0以外的其他参数。
    ////
    *****************
    typedef 结构
    {
    //
    //! 该描述符的长度(以字节为单位)。 该值将会增加2
    //! 构成 Unicode 字符串的字节数
    //! 描述符包含。
    //
    unsigned char bLength;
    
    //
    //! 描述符的类型。 对于字符串描述符、这将是
    //! USB_DTYPE_STRING (3)。
    //
    unsigned char b 描述符类型;
    
    //
    //! Unicode 字符串的第一个字节。 此字符串不为 NULL
    //! 已终止。 其长度(以字节为单位)可通过减去2来计算
    //! 从 bLength 域中的值中删除。
    //
    unsigned char bString;
    }
    USBLIB_packed tStringDescriptor; 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    团队将收到通知。 他们将直接在此处发布反馈。

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

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

    Anthony、

    您似乎正在开发自己的代码或使用 Starterware 提供的 USBLIB 进行开发。 您能确认一下。

    • 如果您没有使用 Starterware,请说明您使用的软件包是什么?
    • 您尝试从哪种引导模式进行引导?
    • 请详细说明您尝试引导加载应用程序的过程。

    如果您使用的是 Starterware、我建议您查看此处所述的闪存和引导加载过程以加载和运行您的应用程序:

    此致、

    Rahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,Rahul
    实际上、问题出在构建设置中、未选择语言选项、我将其更改为"宽松解析(非严格 ANSI)(--relaxed_ansi、-pr)"。 最终所有的错误都消失了:)
    感谢您付出的时间和努力...

    谢谢、此致
    安东尼