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

📄 scu2niuc.c

📁 这是单板上DPRAM的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  CLAD 寄存器                                                                        */
/*-------------------------------------------------------------------------------------*/ 
    bt8370->CLAD_CR = 0x86;  /* CEN = 1,
                                XSEL[2:0] = 000, 传输线率选择, 2M E1信号;
                                LFGAIN[3:0] = 0110, Loop 滤波器增益    */
    bt8370->CSEL = 0x13;
    bt8370->CPHASE = 0;
    bt8370->CTEST = 0;                                
                                            
/*-------------------------------------------------------------------------------------*/
/*  Bit-Oriented Protocol 寄存器                                                       */
/*-------------------------------------------------------------------------------------*/ 
    bt8370->BOP = 0;
    bt8370->TBOP = 0xa;
    
/*-------------------------------------------------------------------------------------*/
/*  Data Link 寄存器                                                                   */
/*-------------------------------------------------------------------------------------*/ 
    bt8370->DL1_TS = 0;
    bt8370->DL1_BIT = 0;
    bt8370->DL1_CTL = 0;
    bt8370->RDL1_FFC = 0;
    bt8370->PRM = 0;
    bt8370->TDL1_FEC = 0;
    bt8370->TDL1_EOM = 0xff;
    bt8370->TDL1 = 0xff;
    bt8370->DL2_TS = 0;
    bt8370->DL2_BIT = 0;
    bt8370->DL2_CTL = 0;
    bt8370->RDL2_FFC = 0;
    bt8370->TDL2_FEC = 0;
    bt8370->TDL2_EOM = 0xff;
    bt8370->TDL2 = 0xff;
    bt8370->DL_TEST[0] = 0;
    bt8370->DL_TEST[1] = 0;
    bt8370->DL_TEST[2] = 0;
    bt8370->DL_TEST[3] = 0;
    bt8370->DL_TEST[4] = 0;
    
/*-------------------------------------------------------------------------------------*/
/*  系统总线寄存器                                                                     */
/*-------------------------------------------------------------------------------------*/ 
    bt8370->SBI_CR = 0x46;  /* X2CLK = 0;
                                SBI_OE = 1, 使能系统总线输出;
                                EMF = 0,
                                EMBED = 0,
                                SBI[3:0] = 0110, SBI 模式, 2M时钟, 32时隙.   */
    bt8370->RSB_CR = 0x40;
    bt8370->RSYNC_BIT = 0;
    bt8370->RSYNC_TS = 0;
    bt8370->TSB_CR = 0x80;
    bt8370->TSYNC_BIT = 0;
    bt8370->TSYNC_TS = 0;
    bt8370->RSIG_CR = 0;
    bt8370->RSYNC_FRM = 0; 
      
    for (i = 0; i < 32; i++) {
        bt8370->SBC[i] = 0x01;
        bt8370->TPC[i] = 0x0;
        bt8370->TSIG[i] = 0x0;
        bt8370->TSLIP_LO[i] = 0x0;
        bt8370->TSLIP_HI[i] = 0x0;
        bt8370->RPC[i] = 0x0;
        bt8370->RSIG[i] = 0x0;
        bt8370->RSLIP_LO[i] = 0x0;
        bt8370->RSLIP_HI[i] = 0x0;
    }
    
    if(mode == NIU_HDSL ){ /* Hdsl mode */
        bt8370->LIU_CR = 0x51;
        bt8370->RCR0 = 0x89;
    }
}

static void ScuNiucInit(void *pDataBuf, ScuNiucCfgStruct *cfg)
{
    volatile int i;
    int DefMode;
    ScuNiucCfgStruct* pCfg =(ScuNiucCfgStruct *)(pDataBuf);
    memmove(pCfg,cfg,sizeof(*cfg));
    
/*-------------------------<< Initial data >>-------------------------------*/
    pCfg->OpReady=1;
    if(pCfg->ch!=0 && pCfg->ch!=1) pCfg->ch=0;  /* Select current niu */
    SetLLDat(&pCfg->Select,pCfg->ch);

/*------------------------------<< Init Niu[0] >>---------------------------*/
        SetLLDat(&pCfg->Niu[0].Reset,0);       /* Reset Niu0, delay at least 60ns */
        for(i = 0; i < 20; i++);
        SetLLDat(&pCfg->Niu[0].Reset,1);        /* Run Niu0 */
        for(i = 0; i < 20; i++);
        
        if(S_PortADataReg & (1 << (15 - 4)))  
            DefMode=NIU_E1;
        else
            DefMode=NIU_HDSL;
    
        if(DefMode==NIU_HDSL)                   /* Check if mode set is valid */
            pCfg->Niu[0].Mode=NIU_HDSL;
        else
            pCfg->Niu[0].Mode=NIU_E1;
        
            
        BT8370Init((BT8370Reg *)pCfg->Niu[0].Base,pCfg->Niu[0].Mode);
/*------------------------------<< Init Niu[1] >>---------------------------*/  
        SetLLDat(&pCfg->Niu[1].Reset,0);        /* Reset Niu1, delay at least 60ns */
        for(i = 0; i < 20; i++);
        SetLLDat(&pCfg->Niu[1].Reset,1);        /* Run Niu1 */
        for(i = 0; i < 20; i++);
        
        if(S_PortADataReg & (1 << (15 - 5)))  
            DefMode=NIU_E1;
        else
            DefMode=NIU_HDSL;
        
        if(DefMode==NIU_HDSL)                   /* Check if mode set is valid */
            pCfg->Niu[1].Mode=NIU_HDSL;
        else
            pCfg->Niu[1].Mode=NIU_E1;
            
        BT8370Init((BT8370Reg *)pCfg->Niu[1].Base,pCfg->Niu[1].Mode);
}

int ScuNiucCntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
    int i,rc;
    UCHAR byAlarmValue1, byAlarmValue2;
    volatile UCHAR byAlarmValue3;
    char pSendBuf[4], pRecvBuf[4];
    ScuNiucCfgStruct* pCfg =(ScuNiucCfgStruct *)(pDataBuf); 
    BT8370Reg *bt8370=(BT8370Reg *)(pCfg->Niu[pCfg->ch].Base);
    
    switch(cmd) {
        case SDC_REINIT:
            ScuNiucInit(pDataBuf, pCfg);
            break;

        case SDC_SEL_SLAVE:
            if(maxlen!=sizeof(int))return SDE_INVALID_ARG;
            if(*(int *)pParam !=0 && *(int *)pParam !=1)
                return SDE_INVALID_SLAVE;
            pCfg->ch=*(int *)pParam;
            SetLLDat(&pCfg->Select,pCfg->ch);
            pCfg->OpReady=1;
            break;

        case SDC_READY:
            if(pCfg->Niu[pCfg->ch].Mode==NIU_NONE)return 1; 
            if(pCfg->OpReady!=0)return 1;
            do{
                rc=sd_read(pCfg->UartNo, pRecvBuf, 4);
                if(rc>0 && memcmp(pRecvBuf,"\xff\xff\xff\x55",4) == 0 )
                    pCfg->OpReady=1;
                if(rc!=SDE_BUF_EMPTY && rc<0)return rc;
            }while(rc!=SDE_BUF_EMPTY);
            return pCfg->OpReady;

            
        case SDC_RESET:
            SetLLDat(&pCfg->Niu[pCfg->ch].Reset,0);
            tm_wkafter(8);         /* Wait 80ms for reset */
            SetLLDat(&pCfg->Niu[pCfg->ch].Reset,1);
            BT8370Init((BT8370Reg *)pCfg->Niu[pCfg->ch].Base,
                       pCfg->Niu[pCfg->ch].Mode);
            break;   

        case SDC_SET_FRAME_MODE:
            if(pCfg->Niu[pCfg->ch].Mode!=NIU_HDSL)break;
            pSendBuf[0] = 0xf3;     /* _CU_COMMON */
            pSendBuf[1] = 0x09;     /* _CU_FRAME_FORMAT */
            pSendBuf[2] = 0x01;     /* unframed: MSYNC ignors TMSYNC */
            pSendBuf[3] = pSendBuf[0] ^ pSendBuf[1] ^ pSendBuf[2] ^ 0xAA;
            rc=sd_write(pCfg->UartNo, pSendBuf, 4);
            if(rc<0)return SDE_ZIPSOCKET_FAIL;
            pCfg->OpReady=0;
            break;   

        case SDC_GET_ALARMS:
            if(maxlen<=0)return SDE_INVALID_ARG;
            byAlarmValue1 = REG8(&bt8370->ALM1);
            byAlarmValue2 = REG8(&bt8370->SSTAT);
            i=0;
            if((byAlarmValue1 & 0x1e) == 0 && (byAlarmValue2 & 0x06) == 0) {
                byAlarmValue3 = bt8370->ISR7_ALARM1;
                byAlarmValue3 = bt8370->ISR5_ERROR;
                return 0;
            }    
            else {
                if(byAlarmValue1 & BT8370_RLOF){
                    if(i>=maxlen/4)return SDE_SHORTER_BUF;
                    ((ULONG*)pParam)[i++]=SDA_BT8370_LOSS_OF_FRAME_ALIGNMENT;
                }
                if(byAlarmValue1 & BT8370_RLOS){
                    if(i>=maxlen/4)return SDE_SHORTER_BUF;
                    ((ULONG*)pParam)[i++]=SDA_BT8370_LOSS_OF_RECEIVE_SIGNAL;
                }
                if(byAlarmValue1 & BT8370_RALOS){
                    if(i>=maxlen/4)return SDE_SHORTER_BUF;
                    ((ULONG*)pParam)[i++]=SDA_BT8370_LOSS_OF_RECEIVE_ANALOG_SIGNAL;
                }
                if(byAlarmValue1 & BT8370_RAIS){
                    if(i>=maxlen/4)return SDE_SHORTER_BUF;
                    ((ULONG*)pParam)[i++]=SDA_BT8370_LOSS_OF_ALARM_INDICATION_SIGNAL;
                }
                if(byAlarmValue2 & BT8370_RFSLIP){
                    if(i>=maxlen/4)return SDE_SHORTER_BUF;
                    if(byAlarmValue2 & BT8370_RSDIR)
                        ((ULONG*)pParam)[i++]=SDA_BT8370_POSITIVE_FRAME_SLIP;
                    else
                        ((ULONG*)pParam)[i++]=SDA_BT8370_NEGATIVE_FRAME_SLIP;
                    byAlarmValue3 = bt8370->ISR5_ERROR;    
                }
                if(byAlarmValue2 & BT8370_RUSLIP){
                    if(i>=maxlen/4)return SDE_SHORTER_BUF;
                    if(byAlarmValue2 & BT8370_RSDIR)
                        ((ULONG*)pParam)[i++]=SDA_BT8370_POSITIVE_BIT_SLIP;
                    else
                        ((ULONG*)pParam)[i++]=SDA_BT8370_NEGATIVE_BIT_SLIP;
                }
                return i;
            }

        case SDC_SET_NORMAL_MODE:
            bt8370->LOOP = 0x00;       /* Loopback off */
            for (i = 0; i < 32; i++) {
                bt8370->SBC[i] = 0x01;
                bt8370->TPC[i] = 0x00;
            }
            pSendBuf[0] = 0xf8;  /* Destination = _DSL_APPLICATION */
            pSendBuf[1] = 0x20;  /* Opcode = _DSL_LOOPBACK */
            pSendBuf[2] = 0x00;  /* Parameter = _LOOPBACK_OFF */
            pSendBuf[3] = pSendBuf[0] ^ pSendBuf[1] ^ pSendBuf[2] ^ 0xAA;
            rc=sd_write(pCfg->UartNo, pSendBuf, 4);
            if(rc<0)return SDE_ZIPSOCKET_FAIL;
            pCfg->OpReady=0;
            break;
            
        case SDC_BT8370_REMOTE_LINE_LOOPBACK:
            bt8370->LOOP = 0x04;       /* ScuNiuc_LLOOP = 1 */
            break;
            
        case SDC_BT8370_REMOTE_PAYLOAD_LOOPBACK:
            bt8370->LOOP = 0x08;       /* ScuNiuc_PLOOP = 1 */
            break;
            
        case SDC_BT8370_REMOTE_PERCHANNEL_LOOPBACK:
            for (i = 0; i < 32; i++) {
               bt8370->TPC[i] = 0x40;  /* ScuNiuc_TLOOP = 1 */ 
            }
            break;
            
        case SDC_BT8370_LOCAL_ANALOG_LOOPBACK:
            bt8370->LOOP = 0x01;       /* ScuNiuc_ALOOP = 1 */
            break;
            
        case SDC_BT8370_LOCAL_FRAMER_LOOPBACK:
            bt8370->LOOP = 0x02;       /* ScuNiuc_FLOOP = 1 */
            break;
            
        case SDC_BT8370_LOCAL_PERCHANNEL_LOOPBACK:
            for (i = 0; i < 32; i++) {
               bt8370->SBC[i] = 0x11;  /* ScuNiuc_RLOOP = 1 */
            }
            break;
            
        case SDC_ZIPSOCKET_NEAR_END_PCM_TO_PCM_LOOPBACK:
            if(pCfg->Niu[pCfg->ch].Mode!=NIU_HDSL)break;
            pSendBuf[0] = 0xf8;     /* Destination = _DSL_APPLICATION */
            pSendBuf[1] = 0x20;     /* Opcode = _DSL_LOOPBACK */
            pSendBuf[2] = 0x01;     /* Parameter = _CU_PCM_ON_PCM */
            pSendBuf[3] = pSendBuf[0] ^ pSendBuf[1] ^ pSendBuf[2] ^ 0xAA; 
            rc=sd_write(pCfg->UartNo, pSendBuf, 4);
            if(rc<0)return SDE_ZIPSOCKET_FAIL;
            pCfg->OpReady=0;
            break;
            
        case SDC_ZIPSOCKET_FAR_END_HDSL_TO_PCM_LOOPBACK:
            if(pCfg->Niu[pCfg->ch].Mode!=NIU_HDSL)break;
            pSendBuf[0] = 0xf8;     /* Destination = _DSL_APPLICATION */
            pSendBuf[1] = 0x20;     /* Opcode = _DSL_LOOPBACK */
            pSendBuf[2] = 0x02;     /* Parameter = _CU_HDSL_ON_PCM */
            pSendBuf[3] = pSendBuf[0] ^ pSendBuf[1] ^ pSendBuf[2] ^ 0xAA;
            rc=sd_write(pCfg->UartNo, pSendBuf, 4);
            if(rc<0)return SDE_ZIPSOCKET_FAIL;
            pCfg->OpReady=0;
            break;
            
        case SDC_ZIPSOCKET_ISOLATED_ANALOG_LOOPBACK:
            if(pCfg->Niu[pCfg->ch].Mode!=NIU_HDSL)break;
            pSendBuf[0] = 0xf8;  /* Destination = _DSL_APPLICATION */
            pSendBuf[1] = 0x20;  /* Opcode = _DSL_LOOPBACK */
            pSendBuf[2] = 0x03;  /* Parameter = _BP_ISOLATED_ANALOG_LOOPBACK */
            pSendBuf[3] = pSendBuf[0] ^ pSendBuf[1] ^ pSendBuf[2] ^ 0xAA; 
            rc=sd_write(pCfg->UartNo, pSendBuf, 4);
            if(rc<0)return SDE_ZIPSOCKET_FAIL;
            pCfg->OpReady=0;
            break;

        case SDC_ZIPSOCKET_EXTERNAL_ANALOG_LOOPBACK:
            if(pCfg->Niu[pCfg->ch].Mode!=NIU_HDSL)break;
            pSendBuf[0] = 0xf8;  /* Destination = _DSL_APPLICATION */
            pSendBuf[1] = 0x20;  /* Opcode = _DSL_LOOPBACK */
            pSendBuf[2] = 0x04;  /* Parameter = _BP_EXTERNAL_ANALOG_LOOPBACK */
            pSendBuf[3] = pSendBuf[0] ^ pSendBuf[1] ^ pSendBuf[2] ^ 0xAA; 
            rc=sd_write(pCfg->UartNo, pSendBuf, 4);
            if(rc<0)return SDE_ZIPSOCKET_FAIL;
            pCfg->OpReady=0;
            break;

        default:
            return SDE_UNKNOW_CMD ;
    }
    return SDE_OK;
}

char *ScuNiucBspInit(int DEV, char *FreeMemPtr, ScuNiucCfgStruct *cfg)
{
    InstallSD(DEV,NULL,NULL,ScuNiucCntrl,FreeMemPtr);
    ScuNiucInit(FreeMemPtr, cfg); 
    FreeMemPtr += sizeof(ScuNiucCfgStruct);
    memcpy(FreeMemPtr,"*NiucDat",8);
    FreeMemPtr += 8;
    return FreeMemPtr;
}

⌨️ 快捷键说明

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