{"mailboxTasklet", MAILBOX_RECV_TASKLET_HI, 0, 0, }, /*中断方式的邮件数据处理*/ {"mailboxInt", MAILBOX_RECV_INT_IRQ, 0, 0, }, /*请在此后新增处理方式项目,否则会影响UT用例*/ /*结束*/ }; /*A核的邮箱通道资源与平台系统资源对应关系配置表*/ MAILBOX_LOCAL struct mb_local_cfg g_mb_local_cfg_tbl[] = { /*接收通道的配置*/ /*ChannelID*/ /*通道属性*/ {MAILBOX_MAILCODE_RESERVED(MCU, ACPU, MSG), MAILBOX_RECV_TASKLET_HI, 0 }, {MAILBOX_MAILCODE_RESERVED(HIFI, ACPU, MSG), MAILBOX_RECV_TASKLET_HI, 0 }, {MAILBOX_MAILCODE_RESERVED(CCPU, ACPU, MSG), MAILBOX_RECV_TASKLET_HI, 0 }, {MAILBOX_MAILCODE_RESERVED(CCPU, ACPU, IFC), MAILBOX_RECV_TASK_NORMAL, 0 }, {MAILBOX_MAILCODE_RESERVED(MCU, ACPU, IFC), MAILBOX_RECV_TASK_HIGH, 0 }, /*发送通道配置*/ /*ChannelID*/ /*通道属性*/ {MAILBOX_MAILCODE_RESERVED( ACPU, MCU, MSG), MAILBOX_SEND | MAILBOX_LOCK_SPINLOCK, 0 }, {MAILBOX_MAILCODE_RESERVED( ACPU, HIFI, MSG), MAILBOX_SEND | MAILBOX_LOCK_SPINLOCK, 0 }, {MAILBOX_MAILCODE_RESERVED( ACPU, CCPU, MSG), MAILBOX_SEND | MAILBOX_LOCK_SEMAPHORE /*如果消息通道作为IFC的返回通道,且这个IFC执行方的 函数有睡眠动作,此消息通道就只能用信号量来保护*/ , 0 },
VOS_UINT32 DRV_MAILBOX_Read( IPC_MSG_BLK_STRU *pstMsgBlk, DRV_MAILBOX_QUEUE_STRU *pstQueue) { MsgBlock *pstSndOsaMsg; VOS_UINT32 uwMsgPriority; VOS_UINT32 uwCpuId; /* 根据邮编进行相应处理 */ switch (pstMsgBlk->stMsgHead.ulMailCode) { case MAILBOX_MAILCODE_ACPU_TO_HIFI_VOS_MSG_NORMAL : case MAILBOX_MAILCODE_CCPU_TO_HIFI_VOS_MSG_NORMAL : case MAILBOX_MAILCODE_BBE16_TO_HIFI_VOS_MSG_NORMAL: { uwMsgPriority = VOS_NORMAL_PRIORITY_MSG; /* 读出消息头信息中的VOS头(需要知道PID) */ DRV_MAILBOX_ReadQueue(pstQueue, (VOS_UCHAR*)&pstMsgBlk->ulSenderCpuId, sizeof(VOS_MSG_HEADER_STRU)); break; } case MAILBOX_MAILCODE_ACPU_TO_HIFI_VOS_MSG_URGENT : case MAILBOX_MAILCODE_CCPU_TO_HIFI_VOS_MSG_URGENT : case MAILBOX_MAILCODE_BBE16_TO_HIFI_VOS_MSG_URGENT: { uwMsgPriority = VOS_EMERGENT_PRIORITY_MSG; /* 读出消息头信息中的VOS头(需要知道PID) */ DRV_MAILBOX_ReadQueue(pstQueue, (VOS_UCHAR*)&pstMsgBlk->ulSenderCpuId, sizeof(VOS_MSG_HEADER_STRU)); break; } case MAILBOX_MAILCODE_ACPU_TO_HIFI_AUDIO : case MAILBOX_MAILCODE_ACPU_TO_HIFI_MISC: { uwMsgPriority = VOS_NORMAL_PRIORITY_MSG; /* 若非VOS消息,则自行填充VOS头 */ pstMsgBlk->ulSenderCpuId = (pstMsgBlk->stMsgHead.ulMailCode>>MAILBOX_ID_SRC_CPU_OFFSET)&0xff; pstMsgBlk->ulSenderPid = UEPS_PID_DL; /* 此处填写AP侧DRV对应的PID,,待定 */ pstMsgBlk->ulReceiverCpuId= VOS_CPU_ID_MEDDSP; pstMsgBlk->ulReceiverPid = DSP_PID_AUDIO_RT; /* 目前默认为这两个通道的消息均为需实时响应的消息 */ pstMsgBlk->ulLength = pstMsgBlk->stMsgHead.ulMsgLength; pstMsgBlk->stMsgHead.ulMsgLength += sizeof(VOS_MSG_HEADER_STRU); break; } /* C核复位A核通知hifi C核复位channel */ case MAILBOX_MAILCODE_ACPU_TO_HIFI_CCORE_RESET_ID: { uwMsgPriority = VOS_NORMAL_PRIORITY_MSG; /* 若非VOS消息,则自行填充VOS头 */ pstMsgBlk->ulSenderCpuId = (pstMsgBlk->stMsgHead.ulMailCode>>MAILBOX_ID_SRC_CPU_OFFSET)&0xff; pstMsgBlk->ulSenderPid = UEPS_PID_DL; /* 此处填写AP侧DRV对应的PID,,待定 */ pstMsgBlk->ulReceiverCpuId= VOS_CPU_ID_MEDDSP; pstMsgBlk->ulReceiverPid = DSP_PID_VOICE; /* 目前默认为这两个通道的消息均为需实时响应的消息 */ pstMsgBlk->ulLength = pstMsgBlk->stMsgHead.ulMsgLength; pstMsgBlk->stMsgHead.ulMsgLength += sizeof(VOS_MSG_HEADER_STRU); break; } case MAILBOX_MAILCODE_RESERVED(CCPU, HIFI, MSG) : { uwCpuId = VOS_CPU_ID_CCPU; DRV_MAILBOX_Write(DRV_MAILBOX_GetMailBoxTx(uwCpuId), DRV_MAILBOX_GetTargetCpu(uwCpuId), VOS_NORMAL_PRIORITY_MSG, (VOS_UCHAR *)pstQueue->uwRear, pstMsgBlk->stMsgHead.ulMsgLength, MAILBOX_MAILCODE_RESERVED(HIFI, CCPU, MSG)); /*向目标CPU触发IPC中断*/ DRV_IPC_TrigInt(DRV_MAILBOX_GetTargetCpu(uwCpuId), DRV_MAILBOX_GetIntrSrc(uwCpuId)); return VOS_OK; } case MAILBOX_MAILCODE_RESERVED(ACPU, HIFI, MSG): { uwCpuId = VOS_CPU_ID_ACPU; DRV_MAILBOX_Write(DRV_MAILBOX_GetMailBoxTx(uwCpuId), DRV_MAILBOX_GetTargetCpu(uwCpuId), VOS_NORMAL_PRIORITY_MSG, (VOS_UCHAR *)pstQueue->uwRear, pstMsgBlk->stMsgHead.ulMsgLength, MAILBOX_MAILCODE_RESERVED(HIFI, ACPU, MSG)); /*向目标CPU触发IPC中断*/ DRV_IPC_TrigInt(DRV_MAILBOX_GetTargetCpu(uwCpuId), DRV_MAILBOX_GetIntrSrc(uwCpuId)); return VOS_OK; } default: { /*上报异常,MailCode异常*/ OM_LogError1(OM_MAILBOX_RecieveMsg_MsgChannelIdErr, pstMsgBlk->stMsgHead.ulMailCode); return VOS_ERR; } } /*申请OSA消息缓存pMsg*/ pstSndOsaMsg = (MsgBlock*)VOS_AllocMsg(pstMsgBlk->ulSenderPid, pstMsgBlk->ulLength); /*若内存不足,释放互斥,直接返回*/ if (VOS_NULL == pstSndOsaMsg) { OM_LogError(OM_MAILBOX_SendMsg_AllocFail); /* 复位 */ OM_LogFatalAndReset(OM_MAILBOX_SendMsg_AllocFail); return VOS_ERR; } /* 将VOS_HEADER内容拷贝入消息中 */ UCOM_MemCpy(pstSndOsaMsg, (VOS_VOID *)(&(pstMsgBlk->ulSenderCpuId)), sizeof(VOS_MSG_HEADER_STRU)); /*从邮箱内容中读出消息内容(不含VOS头),并更新队列状态记录临时结构体*/ DRV_MAILBOX_ReadQueue(pstQueue, (VOS_UCHAR*)pstSndOsaMsg->aucValue, pstMsgBlk->ulLength); /*根据消息优先级发送OSA消息*/ if (VOS_EMERGENT_PRIORITY_MSG == uwMsgPriority) { return VOS_SendUrgentMsg(pstMsgBlk->ulSenderPid, pstSndOsaMsg, DRV_MAILBOX_CHANNEL_VOS_CH); } else { return VOS_SendMsg(pstMsgBlk->ulSenderPid, pstSndOsaMsg, DRV_MAILBOX_CHANNEL_VOS_CH); } }
/*中断方式的邮件数据处理*/ {"mailboxInt" ,MAILBOX_VXWORKS_PROC_STYLE_INT_NORMAL, 0, 0 }, /*请在此后新增处理方式项目,否则会影响UT用例*/ /*结束*/ }; /*C核的邮箱通道资源与平台系统资源对应关系配置表*/ MAILBOX_LOCAL struct mb_vx_cfg g_mailbox_vx_cfg_tbl[] = { #if 0 /*接收通道的配置*/ /*ChannelID*/ /*通道处理方式ID号*/ {MAILBOX_MAILCODE_RESERVED(MCU, CCPU, MSG), MAILBOX_VXWORKS_PROC_STYLE_TASK_MSG }, {MAILBOX_MAILCODE_RESERVED(HIFI, CCPU, MSG), MAILBOX_VXWORKS_PROC_STYLE_TASK_MSG }, {MAILBOX_MAILCODE_RESERVED(ACPU, CCPU, MSG), MAILBOX_VXWORKS_PROC_STYLE_TASK_MSG }, {MAILBOX_MAILCODE_RESERVED(ACPU, CCPU, IFC), MAILBOX_VXWORKS_PROC_STYLE_TASK_IFC }, {MAILBOX_MAILCODE_RESERVED(MCU, CCPU, IFC), MAILBOX_VXWORKS_PROC_STYLE_TASK_IFC }, /*发送通道配置*/ /*ChannelID*/ /*通道处理方式ID号*/ {MAILBOX_MAILCODE_RESERVED( CCPU, MCU, MSG), MAILBOX_VXWORKS_PROC_STYLE_SEND_RESERVED }, {MAILBOX_MAILCODE_RESERVED( CCPU, HIFI, MSG), MAILBOX_VXWORKS_PROC_STYLE_SEND_RESERVED }, {MAILBOX_MAILCODE_RESERVED( CCPU, ACPU, MSG), MAILBOX_VXWORKS_PROC_STYLE_SEND_RESERVED }, {MAILBOX_MAILCODE_RESERVED( CCPU, ACPU, IFC), MAILBOX_VXWORKS_PROC_STYLE_SEND_RESERVED }, {MAILBOX_MAILCODE_RESERVED( CCPU, MCU, IFC), MAILBOX_VXWORKS_PROC_STYLE_SEND_RESERVED }, #else /*接收通道的配置*/ /*ChannelID*/ /*通道处理方式ID号*/ {MAILBOX_MAILCODE_RESERVED(HIFI, CCPU, MSG), MAILBOX_VXWORKS_PROC_STYLE_TASK_MSG },
CPUn的通道0邮编,通道1邮编,通道2邮编,通道0邮编, 说明: 邮编为VOS_NULL_DWORD表示对应的通道邮编不存在, 即与该CPU不支持该通道跨核消息; */ VOS_UINT32 g_uwDrvMailCodeTbl[VOS_CPU_ID_BUTT][DRV_MAILBOX_CHANNEL_BUTT] = { {MAILBOX_MAILCODE_HIFI_TO_CCPU_VOS_MSG_NORMAL, MAILBOX_MAILCODE_HIFI_TO_CCPU_VOS_MSG_URGENT, VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD}, {MAILBOX_MAILCODE_HIFI_TO_ACPU_VOS_MSG_NORMAL, MAILBOX_MAILCODE_HIFI_TO_ACPU_VOS_MSG_URGENT, MAILBOX_MAILCODE_HIFI_TO_ACPU_AUDIO, MAILBOX_MAILCODE_HIFI_TO_ACPU_MISC, MAILBOX_MAILCODE_HIFI_TO_ACPU_CCORE_RESET_ID, MAILBOX_MAILCODE_RESERVED(ACPU, HIFI, MSG)}, {VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD}, {VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD}, {VOS_NULL_DWORD, VOS_NULL_DWORD, VOS_NULL_DWORD,