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.

AM3359: PRU firmware porting

Part Number: AM3359

Hello Community,

I am working with Quadros OS project in which I need to port PRU firmware(icss_dualmac).

What are the OS dependent component of PRU ?

What is linker command file ?

what is PRU releation with config_am335x_a8.bld  ?

Regards,

Pankaj

  • Pankaj,

    PRU firmware is not dependent on OS. Only the PRU driver to load/run PRU binary is OS dependent (supporting bare-metal as well). 

    The linker command file for PRU firmware is pru.cmd in drv\icss_emac\firmware\icss_dualemac\src. The PRUx_REVx_to_ARM(C66).cmd under firmware/cmd is for converting .out file to .bin using hexpru, see the attached log

    C:\ti\pdk_am335x_1_0_14\packages\ti\drv\icss_emac>gmake firm
    gmake firmcores SOC=am335x
    gmake[1]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake firm_allhostcores CORE=pru_0
    gmake[2]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake firm_allversion HOSTCORE=a8host
    gmake[3]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake comp_firm PRUVERSION=REV1
    gmake[4]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake -C C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac -f ../../build/makefile_icss_dualemac.mk
    gmake[5]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac'
    #
    # Linking into am335x:pru_0:icss_dualemac into C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/icss_dualemac_PRU0/icss_dualemac_PRU0.out...
    #
    C:/ti/ti-cgt-pru_2.2.1/bin/clpru -v3 -g --endian=little --define=am335x --diag_wrap=off --diag_warning=225 --display_error_number --hardware_mac=on -z --stack_size=0 --heap_size=0 --reread_libs --warn_sections -IC:/ti/ti-cgt-pru_2.2.1/include -IC:/ti/ti-cgt-pru_2.2.1/lib --define=PRU0 --define=pru0 --entry_point=micro_scheduler    C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/micro_scheduler.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/emac_MII_Rcv.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/emac_MII_Xmt.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/emac_statistics.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/emac_tts.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/emac_ptp.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/resource_table.opru C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac/src/pru.cmd -o C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/icss_dualemac_PRU0.out -m C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/icss_dualemac_PRU0.map --xml_link_info="C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/icss_dualemac_PRU0_linkInfo.xml" -lC:/ti/ti-cgt-pru_2.2.1/lib/libc.a
    <Linking>
    #
    # Generating output header into am335x:pru_0:icss_dualemac into C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac/bin/am335x/a8host/REV1/icss_dualemac_PRU0.bin...
    #
    C:/ti/ti-cgt-pru_2.2.1/bin/hexpru C:/ti/pdk_am335x_1_0_14/packages/ti/build/pruss/PRU0_REV1_to_ARM.cmd C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/icss_dualemac_PRU0.out -o C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac/bin/am335x/a8host/REV1/icss_dualemac_PRU0.bin
    Translating to Load Image format...
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/icss_dualemac_PRU0.out" .text:micro_scheduler ==> .text:micro_scheduler
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/icss_dualemac_PRU0.out" .text ==> .text
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_0/icss_dualemac_PRU0.out" .data ==> .data
    gmake[5]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac'
    gmake -C C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch -f ../../build/makefile_icss_switch.mk
    gmake[5]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch'
    #
    # Linking into am335x:pru_0:icss_switch into C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/icss_switch_PRU0/icss_switch_PRU0.out...
    #
    C:/ti/ti-cgt-pru_2.2.1/bin/clpru -v3 -g --endian=little --define=am335x --diag_wrap=off --diag_warning=225 --display_error_number --hardware_mac=on -z --stack_size=0 --heap_size=0 --reread_libs --warn_sections -IC:/ti/ti-cgt-pru_2.2.1/include -IC:/ti/ti-cgt-pru_2.2.1/lib --define=PRU0 --define=pru0 --entry_point=micro_scheduler    C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/micro_scheduler.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/emac_MII_Rcv.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/emac_MII_Xmt.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/emac_statistics.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/switch_collision_task.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac/src/pru.cmd -o C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/icss_switch_PRU0.out -m C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/icss_switch_PRU0.map --xml_link_info="C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/icss_switch_PRU0_linkInfo.xml" -lC:/ti/ti-cgt-pru_2.2.1/lib/libc.a
    <Linking>
    #
    # Generating output header into am335x:pru_0:icss_switch into C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch/bin/am335x/a8host/REV1/icss_switch_PRU0.bin...
    #
    C:/ti/ti-cgt-pru_2.2.1/bin/hexpru C:/ti/pdk_am335x_1_0_14/packages/ti/build/pruss/PRU0_REV1_to_ARM.cmd C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/icss_switch_PRU0.out -o C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch/bin/am335x/a8host/REV1/icss_switch_PRU0.bin
    Translating to Load Image format...
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/icss_switch_PRU0.out" .text:micro_scheduler ==> .text:micro_scheduler
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/icss_switch_PRU0.out" .text ==> .text
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_0/icss_switch_PRU0.out" .data ==> .data
    gmake[5]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch'
    gmake[4]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake[3]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake[2]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake firm_allhostcores CORE=pru_1
    gmake[2]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake firm_allversion HOSTCORE=a8host
    gmake[3]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake comp_firm PRUVERSION=REV1
    gmake[4]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake -C C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac -f ../../build/makefile_icss_dualemac.mk
    gmake[5]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac'
    #
    # Linking into am335x:pru_1:icss_dualemac into C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/icss_dualemac_PRU1/icss_dualemac_PRU1.out...
    #
    C:/ti/ti-cgt-pru_2.2.1/bin/clpru -v3 -g --endian=little --define=am335x --diag_wrap=off --diag_warning=225 --display_error_number --hardware_mac=on -z --stack_size=0 --heap_size=0 --reread_libs --warn_sections -IC:/ti/ti-cgt-pru_2.2.1/include -IC:/ti/ti-cgt-pru_2.2.1/lib --define=PRU1 --define=pru1 --entry_point=micro_scheduler    C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/micro_scheduler.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/emac_MII_Rcv.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/emac_MII_Xmt.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/emac_statistics.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/emac_tts.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/emac_ptp.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/resource_table.opru C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac/src/pru.cmd -o C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/icss_dualemac_PRU1.out -m C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/icss_dualemac_PRU1.map --xml_link_info="C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/icss_dualemac_PRU1_linkInfo.xml" -lC:/ti/ti-cgt-pru_2.2.1/lib/libc.a
    <Linking>
    #
    # Generating output header into am335x:pru_1:icss_dualemac into C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac/bin/am335x/a8host/REV1/icss_dualemac_PRU1.bin...
    #
    C:/ti/ti-cgt-pru_2.2.1/bin/hexpru C:/ti/pdk_am335x_1_0_14/packages/ti/build/pruss/PRU1_REV1_to_ARM.cmd C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/icss_dualemac_PRU1.out -o C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac/bin/am335x/a8host/REV1/icss_dualemac_PRU1.bin
    Translating to Load Image format...
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/icss_dualemac_PRU1.out" .text:micro_scheduler ==> .text:micro_scheduler
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/icss_dualemac_PRU1.out" .text ==> .text
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_dualemac/obj/am335x/a8host/REV1/pru_1/icss_dualemac_PRU1.out" .data ==> .data
    gmake[5]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac'
    gmake -C C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch -f ../../build/makefile_icss_switch.mk
    gmake[5]: Entering directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch'
    #
    # Linking into am335x:pru_1:icss_switch into C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/icss_switch_PRU1/icss_switch_PRU1.out...
    #
    C:/ti/ti-cgt-pru_2.2.1/bin/clpru -v3 -g --endian=little --define=am335x --diag_wrap=off --diag_warning=225 --display_error_number --hardware_mac=on -z --stack_size=0 --heap_size=0 --reread_libs --warn_sections -IC:/ti/ti-cgt-pru_2.2.1/include -IC:/ti/ti-cgt-pru_2.2.1/lib --define=PRU1 --define=pru1 --entry_point=micro_scheduler    C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/micro_scheduler.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/emac_MII_Rcv.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/emac_MII_Xmt.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/emac_statistics.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/switch_collision_task.opru  C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_dualemac/src/pru.cmd -o C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/icss_switch_PRU1.out -m C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/icss_switch_PRU1.map --xml_link_info="C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/icss_switch_PRU1_linkInfo.xml" -lC:/ti/ti-cgt-pru_2.2.1/lib/libc.a
    <Linking>
    #
    # Generating output header into am335x:pru_1:icss_switch into C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch/bin/am335x/a8host/REV1/icss_switch_PRU1.bin...
    #
    C:/ti/ti-cgt-pru_2.2.1/bin/hexpru C:/ti/pdk_am335x_1_0_14/packages/ti/build/pruss/PRU1_REV1_to_ARM.cmd C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/icss_switch_PRU1.out -o C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch/bin/am335x/a8host/REV1/icss_switch_PRU1.bin
    Translating to Load Image format...
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/icss_switch_PRU1.out" .text:micro_scheduler ==> .text:micro_scheduler
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/icss_switch_PRU1.out" .text ==> .text
       "C:/ti/pdk_am335x_1_0_14/packages/ti/binary/icss_switch/obj/am335x/a8host/REV1/pru_1/icss_switch_PRU1.out" .data ==> .data
    gmake[5]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac/firmware/icss_switch'
    gmake[4]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake[3]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake[2]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'
    gmake[1]: Leaving directory 'C:/ti/pdk_am335x_1_0_14/packages/ti/drv/icss_emac'

    The lnk_a8_a9_a15_REVx.cmd is the linker file for building ICSS_EMAC driver example project.

    The config_am335x_a8.bld file defines a few memory sections that are not in default platform/board configuration file, e.g. ti.platforms.evmAM335X, but these sections are referred in lnk_a8_a9_a15_REVx.cmd. More infor on .bld file - https://processors.wiki.ti.com/index.php/Config_bld_basics

    Regards,

    Garrett

  • Hi Garrett,

    Thanks for the answer.

    In my ccs project i dont have xdc tool is in used, I am using AM335x.lds file.

    Is it possible to put PRU linker command in AM335x.lds file, I have already done it but dont know it will work or not ?

    MEMORY
    {

        SRAM :     o = 0x402F0400,  l = 0x0000FC00  /* 64kB internal SRAM */
        L3OCMC0 :  o = 0x40300000,  l = 0x00010000  /* 64kB L3 OCMC SRAM */
        M3SHUMEM : o = 0x44D00000,  l = 0x00004000  /* 16kB M3 Shared Unified Code Space */
        M3SHDMEM : o = 0x44D80000,  l = 0x00002000  /* 8kB M3 Shared Data Memory */
        DDR0 :     o = 0x80000000,  l = 0x0F000000  /* cacheable DDR area */
        NC_DDR0 :  o = 0x8F000000,  l = 0x01000000  /* non cache DDR area */
        APP_CODE_MEM : o = 0x80000000, l = 0x200000
        APP_CACHED_DATA_MEM : o = 0x80200000, l = 0x1400000
        APP_UNCACHED_DATA_BLK3_MEM : o = 0xA0000000, l = 0x200000
        APP_CACHED_DATA_BLK1_MEM : o = 0x81600000, l = 0xF400000
        APP_CACHED_DATA_BLK2_MEM : o = 0x90A00000, l = 0x8000000


    }

    SECTIONS
    {


        PRU0_REV1_IMEM : {
            pru_imem0_rev1_start = .;
            KEEP(*(PRU0_REV1_IMEM))
            pru_imem0_rev1_end = .;
        } > APP_CACHED_DATA_BLK1_MEM
        PRU0_REV1_DMEM : {
            pru_dmem0_rev1_start = .;
            KEEP (*(PRU0_REV1_DMEM))
            pru_dmem0_rev1_end = .;
        } > APP_CACHED_DATA_BLK1_MEM
        PRU0_REV1_EXT : {
            KEEP (*(PRU0_REV1_EXT))
        } > APP_CACHED_DATA_BLK1_MEM
        PRU1_REV1_IMEM : {
            pru_imem1_rev1_start = .;
            KEEP (*(PRU1_REV1_IMEM))
            pru_imem1_rev1_end = .;
        } > APP_CACHED_DATA_BLK1_MEM
        PRU1_REV1_DMEM : {
            pru_dmem1_rev1_start = .;
            KEEP (*(PRU1_REV1_DMEM))
            pru_dmem1_rev1_end = .;
        } > APP_CACHED_DATA_BLK1_MEM
        PRU1_REV1_EXT : {
            KEEP (*(PRU1_REV1_EXT))
        } > APP_CACHED_DATA_BLK1_MEM

        .rsthand :
        {
            . = ALIGN(0x10000);
            KEEP(*(.isr_vector))
            *startup_ARMCA8.o (.text)
        } > DDR0
       

    Please let me know if I am wrong

    Regards,

    Pankaj

  • Hi Pankaj,

    Yes, this should work too. The linker command file is OS/XDC independent

    Regards,
    Garrett