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

📄 mt90820.c

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

#define MT90820_CR_REG    0x0
#define MT90820_IMS_REG   0x1
#define MT90820_FAR_REG   0x2
#define MT90820_FOR0_REG  0x3
#define MT90820_FOR1_REG  0x4
#define MT90820_FOR2_REG  0x5
#define MT90820_FOR3_REG  0x6

#define MT90820_CR(ba,cr)     REG16(ba+(cr<<1))
#define MT90820_CH(ba,ch)     REG16(ba +0x100+(ch<<1))

static int ConfigTs(MT90820CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
    
    UCHAR  MaxSlotNum;

    if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
    else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
    else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;   
    else return SDE_INVALID_ARG;   
        
    if(  pTs->StreamOut>15 || pTs->StreamIn>15 
       || pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
       return SDE_INVALID_ARG;
    MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
        =pTs->StreamOut|0x0010;
    MT90820_CH(pCfg->BaseAddr,pTs->ChanOut)
        =(pTs->StreamIn<<7)|pTs->ChanIn|0x4800;
    return SDE_OK;
}

/* Following added by maold */
static int Check_Connection(MT90820CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
    
    UCHAR  MaxSlotNum;
    unsigned short * ADDR;
    unsigned short re_val,input;			

    if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
    else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
    else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;   
    else return SDE_INVALID_ARG; 
        
     if(  pTs->StreamOut>15 || pTs->StreamIn>15 
       || pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
       return SDE_INVALID_ARG;
    
    MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
        =pTs->StreamOut;
    MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
        &=0xFFEF;   
    
    input= (pTs->StreamIn<<7)+pTs->ChanIn+0x4800;
    re_val = MT90820_CH(pCfg->BaseAddr,pTs->ChanOut);               
    if(re_val==input)
    	return SDE_OK;
    else
        return 	SDE_CONN_CHEK_ERR;   
}

static void MT90820Init(void *pDataBuf, MT90820CfgStruct *cfg )
{
    volatile ULONG i;
    
    MT90820CfgStruct *pCfg = (MT90820CfgStruct *)(pDataBuf);
/*-------------------------<< Initial data >>-------------------------------*/
    memmove(pCfg,cfg,sizeof(MT90820CfgStruct));
      
    /* 配置所有的输出使能有效*/
    MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)=MT90820_MEMORY_BLOCK_PROGRAM;
    /* LPBK=0,V/C=1,MC=0,CSTo=0,OE=1,BPE=1        */ 
    MT90820_CR(pCfg->BaseAddr,MT90820_IMS_REG)=0x0138|pCfg->DataRate;
    for(i=65535;i>0;i--){
        if((MT90820_CR(pCfg->BaseAddr,MT90820_IMS_REG)&0x10)==0)break;   
    }
    /*完成一些初始化链路的配置*/
    for(i=0; i< pCfg->ValidConfigTsNum;i++)
       ConfigTs(pCfg,&(pCfg->ConfigTsTable[i]));
}

static int MT90820ConfigMessageMode(MT90820CfgStruct* pCfg, 
                                    MT90820MessageModeStruct *pMsgMode)
{
    UCHAR  MaxSlotNum;

    if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
    else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
    else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;   
    else return SDE_INVALID_ARG;   
    
   if((pMsgMode->Stream>15)||(pMsgMode->Chan>MaxSlotNum-1))
       return SDE_INVALID_ARG;
  
   MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)=(USHORT)pMsgMode->Stream;
   MT90820_CH(pCfg->BaseAddr,pMsgMode->Chan)=(USHORT)pMsgMode->Value|0x6800;
   return SDE_OK;
}

static int MT90820CheckMsg(MT90820CfgStruct* pCfg, 
                          MT90820MessageModeStruct *pMsgMode)
{
   UCHAR  MaxSlotNum;

    if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
    else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
    else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;   
    else return SDE_INVALID_ARG;   
    
   if((pMsgMode->Stream>15)||(pMsgMode->Chan>MaxSlotNum-1))
       return SDE_INVALID_ARG;

   MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
      =(USHORT)pMsgMode->Stream|MT90820_MS_DATAM;
   if(pMsgMode->Value!=(char)MT90820_CH(pCfg->BaseAddr, pMsgMode->Chan))
   {
   	  pMsgMode->Value=(char)MT90820_CH(pCfg->BaseAddr, pMsgMode->Chan); 
      return SDE_CHK_MSG_ERR;
   }
   pMsgMode->Value=(char)MT90820_CH(pCfg->BaseAddr, pMsgMode->Chan); 
   return  SDE_OK;  
}

static int MT90820GetMsg(MT90820CfgStruct* pCfg, 
                          MT90820MessageModeStruct *pMsgMode)
{
   UCHAR  MaxSlotNum;

    if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
    else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
    else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;   
    else return SDE_INVALID_ARG;   
    
   if((pMsgMode->Stream>15)||(pMsgMode->Chan>MaxSlotNum-1))
       return SDE_INVALID_ARG;

   MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
      =(USHORT)pMsgMode->Stream|MT90820_MS_DATAM;
   pMsgMode->Value=(char)MT90820_CH(pCfg->BaseAddr, pMsgMode->Chan); 
   return  SDE_OK;  
}

static int MT90820SetDelay(MT90820CfgStruct* pCfg, 
                           SlotDelayStruct *pDelay) 
{
    int ForReg;
    
    if(pDelay->Stream<0)
      return SDE_INVALID_ARG;      
    else if(pDelay->Stream<4)
       ForReg=MT90820_FOR0_REG;
    else if(pDelay->Stream<8)
      ForReg=MT90820_FOR1_REG; 
    else if(pDelay->Stream<12)
      ForReg=MT90820_FOR2_REG;
    else if(pDelay->Stream<16)
      ForReg=MT90820_FOR3_REG;
    else
      return SDE_INVALID_ARG;
    if((pDelay->Delay<0)||(pDelay->Delay>9))
      return SDE_INVALID_ARG;
    MT90820_CR(pCfg->BaseAddr,ForReg)
        &=~(0xF<<((pDelay->Stream%4)*4));
    MT90820_CR(pCfg->BaseAddr,ForReg)
        |=(pDelay->Delay<<((pDelay->Stream%4)*4));
    return SDE_OK; 

}

static int MT90820Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
    int rc;
    MT90820CfgStruct*  pCfg =(MT90820CfgStruct *)(pDataBuf);   
    SDCConfigTsStruct *pTs;
   
    switch(cmd)
    {
        case SDC_REINIT:
            MT90820Init(pDataBuf, pCfg);
            break;
            
        case SDC_SET_MTCH:
            if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
                
            pTs = (SDCConfigTsStruct *)pParam;
            rc=ConfigTs(pCfg, pTs);
	    return rc;
       
        case SDC_MESSAGE_MODE:
            if(maxlen != sizeof(MT90820MessageModeStruct))
                return SDE_INVALID_ARG;
            rc=MT90820ConfigMessageMode(pCfg,(MT90820MessageModeStruct*)pParam);
            return rc;
       
       case SDC_CHECK_MSG:
            if(maxlen!=sizeof(MT90820MessageModeStruct))
                return SDE_INVALID_ARG;
            rc=MT90820CheckMsg(pCfg, (MT90820MessageModeStruct *)pParam);
            return rc;
       
       case SDC_GET_MSG:
            if(maxlen!=sizeof(MT90820MessageModeStruct))
                return SDE_INVALID_ARG;
            rc=MT90820GetMsg(pCfg, (MT90820MessageModeStruct *)pParam);
            return rc;           
       
       case SDC_SET_DELAY:
            if(maxlen!=sizeof(SlotDelayStruct))
                return SDE_INVALID_ARG;
            rc=MT90820SetDelay(pCfg,(SlotDelayStruct*)pParam); 
            return rc;           
       case SDC_CHK_CONNECT:
           if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
               
           pTs = (SDCConfigTsStruct *)pParam;
           rc=Check_Connection(pCfg, pTs);
           return rc;
       default: 
            return SDE_UNKNOW_CMD;
    }/* end of switch(cmd) */
    return SDE_OK;
}

UCHAR *MT90820BspInit(int DEV, UCHAR *FreeMemPtr, MT90820CfgStruct *cfg)
{
    InstallSD(DEV,NULL,NULL,MT90820Cntrl,FreeMemPtr);
    MT90820Init(FreeMemPtr, cfg); 
    FreeMemPtr += sizeof(MT90820CfgStruct);
    memcpy(FreeMemPtr,"90820Dat",8);
    FreeMemPtr += 8;
    return FreeMemPtr;
}

⌨️ 快捷键说明

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