?? mt898x.c
字號(hào):
/* @(#) pSOSystem PowerPC/V2.2.2*/
/***********************************************************************/
/* */
/* MODULE: mpc8xx/sdev/MT898x.c */
/* DATE: 99/11/29 */
/* AUTHOR: Dong Aiping */
/* PURPOSE: include all miscillous functions */
/* */
/*---------------------------------------------------------------------*/
/* */
/* Copyright 1998 - 1999, ZHONGXING TELECOM CO.,LTD. */
/* ALL RIGHTS RESERVED */
/* */
/*---------------------------------------------------------------------*/
/* */
/* The routines in this module performs MT898x functions. */
/* */
/***********************************************************************/
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "bspspec.h"
#include "MT898x.h"
#define MT898x_CR(base) REG8(base) /* 控制寄存器 */
#define MT898x_CH(base,ch) REG8(base + ch + (((int)ch)/32+1)*0x20) /* 通道選擇 */
static int ConfigTs(MT898xCfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
unsigned char idr,odr;
/* get data rate*/
idr=((pCfg->Imsr&IMSR_IDR_MASK)>>5)+1;
if(idr==3)idr=4; /*adjust to vaild param*/
odr=((pCfg->Imsr&IMSR_ODR_MASK)>>3)+1;
if(odr==3)odr=4;
if(pTs->StreamOut>(8/odr-1) || pTs->StreamIn>(8/idr-1) \
|| pTs->ChanOut>(32*odr-1) || pTs->ChanIn>(32*idr-1))
return SDE_INVALID_ARG;
MT898x_CR(pCfg->BaseAddr) = (0x18 | pTs->StreamOut );/* Conn Mem High(11)*/
MT898x_CH(pCfg->BaseAddr, pTs->ChanOut) =((pTs->ChanIn&0x60)>>2) |(0x41);/* enable the output */
MT898x_CR(pCfg->BaseAddr) = (0x10 | pTs->StreamOut );/* Conn Mem Low(10) */
MT898x_CH(pCfg->BaseAddr, pTs->ChanOut)
= ((pTs->StreamIn << 5) | (pTs->ChanIn&0x1f));
return SDE_OK;
}
/* Following added by maold */
static int Check_Connection(MT898xCfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
unsigned char idr,odr;
unsigned short re_val,re_val2,input,input2;
/* get data rate*/
idr=((pCfg->Imsr&IMSR_IDR_MASK)>>5)+1;
if(idr==3)idr=4; /*adjust to vaild param*/
odr=((pCfg->Imsr&IMSR_ODR_MASK)>>3)+1;
if(odr==3)odr=4;
if(pTs->StreamOut>(8/odr-1) || pTs->StreamIn>(8/idr-1) \
|| pTs->ChanOut>(32*odr-1) || pTs->ChanIn>(32*idr-1))
return SDE_INVALID_ARG;
MT898x_CR(pCfg->BaseAddr) = (0x18 | pTs->StreamOut );/* Conn Mem High(11)*/
re_val2 = MT898x_CH(pCfg->BaseAddr, pTs->ChanOut)&0x18;
MT898x_CR(pCfg->BaseAddr) = (0x10 | pTs->StreamOut );/* Conn Mem Low(10) */
re_val = MT898x_CH(pCfg->BaseAddr, pTs->ChanOut);
input = ((pTs->StreamIn << 5) | (pTs->ChanIn&0x1f));
input2 = (pTs->ChanIn&0x60)>>2;
if((re_val==input)&&(re_val2==input2))
return SDE_OK;
else
return SDE_CONN_CHEK_ERR;
}
static int MT898xConfigMessageMode(MT898xCfgStruct* pCfg,
MT898xMessageModeStruct *pMsgMode)
{
unsigned char odr;
/* get data rate*/
odr=((pCfg->Imsr&IMSR_ODR_MASK)>>3)+1;
if(odr==3)odr=4; /*adjust to vaild param*/
if((pMsgMode->StreamOut>(8/odr-1))||(pMsgMode->ChanOut>(32*odr-1)))
return SDE_INVALID_ARG;
MT898x_CR(pCfg->BaseAddr)
= (0x18 | ( pMsgMode->StreamOut & 0x7)); /* Conn Mem High(11)*/
MT898x_CH(pCfg->BaseAddr, pMsgMode->ChanOut)
= 0x05; /* set ChanOut message mode, enable the output */
MT898x_CR(pCfg->BaseAddr)
= (0x10 | ( pMsgMode->StreamOut & 0x7)); /* Conn Mem Low(10) */
MT898x_CH(pCfg->BaseAddr, pMsgMode->ChanOut)
= pMsgMode->ChanOutValue;
return SDE_OK;
/* @@PY NO_USE MT898x_CR(pCfg->BaseAddr)
= 0x08 | (pMsgMode->StreamOut & 0x7); /* read Val in data memory*/
}
static int MT898xCheckMsg(MT898xCfgStruct* pCfg,
MT898xMessageModeStruct *pMsgMode)
{
unsigned char odr;
/* get data rate*/
odr=((pCfg->Imsr&IMSR_ODR_MASK)>>3)+1;
if(odr==3)odr=4; /*adjust to vaild param*/
if((pMsgMode->StreamOut>(8/odr-1))||(pMsgMode->ChanOut>(32*odr-1)))
return SDE_INVALID_ARG;
MT898x_CR(pCfg->BaseAddr)=(0x1<<3)|pMsgMode->StreamOut;
if(pMsgMode->ChanOutValue!=(char)MT898x_CH(pCfg->BaseAddr, pMsgMode->ChanOut))
return SDE_CHK_MSG_ERR;
return SDE_OK;
}
static int MT898xChDisableOE(MT898xCfgStruct* pCfg,
MT898xMessageModeStruct *pMsgMode)
{
unsigned char odr;
/* get data rate*/
odr=((pCfg->Imsr&IMSR_ODR_MASK)>>3)+1;
if(odr==3)odr=4; /*adjust to vaild param*/
if((pMsgMode->StreamOut>(8/odr-1))||(pMsgMode->ChanOut>(32*odr-1)))
return SDE_INVALID_ARG;
MT898x_CR(pCfg->BaseAddr)
= (0x18 | ( pMsgMode->StreamOut & 0x7)); /* Conn Mem High(11)*/
MT898x_CH(pCfg->BaseAddr, pMsgMode->ChanOut)
&= 0xfe; /* set ChanOut message mode, enable the output */
return SDE_OK;
}
static int MT898xChEnableOE(MT898xCfgStruct* pCfg,
MT898xMessageModeStruct *pMsgMode)
{
unsigned char odr;
/* get data rate*/
odr=((pCfg->Imsr&IMSR_ODR_MASK)>>3)+1;
if(odr==3)odr=4; /*adjust to vaild param*/
if((pMsgMode->StreamOut>(8/odr-1))||(pMsgMode->ChanOut>(32*odr-1)))
return SDE_INVALID_ARG;
MT898x_CR(pCfg->BaseAddr)
= (0x18 | ( pMsgMode->StreamOut & 0x7)); /* Conn Mem High(11)*/
MT898x_CH(pCfg->BaseAddr, pMsgMode->ChanOut)
|= 0x1; /* set ChanOut message mode, enable the output */
return SDE_OK;
}
static void MT898xInit(void *pDataBuf, MT898xCfgStruct *cfg )
{
int i, j;
MT898xCfgStruct *pCfg = (MT898xCfgStruct *)(pDataBuf);
/*------------<< Initial data >>---------------------------------------*/
memmove(pCfg,cfg,sizeof(MT898xCfgStruct));
MT898x_CR(pCfg->BaseAddr+0x1) = pCfg->Imsr;
MT898x_CR(pCfg->BaseAddr+0x2) = 0x00;
MT898x_CR(pCfg->BaseAddr+0x3) = 0x00;
for (i = 0; i < 8; i++) {
/* Conn Mem High(11) */
MT898x_CR(pCfg->BaseAddr) = (0x18 | (i & 0x7));
for (j = 0; j < 128; j++) {
MT898x_CH(pCfg->BaseAddr,j) = (0x0);/* disable the output */
}
}
/* ------------<< 加上缺省的通道配置信息 >>----------------------------*/
for (i=0; i< pCfg->ValidConfigTsNum;i++)
ConfigTs(pCfg,&(pCfg->ConfigTsTable[i]));
}
static int MT898xCntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
int ret;
/* PDA *pda= (PDA *)(GetIMMR() & IO_MAP_MASK); */
MT898xCfgStruct* pCfg =(MT898xCfgStruct *)(pDataBuf);
switch(cmd)
{
case SDC_REINIT:
MT898xInit(pDataBuf, pCfg);
ret=SDE_OK;
break;
case SDC_CONFIG_TS:
if(maxlen!=sizeof(SDCConfigTsStruct))
return SDE_INVALID_ARG;
ret=ConfigTs(pCfg, (SDCConfigTsStruct *)pParam);
break;
case SDC_CONFIG_2TS:
{
SDCConfigTsStruct ts;
if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
ret=ConfigTs(pCfg, (SDCConfigTsStruct *)pParam);
if(ret<0)break;
ts.StreamIn =((SDCConfigTsStruct*)pParam)->StreamOut;
ts.StreamOut=((SDCConfigTsStruct*)pParam)->StreamIn;
ts.ChanIn =((SDCConfigTsStruct*)pParam)->ChanOut;
ts.ChanOut =((SDCConfigTsStruct*)pParam)->ChanIn;
ret=ConfigTs(pCfg, &ts);
}
break;
case SDC_MESSAGE_MODE:
if(maxlen!=sizeof(MT898xMessageModeStruct))
return SDE_INVALID_ARG;
ret=MT898xConfigMessageMode(pCfg, (MT898xMessageModeStruct *)pParam);
break;
case SDC_CHECK_MSG:
if(maxlen!=sizeof(MT898xMessageModeStruct))
return SDE_INVALID_ARG;
return MT898xCheckMsg(pCfg, (MT898xMessageModeStruct *)pParam);
case SDC_DISABLE_CH:
if(maxlen!=sizeof(MT898xMessageModeStruct))
return SDE_INVALID_ARG;
ret=MT898xChDisableOE(pCfg,(MT898xMessageModeStruct *)pParam);
break;
case SDC_ENABLE_CH:
if(maxlen!=sizeof(MT898xMessageModeStruct))
return SDE_INVALID_ARG;
ret=MT898xChEnableOE(pCfg,(MT898xMessageModeStruct *)pParam);
break;
case SDC_CHK_CONNECT:
if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
ret=Check_Connection(pCfg, (SDCConfigTsStruct *)pParam);
break;
default:
return SDE_UNKNOW_CMD;
}/* end of switch(cmd) */
return ret;
}
char *MT898xBspInit(int DEV, char *FreeMemPtr, MT898xCfgStruct *cfg)
{
InstallSD(DEV,NULL,NULL,MT898xCntrl,FreeMemPtr);
MT898xInit(FreeMemPtr, cfg);
FreeMemPtr += sizeof(MT898xCfgStruct);
memcpy(FreeMemPtr,"*8985Dat",8);
FreeMemPtr += 8;
return FreeMemPtr;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -