Part Number: J784S4XEVM
Hello,
I have a question regarding an IPC-related issue while testing with the J784S4_EVM.
RTOS, Linux SDK Version : 11.01
I am booting the system using bootApp with the following stages:
-
app (mcu1_0)
-
stage1 (mcu2_0, mcu2_1)
-
stage2 (mcu3_0, mcu3_1, mcu4_0, mcu4_1)
-
stage3 (mpu1) — using a pre-built image
Additionally, I implemented IPC communication between MCU cores and between MCU and MPU cores by referencing the IPC examples (bootApp + IPC example).
The overall flow is as follows:
-
Wait until bootApp image loading is completed.
-
After image loading is finished, start the IPC task (at this time, the Linux kernel is still booting).
-
Call
Ipc_mpSetConfig,IpcInitPrms_init, andIpc_init. -
Call
Ipc_loadResourceTableandIpc_initVirtIO. -
Call
RPMessageParams_initandRPMessage_init. -
Create RPMessage receive tasks per core (ti.ipc4.ping-pong, rpmsg_chrdev).
-
Create RPMessage send tasks according to the number of cores.
-
Create
rpmsg_vdevMonitorFxntask:-
Call
Ipc_lateVirtioCreateandRPMessage_lateInit -
Announce the
ti.ipc4.ping-pongservice toIPC_MPU1_0usingRPMessage_announce.
-
/*------------------------------------------------*/
/* Size of various Memory Locations for each core */
/*------------------------------------------------*/
#define DMA_SPACE_SIZE 0x00100000 /* 1MB */
#define IPC_DATA_SIZE 0x00100000 /* 1MB */
#define EXT_DATA_SIZE 0x00100000 /* 1MB */
#define MEM_TEXT_SIZE 0x00100000 /* 1MB */
#define MEM_DATA_SIZE 0x00100000 /* 1MB */
#define DDR_SPACE_SIZE 0x00B00000 /* 12MB */
#define CORE_TOTAL_SIZE 0x01000000 /* 16MB (IPC_DATA_SIZE + R5F_MEM_TEXT_SIZE + R5F_MEM_DATA_SIZE + DDR_SPACE_SIZE) */
/*-----------------------------*/
/* Start address for each core */
/*-----------------------------*/
#define MCU1_0_ALLOCATED_START DDR0_ALLOCATED_START /* 0xA0000000 */
#define MCU1_1_ALLOCATED_START MCU1_0_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA1000000 */
#define MCU2_0_ALLOCATED_START MCU1_1_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA2000000 */
#define MCU2_1_ALLOCATED_START MCU2_0_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA3000000 */
#define MCU3_0_ALLOCATED_START MCU2_1_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA4000000 */
#define MCU3_1_ALLOCATED_START MCU3_0_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA5000000 */
#define MCU4_0_ALLOCATED_START MCU3_1_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA6000000 */
#define MCU4_1_ALLOCATED_START MCU4_0_ALLOCATED_START + CORE_TOTAL_SIZE /* 0xA7000000 */
(The IPC memory regions defined in the Linux device tree and the linker.cmd memory layout are configured identically.)
I am facing two issues:
First, MCU2_1, MCU3_1, and MCU4_1 do not operate at all.
Is there any special configuration required to enable or start these cores?

/* Initialize the param */
RPMessageParams_init(&cntrlParam);
/* Set memory for HeapMemory for control task */
cntrlParam.buf = pCntrlBuf;
cntrlParam.bufSize = rpmsgDataSize;
cntrlParam.stackBuffer = pTaskBuf;
cntrlParam.stackSize = IPC_TASK_STACKSIZE;
cntrlParam.ctrlTaskPriority = IPC_CTRL_TASK_PRIORITY;
RPMessage_init(&cntrlParam);
run_rpmsg_receiver();
run_rpmsg_sender();
#if !defined(BUILD_MPU1_0) && defined(A72_LINUX_OS) && defined(A72_LINUX_OS_IPC_ATTACH)
TaskP_sleepInMsecs(30000);
/* Respond to messages coming in to endPt ENDPT_PING */
TaskP_Params_init(&taskParams);
taskParams.priority = 10;
taskParams.stacksize = 0x1000;
taskParams.arg0 = 0;
if (NULL == TaskP_create(&rpmsg_vdevMonitorFxn, &taskParams))
{
Ipc_Trace_printf("IPC VDEV Monitor task creation failed!!!");
}
//RecvRPMessage_lateannounce();
#endif /* !defined(BUILD_MPU1_0) && defined(A72_LINUX_OS) && defined(A72_LINUX_OS_IPC_ATTACH) */
Second, in the code described above, if TaskP_sleepInMsecs(30000); is not set to a sufficiently long delay, a kernel panic occurs along with the error shown below.

Even when the delay is increased, the virtio devices are registered as shown below, but after some time an error still occurs on MCU1_0.
(MCU2_0, MCU3_0, and MCU4_0 continue to operate normally.)

I would appreciate your help with this issue.
thank you.