?? mt8980.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 + -