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

📄 mt898x.c

📁 这是单板上DPRAM的驱动程序
💻 C
字号:
/* @(#) 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;
}

⌨️ 快捷键说明

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