📄 scu2niuc.c
字号:
/* 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 + -