/* * Copyright (c) 2016, Freescale Semiconductor, Inc. * Copyright 2016-2017 NXP * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include "rpmsg_lite.h" #include "rpmsg_queue.h" #include "rpmsg_ns.h" #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_debug_console.h" #include "FreeRTOS.h" #include "task.h" #include "fsl_uart.h" #include "rsc_table.h" /******************************************************************************* * Definitions ******************************************************************************/ #define RPMSG_LITE_SHMEM_BASE (VDEV0_VRING_BASE) #define RPMSG_LITE_LINK_ID (RL_PLATFORM_IMX8MP_M7_USER_LINK_ID) #define RPMSG_LITE_NS_ANNOUNCE_STRING "rpmsg-virtual-tty-channel-1" #define APP_TASK_STACK_SIZE (256) #ifndef LOCAL_EPT_ADDR #define LOCAL_EPT_ADDR (30) #endif /* Globals */ static char app_buf[512]; /* Each RPMSG buffer can carry less than 512 payload */ /******************************************************************************* * Prototypes ******************************************************************************/ /******************************************************************************* * Code ******************************************************************************/ static TaskHandle_t app_task_handle = NULL; static struct rpmsg_lite_instance *volatile my_rpmsg = NULL; static struct rpmsg_lite_endpoint *volatile my_ept = NULL; static volatile rpmsg_queue_handle my_queue = NULL; void app_destroy_task(void) { if (app_task_handle) { vTaskDelete(app_task_handle); app_task_handle = NULL; } if (my_ept) { rpmsg_lite_destroy_ept(my_rpmsg, my_ept); my_ept = NULL; } if (my_queue) { rpmsg_queue_destroy(my_rpmsg, my_queue); my_queue = NULL; } if (my_rpmsg) { rpmsg_lite_deinit(my_rpmsg); my_rpmsg = NULL; } } void app_task(void *param) { volatile uint32_t remote_addr; void *rx_buf; uint32_t len; int32_t result; void *tx_buf; uint32_t size; /* Print the initial banner */ PRINTF("\r\nRPMSG String Echo FreeRTOS RTOS API Demo...\r\n"); #ifdef MCMGR_USED uint32_t startupData; /* Get the startup data */ (void)MCMGR_GetStartupData(kMCMGR_Core1, &startupData); my_rpmsg = rpmsg_lite_remote_init((void *)startupData, RPMSG_LITE_LINK_ID, RL_NO_FLAGS); /* Signal the other core we are ready */ (void)MCMGR_SignalReady(kMCMGR_Core1); #else my_rpmsg = rpmsg_lite_remote_init((void *)RPMSG_LITE_SHMEM_BASE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS); #endif /* MCMGR_USED */ rpmsg_lite_wait_for_link_up(my_rpmsg, RL_BLOCK); my_queue = rpmsg_queue_create(my_rpmsg); my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, rpmsg_queue_rx_cb, my_queue); (void)rpmsg_ns_announce(my_rpmsg, my_ept, RPMSG_LITE_NS_ANNOUNCE_STRING, RL_NS_CREATE); PRINTF("\r\nNameservice sent, ready for incoming messages...\r\n"); for (;;) { /* Get RPMsg rx buffer with message */ result = rpmsg_queue_recv_nocopy(my_rpmsg, my_queue, (uint32_t *)&remote_addr, (char **)&rx_buf, &len, RL_BLOCK); if (result != 0) { assert(false); } /* Copy string from RPMsg rx buffer */ assert(len < sizeof(app_buf)); memcpy(app_buf, rx_buf, len); app_buf[len] = 0; /* End string by '\0' */ if ((len == 2) && (app_buf[0] == 0xd) && (app_buf[1] == 0xa)) PRINTF("Get New Line From Master Side\r\n"); else PRINTF("Get Message From Master Side : \"%s\" [len : %d]\r\n", app_buf, len); /* Get tx buffer from RPMsg */ tx_buf = rpmsg_lite_alloc_tx_buffer(my_rpmsg, &size, RL_BLOCK); assert(tx_buf); /* Copy string to RPMsg tx buffer */ memcpy(tx_buf, app_buf, len); /* Echo back received message with nocopy send */ result = rpmsg_lite_send_nocopy(my_rpmsg, my_ept, remote_addr, tx_buf, len); if (result != 0) { assert(false); } /* Release held RPMsg rx buffer */ result = rpmsg_queue_nocopy_free(my_rpmsg, rx_buf); if (result != 0) { assert(false); } } } void app_create_task(void) { if (app_task_handle == NULL && xTaskCreate(app_task, "APP_TASK", APP_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &app_task_handle) != pdPASS) { PRINTF("\r\nFailed to create application task\r\n"); for (;;) ; } } /*! * @brief Main function */ int main(void) { /* Initialize standard SDK demo application pins */ /* M7 has its local cache and enabled by default, * need to set smart subsystems (0x28000000 ~ 0x3FFFFFFF) * non-cacheable before accessing this address region */ BOARD_InitMemory(); /* Board specific RDC settings */ BOARD_RdcInit(); BOARD_InitBootPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); copyResourceTable(); #ifdef MCMGR_USED /* Initialize MCMGR before calling its API */ (void)MCMGR_Init(); #endif /* MCMGR_USED */ app_create_task(); vTaskStartScheduler(); PRINTF("Failed to start FreeRTOS on core0.\n"); for (;;) ; }