📄 hw_mailbox.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : hw_mailbox.c
Desc : MailBox接口函数的实现
Author : huangxinyu
Date : 2007-09-17
Notes :
$Log: hw_mailbox.c,v $
Revision 1.3 2008/06/19 04:43:33 Administrator
代码整理!
Revision 1.2 2008/05/15 08:05:10 HXY
取消LDK/Porsche宏
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.1.1.1 2008/03/06 13:29:06 Lingzhaojun
no message
Revision 1.5 2007/10/30 10:24:05 Hanjiang
no message
Revision 1.4 2007/10/23 08:24:51 Huangxinyu
调试后修改bug
Revision 1.3 2007/10/15 09:17:33 Huangxinyu
根据RK27提交修改driver
Revision 1.2 2007/10/08 02:38:45 Lingzhaojun
添加版本自动注释脚本
*********************************************************************/
/********************************************************************
INCLUDE FILES
*********************************************************************/
#include "hw_include.h"
#include "hw_mailbox.h"
#ifdef ROCK_MAILBOX_PROTOCOL
#include "../../gui/guictrl/list.h"
#include "system.h"
#endif
BOOLEAN MailBoxInternalReceiveMsg(void* msg);
#ifdef ROCK_MAILBOX_PROTOCOL
UILIST* gMailArm2ZSP = NULL;
UILIST* gMailZSP2Arm = NULL;
UILISTFTABLE MailBoxListFunc;
#endif
/**************************************************************************
* 函数描述: MailBox Host中断入口函数
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void MailBox_HosISR(void)
{
UINT32 C2H_Status;
MailBox_Channel_en_t MBox_Channel;
UINT32 MBox_Cmd;
UINT32 MBox_Data;
MBoxCallBack callback;
short cnt;
Intr_Disable(INTC_MAILBOX);
C2H_Status = ReadReg32(&pMailBoxReg->C2H_STA);
for (cnt = 0;cnt < 4;cnt++)
{
if (C2H_Status&(1 << cnt))
{
MAILBOXMSG msg;
msg.MailBoxCmd = ReadReg32(&pMailBoxReg->C2H[cnt].cmd);
msg.MailBoxData = ReadReg32(&pMailBoxReg->C2H[cnt].data);
MailBoxInternalReceiveMsg(&msg);
}
}
Intr_Enable(INTC_MAILBOX);
}
/**************************************************************************
* 函数描述: MailBox消息
* 入口参数: MBoxChannel -- MailBox的通道
* Cmd -- MailBox的命令
* 出口参数: 无
* 返回值: 无
***************************************************************************/
MailBox_Channel_en_t MailBox_SendMail(UINT32 Cmd, UINT32 Data)
{
UINT32 mailbox_status;
short cnt;
mailbox_status = ReadReg32(&pMailBoxReg->C2H_STA);
if ((mailbox_status&0x0f) == 0x0f)
return MAILBOX_BUSY;
for (cnt = 0;cnt < 4;cnt++)
{
if (mailbox_status&(1 << cnt))
continue;
WriteReg32(&pMailBoxReg->H2C[cnt].data, Data);
WriteReg32(&pMailBoxReg->H2C[cnt].cmd, Cmd);
}
return cnt;
}
/**************************************************************************
* 函数描述: MailBox Host端初始化
* 入口参数: MBoxChannel -- MailBox的通道
* Hostcallback -- 用户注册的MailBox Host端接收MailBox命令和数据的回调函数
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void MailBox_HostInit(void)
{
Intr_RegISR(INTC_MAILBOX, MailBox_HosISR);
}
//协议层开始
/**************************************************************************
* 函数描述: MAILBOX 协议栈用于比较信息的特征值
* 入口参数: data1 -- 特征值1;data2 -- 特征值2
* 出口参数: 无
* 返回值: 比较结果
* 注释: mailbox协议内部使用
***************************************************************************/
INT32 MailBoxInternalCmp(const void* data1, const void* data2)
{
#ifdef ROCK_MAILBOX_PROTOCOL
MAILBOXMSG* msg1 = (MAILBOXMSG*)data1;
MAILBOXMSG* msg2 = (MAILBOXMSG*)data2;
return ((msg1->MailBoxCmd >> 27) - (msg2->MailBoxCmd >> 27));
#endif
}
/**************************************************************************
* 函数描述: MAILBOX 释放用户malloc的空间
* 入口参数: buf -- 被释放的指针
* 出口参数: 无
* 返回值: 无
* 注释: mailbox协议内部使用
***************************************************************************/
void MailBoxInternalFree(void* buf)
{
#ifdef ROCK_MAILBOX_PROTOCOL
RKfree(buf);
#endif
}
/**************************************************************************
* 函数描述: MAILBOX 接受zsp发来的消息,在mailbox中断中调用
* 入口参数: mail信息(cmd,data)
* 出口参数: 无
* 返回值: true/false
* 注释: mailbox协议内部使用
***************************************************************************/
BOOLEAN MailBoxInternalReceiveMsg(void* msg)
{
#ifdef ROCK_MAILBOX_PROTOCOL
#ifndef MAILBOX_STACK_LIMIT
ListAddItem(gMailZSP2Arm, msg);
return MailBoxDispathMsg(msg);
#else
#endif
#endif
}
/**************************************************************************
* 函数描述: MAILBOX 发送到zsp的消息,在接受到zsp应答与host发送消息时调用
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释: mailbox协议内部使用
***************************************************************************/
INT16 MailBoxInternalSendMsg(void* msg)
{
#ifdef ROCK_MAILBOX_PROTOCOL
MAILBOXMSG* pMsg = (MAILBOXMSG*)msg;
return MailBox_SendMail(pMsg->MailBoxCmd, pMsg->MailBoxData);
#endif
}
/**************************************************************************
* 函数描述: MAILBOX
* 入口参数: msg -- 通过mailbox发送的信息,需包含(cmd,data)
* 出口参数: 无
* 返回值: 该消息在mailbox queue中的位置
* 注释: 若mailbox通道被占满,消息可能不会被立即发送
***************************************************************************/
BOOLEAN MailBoxDispathMsg(void)
{
#ifdef ROCK_MAILBOX_PROTOCOL
if (gMailZSP2Arm->last)
{
RockOSSendMsg(MBAUDIO, MS_MAILBOX, gMailZSP2Arm->last->data);
return TRUE;
}
return FALSE;
#endif
}
/****************************************************************************************
以下是对外接口
****************************************************************************************/
/**************************************************************************
* 函数描述: MAILBOX 初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 成功 -- TRUE 失败 -- FALSE
* 注释: 使用mailbox前需先初始化
***************************************************************************/
BOOLEAN MailBoxInit(void)
{
#ifdef ROCK_MAILBOX_PROTOCOL
BOOLEAN ret = FALSE;
MailBoxListFunc.CompareItem = MailBoxInternalCmp;
MailBoxListFunc.FreeItem = MailBoxInternalFree;
gMailArm2ZSP = ListCreate(LS_OWNSITEMS | LS_SORTED, &MailBoxListFunc);
gMailZSP2Arm = ListCreate(LS_OWNSITEMS | LS_SORTED, &MailBoxListFunc);
if ((NULL == gMailArm2ZSP) || (NULL == gMailZSP2Arm))
ret = FALSE;
if (FALSE == ret)
{
if (NULL == gMailArm2ZSP)
ListDestroy(gMailArm2ZSP);
if (NULL == gMailZSP2Arm)
ListDestroy(gMailZSP2Arm);
}
MailBox_HostInit();
return ret;
#endif
}
/**************************************************************************
* 函数描述: MAILBOX 反初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void MailBoxDenit(void)
{
#ifdef ROCK_MAILBOX_PROTOCOL
ListDestroy(gMailArm2ZSP);
ListDestroy(gMailZSP2Arm);
#endif
}
/**************************************************************************
* 函数描述: MAILBOX 发送消息
* 入口参数: msg -- 通过mailbox发送的信息,需包含(cmd,data)
* 出口参数: 无
* 返回值: 该消息在mailbox queue中的位置
* 注释: 若mailbox通道被占满,消息可能不会被立即发送
***************************************************************************/
UINT16 MailBoxSendMsg(void* msg)
{
#ifdef ROCK_MAILBOX_PROTOCOL
ListAddItem(gMailArm2ZSP, msg);
return MailBoxInternalSendMsg(msg);
#endif
}
/**************************************************************************
* 函数描述: MAILBOX 标识被处理过的消息
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释: 因为有可能应用或取消息后无法处理,所以增加该功能
***************************************************************************/
BOOLEAN MailBoxMsgDealed(void)
{
#ifdef ROCK_MAILBOX_PROTOCOL
ListDeleteItem(gMailZSP2Arm, ListGetCount(gMailZSP2Arm));
return MailBoxDispathMsg();
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -