Ejemplo n.º 1
0
/*****************************************************************************
 Prototype      : MailBox_SpMsgWrite
 Description    : 专有邮箱读接口封装
 Input          : 
                ulAddr : 专有邮箱的偏移地址(从消息头开始的地址)
                ulSize : 初始值的大小(以字节为单位)
                pData  : 数据信息(不包含消息头信息)
 Return Value   : 
                0: 表示操作成功
                其他: 表示操作失败
*****************************************************************************/
u32 MailBox_SpMsgRead(u32 ulAddr, 
                          u32 ulSize, 
                          void* pData)
{
    s32 key;

    key = intLock();

    /* 如果DSP已睡眠,表示邮箱中无数据 */
    /* 如果DSP没睡眠,由锁中断保证不调度低功耗模块对DSP的下电处理 */
    if(BSP_TRUE == BSP_MailBox_IsDspSleep()) /*lint !e746*/
    {
        intUnlock(key);
        return ERR_MAILBOX_READ_NULL;
    }
    
    /* 判断当前消息是否已读走 */
    if(0 == *((u32*)ulAddr))
    {
        intUnlock(key);
        return ERR_MAILBOX_READ_NULL;
    }

    memcpy(pData, ((u8*)ulAddr + 4), ulSize);

    /* 设置可以DSP可以读 */
    *((u32*)ulAddr) = 0;
    
    intUnlock(key);

    return BSP_OK;
}
/*****************************************************************************
 Prototype      : MailBox_SpMsgWrite
 Description    : 专有邮箱读接口封装
 Input          : 
                ulAddr : 专有邮箱的偏移地址(从消息头开始的地址)
                ulSize : 初始值的大小(以字节为单位)
                pData  : 数据信息(不包含消息头信息)
 Return Value   : 
                0: 表示操作成功
                其他: 表示操作失败
*****************************************************************************/
u32 MailBox_SpMsgRead(u32 ulAddr,
                          u32 ulSize,
                          void* pData)
{
    unsigned long key;

    local_irq_save(key);

    /* 如果DSP已睡眠,表示邮箱中无数据 */
    /* 如果DSP没睡眠,由锁中断保证不调度低功耗模块对DSP的下电处理 */
    if(BSP_TRUE == BSP_MailBox_IsDspSleep()) /*lint !e746*/
    {
        local_irq_restore(key);
        return ERR_MAILBOX_READ_NULL;
    }

    /* 判断当前消息是否已读走 */
    if(0 == *((u32*)ulAddr))
    {
        local_irq_restore(key);
        return ERR_MAILBOX_READ_NULL;
    }

    memcpy(pData, ((u8*)ulAddr + 4), ulSize);

    /* 设置可以DSP可以读 */
    *((u32*)ulAddr) = 0;

    local_irq_restore(key);

    return BSP_OK;
}