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

📄 mt8980.c

📁 这是单板上DPRAM的驱动程序
💻 C
字号:
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "bspspec.h"
#include "mt8980.h"

#define MT8980_CR(ba)        REG8(ba)
#define MT8980_CH(ba,ch)     REG8(ba + 0x20 + ch)

static int ConfigTs(MT8980CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
    if(pTs->StreamOut>7 || pTs->StreamIn>7 || pTs->ChanOut>31 || pTs->ChanIn>31)
        return SDE_INVALID_ARG;
    MT8980_CR(pCfg->BaseAddr) = (0x18 | pTs->StreamOut );/* Conn Mem High(11)*/
    MT8980_CH(pCfg->BaseAddr, pTs->ChanOut) = (0x01);    /* enable the output */
    MT8980_CR(pCfg->BaseAddr) = (0x10 | pTs->StreamOut ); /* Conn Mem Low(10) */
    MT8980_CH(pCfg->BaseAddr, pTs->ChanOut) 
           = ((pTs->StreamIn << 5) | pTs->ChanIn );
    return SDE_OK;
}

static void MT8980ConfigMessageMode(MT8980CfgStruct* pCfg, 
                                    MT8980MessageModeStruct *pMsgMode)
{
    MT8980_CR(pCfg->BaseAddr) 
        = (0x18 | ( pMsgMode->StreamOut & 0x7));  /* Conn Mem High(11)*/
    MT8980_CH(pCfg->BaseAddr, pMsgMode->ChanOut) 
        = 0x07;    /* set ChanOut message mode, enable the output */
                                                          
    MT8980_CR(pCfg->BaseAddr) 
        = (0x10 | ( pMsgMode->StreamOut & 0x7)); /* Conn Mem Low(10) */
    MT8980_CH(pCfg->BaseAddr, pMsgMode->ChanOut) 
        = pMsgMode->ChanOutValue;     
    
    MT8980_CR(pCfg->BaseAddr) 
        = 0x08 | (pMsgMode->StreamOut & 0x7); /* read Val in the data memory*/
}

static int MT8980CheckMsg(MT8980CfgStruct* pCfg, 
                          MT8980MessageModeStruct *pMsgMode)
{
   
   if((pMsgMode->StreamOut>7)||(pMsgMode->ChanOut>31))
	  return SDE_INVALID_ARG;
   MT8980_CR(pCfg->BaseAddr)=(0x1<<3)|pMsgMode->StreamOut;              
   if(pMsgMode->ChanOutValue!=(char)MT8980_CH(pCfg->BaseAddr, pMsgMode->ChanOut)) 
      return SDE_CHK_MSG_ERR;
   return  SDE_OK;  
	
}

static void MT8980Init(void *pDataBuf, MT8980CfgStruct *cfg )
{
    int i, j;
    MT8980CfgStruct *pCfg = (MT8980CfgStruct *)(pDataBuf);
    
/*-------------------------<< Initial data >>-------------------------------*/
    memmove(pCfg,cfg,sizeof(MT8980CfgStruct));

    for (i = 0; i < 8; i++) {
        MT8980_CR(pCfg->BaseAddr) = (0x18 | (i & 0x7)); /* Conn Mem High(11) */
        for (j = 0; j < 32; j++) {
            MT8980_CH(pCfg->BaseAddr,j) =  (0x0); /* disable the output */
        }
    }

    for (i=0; i< pCfg->ValidConfigTsNum;i++)
        ConfigTs(pCfg,&(pCfg->ConfigTsTable[i]));
}

static int MT8980Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
    int i, j;
    /* PDA *pda= (PDA *)(GetIMMR() & IO_MAP_MASK);  */
    MT8980CfgStruct*  pCfg =(MT8980CfgStruct *)(pDataBuf);   
    
    switch(cmd)
    {
        case SDC_REINIT:
            MT8980Init(pDataBuf, pCfg);
            break;
            
        case SDC_CONFIG_TS:
            if(maxlen!=sizeof(SDCConfigTsStruct))
                return SDE_INVALID_ARG;
            ConfigTs(pCfg, (SDCConfigTsStruct *)pParam);
            break;
            
        case SDC_CONFIG_2TS:
        {
            SDCConfigTsStruct ts;
            if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
            ConfigTs(pCfg, (SDCConfigTsStruct *)pParam);
	        ts.StreamIn =((SDCConfigTsStruct*)pParam)->StreamOut;
	        ts.StreamOut=((SDCConfigTsStruct*)pParam)->StreamIn;
	        ts.ChanIn   =((SDCConfigTsStruct*)pParam)->ChanOut;
	        ts.ChanOut  =((SDCConfigTsStruct*)pParam)->ChanIn;
            ConfigTs(pCfg, &ts);
        }
        break;

     
        case SDC_MESSAGE_MODE:
            if(maxlen!=sizeof(MT8980MessageModeStruct))
                return SDE_INVALID_ARG;
            MT8980ConfigMessageMode(pCfg, (MT8980MessageModeStruct *)pParam);
            break;    
            
        case SDC_CHECK_MSG:
            if(maxlen!=sizeof(MT8980MessageModeStruct))
                return SDE_INVALID_ARG;
            return MT8980CheckMsg(pCfg, (MT8980MessageModeStruct *)pParam);  
        default: 
            return SDE_UNKNOW_CMD;
    }/* end of switch(cmd) */
    return SDE_OK;
}

char *MT8980BspInit(int DEV, char *FreeMemPtr, MT8980CfgStruct *cfg)
{
    InstallSD(DEV,NULL,NULL,MT8980Cntrl,FreeMemPtr);
    MT8980Init(FreeMemPtr, cfg); 
    FreeMemPtr += sizeof(MT8980CfgStruct);
    memcpy(FreeMemPtr,"*8980Dat",8);
    FreeMemPtr += 8;
    return FreeMemPtr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -