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.

Linux/66AK2H14: IPC

Part Number: 66AK2H14

Tool/software: Linux

Hi everyone. I have a question about IPC. Is it possible that implement a topology like below so that transfer data between ARM and DSPs when Linux is running on an ARM and between DSP[0-7] and DSP[0-7]?

  • Hi,

    Yes, this should be possible, however I am not sure if we have an example code to provide you with. I am also looping the IPC team to elaborate, if needed.

    Best Regards,
    Yordan
  • Hi Yordan.I'll really appreciate it

  • Hi, Mahat,

    My recollection is that the dual_transport under RTOS IPC test directory is the example which ARM sends a meesage to DSP1, It in turn sneds to the next DSP core, and the last DSP core sends the message back to ARM host. The prebuilt DSP image is included in tisdk-server-extra filesystem. The host should run MessageQAPP. Could you check it out? I'll try it also in the meantime.

    Rex
  • Hi Rex. Tnx for your reply.

    Where is this example???? I don't know! Is it in SDK?

  • Hi, Mahat,

    There are 2 filesystems included in the Linux SDK package. One is tisdk-server-rootfs.tar.xz and the other tisdk-server-extra-rootfs.tar.xz. The prebuilt example binaries are in tisdk-server-extra-rootfs.tar.xz. The source code are in ipc/linux/src/tests/MessageQApp.c and ipc/packages/ti/ipc/tests/dual_transports.c.

    I just ran it and confirmed this is the example you should refer to. My script to download and run DSP images on all 8 DSP cores.

    root@k2hk-evm:~# cat test.sh

    mpmcl reset dsp0
    mpmcl reset dsp1
    mpmcl reset dsp2
    mpmcl reset dsp3
    mpmcl reset dsp4
    mpmcl reset dsp5
    mpmcl reset dsp6
    mpmcl reset dsp7

    mpmcl load dsp0 /lib/firmware/ipc/ti_platforms_evmTCI6638K2K_core0/dual_transports.xe66
    mpmcl load dsp1 /lib/firmware/ipc/ti_platforms_evmTCI6638K2K_core0/dual_transports.xe66
    mpmcl load dsp2 /lib/firmware/ipc/ti_platforms_evmTCI6638K2K_core0/dual_transports.xe66
    mpmcl load dsp3 /lib/firmware/ipc/ti_platforms_evmTCI6638K2K_core0/dual_transports.xe66
    mpmcl load dsp4 /lib/firmware/ipc/ti_platforms_evmTCI6638K2K_core0/dual_transports.xe66
    mpmcl load dsp5 /lib/firmware/ipc/ti_platforms_evmTCI6638K2K_core0/dual_transports.xe66
    mpmcl load dsp6 /lib/firmware/ipc/ti_platforms_evmTCI6638K2K_core0/dual_transports.xe66
    mpmcl load dsp7 /lib/firmware/ipc/ti_platforms_evmTCI6638K2K_core0/dual_transports.xe66

    mpmcl run dsp0
    mpmcl run dsp1
    mpmcl run dsp2
    mpmcl run dsp3
    mpmcl run dsp4
    mpmcl run dsp5
    mpmcl run dsp6
    mpmcl run dsp7

    The logs from running MessageqApp:

    root@k2hk-evm:~# /usr/bin/MessageQApp
    Using numLoops: 100; procId : 1
    Entered MessageQApp_execute
    Local MessageQId: 0x80
    Remote queueId [0x10081]
    Exchanging 100 messages with remote processor CORE0...
    MessageQ_get #1 Msg = 0xb6500470
    MessageQ_get #2 Msg = 0xb6500470
    MessageQ_get #3 Msg = 0xb6500470
    MessageQ_get #4 Msg = 0xb6500470
    MessageQ_get #5 Msg = 0xb6500470
    MessageQ_get #6 Msg = 0xb6500470
    MessageQ_get #7 Msg = 0xb6500470
    MessageQ_get #8 Msg = 0xb6500470
    MessageQ_get #9 Msg = 0xb6500470
    MessageQ_get #10 Msg = 0xb6500470
    MessageQ_get #11 Msg = 0xb6500470
    MessageQ_get #12 Msg = 0xb6500470
    MessageQ_get #13 Msg = 0xb6500470
    MessageQ_get #14 Msg = 0xb6500470
    MessageQ_get #15 Msg = 0xb6500470
    MessageQ_get #16 Msg = 0xb6500470
    MessageQ_get #17 Msg = 0xb6500470
    MessageQ_get #18 Msg = 0xb6500470
    MessageQ_get #19 Msg = 0xb6500470
    MessageQ_get #20 Msg = 0xb6500470
    MessageQ_get #21 Msg = 0xb6500470
    MessageQ_get #22 Msg = 0xb6500470
    MessageQ_get #23 Msg = 0xb6500470
    MessageQ_get #24 Msg = 0xb6500470
    MessageQ_get #25 Msg = 0xb6500470
    MessageQ_get #26 Msg = 0xb6500470
    MessageQ_get #27 Msg = 0xb6500470
    MessageQ_get #28 Msg = 0xb6500470
    MessageQ_get #29 Msg = 0xb6500470
    MessageQ_get #30 Msg = 0xb6500470
    MessageQ_get #31 Msg = 0xb6500470
    MessageQ_get #32 Msg = 0xb6500470
    MessageQ_get #33 Msg = 0xb6500470
    MessageQ_get #34 Msg = 0xb6500470
    MessageQ_get #35 Msg = 0xb6500470
    MessageQ_get #36 Msg = 0xb6500470
    MessageQ_get #37 Msg = 0xb6500470
    MessageQ_get #38 Msg = 0xb6500470
    MessageQ_get #39 Msg = 0xb6500470
    MessageQ_get #40 Msg = 0xb6500470
    MessageQ_get #41 Msg = 0xb6500470
    MessageQ_get #42 Msg = 0xb6500470
    MessageQ_get #43 Msg = 0xb6500470
    MessageQ_get #44 Msg = 0xb6500470
    MessageQ_get #45 Msg = 0xb6500470
    MessageQ_get #46 Msg = 0xb6500470
    MessageQ_get #47 Msg = 0xb6500470
    MessageQ_get #48 Msg = 0xb6500470
    MessageQ_get #49 Msg = 0xb6500470
    MessageQ_get #50 Msg = 0xb6500470
    MessageQ_get #51 Msg = 0xb6500470
    MessageQ_get #52 Msg = 0xb6500470
    MessageQ_get #53 Msg = 0xb6500470
    MessageQ_get #54 Msg = 0xb6500470
    MessageQ_get #55 Msg = 0xb6500470
    MessageQ_get #56 Msg = 0xb6500470
    MessageQ_get #57 Msg = 0xb6500470
    MessageQ_get #58 Msg = 0xb6500470
    MessageQ_get #59 Msg = 0xb6500470
    MessageQ_get #60 Msg = 0xb6500470
    MessageQ_get #61 Msg = 0xb6500470
    MessageQ_get #62 Msg = 0xb6500470
    MessageQ_get #63 Msg = 0xb6500470
    MessageQ_get #64 Msg = 0xb6500470
    MessageQ_get #65 Msg = 0xb6500470
    MessageQ_get #66 Msg = 0xb6500470
    MessageQ_get #67 Msg = 0xb6500470
    MessageQ_get #68 Msg = 0xb6500470
    MessageQ_get #69 Msg = 0xb6500470
    MessageQ_get #70 Msg = 0xb6500470
    MessageQ_get #71 Msg = 0xb6500470
    MessageQ_get #72 Msg = 0xb6500470
    MessageQ_get #73 Msg = 0xb6500470
    MessageQ_get #74 Msg = 0xb6500470
    MessageQ_get #75 Msg = 0xb6500470
    MessageQ_get #76 Msg = 0xb6500470
    MessageQ_get #77 Msg = 0xb6500470
    MessageQ_get #78 Msg = 0xb6500470
    MessageQ_get #79 Msg = 0xb6500470
    MessageQ_get #80 Msg = 0xb6500470
    MessageQ_get #81 Msg = 0xb6500470
    MessageQ_get #82 Msg = 0xb6500470
    MessageQ_get #83 Msg = 0xb6500470
    MessageQ_get #84 Msg = 0xb6500470
    MessageQ_get #85 Msg = 0xb6500470
    MessageQ_get #86 Msg = 0xb6500470
    MessageQ_get #87 Msg = 0xb6500470
    MessageQ_get #88 Msg = 0xb6500470
    MessageQ_get #89 Msg = 0xb6500470
    MessageQ_get #90 Msg = 0xb6500470
    MessageQ_get #91 Msg = 0xb6500470
    MessageQ_get #92 Msg = 0xb6500470
    MessageQ_get #93 Msg = 0xb6500470
    MessageQ_get #94 Msg = 0xb6500470
    MessageQ_get #95 Msg = 0xb6500470
    MessageQ_get #96 Msg = 0xb6500470
    MessageQ_get #97 Msg = 0xb6500470
    MessageQ_get #98 Msg = 0xb6500470
    MessageQ_get #99 Msg = 0xb6500470
    MessageQ_get #100 Msg = 0xb6500470
    Exchanged 100 messages with remote processor CORE0
    Sample application successfully completed!
    Leaving MessageQApp_execute


    Dump the trace files, it shows the host sends messages to CORE0. CORE0 sends to CORE1,...., CORE7 sends messages back to CORE0 which sends back to host.

    root@k2hk-evm:~# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0
    2 Resource entries at 0x800000
    main: MultiProc id: 1
    registering rpmsg-proto:rpmsg-proto service on 61 with HOST
    multicoreFxn: Entered...
    multicoreFxn: Creating HeapBufMP...
    multicoreFxn: Opening Remote Queue: CORE1...
    hostMsgqFxn: created MessageQ: SLAVE_CORE0; QueueID: 0x10081
    Awaiting sync message from host...
    Received msg from (procId:remoteQueueId): 0x0:0x80
    payload: 8 bytes; loops: 100 without printing.
    multicoreFxn: Sender: Start the main loop
    Sending message #0 to CORE1
    Sending message #1 to CORE1
    Sending message #2 to CORE1
    Sending message #3 to CORE1
    Sending message #4 to CORE1
    Sending message #5 to CORE1
    Sending message #6 to CORE1
    Sending message #7 to CORE1
    Sending message #8 to CORE1
    Sending message #9 to CORE1
    100 iterations took 10 ticks or 100 usecs/msg
    Awaiting sync message from host...
    root@k2hk-evm:~# cat /sys/kernel/debug/remoteproc/remoteproc1/trace0
    2 Resource entries at 0x800000
    main: MultiProc id: 2
    registering rpmsg-proto:rpmsg-proto service on 61 with HOST
    multicoreFxn: Entered...
    multicoreFxn: Opening HeapBufMP...
    hostMsgqFxn: created MessageQ: SLAVE_CORE1; QueueID: 0x20080
    Awaiting sync message from host...
    multicoreFxn: Opening Remote Queue: CORE2...
    multicoreFxn: Receiver: Start the main loop
    Sending a message #0 to CORE2
    Sending a message #1 to CORE2
    Sending a message #2 to CORE2
    Sending a message #3 to CORE2
    Sending a message #4 to CORE2
    Sending a message #5 to CORE2
    Sending a message #6 to CORE2
    Sending a message #7 to CORE2
    Sending a message #8 to CORE2
    Sending a message #9 to CORE2
    root@k2hk-evm:~# cat /sys/kernel/debug/remoteproc/remoteproc7/trace0
    2 Resource entries at 0x800000
    main: MultiProc id: 8
    registering rpmsg-proto:rpmsg-proto service on 61 with HOST
    multicoreFxn: Entered...
    multicoreFxn: Opening HeapBufMP...
    hostMsgqFxn: created MessageQ: SLAVE_CORE7; QueueID: 0x80080
    Awaiting sync message from host...
    multicoreFxn: Opening Remote Queue: CORE0...
    multicoreFxn: Receiver: Start the main loop
    Sending a message #0 to CORE0
    Sending a message #1 to CORE0
    Sending a message #2 to CORE0
    Sending a message #3 to CORE0
    Sending a message #4 to CORE0
    Sending a message #5 to CORE0
    Sending a message #6 to CORE0
    Sending a message #7 to CORE0
    Sending a message #8 to CORE0
    Sending a message #9 to CORE0
    root@k2hk-evm:~#

    If this answers your question, please click "Resolved" button. Thanks!

    Rex
  • Hi Rex.
    When I compiled the source code in CCS, the output does not work with mpmcl and stopped in the below line:

    root@k2hk-evm:~# MessageQApp
    Using numLoops: 100; procId : 1
    Entered MessageQApp_execute
    Local MessageQId: 0x80

    root@k2hk-evm:~# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0
    2 Resource entries at 0x800000
    main: MultiProc id: 1
    registering rpmsg-proto:rpmsg-proto service on 61 with HOST
    multicoreFxn: Entered...
    multicoreFxn: Creating HeapBufMP...
    multicoreFxn: Opening Remote Queue: CORE1...
    hostMsgqFxn: created MessageQ: SLAVE_CORE0; QueueID: 0x10081
    Awaiting sync message from host...
    I need to work with CCS to debug my code.
    And why the binary code in the mentioned directory has .xe66 postfix but CCS has .out?

    And what is DDR3 in memory map file? I don't have any DDR3 section in my default platform for TCI6638!!

    dual_transports.xe66.txt

  • Mahat,

    The file extension in release package is renamed for easy distinguishing on which core it will be run on, such as .xe66 vs .xem4.
    Please try using high level build as instructed in IPC Quick Start Guide, software-dl.ti.com/.../Foundational_Components.html

    Rex
  • Mahat,

    I forgot to mention that there are some glitches in high level build in 4.3 release. Some of the IPC build targets are broken, but works in 4.1 and may be in 4.2. Please take a look at this thread, e2e.ti.com/.../702993, which refers another thread with a new makefile to fix the high level build issue.

    Rex

  • Dear Rex.

    I have my own code and I want to just use the .cfg file of this example. If I want to debug my code, I gotta use CCS! (I think). 

    So how can Ido that?

  • Hi, Mahat,

    I believe using high level build, you can still debug using CCS. I will have RTOS engineer to help you on that.

    Rex
  • Hello,

    Please take a look at the following app note for techniques on debugging the DSP core when the ARM is running Linux. If you would like to debug in CCS, I recommend referring to the "Attaching Before the Issue" section.

    http://www.ti.com/lit/an/sprac12/sprac12.pdf