⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_mailbox.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -