154 lines
2.9 KiB
C
Executable File
154 lines
2.9 KiB
C
Executable File
#include <string.h>
|
|
#include "mbox0_adapter.h"
|
|
|
|
enum
|
|
{
|
|
TX_CMD_BOX = 0,
|
|
TX_ACK_BOX,
|
|
TX_BOX_NUM,
|
|
} ;
|
|
|
|
static mailbox_data_t mailbox_buff[MBOX_CHNL_NUM][TX_BOX_NUM];
|
|
static mailbox_callback_t mailbox_callback[MBOX_CHNL_NUM] = {0};
|
|
static uint8_t mailbox_tx_box[MBOX_CHNL_NUM] = {0};
|
|
|
|
static void mbox0_rx_isr(mbox0_message_t *msg)
|
|
{
|
|
mailbox_data_t data;
|
|
u32 chnl = msg->src_cpu;
|
|
|
|
if(chnl >= MBOX_CHNL_NUM)
|
|
return;
|
|
|
|
if(msg->data[1] == sizeof(data))
|
|
{
|
|
#if CONFIG_CACHE_ENABLE
|
|
extern void flush_dcache(void *va, long size);
|
|
flush_dcache((void *)msg->data[0], sizeof(data));
|
|
#endif
|
|
memcpy(&data, (u8 *)msg->data[0], sizeof(data));
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(mailbox_callback[chnl] != NULL)
|
|
mailbox_callback[chnl](&data);
|
|
}
|
|
|
|
bk_err_t bk_mailbox_init(void)
|
|
{
|
|
int ret_code;
|
|
|
|
ret_code = mbox0_drv_init();
|
|
if(ret_code != 0)
|
|
return BK_FAIL;
|
|
|
|
ret_code = mbox0_drv_callback_register(mbox0_rx_isr);
|
|
|
|
return ret_code;
|
|
}
|
|
|
|
bk_err_t bk_mailbox_deinit(void)
|
|
{
|
|
int ret_code;
|
|
|
|
ret_code = mbox0_drv_deinit();
|
|
if(ret_code != 0)
|
|
return BK_FAIL;
|
|
|
|
return BK_OK;
|
|
}
|
|
|
|
bk_err_t bk_mailbox_ready(mailbox_endpoint_t src, mailbox_endpoint_t dst, uint32_t box_id)
|
|
{
|
|
if(dst >= MBOX_CHNL_NUM)
|
|
return BK_ERR_MAILBOX_SRC_DST;
|
|
|
|
return BK_OK;
|
|
|
|
}
|
|
|
|
bk_err_t bk_mailbox_send(mailbox_data_t *data, mailbox_endpoint_t src, mailbox_endpoint_t dst, void *arg)
|
|
{
|
|
mbox0_message_t message;
|
|
|
|
if(dst >= MBOX_CHNL_NUM)
|
|
return BK_ERR_MAILBOX_SRC_DST;
|
|
|
|
(void)arg;
|
|
|
|
/*
|
|
int box = TX_CMD_BOX;
|
|
|
|
if(arg != NULL)
|
|
{
|
|
box = (*(uint16_t *)arg) & 0xFF;
|
|
}
|
|
|
|
if(box >= TX_BOX_NUM)
|
|
return BK_ERR_MAILBOX_ID;
|
|
*/
|
|
|
|
int ret_code = mbox0_drv_get_send_stat((uint32_t)dst);
|
|
|
|
if(ret_code != MBOX0_HAL_OK)
|
|
{
|
|
if(ret_code == MBOX0_HAL_SW_FIFO_FULL)
|
|
return BK_ERR_MAILBOX_TIMEOUT; // mailbox busy
|
|
|
|
if(ret_code == MBOX0_HAL_SW_PARAM_ERR)
|
|
return BK_ERR_MAILBOX_SRC_DST;
|
|
|
|
return BK_ERR_MAILBOX_NOT_INIT;
|
|
}
|
|
|
|
mailbox_tx_box[dst] = (mailbox_tx_box[dst] + 1) % TX_BOX_NUM;
|
|
|
|
int box = mailbox_tx_box[dst];
|
|
|
|
if(data != NULL)
|
|
{
|
|
memcpy(&mailbox_buff[dst][box], data, sizeof(mailbox_data_t));
|
|
|
|
message.data[0] = (u32)(&mailbox_buff[dst][box]);
|
|
message.data[1] = sizeof(mailbox_data_t);
|
|
}
|
|
else
|
|
{
|
|
message.data[0] = 0;
|
|
message.data[1] = 0;
|
|
}
|
|
|
|
message.dest_cpu = (uint8_t)dst;
|
|
|
|
ret_code = mbox0_drv_send_message(&message);
|
|
|
|
if(ret_code != MBOX0_HAL_OK)
|
|
return BK_ERR_MAILBOX_NOT_INIT;
|
|
|
|
return BK_OK;
|
|
}
|
|
|
|
bk_err_t bk_mailbox_recv_callback_register(mailbox_endpoint_t src, mailbox_endpoint_t dst, mailbox_callback_t callback)
|
|
{
|
|
if(src >= MBOX_CHNL_NUM)
|
|
return BK_ERR_MAILBOX_SRC_DST;
|
|
|
|
mailbox_callback[src] = callback;
|
|
|
|
return BK_OK;
|
|
}
|
|
|
|
bk_err_t bk_mailbox_recv_callback_unregister(mailbox_endpoint_t src, mailbox_endpoint_t dst)
|
|
{
|
|
if(src >= MBOX_CHNL_NUM)
|
|
return BK_ERR_MAILBOX_SRC_DST;
|
|
|
|
mailbox_callback[src] = NULL;
|
|
|
|
return BK_OK;
|
|
}
|
|
|