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

📄 mt90826.c

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

#define MT90826_CR_REG    0x0
/* #define MT90826_IMS_REG   0x1 */
#define MT90826_FAR_REG   0x1

#define MT90826_DOS0_REG   0x2
#define MT90826_DOS1_REG   0x3
#define MT90826_DOS2_REG   0x4
#define MT90826_DOS3_REG   0x5
#define MT90826_DOS4_REG   0x6
#define MT90826_DOS5_REG   0x7
#define MT90826_DOS6_REG   0x8
#define MT90826_DOS7_REG   0x9

#define MT90826_FOR0_REG  0x0a
#define MT90826_FOR1_REG  0xb
#define MT90826_FOR2_REG  0xc
#define MT90826_FOR3_REG  0xd

#define  MT90826_MEMORY_BLOCK_PROGRAM  0x0020
#define  MT90826_MS_DATAM  0x0010 

#define MT90826_CR(ba,cr)     REG16(ba+(cr<<1))

static int ConfigTs(MT90826CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
    
    UCHAR  MaxSlotNum;
    unsigned short * ADDR;
    unsigned short re_val,input,temp,i;			//add by zhou

    if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
    else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
    else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;   
    else return SDE_INVALID_ARG; 
        
    if(   pTs->StreamOut>31 || pTs->StreamIn>31 
       || pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
       return SDE_INVALID_ARG;
    MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
    ADDR = (unsigned short *)(pCfg->BaseAddr+0x4000+((pTs->StreamOut<<8)
        +pTs->ChanOut)*2);
    *ADDR = 0xA000 + (pTs->StreamIn<<8)+pTs->ChanIn;
    //add code here by zhou
    //delay
    //for(i=0;i<1000;i++)
    //	{;}    
    input=0xA000 + (pTs->StreamIn<<8)+pTs->ChanIn;
    re_val=*ADDR;                                  
    if(re_val==input)
    	return SDE_OK;
    else
        return 	SDE_FAIL;
   //END    
}
////////////////////////////////////////////////////////////////////////////
/* Following added by zhou*/
static int Check_Connection(MT90826CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
    
    UCHAR  MaxSlotNum;
    unsigned short * ADDR;
    unsigned short re_val,input,temp,i;			

    if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
    else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
    else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;   
    else return SDE_INVALID_ARG; 
        
    if(   pTs->StreamOut>31 || pTs->StreamIn>31 
       || pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
       return SDE_INVALID_ARG;
       
    MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
    ADDR = (unsigned short *)(pCfg->BaseAddr+0x4000+((pTs->StreamOut<<8)+pTs->ChanOut)*2);
        
    input=0xA000 + (pTs->StreamIn<<8)+pTs->ChanIn;
    re_val=*ADDR;               
    if(re_val==input)
    	return SDE_OK;
    else
        return 	SDE_FAIL;   
}

/*above add by zhou 7-6*/
////////////////////////////////////////////////////////////////////////
static int DisableTs(MT90826CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
    
    UCHAR  MaxSlotNum;
    unsigned short * ADDR;

    if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
    else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
    else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;   
    else return SDE_INVALID_ARG; 
        
    if(   pTs->StreamOut>31 || pTs->StreamIn>31 
       || pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
       return SDE_INVALID_ARG;
    MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
    ADDR = (unsigned short *)(pCfg->BaseAddr+0x4000+((pTs->StreamOut<<8)
        +pTs->ChanOut)*2);
    (*ADDR) &= 0xdfff; 
    return SDE_OK;
}


static void MT90826Init(void *pDataBuf, MT90826CfgStruct *cfg )
{
    int i;
    unsigned short * ADDR;
     
    MT90826CfgStruct *pCfg = (MT90826CfgStruct *)(pDataBuf);
   
   
    /*-------------------------<< Initial data >>-------------------------------*/
    memmove(pCfg,cfg,sizeof(MT90826CfgStruct));
    
    SetLLDat(&pCfg->Rst,0); 
    for(i=0;i<12;i++);
    SetLLDat(&pCfg->Rst,1); 
    for(i=0;i<19;i++);

    ADDR= (unsigned short *)(pCfg->BaseAddr);
    for (i=0;i<18;i++)
         *(ADDR+i) = 0x0;
    memset(pCfg->BaseAddr+0x4000,0,0x3fff);

   
    MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)|=pCfg->DataRate;

    for (i=0;i<pCfg->DefTsTabEntryNum;i++)
          ConfigTs(pCfg, &(cfg->pDefTsTable[i]));
}

static int MT90826ConfigMessageMode(MT90826CfgStruct* pCfg, 
                                    MT90826MessageModeStruct *pMsgMode)
{
    UCHAR  MaxSlotNum;
    unsigned short * ADDR;

    if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
    else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
    else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;   
    else return SDE_INVALID_ARG; 
    
    if((pMsgMode->Stream>31)||(pMsgMode->Chan>MaxSlotNum-1))
       return SDE_INVALID_ARG;

    MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
    ADDR = (USHORT *)(pCfg->BaseAddr+0x4000
          +((pMsgMode->Stream<<8)+pMsgMode->Chan)*2);

    *ADDR = 0x6000 +(USHORT)pMsgMode->Value; 
    return SDE_OK;
}

static int MT90826CheckMsg(MT90826CfgStruct* pCfg, 
                          MT90826MessageModeStruct *pMsgMode)
{
   UCHAR  MaxSlotNum;
   unsigned short * ADDR;
   int i,val1,val2;
    
   if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
     else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
       else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;   
         else return SDE_INVALID_ARG;   
   if((pMsgMode->Stream>31)||(pMsgMode->Chan>MaxSlotNum-1))
       return SDE_INVALID_ARG;
 
   MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
   MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)|=0x0010;
   ADDR = (USHORT *)(pCfg->BaseAddr+0x4000 
         +((pMsgMode->Stream<<8)+pMsgMode->Chan)*2) ; 
   val1 = *ADDR;  
   for(i=0;i<10;i++)
   {
      val1 = *ADDR;  
      val2 = *ADDR;  
      if(val1==val2) break; 
   }
   if(i==10) return SDE_CHK_MSG_FALSE;
   pMsgMode->Value=val1;
   return  SDE_OK;  
}


/*FLOW ADD BY MAOLD 2004-2-13*/
static int SETPRBS(MT90826CfgStruct*  pCfg,SDCConfigTsStruct *pTs) //set 90826 to bit error test mode and start test
 {  
      int rc;
      unsigned short *ADDR;
      unsigned short * CMADDR;
      unsigned short * BISR;
      UCHAR  MaxSlotNum;
      
      if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
    else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
    else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;   
    else return SDE_INVALID_ARG;
    
      if(   pTs->StreamOut>31 || pTs->StreamIn>31 
       || pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
       return SDE_INVALID_ARG; 
      // ConfigTs(pCfg, pTs);
       //set output StreamNum and ChannelNum and Output Enable 
       CMADDR = (unsigned short *)(0x30004000 +  ((pTs->StreamOut<<8) + pTs->ChanOut)*2);
      *CMADDR = 0xe000;      
       //set input StreamNum and ChannelNum which are set in BISR rigister
      BISR = (unsigned short *)(0x30000022);
      *BISR = 0x0000+ (pTs->StreamIn<<8) + pTs->ChanIn ; 
                   
      ADDR = (unsigned short *)(0x30000000);    //0x30000000 is 90826_control register CR
      *ADDR = *ADDR & 0xF9FF;  		        //bit SBER=0 and bit CBER=0  
     
      ADDR = (unsigned short *)(0x30000000);    
      *ADDR = *ADDR | 0x0600;                   //bit CBER=1 SBER=1
      //CBER(0 TO 1)resets the bit error count register and the internal bit error counter.
      //SBER(0 TO 1)initiates the bit error test and enables the internal bit error counter.
     
      ADDR = (unsigned short *)(0x30000000);
      *ADDR = *ADDR & 0xfbff;                   //bit CBER=0 to end clear bit error count
     	
     ADDR = (unsigned short *)(0x30000000);
      *ADDR = *ADDR | 0x0200;  		            //bit SBER=1 to START TEST  
      return SDE_OK;
  }    


    
int PRBSEC(void)    //get the test error count number
 {  
     int val;
     unsigned short *ADDR;
     
     ADDR = (unsigned short *)(0x30000000);
     *ADDR = *ADDR & 0xfdff;                      //6  bit SBER=0 :TEST STOP
   	
     ADDR = (unsigned short *)(0x30000024);     //read the error count number
     val = *ADDR; 
    
     ADDR = (unsigned short *)(0x30000000);     //90826_control register CR
     *ADDR = *ADDR | 0x0400;                    //bit CBER=1
     
     ADDR = (unsigned short *)(0x30000000);
     *ADDR = *ADDR & 0xfbff;                     //CBER=0 to end clear BERR  
      
      ADDR = (unsigned short *)(0x30000000);
      *ADDR = *ADDR | 0x0200;  		            //bit SBER=1 to START TEST  
     return val;
}

int STOPPRBS(MT90826CfgStruct*  pCfg,SDCConfigTsStruct *pTs)    //stop prbs test
 {  
     unsigned short *ADDR;
     UCHAR  MaxSlotNum;
      
    if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
    else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
    else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;   
    else return SDE_INVALID_ARG;
    
      if(   pTs->StreamOut>31 || pTs->StreamIn>31 
       || pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
       return SDE_INVALID_ARG; 	
     ADDR = (unsigned short *)(0x30000000);
     *ADDR = *ADDR & 0xfdff;                      //6  bit SBER=0 :TEST STOP
     
     ADDR = (unsigned short *)(0x30004000 +  ((pTs->StreamOut<<8) + pTs->ChanOut)*2);
     *ADDR &= 0x1fff;        //clean CM
     return SDE_OK;
}

static int MT90826Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
    int rc;
    MT90826CfgStruct*  pCfg =(MT90826CfgStruct *)(pDataBuf);   
    SDCConfigTsStruct *pTs;
   
    switch(cmd)
    {
        case SDC_REINIT:
            MT90826Init(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_CHK_CONNECT:
            if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
                
            pTs = (SDCConfigTsStruct *)pParam;
            rc=Check_Connection(pCfg, pTs);
            return rc;
   
        case SDC_MESSAGE_MODE:
            if(maxlen!=sizeof(MT90826MessageModeStruct))
                return SDE_INVALID_ARG;
            rc=MT90826ConfigMessageMode(pCfg,(MT90826MessageModeStruct*)pParam);
            return rc;
       
       case SDC_CHECK_MSG:
            if(maxlen!=sizeof(MT90826MessageModeStruct))
                return SDE_INVALID_ARG;
            rc=MT90826CheckMsg(pCfg, (MT90826MessageModeStruct *)pParam);
            return rc;
       case SDC_SET_UNCONNECT:
            if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
                
            pTs = (SDCConfigTsStruct *)pParam;
            rc=DisableTs(pCfg, pTs);
            return rc;
            /*flow add by maold 2004-2-13*/

       case SDC_PRBS_MODE:
            pTs = (SDCConfigTsStruct *)pParam;
            rc=SETPRBS(pCfg,pTs);
            return rc;  
     
       case SDC_PRBSEC_READ:  
            rc=PRBSEC();
            return rc; 
                  
      case SDC_PRBS_STOP:
            pTs = (SDCConfigTsStruct *)pParam;
            rc=STOPPRBS(pCfg,pTs);
            return rc;
                    
       default: 
            return SDE_UNKNOW_CMD;
    }/* end of switch(cmd) */
    return SDE_OK;
}

UCHAR *MT90826BspInit(int DEV, UCHAR *FreeMemPtr, MT90826CfgStruct *cfg)
{
    MT90826CfgStruct *pCfg;
    InstallSD(DEV,NULL,NULL,MT90826Cntrl,FreeMemPtr);
    MT90826Init(FreeMemPtr, cfg); 
    pCfg=(MT90826CfgStruct*)FreeMemPtr;
    FreeMemPtr += sizeof(MT90826CfgStruct);
    
    pCfg->pDefTsTable=(SDCConfigTsStruct*)FreeMemPtr;
    memcpy(FreeMemPtr,cfg->pDefTsTable,cfg->DefTsTabEntryNum*
                sizeof(SDCConfigTsStruct));
    FreeMemPtr +=cfg->DefTsTabEntryNum*sizeof(SDCConfigTsStruct);
    memcpy(FreeMemPtr,"90826Dat",8);
    FreeMemPtr += 8;
    return FreeMemPtr;
}

⌨️ 快捷键说明

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