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.

ek-tm4c123gxl usb_dev_serial example not working with gnu toolchain

Other Parts Discussed in Thread: TM4C123GH6PM

Hello

I am trying to compile the usb_dev_serial example from tiva_ware release 2.1.0.12573 with GCC and it's not working.

The code compile correctly, but I have a runtime error leading to the FaultISR() handler.

The same code compile and work correctly with the TI compiler.

I use Code Composer Studio 6.0.1 with the embedded TI v5.1.8 compiler and Linaro 4.7.4.

Did someone have it work with the GNU toolchain ?

Here is an archive of the project. It is basically the usb_dev_serial example from the SDK, with an added target "Debug_GNU" which uses the linaro compiler.

The "Debug" target, which work perfectly, uses TI 1.5.8.

usb_dev_serial_123gxl_gnu_ccs6.zip

  • Hello Rosi

    When the FaultISR is triggered can you check the FAULTSTAT and FAULTADDR register. Each compiler has it's nuances so an optimization may cause it to behave differently

    Regards
    Amit
  • Hello Amit
    Here are the values of these two registers :

    NVIC_FAULT_STAT 0x00008200
    NVIC_FAULT_ADDR 0x00720073

    NVIC_FAULT_STAT has these bits set:
    NVIC_FAULT_STAT_BFARV 1 Bus Fault Address Register Valid
    NVIC_FAULT_STAT_PRECISE 1 Precise Data Bus Error

    The memory browser is not able to open address 0x00720073. I think it's out of RAM.

    By importing the whole USBlib in my project and compiling the code, I was able to trace the problem to an incorrectly initialized structure in usb_serial_structs.h :

    tUSBDCDCDevice g_sCDCDevice =
    {
    USB_VID_TI_1CBE,
    USB_PID_SERIAL,
    0,
    USB_CONF_ATTR_SELF_PWR,
    ControlHandler,
    (void *)&g_sCDCDevice,
    USBBufferEventCallback,
    (void *)&g_sRxBuffer,
    USBBufferEventCallback,
    (void *)&g_sTxBuffer,
    g_ppui8StringDescriptors,
    NUM_STRING_DESCRIPTORS
    };

    This structure is not correcly initialized on startup by GCC. Changing the declaration to :
    const tUSBDCDCDevice g_sCDCDevice

    Corrected this initialisation problem but leds to other problem : with the program running, if I plug the USB device cable on my laptop, this crashes the USB stack of Ubuntu :
    $dmesg
    ...
    [24961.071214] usb 3-3.3: new full-speed USB device number 17 using xhci_hcd
    [24966.077094] xhci_hcd 0000:00:14.0: Timeout while waiting for address device command
    [24966.113113] xhci_hcd 0000:00:14.0: xHCI host not responding to stop endpoint command.
    [24966.113119] xhci_hcd 0000:00:14.0: Assuming host is dying, halting host.
    [24966.113168] xhci_hcd 0000:00:14.0: HC died; cleaning up
    [24971.287312] xhci_hcd 0000:00:14.0: Timeout while waiting for address device command
    [24971.287316] xhci_hcd 0000:00:14.0: Abort the command ring, but the xHCI is dead.
    [24971.491545] usb 3-3.3: device not accepting address 17, error -108
    [24976.497560] xhci_hcd 0000:00:14.0: Timeout while waiting for a slot
    [24976.497571] xhci_hcd 0000:00:14.0: Abort the command ring, but the xHCI is dead.
    [24981.503529] xhci_hcd 0000:00:14.0: Timeout while waiting for a slot
    [24981.503534] xhci_hcd 0000:00:14.0: Abort the command ring, but the xHCI is dead.
    [24986.509511] xhci_hcd 0000:00:14.0: Timeout while waiting for a slot
    [24986.509519] xhci_hcd 0000:00:14.0: Abort the command ring, but the xHCI is dead.
    ...

    Then, I need to reboot my computer to have USB working again.

    This seems to indicate the USBlib is not working either, but make debugging a LOT more difficult as this completely stop all USB operation on the computer.

    Any idea ?
  • Hello Rossi

    Can you please share your code as zip package that can be imported in CodeSourcery?

    Regards
    Amit
  • I posted the code with my question.

  • Hi Amit, I feel like you need a break, user posted all details on first post then detailed to a deep level real issue, Yes is unbelievable but sign of weakness are subtle, CCS not Code Sourcery. Amit, we like your job and all help you give us but please also take care of you. ;)
  • Hello Rossi

    The original zip file does not have the Interrupt Handler for SysTick, UART and USB. So I am not sure if the zip file is in sync with your modified code base.

    Hello Roberto,

    I agree...

    Regards
    Amit
  • Dear Amit, Thank you for your help.

    First, the ZIP file was added as an edit in my first question, you haven't missed a thing ;-)

    You are right, the ISR handler are not configured in the ZIP. This is because I started again from scratch to upload you a clean version of the project and forgot this part.

    The corrected file is joined in this reply. This has however no impact on the problem : the program goes straight to FaultISR() handler during USB initialization.

    I hope you can help me because I really don't have a clue...

    //*****************************************************************************
    //
    // Startup code for use with TI's Code Composer Studio and GNU tools.
    //
    // Copyright (c) 2011-2014 Texas Instruments Incorporated.  All rights reserved.
    // Software License Agreement
    // 
    // Software License Agreement
    //
    // Texas Instruments (TI) is supplying this software for use solely and
    // exclusively on TI's microcontroller products. The software is owned by
    // TI and/or its suppliers, and is protected under applicable copyright
    // laws. You may not combine this software with "viral" open-source
    // software in order to form a larger program.
    //
    // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
    // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
    // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
    // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
    // DAMAGES, FOR ANY REASON WHATSOEVER.
    //
    //*****************************************************************************
    
    #include <stdint.h>
    
    //*****************************************************************************
    //
    // Forward declaration of the default fault handlers.
    //
    //*****************************************************************************
    void ResetISR(void);
    static void NmiSR(void);
    static void FaultISR(void);
    static void IntDefaultHandler(void);
    
    #ifndef HWREG
    #define HWREG(x) (*((volatile uint32_t *)(x)))
    #endif
    
    //*****************************************************************************
    //
    // The entry point for the application.
    //
    //*****************************************************************************
    extern int main(void);
    
    //*****************************************************************************
    //
    // Reserve space for the system stack.
    //
    //*****************************************************************************
    static uint32_t pui32Stack[256];
    
    //*****************************************************************************
    //
    // External declarations for the interrupt handlers used by the application.
    //
    //*****************************************************************************
    extern void SysTickIntHandler(void);
    extern void USBUARTIntHandler(void);
    extern void USB0DeviceIntHandler(void);
    
    //*****************************************************************************
    //
    // The vector table.  Note that the proper constructs must be placed on this to
    // ensure that it ends up at physical address 0x0000.0000 or at the start of
    // the program if located at a start address other than 0.
    //
    //*****************************************************************************
    __attribute__ ((section(".isr_vector")))
    void (* const g_pfnVectors[])(void) =
    {
        (void (*)(void))((uint32_t)pui32Stack + sizeof(pui32Stack)),
                                                // The initial stack pointer
        ResetISR,                               // The reset handler
        NmiSR,                                  // The NMI handler
        FaultISR,                               // The hard fault handler
        IntDefaultHandler,                      // The MPU fault handler
        IntDefaultHandler,                      // The bus fault handler
        IntDefaultHandler,                      // The usage fault handler
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // SVCall handler
        IntDefaultHandler,                      // Debug monitor handler
        0,                                      // Reserved
        IntDefaultHandler,                      // The PendSV handler
        SysTickIntHandler,                      // The SysTick handler
        IntDefaultHandler,                      // GPIO Port A
        IntDefaultHandler,                      // GPIO Port B
        IntDefaultHandler,                      // GPIO Port C
        IntDefaultHandler,                      // GPIO Port D
        IntDefaultHandler,                      // GPIO Port E
        USBUARTIntHandler,                      // UART0 Rx and Tx
        IntDefaultHandler,                      // UART1 Rx and Tx
        IntDefaultHandler,                      // SSI0 Rx and Tx
        IntDefaultHandler,                      // I2C0 Master and Slave
        IntDefaultHandler,                      // PWM Fault
        IntDefaultHandler,                      // PWM Generator 0
        IntDefaultHandler,                      // PWM Generator 1
        IntDefaultHandler,                      // PWM Generator 2
        IntDefaultHandler,                      // Quadrature Encoder 0
        IntDefaultHandler,                      // ADC Sequence 0
        IntDefaultHandler,                      // ADC Sequence 1
        IntDefaultHandler,                      // ADC Sequence 2
        IntDefaultHandler,                      // ADC Sequence 3
        IntDefaultHandler,                      // Watchdog timer
        IntDefaultHandler,                      // Timer 0 subtimer A
        IntDefaultHandler,                      // Timer 0 subtimer B
        IntDefaultHandler,                      // Timer 1 subtimer A
        IntDefaultHandler,                      // Timer 1 subtimer B
        IntDefaultHandler,                      // Timer 2 subtimer A
        IntDefaultHandler,                      // Timer 2 subtimer B
        IntDefaultHandler,                      // Analog Comparator 0
        IntDefaultHandler,                      // Analog Comparator 1
        IntDefaultHandler,                      // Analog Comparator 2
        IntDefaultHandler,                      // System Control (PLL, OSC, BO)
        IntDefaultHandler,                      // FLASH Control
        IntDefaultHandler,                      // GPIO Port F
        IntDefaultHandler,                      // GPIO Port G
        IntDefaultHandler,                      // GPIO Port H
        IntDefaultHandler,                      // UART2 Rx and Tx
        IntDefaultHandler,                      // SSI1 Rx and Tx
        IntDefaultHandler,                      // Timer 3 subtimer A
        IntDefaultHandler,                      // Timer 3 subtimer B
        IntDefaultHandler,                      // I2C1 Master and Slave
        IntDefaultHandler,                      // Quadrature Encoder 1
        IntDefaultHandler,                      // CAN0
        IntDefaultHandler,                      // CAN1
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // Hibernate
        USB0DeviceIntHandler,                   // USB0
        IntDefaultHandler,                      // PWM Generator 3
        IntDefaultHandler,                      // uDMA Software Transfer
        IntDefaultHandler,                      // uDMA Error
        IntDefaultHandler,                      // ADC1 Sequence 0
        IntDefaultHandler,                      // ADC1 Sequence 1
        IntDefaultHandler,                      // ADC1 Sequence 2
        IntDefaultHandler,                      // ADC1 Sequence 3
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // GPIO Port J
        IntDefaultHandler,                      // GPIO Port K
        IntDefaultHandler,                      // GPIO Port L
        IntDefaultHandler,                      // SSI2 Rx and Tx
        IntDefaultHandler,                      // SSI3 Rx and Tx
        IntDefaultHandler,                      // UART3 Rx and Tx
        IntDefaultHandler,                      // UART4 Rx and Tx
        IntDefaultHandler,                      // UART5 Rx and Tx
        IntDefaultHandler,                      // UART6 Rx and Tx
        IntDefaultHandler,                      // UART7 Rx and Tx
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // I2C2 Master and Slave
        IntDefaultHandler,                      // I2C3 Master and Slave
        IntDefaultHandler,                      // Timer 4 subtimer A
        IntDefaultHandler,                      // Timer 4 subtimer B
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // Timer 5 subtimer A
        IntDefaultHandler,                      // Timer 5 subtimer B
        IntDefaultHandler,                      // Wide Timer 0 subtimer A
        IntDefaultHandler,                      // Wide Timer 0 subtimer B
        IntDefaultHandler,                      // Wide Timer 1 subtimer A
        IntDefaultHandler,                      // Wide Timer 1 subtimer B
        IntDefaultHandler,                      // Wide Timer 2 subtimer A
        IntDefaultHandler,                      // Wide Timer 2 subtimer B
        IntDefaultHandler,                      // Wide Timer 3 subtimer A
        IntDefaultHandler,                      // Wide Timer 3 subtimer B
        IntDefaultHandler,                      // Wide Timer 4 subtimer A
        IntDefaultHandler,                      // Wide Timer 4 subtimer B
        IntDefaultHandler,                      // Wide Timer 5 subtimer A
        IntDefaultHandler,                      // Wide Timer 5 subtimer B
        IntDefaultHandler,                      // FPU
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // I2C4 Master and Slave
        IntDefaultHandler,                      // I2C5 Master and Slave
        IntDefaultHandler,                      // GPIO Port M
        IntDefaultHandler,                      // GPIO Port N
        IntDefaultHandler,                      // Quadrature Encoder 2
        0,                                      // Reserved
        0,                                      // Reserved
        IntDefaultHandler,                      // GPIO Port P (Summary or P0)
        IntDefaultHandler,                      // GPIO Port P1
        IntDefaultHandler,                      // GPIO Port P2
        IntDefaultHandler,                      // GPIO Port P3
        IntDefaultHandler,                      // GPIO Port P4
        IntDefaultHandler,                      // GPIO Port P5
        IntDefaultHandler,                      // GPIO Port P6
        IntDefaultHandler,                      // GPIO Port P7
        IntDefaultHandler,                      // GPIO Port Q (Summary or Q0)
        IntDefaultHandler,                      // GPIO Port Q1
        IntDefaultHandler,                      // GPIO Port Q2
        IntDefaultHandler,                      // GPIO Port Q3
        IntDefaultHandler,                      // GPIO Port Q4
        IntDefaultHandler,                      // GPIO Port Q5
        IntDefaultHandler,                      // GPIO Port Q6
        IntDefaultHandler,                      // GPIO Port Q7
        IntDefaultHandler,                      // GPIO Port R
        IntDefaultHandler,                      // GPIO Port S
        IntDefaultHandler,                      // PWM 1 Generator 0
        IntDefaultHandler,                      // PWM 1 Generator 1
        IntDefaultHandler,                      // PWM 1 Generator 2
        IntDefaultHandler,                      // PWM 1 Generator 3
        IntDefaultHandler                       // PWM 1 Fault
    };
    
    //*****************************************************************************
    //
    // The following are constructs created by the linker, indicating where the
    // the "data" and "bss" segments reside in memory.  The initializers for the
    // for the "data" segment resides immediately following the "text" segment.
    //
    //*****************************************************************************
    extern uint32_t __etext;
    extern uint32_t __data_start__;
    extern uint32_t __data_end__;
    extern uint32_t __bss_start__;
    extern uint32_t __bss_end__;
    
    //*****************************************************************************
    //
    // This is the code that gets called when the processor first starts execution
    // following a reset event.  Only the absolutely necessary set is performed,
    // after which the application supplied entry() routine is called.  Any fancy
    // actions (such as making decisions based on the reset cause register, and
    // resetting the bits in that register) are left solely in the hands of the
    // application.
    //
    //*****************************************************************************
    void
    ResetISR(void)
    {
        uint32_t *pui32Src, *pui32Dest;
    
        //
        // Copy the data segment initializers from flash to SRAM.
        //
        pui32Src = &__etext;
        for(pui32Dest = &__data_start__; pui32Dest < &__data_end__; )
        {
            *pui32Dest++ = *pui32Src++;
        }
    
        //
        // Zero fill the bss segment.
        //
        __asm("    ldr     r0, =__bss_start__\n"
              "    ldr     r1, =__bss_end__\n"
              "    mov     r2, #0\n"
              "    .thumb_func\n"
              "zero_loop:\n"
              "        cmp     r0, r1\n"
              "        it      lt\n"
              "        strlt   r2, [r0], #4\n"
              "        blt     zero_loop");
    
        //
        // Enable the floating-point unit.  This must be done here to handle the
        // case where main() uses floating-point and the function prologue saves
        // floating-point registers (which will fault if floating-point is not
        // enabled).  Any configuration of the floating-point unit using DriverLib
        // APIs must be done here prior to the floating-point unit being enabled.
        //
        // Note that this does not use DriverLib since it might not be included in
        // this project.
        //
        HWREG(0xE000ED88) = ((HWREG(0xE000ED88) & ~0x00F00000) | 0x00F00000);
        
        //
        // Call the application's entry point.
        //
        main();
    }
    
    //*****************************************************************************
    //
    // This is the code that gets called when the processor receives a NMI.  This
    // simply enters an infinite loop, preserving the system state for examination
    // by a debugger.
    //
    //*****************************************************************************
    static void
    NmiSR(void)
    {
        //
        // Enter an infinite loop.
        //
        while(1)
        {
        }
    }
    
    //*****************************************************************************
    //
    // This is the code that gets called when the processor receives a fault
    // interrupt.  This simply enters an infinite loop, preserving the system state
    // for examination by a debugger.
    //
    //*****************************************************************************
    static void
    FaultISR(void)
    {
        //
        // Enter an infinite loop.
        //
        while(1)
        {
        }
    }
    
    //*****************************************************************************
    //
    // This is the code that gets called when the processor receives an unexpected
    // interrupt.  This simply enters an infinite loop, preserving the system state
    // for examination by a debugger.
    //
    //*****************************************************************************
    static void
    IntDefaultHandler(void)
    {
        //
        // Go into an infinite loop.
        //
        while(1)
        {
        }
    }
    

  • Hi Rossi, please post values of fault register and where it leave code before to fault.
    <you can reference stick for register and what they mean.

    http://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/374640

  • Hi Roberto.
    I already gave these values in a previous answer here. If you need more, can you tell me which registers you want to see ?
    Thank you.
  • Hi Rossi, Opps sorry I followed the same lines of Amit, I read again main post, Ok issue is when compiled with GCC and work fine when compiled with TI so:
    Leave project running on TI compiler as is and try import again project use GCC setting from original project.
    startupgcc.c instead of ccsone
    usb_dev_serial.ld for linker instead of default.

    I have to go out now, when I return I try compile and see what happen and also try load your project to see what can be missing or bad. Crashing Linux USB stack is not so usual...
    Service restart of USB is not effective to require reboot?
    Loading GCC binary from original project run or crash?
    I am not using USB device so I do a try to learn about, I am more network incline and I don't like USB too much.
  • >> I hope you can help me because I really don't have a clue...

    Hi Rossi, as promised, first I checked code from CCS example it link and compile as is, clearly after adding <linkedResources> (under Mint are not copied from original project), same was done again then I changed to Linaro, changed linker file and startup too, added proper linker path but it don't link.. Also I tested Makefile and this failed too.
    First question why you wish use Linaro instead of TI compiler?
    Second, I inspected your .project file was on zipped, it suffer Linux script trouble like on my installation, so <linkedResources> section was missing,
    </natures>
    ... Here lRes section is missing ....
    <variableList>

    So open original .project, open your .project copy all linked resources section and paste to .project This cure the annoying bug is on Linux version.
    About GCC, if Amit is not inspecting more in deep I can see it but don't expect have response in short time.

    If you join CCS forum I posted a lot of report of Linux issue and how to address them.
    I return try get GUIcomposer AppCenter and Grace working on CCS Linux I need to finish my work.
  • Hello Rossi,

    I have a windows machine where I had to rebuild the code with CCS Linaro GCC compiler. On running the code I saw that there was IBUS fault, so had to dig deep into the startup and lds files. Simplified the two files, but still had issues building the code. Finally a closer inspection shows that in linker the switch for remove unused code was missing. So switched it on and "Voila", Both serial ports work...

    Attached code for reference.

    usb_dev_serial_123gxl.zip

    Regards

    Amit

  • Imported on Linux it doesn't work.. but I retry tomorrow now is time to sleep.
    Great Amit, great job see you tomorrow.
    Trouble come from debug folder where .d files contain:
    usb_dev_serial.d: ../usb_dev_serial.c \
    C:/ti/TivaWare_C_Series-2.1.0.12573/inc/hw_ints.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/inc/hw_memmap.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/inc/hw_types.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/inc/hw_gpio.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/inc/hw_uart.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/inc/hw_sysctl.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/driverlib/debug.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/driverlib/fpu.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/driverlib/gpio.h \
    C:/ti/TivaWare_C_Series-2.1.0.12573/driverlib/pin_map.h \
    and this is not good on Linux, so a relative path need to be added or absolute but root referred to installation base.

    Better I think is add missing section to .project
  • Rossi Romain said:
    am trying to compile the usb_dev_serial example from tiva_ware release 2.1.0.12573 with GCC and it's not working.

    The code compile correctly, but I have a runtime error leading to the FaultISR() handler.

    I haven't tried to run your example, but I note the ResetISR function in the tm4c123gh6pm_startup_ccs_gcc.c file added by CCS contains the same bug reported in Errors in CCSv6 created project for a TM4C129 project using the GNU v4.7.4 compiler. See the referenced thread for the correction to make.

  • Thanks Chester; that's the problem.
    I modified the linker script according to the answer you linked and it is working now.
    I would like to thank all other people who helped here (specially Amit).