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

📄 mt90826cmm.c

📁 这是单板上DPRAM的驱动程序
💻 C
字号:
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "mt8980.h"
#include "bspspec.h"
#include "mt90826cmm.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)
{
    
    int  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 if(pCfg->DataRate== DATA_RATE_16M)MaxSlotNum=256;
    else if(pCfg->DataRate== DATA_RATE_16_8M)MaxSlotNum=256;

    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;
    return SDE_OK;
}

static int DisableTs(MT90826CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
    
    int  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 if(pCfg->DataRate== DATA_RATE_16M)MaxSlotNum=256;
    else if(pCfg->DataRate== DATA_RATE_16_8M)MaxSlotNum=256;
    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;
    MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)|=pCfg->DataRate;
/*add for cmm */
    MT90826_CR(pCfg->BaseAddr,MT90826_DOS0_REG)=pCfg->Dos0;
    MT90826_CR(pCfg->BaseAddr,MT90826_DOS1_REG)=pCfg->Dos1;
    MT90826_CR(pCfg->BaseAddr,MT90826_DOS2_REG)=pCfg->Dos2;
    MT90826_CR(pCfg->BaseAddr,MT90826_DOS3_REG)=pCfg->Dos3;
    MT90826_CR(pCfg->BaseAddr,MT90826_DOS4_REG)=pCfg->Dos4;
    MT90826_CR(pCfg->BaseAddr,MT90826_DOS5_REG)=pCfg->Dos5;
    MT90826_CR(pCfg->BaseAddr,MT90826_DOS6_REG)=pCfg->Dos6;
    MT90826_CR(pCfg->BaseAddr,MT90826_DOS7_REG)=pCfg->Dos7;



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

static int MT90826ConfigMessageMode(MT90826CfgStruct* pCfg, 
                                    MT90826MessageModeStruct *pMsgMode)
{
    int  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 if(pCfg->DataRate== DATA_RATE_16M)MaxSlotNum=256;
    else if(pCfg->DataRate== DATA_RATE_16_8M)MaxSlotNum=256;
    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)
{
   int  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 if(pCfg->DataRate== DATA_RATE_16M)MaxSlotNum=256;
   else if(pCfg->DataRate== DATA_RATE_16_8M)MaxSlotNum=256;
   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;  
}

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_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;
                    
       default: 
            return SDE_UNKNOW_CMD;
    }/* end of switch(cmd) */
    return SDE_OK;
}

char *MT90826BspInit(int DEV, char *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 + -