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...

    tm4c123gh6pm_startup_ccs_gcc.c
    Fullscreen
    1
    2
    3
    4
    5
    6
    //*****************************************************************************
    //
    // 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
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 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).