After a lot of time I have put again my attentions on that topic.
To get things working I configured u-boot to start CM4 firmware before linux.
Then if I test the rpmsg using rpmsg_lite_str_echo_rtos from mcuxpresso exmaples the channel is created correctly and now I can get echo messages sent and recived from linux side.
[ 1.505889] imx-rpmsg 90100000.rpmsg1: assigned reserved memory node vdevbuffer
[ 1.513820] virtio_rpmsg_bus virtio0: rpmsg host is online
[ 1.519928] virtio_rpmsg_bus virtio1: rpmsg host is online
[ 1.519963] virtio_rpmsg_bus virtio1: creating channel rpmsg-virtual-tty-channel-1 addr 0x1f
/sys/bus/rpmsg/devices/virtio1.rpmsg-virtual-tty-channel-1.-1.31 now exists. The result is that from the linux side all things are OK.
unfortunately, if I write the same rpmsg-lite example using a bare metal M4 program, the result is that I'm not able to get channel created and /sys/bus/rpmsg/devices is empty.
[ 1.521733] imx-rpmsg 90100000.rpmsg1: assigned reserved memory node vdevbuffer
[ 1.529666] virtio_rpmsg_bus virtio0: rpmsg host is online
[ 1.535770] virtio_rpmsg_bus virtio1: rpmsg host is online
The bare metal code is the following:
// ------------------------------------------------------------------------
// RPMSG Init
// ------------------------------------------------------------------------
/* Print the initial banner */
PRINTF("\r\n\r\n----- RPMSG Test ------\r\n\r\n");
int32_t retval;
PRINTF("rpmsg_lite_remote_init: ");
my_rpmsg = rpmsg_lite_remote_init((void *)RPMSG_LITE_SHMEM_BASE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS, &rpmsg_ctxt);
if (my_rpmsg) PRINTF("Done!\r\n");
else PRINTF("ERROR rpmsg_lite_remote_init\r\n");
/* wait for link up */
PRINTF("rpmsg_lite_wait_for_link_up: ");
rpmsg_lite_wait_for_link_up(my_rpmsg, RL_BLOCK);
PRINTF("Done!\r\n");
/* wait for a while to allow the primary side to bind_ns and register the NS callback */
//env_sleep_msec(200);
PRINTF("rpmsg_lite_create_ept: ");
my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, my_ept_read_cb, (void *)&has_received, &my_ept_context);
if (my_ept) PRINTF("Done!\r\n");
else PRINTF("ERROR rpmsg_lite_create_ept\r\n");
/* Introduce some delay to avoid NS announce message not being captured by the master side.
before the nameservice_isr_cb is registered on the master side. */
env_sleep_msec(4000);
PRINTF("rpmsg_ns_bind: ");
my_ns = rpmsg_ns_bind(my_rpmsg, app_nameservice_isr_cb, NULL, &my_ns_context);
if (my_ns) PRINTF("Done!\r\n");
else PRINTF("ERROR rpmsg_ns_bind retval=%d\r\n",retval);
PRINTF("rpmsg_ns_announce: ");
retval = rpmsg_ns_announce(my_rpmsg, my_ept, RPMSG_LITE_NS_ANNOUNCE_STRING, RL_NS_CREATE);
if (retval == RL_SUCCESS) PRINTF("Done!\r\n");
else PRINTF("ERROR rpmsg_ns_announce retval=%d\r\n",retval);
I tried to use rpmsg_ns_bind , but also I comment it out for test. All the #defines are the same as working RTOS example. All calls returns succesfully and rpmsg_lite_wait_for_link_up waits few seconds before succesfully returns. app_nameservice_isr_cb callback is never called.
It seems that rpmsg_ns_announce doesn't triggers channel creation, instead wait_for_link_up triggers callback correctly.
Any idea?