mutlihdlc.c
来自「该程序是MPC860的SCC2用作HDLC模式的驱动程序。供大家参考。」· C语言 代码 · 共 1,299 行 · 第 1/3 页
C
1,299 行
}
bdbase[hdlcChNo].TxBd[BDNUM-1].bd_cstatus = 0x2c00;
//NOT Ready,w
bdbase[hdlcChNo].RxBd[BDNUM-1].bd_cstatus = 0xb000;
//Empty ,w
IntCQ[hdlcChNo] = 0;
if( hdlcChNo == 31 )
IntCQ[hdlcChNo] |= 0x4000;
*(UINT16 *)(0xff002000+0x02+hdlcChNo*64)|=0x1000;
for( bdNo=0; bdNo<250; bdNo++ ) ;
}
/*
SCC3多通道HDLC设备开始函数,在使用前,必须调用
参数:无
返回值:无
*/
void mutliHdlcStartup( void )
{
mutliChannelHdlcInit();
*MPC860_GSMR_L2(vxImmrGet())|=SCC_GSMRL_ENT|SCC_GSMRL_ENR;
/*接收发送使能,在设备安装完成后打开*/
(void)intConnect(IV_SCC2,(VOIDFUNCPTR)mutliHdlcInterrupt,(int)&mutliHdlcChan);
/*连接多通道HDLC中断服务程序和中断向量*/
*MPC860_CIMR(vxImmrGet())|=CIMR_SCC2;
/*SCC2中断使能*/
}
/*以下是将21354芯片的HDLC和MPC860SCC3的HDCL综合的函数*/
void mutliChannelHdlcStartup( void )
{
mutliHdlcStartup();
/*(void)DS21354_Init();*/
}
UINT32 txTotal[32] = {0} ;
//UINT32 txChReset[32] = {0} ;
int mutliChannelHdlcWrite( u_char *buffer, int bufferLen )
{
int i,j, temp[BDNUM] ;
int channel[32]={ 30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
19,20,21,22,23,24,25,26,27,28,29 };
i=(int)buffer[0];
buffer[0]=channel[i];
/*
for( i=0; i<BDNUM; i++ )
{
temp[i] = bdbase[buffer[0]].TxBd[i].bd_cstatus ;
if( i!=(BDNUM-1))
{
if( temp[i] & 0x00ff )
{
// restart Tx
*CPCR(vxImmrGet()) = 0x0641 ;
txChReset[buffer[0]] = txChReset[buffer[0]] + 1 ;
while(*CPCR(vxImmrGet())&0x0001) ;
}
}
else
{
if( temp[i] & 0x00ff )
{
// restart Tx
*CPCR(vxImmrGet()) = 0x0641 ;
txChReset[buffer[0]] = txChReset[buffer[0]] + 1 ;
while(*CPCR(vxImmrGet())&0x0001) ;
}
}
}*/
if(((UINT8)buffer[0]>=48) || ( bufferLen < 10 ))
{
return(EAGAIN);
}
if((UINT8)buffer[0]<MAXLOGCHAN)
{
if( mutliHdlcWrite(&mutliHdlcChan,buffer,bufferLen) == OK )
{
return(OK);
}
else
{
return(EAGAIN);
}
}
else
{
return(EAGAIN);
}
}
UINT8 bufferm[512];
/*
hdlcNumTxTest 1,10,1
*/
void hdlcNumTxTest( int times,UINT16 length, UINT8 delaytime)
{
UINT8 i, j,k;
/*
mutliChannelHdlcStartup();
*/
for(k = 0;k<32;k++)
{
bufferm[0] = k ;
for (i = 0; i < times; i++ )
{
for(j = 0; j < length + i; j++ )
{
bufferm[j + 1] = k;
}
if(mutliChannelHdlcWrite(bufferm,length + i + 1 )==EAGAIN)
{
printf("\ntransmiter Multihdlc frame to channel %d error!\n",bufferm[0]);
return;
}
taskDelay(delaytime);
}
}
printf("send %d packets complete\n", times) ;
}
void OneTsTxTest( UINT16 len, UINT8 data )
{
UINT8 i, j,k;
bufferm[0] = 1 ;
for(j = 1; j < len+1; j++ )
{
bufferm[j] = data ;
}
if( mutliChannelHdlcWrite( bufferm,len )==EAGAIN)
{
printf("\ntransmiter Multihdlc frame to channel %d error!\n",bufferm[0]);
return;
}
printf("send complete\n" ) ;
}
UINT16 hdlcLength ;
UINT16 hdlcData, hdlcDelay, cccc=0, hdlcts ;
void hdlcOneTsTxTest( void )
{
UINT16 j ;
while( cccc )
{
bufferm[0] = hdlcts ;
for(j = 1; j < hdlcLength+1; j++ )
{
bufferm[j] = hdlcData ;
}
if( mutliChannelHdlcWrite( bufferm,hdlcLength )==EAGAIN)
{
printf("\ntransmiter Multihdlc frame to channel %d error!\n",bufferm[0]);
return;
}
printf("send complete\n" ) ;
taskDelay( hdlcDelay ) ;
}
}
void oneHdlcTask( UINT16 len, UINT8 data, UINT8 ts, UINT8 delay )
{
hdlcLength = len ;
hdlcData = data ;
hdlcDelay = delay ;
hdlcts = ts ;
cccc = 0x55 ;
if( taskSpawn("t_oneHdlc",120,0,6000,(FUNCPTR)hdlcOneTsTxTest,0,0,0,0,0,0,0,0,0,0)
== ERROR )
printf(">>") ;
}
void hdlc8kTx( UINT8 ts, UINT16 len, UINT8 data )
{
UINT8 buf[MAX_HDLC_FRAME], i ;
buf[0] = ts ;
for( i=1; i<len; i++ )
buf[i] = data ;
mutliChannelHdlcWrite( buf, len ) ;
}
UINT32 auxClkInt_cnt=0, auxClkTicksPerSecond;
void auxClkInt( void )
{
auxClkInt_cnt = auxClkInt_cnt + 1 ;
}
void startAuxTimer( void )
{
auxClkInt_cnt = 0 ;
auxClkTicksPerSecond = sysAuxClkRateGet ();
sysAuxClkRateSet(100) ;
sysAuxClkEnable () ;
sysAuxClkConnect((FUNCPTR)auxClkInt, 0) ;
}
void stopAuxTimer( void )
{
sysAuxClkRateSet (auxClkTicksPerSecond);
sysAuxClkDisable ();
}
void dispRxTotal( int ts )
{
int i ;
logMsg( "\ntime = %d ms", auxClkInt_cnt*10,0,0,0,0,0 ) ;
for( i=0; i<ts; i++ )
{
logMsg( "\nch %d: Tx=%d Rx=%d ChReset=%d ",
i, txTotal[i], rxCorrectTotal[i],
chReset[i],0,0 ) ;
}
logMsg( "\n\n",0,0,0,0,0,0 ) ;
}
void hdlc8kTxTest( void )
{
int i, j, k, temp ;
UINT8 buf[QMC_BUFFER_SIZE] ;
UINT32 rxCntBack[32]={0} ;
if( totTs > 32 )
{
printf( "\nERROR\n" ) ;
return ;
}
printf( "\nTest ch 0-ch %d\n", totTs-1 ) ;
for( i=0; i<32; i++ )
{
txTotal[i] = 0 ;
chReset[i] = 0 ;
rxCorrectTotal[i] = 0 ;
}
temp = 0 ;
startAuxTimer() ;
while( cccc )
{
for( j=0; j<totTs; j++ )
{
buf[0] = (UINT8)j ;
for( k=1; k<hdlcTxLen; k++ )
buf[k] = k;
if( mutliChannelHdlcWrite( buf, hdlcTxLen ) == OK )
txTotal[j] = txTotal[j] + 1 ;
}
// temp = ( temp + 1 ) % 10000 ;
// i = temp % 10 ;
// if( i == 9 )
// {
// for( i=0; i<totTs; i++ )
// {
// if( rxCntBack[i] == rxCorrectTotal[i] )
// {
// taskDelay( 2 ) ;
// oneHdlcChannelInit(i) ;
//// chReset[i] = chReset[i] + 1 ;
//// for( j=0; j<BDNUM; j++ )
//// {
//// if( j==(BDNUM-1))
//// bdbase[i].RxBd[j].bd_cstatus = 0xbc00 ;
//// else
//// bdbase[i].RxBd[j].bd_cstatus = 0x8c00 ;
//// }
//// *CPCR(vxImmrGet()) = 0x0341 ;
//chReset[i] = chReset[i] + 1 ;
//// while(*CPCR(vxImmrGet())&0x0001) ;
// }
// else
// rxCntBack[i] = rxCorrectTotal[i] ;
// }
// }
// if( temp == 9000 )
// dispRxTotal(totTs) ;
taskDelay( 1 ) ;
}
taskDelay(5) ;
dispRxTotal(totTs) ;
}
void tHdlcTest( UINT8 ts, UINT16 len/*, UINT8 dly*/ )
{
totTs = ts ;
// dl = dly ;
hdlcTxLen = len ;
cccc = 0x55 ;
taskSpawn("tHdlc8kTxTest",120,0,6000,(FUNCPTR)hdlc8kTxTest,0,0,0,0,0,0,0,0,0,0);
}
void stopHdlcTest( void )
{
stopAuxTimer() ;
cccc = 0 ;
}
void dispBDStatus( void )
{
int i, j ;
logMsg( "\nscce2reg=%x", *(UINT16*)MPC860_SCCE2(vxImmrGet()),0,0,0,0,0) ;
logMsg( "\nsccs2reg=%x", *(UINT16*)MPC860_SCCS2(vxImmrGet()),0,0,0,0,0) ;
for( i=0; i<MAXLOGCHAN; i++ )
{
for( j=0; j<BDNUM; j++ )
{
logMsg( "\nch %d TxBd %d status=%x length=%x addr=%x",
i,j,bdbase[i].TxBd[j].bd_cstatus,
bdbase[i].TxBd[j].bd_length,
bdbase[i].TxBd[j].bd_addr,0);
logMsg( "\nch %d RxBd %d status=%x length=%x addr=%x",
i,j,bdbase[i].RxBd[j].bd_cstatus,
bdbase[i].RxBd[j].bd_length,
bdbase[i].RxBd[j].bd_addr,0);
}
}
}
void clearRxCorrectTotal( void )
{
int i ;
for( i=0; i<32; i++ )
rxCorrectTotal[i] = 0 ;
}
/*
hdlcmTxTest 1,10,1
*/
void hdlcmTxTest( int times,UINT16 length, UINT8 delaytime)
{
UINT8 i, j,k;
/*
mutliChannelHdlcStartup();
*/
for(k = 0;k<32;k++)
{
mhdlcTxBuffer[0] = k ;
for (i = 0; i < times; i++ )
{
if(mutliChannelHdlcWrite(mhdlcTxBuffer,sizeof(mhdlcTxBuffer))==EAGAIN)
{
printf("\ntransmiter Multihdlc frame to channel %d error!\n",mhdlcTxBuffer[0]);
return;
}
taskDelay(delaytime);
}
}
printf("send %d packets complete\n", times) ;
}
/*
multihdlcTxTest 1,1
*/
void multihdlcTxTest( int times, UINT8 delaytime)
{
UINT8 i, j,k;
/*
mutliChannelHdlcStartup();
*/
for(k = 0;k<32;k++)
{
mhdlcTxBuffer[0] = k ;
for (i = 0; i < times; i++ )
{
if(mutliChannelHdlcWrite(mhdlcTxBuffer,sizeof(mhdlcTxBuffer))==EAGAIN)
{
printf("\ntransmiter Multihdlc frame to channel %d error!\n",mhdlcTxBuffer[0]);
return;
}
taskDelay(delaytime);
}
}
printf("send %d packets complete\n", times) ;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?