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

📄 hdlclib.c

📁 s3c4510的开发板snds100的源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -