144 lines
4.4 KiB
C
144 lines
4.4 KiB
C
#include "fr30xx.h"
|
|
|
|
/* FreeRTOS kernel includes. */
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
|
|
#include "rpmsg.h"
|
|
#include "rpmsg_lite.h"
|
|
#include "rpmsg_queue.h"
|
|
#include "rpmsg_ns.h"
|
|
|
|
#include "dsp.h"
|
|
|
|
#include "app_config.h"
|
|
#include "app_task.h"
|
|
#include "app_rpmsg.h"
|
|
|
|
/* Remote rpmsg instance */
|
|
static struct rpmsg_lite_instance *remote_rpmsg;
|
|
static TaskHandle_t rpmsg_task_handle;
|
|
|
|
static void rpmsg_recv(struct rpmsg_lite_instance *rpmsg, struct rpmsg_msg_t *msg)
|
|
{
|
|
// printf("rpmsg_recv: msg_type = %d.\r\n", msg->msg_type);
|
|
|
|
switch (msg->msg_type) {
|
|
case RPMSG_MSG_TYPE_SYNC_INVOKE:
|
|
if (msg->p.sync_func.func_id == RPMSG_SYNC_FUNC_SUM) {
|
|
uint32_t address = (uint32_t)msg->p.sync_func.param;
|
|
struct rpmsg_sync_msg_sum_t *param = msg->p.sync_func.param;
|
|
if (address >= DSP_DRAM_BASE_ADDR) {
|
|
address = DSP_DRAM_2_MCU_SRAM(address);
|
|
}
|
|
param = (void *)address;
|
|
rpmsg_send_sync_ret(rpmsg, 0, param->x + param->y);
|
|
}
|
|
else {
|
|
rpmsg_send_sync_ret(rpmsg, 0xffffffff, 0);
|
|
}
|
|
break;
|
|
case RPMSG_MSG_TYPE_ASYNC_MSG:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void rpmsg_task(void *arg)
|
|
{
|
|
struct app_task_event *event;
|
|
struct rpmsg_msg_t *msg;
|
|
uint32_t msg_len;
|
|
uint32_t src_addr;
|
|
uint32_t length;
|
|
|
|
dsp_prepare();
|
|
|
|
#if DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_SDCARD
|
|
if (dsp_load_code_from_fs("4:\\dsp\\demos.bin") == false) {
|
|
#elif DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_XIP_RO
|
|
#if DSP_ROM_CODE_XIP == 1
|
|
extern uint8_t DSP_CODE_FLASH_BASE, DSP_CODE_FLASH_END;
|
|
src_addr = (uint32_t)&DSP_CODE_FLASH_BASE;
|
|
length = (uint32_t)&DSP_CODE_FLASH_END - (uint32_t)&DSP_CODE_FLASH_BASE;
|
|
#else
|
|
extern uint8_t DSP_CODE_ROM_BASE, DSP_CODE_ROM_END;
|
|
src_addr = (uint32_t)&DSP_CODE_ROM_BASE;
|
|
length = (uint32_t)&DSP_CODE_ROM_END - (uint32_t)&DSP_CODE_ROM_BASE;
|
|
#endif
|
|
if (dsp_load_code_from_internal_flash(src_addr, length) == false) {
|
|
#elif DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_FIX_ADDRESS
|
|
src_addr = (uint32_t)((DSP_CODE_FIX_ADDRESS + 0x10) | FLASH_DAC_BASE);
|
|
length = *(volatile uint32_t *)((DSP_CODE_FIX_ADDRESS + 0x08) | FLASH_DAC_BASE);
|
|
if (dsp_load_code_from_internal_flash(src_addr, length) == false) {
|
|
#else
|
|
#error "choose correct DSP code load mode"
|
|
{
|
|
#endif
|
|
printf("DSP image load failed.\r\n");
|
|
while(1);
|
|
}
|
|
|
|
printf("DSP is released.\r\n");
|
|
#if DSP_ROM_CODE_XIP == 0
|
|
__SYSTEM_LIBRARY_ROM_CLK_ENABLE();
|
|
#endif
|
|
remote_rpmsg = rpmsg_remote_init(rpmsg_recv);
|
|
dsp_run(0x78400660);
|
|
system_prevent_sleep_set(SYSTEM_PREVENT_SLEEP_TYPE_DSP);
|
|
rpmsg_wait_master_ready(remote_rpmsg);
|
|
system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_TYPE_DSP);
|
|
|
|
printf("DSP is ready.\r\n");
|
|
|
|
/* notice APP that rpmsg is ready. */
|
|
event = app_task_event_alloc(APP_TASK_EVENT_RPMSG_INITED, 0, true);
|
|
app_task_event_post(event, false);
|
|
|
|
while (1) {
|
|
src_addr = rpmsg_recv_msg(remote_rpmsg, &msg, &msg_len);
|
|
rpmsg_recv(remote_rpmsg, msg);
|
|
rpmsg_lite_release_rx_buffer(remote_rpmsg, msg);
|
|
}
|
|
}
|
|
|
|
void app_rpmsg_init(void)
|
|
{
|
|
/* create rpmsg task. */
|
|
xTaskCreate(rpmsg_task, "RPMSG_TASK", RPMSG_TASK_STACK_SIZE, NULL, RPMSG_TASK_PRIORITY, &rpmsg_task_handle);
|
|
}
|
|
|
|
void app_rpmsg_recover(void)
|
|
{
|
|
dsp_prepare();
|
|
|
|
uint32_t src_addr;
|
|
uint32_t length;
|
|
#if DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_XIP_RO
|
|
#if DSP_ROM_CODE_XIP == 1
|
|
extern uint8_t DSP_CODE_FLASH_BASE, DSP_CODE_FLASH_END;
|
|
src_addr = (uint32_t)&DSP_CODE_FLASH_BASE;
|
|
length = (uint32_t)&DSP_CODE_FLASH_END - (uint32_t)&DSP_CODE_FLASH_BASE;
|
|
#else
|
|
extern uint8_t DSP_CODE_ROM_BASE, DSP_CODE_ROM_END;
|
|
src_addr = (uint32_t)&DSP_CODE_ROM_BASE;
|
|
length = (uint32_t)&DSP_CODE_ROM_END - (uint32_t)&DSP_CODE_ROM_BASE;
|
|
#endif
|
|
dsp_load_rw_from_internal_flash(src_addr, length);
|
|
#elif DSP_CODE_LOAD_MODE == DSP_CODE_LOAD_MODE_FIX_ADDRESS
|
|
src_addr = (uint32_t)((DSP_CODE_FIX_ADDRESS + 0x10) | FLASH_DAC_BASE);
|
|
length = *(volatile uint32_t *)((DSP_CODE_FIX_ADDRESS + 0x08) | FLASH_DAC_BASE);
|
|
dsp_load_rw_from_internal_flash(src_addr, length);
|
|
#else
|
|
#error "choose correct DSP code load mode"
|
|
#endif
|
|
|
|
#if DSP_ROM_CODE_XIP == 0
|
|
__SYSTEM_LIBRARY_ROM_CLK_ENABLE();
|
|
#endif
|
|
dsp_run(0x78400660);
|
|
|
|
rpmsg_remote_recover();
|
|
}
|