📄 hdlclib.c
字号:
U32 Status ;
U32 RcvCnt=0,RcvErrCnt=0,TxCnt=0 ;
int i ;
int return_value = 0 ;
// Step 1. Set destination address fields
FrameBuffer.Header.Address[0] = 0x12 ;
FrameBuffer.Header.Address[1] = 0x34 ;
FrameBuffer.Header.Address[2] = 0x45 ;
FrameBuffer.Header.Address[3] = 0x67 ;
// Step 2. Set Control field
FrameBuffer.Header.Control[0] = 0xff ;
// Step 3. Set HDLC Frame Data
for (i=0 ; i< (Size-(sizeof(sHDLCHeader))) ; i++)
FrameBuffer.Information[i] = (U8)(i & 0xFF) ;
if (SendHdlcFrame(channel,(U8 *)&FrameBuffer,Size)) TxCnt++ ;
while(1) {
// do until key stroke
if (UARTSTAT0 & USTAT_RCV_READY) break ;
// Step 1. Get current frame buffer pointer
CRxBDPtr = (U32)gCRxBDPtr[channel] ;
do {
// Step 2. Get frame buffer pointer for process
pRxBDPtr = (sBufferDescriptor *)pCRxBDPtr[channel] ;
// Step 3. Check Ownership is CPU or not
if ( !((U32)(pRxBDPtr->BufferDataPtr) & BOwnership_DMA) ) {
cnt-- ;
// Step 4. If ownership is CPU, then receive frame is exist
// So, get this frame to process
DataBuffer = (U8 *)pRxBDPtr->BufferDataPtr ;
Length = pRxBDPtr->LengthField ;
Status = pRxBDPtr->StatusField ;
if ( !( Status & (RxFERR | DRxABT) ) ) {
RcvCnt++ ;
bcomp((U8 *)DataBuffer, (U8 *)&FrameBuffer, Length) ;
}
else RcvErrCnt++ ;
PrintMemTestStatus(cnt%4) ;
if (cnt) {
if (SendHdlcFrame(channel,(U8 *)&FrameBuffer,Size))
TxCnt++ ;
}
}
else break ;
// Step 5. Change owner to DMA
(pRxBDPtr->BufferDataPtr) |= BOwnership_DMA;
pRxBDPtr->LengthField = (U32)0x0;
pRxBDPtr->StatusField = (U32)0x0;
// Step 6. check all descriptor is used, then enable HDLC receive
if ( gCRxBDPtr[channel] == pCRxBDPtr[channel] )
HDLC_Rx_init(channel) ;
// Step 7. Get Next Frame Descriptor pointer to process
pCRxBDPtr[channel] = (U32)(pRxBDPtr->NextBufferDescriptor) ;
} while (CRxBDPtr != pCRxBDPtr[channel]) ;
if (!cnt) break ;
}
if ( RcvErrCnt ) {
Print(" Fail !") ;
return_value = 0 ;
}
else {
if ( cnt ) {
Print(" Fail !") ;
return_value = 0 ;
}
else {
Print(" Ok !!!") ;
return_value = 1 ;
}
}
return return_value ;
}
/*
* Function : HdlcPingPongTest_Server
* Description : HDLC Ping-Pong Test Server Function
*/
void HdlcPingPongTest_Server(void)
{
sBufferDescriptor *pRxBDPtr ;
U32 CRxBDPtr ;
U8 *DataBuffer ;
U32 Length ;
U32 Status ;
U32 RcvCnt=0,RcvErrCnt=0,TxCnt=0 ;
U32 channel ;
U8 select ;
Print("\n\n >> Select Ping-Pong test channel ('A','B', or '2') ? ") ;
select = get_byte() ;
switch (select) {
case 'A' : case 'a' : channel = HDLCA ; break ;
case 'B' : case 'b' : channel = HDLCB ; break ;
default : Print("\nInvalid HDLC channel selected ....") ;
break ;
}
Print("\n\n >> HDLC channel %c Ping-Pong Test Server Start ... \n",\
to_upper(select)) ;
while(1) {
// do until key stroke
if (UARTSTAT0 & USTAT_RCV_READY) break ;
// Step 1. Get current frame buffer pointer
CRxBDPtr = (U32)gCRxBDPtr[channel] ;
do {
// Step 2. Get frame buffer pointer for process
pRxBDPtr = (sBufferDescriptor *)pCRxBDPtr[channel] ;
// Step 3. Check Ownership is CPU or not
if ( !((U32)(pRxBDPtr->BufferDataPtr) & BOwnership_DMA) ) {
// Step 4. If ownership is CPU, then receive frame is exist
// So, get this frame to process
DataBuffer = (U8 *)pRxBDPtr->BufferDataPtr ;
Length = pRxBDPtr->LengthField ;
Status = pRxBDPtr->StatusField ;
if ( !( Status & (RxFERR | DRxABT) ) ) RcvCnt++ ;
else RcvErrCnt++ ;
if (SendHdlcFrame(channel,(U8 *)DataBuffer,Length)) TxCnt++ ;
if ( !(TxCnt%10) ) {
if ( TxCnt != 0 ) {
Print("\n >> Ping-Pong Test Server ... ") ;
Print("\r -- Transmitted Frame : %d",TxCnt) ;
Print("\r -- Received Good Frame : %d",RcvCnt) ;
Print("\r -- Received Error Frame : %d",RcvErrCnt) ;
Print("\r") ;
}
}
}
else break ;
// Step 5. Change owner to DMA
(pRxBDPtr->BufferDataPtr) |= BOwnership_DMA;
pRxBDPtr->LengthField = (U32)0x0;
pRxBDPtr->StatusField = (U32)0x0;
// Step 6. check all descriptor is used, then enable HDLC receive
if ( gCRxBDPtr[channel] == pCRxBDPtr[channel] )
HDLC_Rx_init(channel) ;
// Step 7. Get Next Frame Descriptor pointer to process
pCRxBDPtr[channel] = (U32)(pRxBDPtr->NextBufferDescriptor) ;
} while (CRxBDPtr != pCRxBDPtr[channel]);
}
Print("\n\n >> Ping-Pong Test Server Result ") ;
Print("\r -- Transmitted Frame : %d",TxCnt) ;
Print("\r -- Received Good Frame : %d",RcvCnt) ;
Print("\r -- Received Error Frame : %d",RcvErrCnt) ;
get_byte() ;
}
/*
* Function : HdlcPingPongTest_Client
* Description : HDLC Ping-Pong Test Function
*/
void HdlcPingPongTest_Client(void)
{
sBufferDescriptor *pRxBDPtr ;
U32 CRxBDPtr ;
U8 *DataBuffer ;
U32 Length, Size = 1500 ;
U32 Status ;
U32 RcvCnt=0,RcvErrCnt=0,TxCnt=0 ;
U32 channel ;
U8 select ;
sHDLCFrame FrameBuffer ;
int i ;
Print("\n\n >> Select Ping-Pong test channel ('A','B', or '2') ? ") ;
select = get_byte() ;
switch (select) {
case 'A' : case 'a' : channel = HDLCA ; break ;
case 'B' : case 'b' : channel = HDLCB ; break ;
default : Print("\nInvalid HDLC channel selected ....") ;
break ;
}
Print("\n\n >> HDLC channel %c Ping-Pong Test Client Start ... \n",\
to_upper(select)) ;
// Step 1. Set destination address fields
FrameBuffer.Header.Address[0] = 0x12 ;
FrameBuffer.Header.Address[1] = 0x34 ;
FrameBuffer.Header.Address[2] = 0x45 ;
FrameBuffer.Header.Address[3] = 0x67 ;
// Step 2. Set Control field
FrameBuffer.Header.Control[0] = 0xff ;
// Step 3. Set HDLC Frame Data
for (i=0 ; i< (Size-(sizeof(sHDLCHeader))) ; i++)
FrameBuffer.Information[i] = (U8)(i & 0xFF) ;
if (SendHdlcFrame(channel,(U8 *)&FrameBuffer,Size)) TxCnt++ ;
while(1) {
// do until key stroke
if (UARTSTAT0 & USTAT_RCV_READY) break ;
// Step 1. Get current frame buffer pointer
CRxBDPtr = (U32)gCRxBDPtr[channel] ;
do {
// Step 2. Get frame buffer pointer for process
pRxBDPtr = (sBufferDescriptor *)pCRxBDPtr[channel] ;
// Step 3. Check Ownership is CPU or not
if ( !((U32)(pRxBDPtr->BufferDataPtr) & BOwnership_DMA) ) {
// Step 4. If ownership is CPU, then receive frame is exist
// So, get this frame to process
DataBuffer = (U8 *)pRxBDPtr->BufferDataPtr ;
Length = pRxBDPtr->LengthField ;
Status = pRxBDPtr->StatusField ;
if ( !( Status & (RxFERR | DRxABT) ) ) RcvCnt++ ;
else RcvErrCnt++ ;
if (SendHdlcFrame(channel,(U8 *)&FrameBuffer,Size)) TxCnt++ ;
if ( !(TxCnt%10) ) {
if ( TxCnt != 0 ) {
Print("\n >> Ping-Pong Test Client ... ") ;
Print("\r -- Transmitted Frame : %d",TxCnt) ;
Print("\r -- Received Good Frame : %d",RcvCnt) ;
Print("\r -- Received Error Frame : %d",RcvErrCnt) ;
Print("\r") ;
}
}
}
else break ;
// Step 5. Change owner to DMA
(pRxBDPtr->BufferDataPtr) |= BOwnership_DMA;
pRxBDPtr->LengthField = (U32)0x0;
pRxBDPtr->StatusField = (U32)0x0;
// Step 6. check all descriptor is used, then enable HDLC receive
if ( gCRxBDPtr[channel] == pCRxBDPtr[channel] )
HDLC_Rx_init(channel) ;
// Step 7. Get Next Frame Descriptor pointer to process
pCRxBDPtr[channel] = (U32)(pRxBDPtr->NextBufferDescriptor) ;
} while (CRxBDPtr != pCRxBDPtr[channel]);
}
Print("\n\n >> Ping-Pong Test Client Result ") ;
Print("\r -- Transmitted Frame : %d",TxCnt) ;
Print("\r -- Received Good Frame : %d",RcvCnt) ;
Print("\r -- Received Error Frame : %d",RcvErrCnt) ;
get_byte() ;
}
/*
* Function : HDLC_Status
* Description : View HDLC Status report
*/
void HDLC_Status(void)
{
U32 channel ;
Print("\n >> HDLC Control Register Value <<") ;
Print("\r+-----------------------------------------+") ;
Print("\r Channel A Channel B ") ;
Print("\r+-----------------------------------------+") ;
Print("\r HCON0 %08x %08x ",HCON0A, HCON0B) ;
Print("\r HCON1 %08x %08x ",HCON1A, HCON1B) ;
Print("\r HSTAT %08x %08x ",HSTATA, HSTATB) ;
Print("\r HINTEN %08x %08x ",HINTENA, HINTENB) ;
Print("\r HBRGTC %08x %08x ",HBRGTCA, HBRGTCB) ;
Print("\r HDMATXCNT %08x %08x ",HDMATXCNTA, HDMATXCNTB) ;
Print("\r HDMARXCNT %08x %08x ",HDMARXCNTA, HDMARXCNTB) ;
Print("\r HDMARXBCNT %08x %08x ",HDMARXBCNTA, HDMARXBCNTB) ;
Print("\r HTXFIFOC %08x %08x ",HTXFIFOCA, HTXFIFOCB) ;
Print("\r HTXFIFOT %08x %08x ",HTXFIFOTA, HTXFIFOTB) ;
Print("\r+-----------------------------------------+") ;
Print("\n >> HDLC Status Register Value <<") ;
Print("\r+-----------------------------------------+") ;
Print("\r Channel A Channel B ") ;
Print("\r+-----------------------------------------+") ;
Print("\r Tx Complete %5d %5d ", \
gHdlcTxStatus[HDLCA].TxFrameComplete, gHdlcTxStatus[HDLCB].TxFrameComplete) ;
Print("\r Tx FIFO Avail %5d %5d ", \
gHdlcTxStatus[HDLCA].TxFIFOAvailable, gHdlcTxStatus[HDLCB].TxFIFOAvailable) ;
Print("\r Tx CTS Tran %5d %5d ", \
gHdlcTxStatus[HDLCA].TxTransitionOfCTS, gHdlcTxStatus[HDLCB].TxTransitionOfCTS) ;
Print("\r Tx Underrun %5d %5d ", \
gHdlcTxStatus[HDLCA].TxUnderrun, gHdlcTxStatus[HDLCB].TxUnderrun) ;
Print("\r Tx DMA Stop %5d %5d ", \
gHdlcTxStatus[HDLCA].DMATxStop, gHdlcTxStatus[HDLCB].DMATxStop) ;
Print("\r Tx DMA Abort %5d %5d ", \
gHdlcTxStatus[HDLCA].DMATxABT, gHdlcTxStatus[HDLCB].DMATxABT) ;
Print("\r+-----------------------------------------+") ;
Print("\r Rx FIFO Avail %5d %5d ", \
gHdlcRxStatus[HDLCA].RxFIFOAvalable, gHdlcRxStatus[HDLCB].RxFIFOAvalable) ;
Print("\r Rx FIFO Addr %5d %5d ", \
gHdlcRxStatus[HDLCA].RxFIFOAddrPresent, gHdlcRxStatus[HDLCB].RxFIFOAddrPresent) ;
Print("\r Rx Flag Detect %5d %5d ", \
gHdlcRxStatus[HDLCA].RxFlagDetected, gHdlcRxStatus[HDLCB].RxFlagDetected) ;
Print("\r Rx DCD Transit %5d %5d ", \
gHdlcRxStatus[HDLCA].RxTransitionOfDCD, gHdlcRxStatus[HDLCB].RxTransitionOfDCD) ;
Print("\r Rx Addr Error %5d %5d ", \
gHdlcRxStatus[HDLCA].RxAddressError, gHdlcRxStatus[HDLCB].RxAddressError) ;
Print("\r Rx LFrame Valid %5d %5d ", \
gHdlcRxStatus[HDLCA].RxLastFrameValid, gHdlcRxStatus[HDLCB].RxLastFrameValid) ;
Print("\r Rx Idle %5d %5d ", \
gHdlcRxStatus[HDLCA].RxIdle, gHdlcRxStatus[HDLCB].RxIdle) ;
Print("\r Rx Abort %5d %5d ", \
gHdlcRxStatus[HDLCA].RxAbort, gHdlcRxStatus[HDLCB].RxAbort) ;
Print("\r Rx Frame Error %5d %5d ", \
gHdlcRxStatus[HDLCA].RxFrameError, gHdlcRxStatus[HDLCB].RxFrameError) ;
Print("\r Rx Overrun %5d %5d ", \
gHdlcRxStatus[HDLCA].RxOverrun, gHdlcRxStatus[HDLCB].RxOverrun) ;
Print("\r Rx DMA Stop %5d %5d ", \
gHdlcRxStatus[HDLCA].DMARxStop, gHdlcRxStatus[HDLCB].DMARxStop) ;
Print("\r Rx DMA ABT %5d %5d ", \
gHdlcRxStatus[HDLCA].DMARxABT, gHdlcRxStatus[HDLCB].DMARxABT) ;
Print("\r+-----------------------------------------+") ;
Print("\r DPLL One Clk Miss %5d %5d ", \
gHdlcDPLLStatus[HDLCA].DPLLOneClkMiss, gHdlcDPLLStatus[HDLCB].DPLLOneClkMiss) ;
Print("\r DPLL Two Clk Miss %5d %5d ", \
gHdlcDPLLStatus[HDLCA].DPLLTwoClkMiss, gHdlcDPLLStatus[HDLCB].DPLLTwoClkMiss) ;
Print("\r+-----------------------------------------+") ;
Print("\n >> HDLC Buffer Descriptor Value <<") ;
Print("\r+-----------------------------------------+") ;
Print("\r Channel A Channel B ") ;
Print("\r+-----------------------------------------+") ;
Print("\r Process Tx BD %08x %08x ", \
pCTxBDPtr[HDLCA], pCTxBDPtr[HDLCB] ) ;
Print("\r Transmit Tx BD %08x %08x ", \
gCTxBDPtr[HDLCA], gCTxBDPtr[HDLCB] ) ;
Print("\r Process Rx BD %08x %08x ", \
pCRxBDPtr[HDLCA], pCRxBDPtr[HDLCB] ) ;
Print("\r Receive Rx BD %08x %08x ", \
gCRxBDPtr[HDLCA], gCRxBDPtr[HDLCB] ) ;
// Clear Error Report
for (channel=HDLCA ; channel<HDLCB; channel++) {
gHdlcTxStatus[channel].TxFrameComplete =
gHdlcTxStatus[channel].TxFIFOAvailable = 0 ;
gHdlcTxStatus[channel].TxLevelOfCTS = 0 ;
gHdlcTxStatus[channel].TxTransitionOfCTS = 0 ;
gHdlcTxStatus[channel].TxUnderrun = 0 ;
gHdlcTxStatus[channel].DMATxStop = 0 ;
gHdlcTxStatus[channel].DMATxABT = 0 ;
gHdlcRxStatus[channel].RxFIFOAvalable = 0 ;
gHdlcRxStatus[channel].RxFIFOAddrPresent = 0 ;
gHdlcRxStatus[channel].RxFlagDetected = 0 ;
gHdlcRxStatus[channel].RxLevelOfDCD = 0 ;
gHdlcRxStatus[channel].RxTransitionOfDCD = 0 ;
gHdlcRxStatus[channel].RxAddressError = 0 ;
gHdlcRxStatus[channel].RxLastFrameValid = 0 ;
gHdlcRxStatus[channel].RxIdle = 0 ;
gHdlcRxStatus[channel].RxAbort = 0 ;
gHdlcRxStatus[channel].RxFrameError = 0 ;
gHdlcRxStatus[channel].RxOverrun = 0 ;
gHdlcRxStatus[channel].DMARxStop = 0 ;
gHdlcRxStatus[channel].DMARxABT = 0 ;
gHdlcDPLLStatus[channel].DPLLOneClkMiss = 0 ;
gHdlcDPLLStatus[channel].DPLLTwoClkMiss = 0 ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -