Пример #1
0
/*****************************************************************************
 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);

}
Пример #5
0
/*****************************************************************************
* 函 数 名  : 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;
}