LPC11U USB Stack GCC编译后运行成功

LPCWare 提供的LPC11U USB stack是用keil和IAR编译的,现在要使用gcc编译需要修改,目前已经在gcc下编译通过,HID设备可以枚举成功。

移植:

主要描述符结构体的单字节对齐,keil和GCC方式不一样,因此需要修改:

// Keil下
typedef   __packed   union   {
    uint16_t   W;
    __packed   struct   {
        uint8_t   L;
        uint8_t   H;
    }   WB;
}   WORD_BYTE;

10 // GCC下
11 struct   _WB {
12         uint8_t   L;
13         uint8_t   H;
14 } __attribute__   ((packed));
15
16 typedef   union   _WORD_BYTE   WORD_BYTE;
17 union   _WORD_BYTE {
18     uint16_t   W;
19     struct   _WB   WB;
20 } __attribute__   ((packed));

GCC不支持左值强制类型运算(这点不敢肯定)

1 // Keil
2 (uint8_t   * )pD   + =   ((USB_CONFIGURATION_DESCRIPTOR   * )pD) - > wTotalLength;
3
4 // GCC
5   pD   =     (   USB_COMMON_DESCRIPTOR   * )((uint8_t   * )pD   +   ((USB_CONFIGURATION_DESCRIPTOR   * )pD) - > wTotalLength);

GCC无法做对齐强制类型,以下为keil的方式,GCC下做类似动作是不生效的,问题描述里详细介绍

1 * ((__packed   uint32_t   * )pData)   =   * ((__packed   uint32_t   * )dataptr);

 

 

调试过程遇到几个问题如下:

usb cable连接后无反应,无中断产生

    原因:没有初始化USB PLL
    解决:在SystemInit时初始化USB PLL

usb cable连接后,当USB device设置地址后,就发生device reset

    原因: USB cable power不足,我是连接在usb hub上的
    解决: 直接连电脑

USB setup过程时,发生HardFault:

    原因:
       GCC无法做对齐强制类型: *((__attribute__ ((packed)) uint32_t *)pData) = *((__attribute__ ((packed)) uint32_t *)dataptr);
       当pData或者dataptr的地址不是4对齐(uint32_t对齐),就会发生HardFault,Keil通过属性能在编译过程中处理该问题,GCC没找到类似的方法,那位知道请mail我一下
    解决:修改为memcpy(pData, dataptr, sizeof(uint32_t));

你可能感兴趣的:(LPC11U USB Stack GCC编译后运行成功)