/***************************************************************************** Prototype : BSP_MailBox_SpNotifyEnable Description : 专有邮箱数据到达通知中断使能接口 param : None Return Value : void *****************************************************************************/ void BSP_MailBox_SpNotifyEnable(void) { if(BSP_OK != BSP_IPC_IntConnect(IPC_INT_DSP_PS_MAC_MBX, (VOIDFUNCPTR)Mbx_SpIntProc, 0)) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MBX, "[mailbox]: <%s> BSP_IPC_IntConnect failed.\n", __FUNCTION__); } if(BSP_OK != BSP_IPC_IntEnable(IPC_INT_DSP_PS_MAC_MBX)) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MBX, "[mailbox]: <%s> BSP_IPC_IntEnable failed.\n", __FUNCTION__); } }
/***************************************************************************** Prototype : BSP_MailBox_SpNotifyEnable Description : 专有邮箱数据到达通知中断使能接口 param : None Return Value : void *****************************************************************************/ void BSP_MailBox_SpNotifyEnable(void) { if(BSP_OK != BSP_IPC_IntConnect(IPC_INT_DSP_PS_MAC_MBX, (VOIDFUNCPTR)Mbx_SpIntProc, 0)) { Mbx_Printf("BSP_IPC_IntConnect failed.\n"); } if(BSP_OK != BSP_IPC_IntEnable(IPC_INT_DSP_PS_MAC_MBX)) { Mbx_Printf("BSP_IPC_IntEnable failed.\n"); } }
MAILBOX_EXTERN long mailbox_channel_register( unsigned long channel_id, unsigned long int_src, unsigned long dst_id, unsigned long direct, void **mutex) { struct mb_local_cfg *local_cfg = &g_mb_local_cfg_tbl[0]; while (MAILBOX_MAILCODE_INVALID != local_cfg->channel_id) { if (channel_id == local_cfg->channel_id) { *mutex = mailbox_mutex_create(local_cfg); if (MAILBOX_NULL == *mutex) { return mailbox_logerro_p1(MAILBOX_CRIT_PORT_CONFIG, channel_id); } /*通道资源配置已找到,注册IPC中断*/ local_cfg->int_src = int_src; local_cfg->dst_id = dst_id; if(MIALBOX_DIRECTION_RECEIVE == direct) { BSP_IPC_IntConnect((IPC_INT_LEV_E)int_src , (VOIDFUNCPTR)mailbox_ipc_int_handle, int_src); BSP_IPC_IntEnable ((IPC_INT_LEV_E)int_src); /*板侧ST用例通道注册*/ test_mailbox_msg_reg(channel_id); } break; } local_cfg++; } /*如果适配层找不到对应的配置,报错*/ if (MAILBOX_MAILCODE_INVALID == local_cfg->channel_id) { return mailbox_logerro_p1(MAILBOX_ERR_LINUX_CHANNEL_NOT_FIND, channel_id); } return MAILBOX_OK; }
MAILBOX_EXTERN int mailbox_channel_register( unsigned int channel_id, unsigned int int_src, unsigned int dst_id, unsigned int direct, void **mutex) { struct mb_vx_cfg *cfg = &g_mailbox_vx_cfg_tbl[0]; while (MAILBOX_MAILCODE_INVALID != cfg->channel_id) { if (channel_id == cfg->channel_id) { *mutex = mailbox_mutex_create(); /*通道资源配置已找到,注册IPC中断*/ cfg->Int_src = int_src; cfg->dst_cpu = dst_id; if(MIALBOX_DIRECTION_RECEIVE == direct) { (void)BSP_IPC_IntConnect((IPC_INT_LEV_E)int_src , (VOIDFUNCPTR)mailbox_ipc_int_handle, int_src); (void)BSP_IPC_IntEnable ((IPC_INT_LEV_E)int_src); /*板侧ST用例通道注册*/ tm_mailbox_msg_reg(channel_id); /*TODO: 如果开发单核下电重启特性,这里需要主动触发一次通道读回调: */ /*mailbox_ipc_int_handle(int_src);*/ } return MAILBOX_OK; } cfg++; } /*如果适配层找不到对应的配置,报错*/ return mailbox_logerro_p1(MAILBOX_ERR_VXWORKS_CHANNEL_NOT_FIND, channel_id); }
/***************************************************************************** * 函 数 名 : DRV_IPC_INTENABLE * * 功能描述 : 使能某个中断 * * 输入参数 : BSP_U32 ulLvl 要使能的中断号,取值范围0~31 * 输出参数 : 无 * * 返 回 值 : OK&ERROR * * 修改记录 : 2011年4月11日 wangjing creat *****************************************************************************/ BSP_S32 DRV_IPC_INTENABLE (IPC_INT_LEV_E ulLvl) { return BSP_IPC_IntEnable(ulLvl); }
/***************************************************************************** Prototype : BSP_MailBox_IntTypeSet Description : 设置PS邮箱中断源接口(默认IPC中断方式) 只用于PS邮箱,OM邮箱无中断上报 param : None Return Value : 0: 成功; 其他: 设置的type非法 *****************************************************************************/ u32 BSP_MailBox_IntTypeSet(MAILBOX_INT_TYPE_E enIntType) { s32 ret; switch(enIntType) { case EN_MAILBOX_INT_SUBFRAME: { if(BSP_OK != BSP_Mailbox_ForbidDspSleep(EN_MAILBOX_SLEEP_WAKEUP)) { Mbx_Printf("BSP_Mailbox_ForbidDspSleep failed.\n"); return ERR_MAILBOX_TIMEOUT; } BSP_BBPIntTimerRegCb(Mbx_ComPsIntProc); /* [false alarm]:fortify */ ret = BSP_BBPIntTimerEnable();/* [false alarm]:fortify */ if(BSP_OK != ret) { /* [false alarm]:fortify */ Mbx_Printf("BSP_BBPIntTimerEnable failed.\n"); } BSP_Mailbox_AllowDspSleep(); ret = (s32)BSP_IPC_IntDisable(IPC_INT_DSP_PS_PUB_MBX); if(BSP_OK != ret) { Mbx_Printf("BSP_IPC_IntDisable failed.\n"); } ret = (s32)BSP_IPC_IntDisonnect(IPC_INT_DSP_PS_PUB_MBX, NULL, 0); /* [false alarm]:fortify */ if(BSP_OK != ret) { Mbx_Printf("BSP_IPC_IntDisonnect failed.\n"); } g_stMbxCtrl.bIsSubFrameInt = BSP_TRUE; break; } case EN_MAILBOX_INT_COM_IPC: { ret = (s32)BSP_IPC_IntConnect(IPC_INT_DSP_PS_PUB_MBX, (VOIDFUNCPTR)Mbx_ComPsIntProc, 0); if(BSP_OK != ret) { Mbx_Printf("BSP_IPC_IntConnect failed.\n"); } ret = (s32)BSP_IPC_IntEnable(IPC_INT_DSP_PS_PUB_MBX); if(BSP_OK != ret) { Mbx_Printf("BSP_IPC_IntEnable failed.\n"); } if(BSP_OK != BSP_Mailbox_ForbidDspSleep(EN_MAILBOX_SLEEP_WAKEUP)) { Mbx_Printf("BSP_Mailbox_ForbidDspSleep failed.\n"); return ERR_MAILBOX_TIMEOUT; } BSP_BBPIntTimerDisable(); BSP_BBPIntTimerClear(); BSP_Mailbox_AllowDspSleep(); g_stMbxCtrl.bIsSubFrameInt = BSP_FALSE; break; } default : { Mbx_Printf("enIntType %d.\n", enIntType); return ERR_MAILBOX_PARAM_INCORRECT; } } return BSP_OK; }