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 + -
显示快捷键?