/***************************************************************************** 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; }