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

📄 uart.c

📁 s3c6410基于USB OTG下载内核至NORFLASH的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		
		g_AisRxDone[ch] = 1;	

		uTemp = Inp32(pUartRegs->rUintM );
		uTemp &= ~(BIT_UART_ERROR);
		Outp32(&pUartRegs->rUintM ,uTemp);
//		pUartRegs->rUintM &= ~(BIT_UART_ERROR);
		
	}


	// Tx ISR	
	if (Inp32(&pUartRegs->rUintP )& BIT_UART_TXD)
	{
		uTemp = Inp32(&pUartRegs->rUintM);
		uTemp |= BIT_UART_TXD;
		Outp32(&pUartRegs->rUintM , uTemp);
//		pUartRegs->rUintM |= BIT_UART_TXD;
		Outp32(&pUartRegs->rUintSp , BIT_UART_TXD);
		Outp32(&pUartRegs->rUintP , BIT_UART_TXD);

		if (Inp32(&pUartRegs->rUfCon )& 1) // 1 : fifo enable 
		{
			// for debugging fifo 
			*g_pFifoDebug++ = ++g_uFcnt;
			*g_pFifoDebug++ = (Inp32(&pUartRegs->rUfCon)>>6)&3;
			*g_pFifoDebug++ = (Inp32(&pUartRegs->rUfStat)>>8)&0x3f;
			*g_pFifoDebug = 0;
			
			while (!(Inp32(&pUartRegs->rUfStat )& (1<<14)) && (*g_pUartTxStr[ch] != TX_END_CHAR)) 	//until tx fifo full or end of string
				Outp32(&pUartRegs->rUtxh , *g_pUartTxStr[ch]++);

			if(*g_pUartTxStr[ch] == TX_END_CHAR) 
			{
				*(g_pUartTxStr[ch]+1) = NULL;
				g_AisTxDone[ch] = 1;	

				uTemp = Inp32(&pUartRegs->rUintM);
				uTemp |= BIT_UART_TXD;
				Outp32(&pUartRegs->rUintM , uTemp);
//				pUartRegs->rUintM |= (BIT_UART_TXD);
				return;
			}
			else 
			{
				uTemp = Inp32(&pUartRegs->rUintM);
				uTemp &= ~( BIT_UART_TXD);
				Outp32(&pUartRegs->rUintM , uTemp);
//				pUartRegs->rUintM &= ~(BIT_UART_TXD);
			}
		}
		else // 0 : fifo disable
		{
			if (*g_pUartTxStr[ch] != TX_END_CHAR)
			{
				Outp32(&pUartRegs->rUtxh , *g_pUartTxStr[ch]++);
				uTemp = Inp32(&pUartRegs->rUintM);
				uTemp &= ~( BIT_UART_TXD);
				Outp32(&pUartRegs->rUintM , uTemp);
//				pUartRegs->rUintM &= ~(BIT_UART_TXD);
			}
			else
			{
				*(g_pUartTxStr[ch]+1) = NULL;
				g_AisTxDone[ch] = 1;	
				return;
			}
		}
	}

	// Rx ISR	
	if (Inp32(&pUartRegs->rUintP) & BIT_UART_RXD)
	{
		uTemp = Inp32(&pUartRegs->rUintM);
		uTemp |= BIT_UART_RXD;
		Outp32(&pUartRegs->rUintM , uTemp);
		Outp32(&pUartRegs->rUintSp , BIT_UART_RXD);
		Outp32(&pUartRegs->rUintP , BIT_UART_RXD);

		if (pUartRegs->rUfCon & 1) // 1 : fifo enable 
		{
			// for debugging fifo 
			*g_pFifoDebug++ = ++g_uFcnt;
			*g_pFifoDebug++ = (Inp32(&pUartRegs->rUfCon)>>4)&3;
			*g_pFifoDebug++ = (Inp32(&pUartRegs->rUfStat))&0x3f;
			*g_pFifoDebug = 0;


			while (Inp32(&pUartRegs->rUfStat )& 0x3f) 	//until rx fifo count 0
			{
				*g_pUartRxStr[ch] = (u8)(Inp32(&pUartRegs->rUrxh));
				printf("%c", *g_pUartRxStr[ch]++);
			}	

			if(*(g_pUartRxStr[ch]-1) == RX_END_CHAR) 
			{
				*g_pUartRxStr[ch] = NULL;
				g_AisRxDone[ch] = 1;	

				uTemp = Inp32(&pUartRegs->rUintM);
				uTemp |= ( BIT_UART_RXD);
				Outp32(&pUartRegs->rUintM , uTemp);
				
//				pUartRegs->rUintM |= (BIT_UART_RXD);
				return;
			}
			else 
			{
				uTemp = Inp32(&pUartRegs->rUintM);
				uTemp &= ~( BIT_UART_RXD);
				Outp32(&pUartRegs->rUintM , uTemp);
				
//				pUartRegs->rUintM &= ~(BIT_UART_RXD);
			}
		}
		else // 0 : fifo disable
		{
			tempChar = (u8)(Inp32(&pUartRegs->rUrxh));
			if (tempChar != RX_END_CHAR)
			{
				printf("%c", tempChar);
				*g_pUartRxStr[ch]++ = tempChar;
			}
			else 
			{
				*g_pUartRxStr[ch] = NULL;
			    	printf("\n");
				g_AisRxDone[ch] = 1;
				return;
			}

			uTemp = Inp32(&pUartRegs->rUintM);
			uTemp &= ~( BIT_UART_RXD);
			Outp32(&pUartRegs->rUintM , uTemp);
//			pUartRegs->rUintM &= ~(BIT_UART_RXD);
		}
	}

	// Modem UART ISR	
	if ((Inp32(&pUartRegs->rUintP ))& BIT_UART_MODEM)
	{

		uTemp = Inp32(&pUartRegs->rUintM);
		uTemp |= BIT_UART_MODEM;
		Outp32(&pUartRegs->rUintM , uTemp);
		Outp32(&pUartRegs->rUintSp , BIT_UART_MODEM);
		Outp32(&pUartRegs->rUintP , BIT_UART_MODEM);


		// Implementation for modem uart

			uTemp = Inp32(&pUartRegs->rUintM);
			uTemp &= ~( BIT_UART_MODEM);
			Outp32(&pUartRegs->rUintM , uTemp);

//		pUartRegs->rUintM &= ~(BIT_UART_MODEM);
	}

	// unknown UART interrupt 
	if (Inp32(&pUartRegs->rUintP )& ~(BIT_UART_MODEM|BIT_UART_TXD|BIT_UART_ERROR|BIT_UART_RXD))
		printf("UARTx sub INT - unknown sub interrupt!!\n");


}


//////////
// Function Name : Isr_Dma
// Function Description : This is Uart DMA request ISR which operates DMA request
// Input : NONE
// Output : NONE
// Version : v0.1

void __irq Isr_Dma(void) // only one for test
{
/*
	unsigned char ch;
	unsigned char* pBuf;
	volatile unsigned int i;
	
	printf("Enter DmaIsr\n");
	printf("rDMAC1IntStatus : 0x%x \n", rDMAC1IntStatus);
	
	INT_Disable1(BIT_DMA1);

	if (rDMAC1IntStatus&0x1)    // Channel 0
	{
		rDMAC1C0Config &= ~(0x1);    // stop DMA
		rDMAC1IntTCClear = 0x1;

		//ch = ((rDMAREQSEL0>>1) -19)/2;
		ch = 0;
		isTxDone[ch] = 1;
		
		printf("isTxDone[%d]: %d\n", ch, isTxDone[ch]);
		INT_Enable1(BIT_DMA1);
		

	//	rDMAC1C0Control |= 0x8;
	//	rDMAC1C0Config  |= 0x1;
	
	//  Test 06.05.10 (Uart DMA Problem)
	   	rDMAC1Configuration = 0x0;
	
		rDMAC1Configuration = 0x1;
		rDMAC1C0Control |= 0x8;
		rDMAC1C0Config  |= 0x1;
	
	
		
	}

	if (rDMAC1IntStatus&0x2)
	{

		rDMAC1C1Config &= ~(0x1);    // stop DMA
		rDMAC1IntTCClear = 0x2;

		pBuf = (unsigned char*)UART_BUF;
		//ch = ((rDMAREQSEL1>>1) -19)/2;
		ch = 0;

		for (i=0; i<DMA_BUF_LEN; i++)
			*g_pUartRxStr[ch]++ = *pBuf++;

		if ( *(g_pUartRxStr[ch]-1) == RX_END_CHAR )
		{
			isRxDone[ch] = 1;
			*g_pUartRxStr[ch] = NULL; // added null after rx string
		}
		else
		{
			rDMAC1C1Control |= 0x8;
			rDMAC1C1Config  |= 0x1;
		}

		INT_Enable1(BIT_DMA1);
	}
		Write_VECTADDR(0x0);
		*/
}





//////////
// Function Name : UART_Config2
// Function Description : This function set up UART by pre-defined value (input)
// Input :
//		Channel(0~3)
//		Other Options 0. Nothing[D]  1.Send Break Signal  2. Loop Back Mode
//		Parity Mode 1. No parity[D] 2. Odd 3. Even 4. Forced as '1' 5. Forced as '0'
//		Number of Stop Bit 1. One stop bit per frame[D] 2. Two stop bit per frame
//		Word Length 1. 5bits 2. 6bits 3. 7bits 4. 8bits
//		Operating Clock 1. PCLK[D]	2. UEXTCLK	3. EPLL
//		External Interface Type 1. UART[D]   2. IrDA mode
//		Baudrate (ex 9600, 115200[D], 921600)
//		Operating Mode 1. Interrupt[D]	2. DMA
//		FIFO Mode (Tx/Rx[byte]) 1. no FIFO[D]  2. Empty/1  3. 16/8   4. 32/16  5. 48/32
//		AFC Mode 1. Disable[D]	2. Enable
//		nRTS trigger level(byte) 1. 63[D]   2. 56   3. 48   4. 40   5. 32   6. 24   7. 16   8. 8
// Output : NONE
// Version : v0.1
// default UART channel setting is UART_Config2(0,0,1,1,4,1,1,115200,1,1,1,1)

u8 UART_Config2(u8 cCh, u32 uBreakorLoop,u32 uParity,u32 uNumStop,u32 uWordLength,u32 uOpCLK, 
				u32 uExtIFtype,u32 uBaudrate,u32 uSelOpmode,u32 uSelFIFO,u32 uSelAFC,u32 uRTSLvL)
{

	volatile UART_CON *pUartCon;

	pUartCon = &g_AUartCon[cCh];	

	
	//Set Other Options
//	printf("\nSelect Other Options\n 0. Nothing[D]  1.Send Break Signal  2. Loop Back Mode  \n Choose : ");
	switch(uBreakorLoop)
	{		
		default : 	
					Outp8(&pUartCon->cSendBreakSignal , 0x0);
					Outp8(&pUartCon->cLoopTest , 0x0);
					break;
					
		case 1 :		
					Outp8(&pUartCon->cSendBreakSignal , 1);	
					return cCh;
					
					
		case 2 :	 	
					Outp8(&pUartCon->cLoopTest , 1);		
					break;		
	}		
	
	
	//Set Parity mode
//	printf("\nSelect Parity Mode\n 1. No parity[D] 2. Odd 3. Even 4. Forced as '1' 5. Forced as '0' \n Choose : ");
	switch(uParity)
	{		
		default : 	
			Outp8(&pUartCon->cParityBit , 0);		
			break;
		case 2 : 		
			Outp8(&pUartCon->cParityBit , 4);
			break;
		case 3 :		
			Outp8(&pUartCon->cParityBit , 5);
			break;
		case 4 :		
			Outp8(&pUartCon->cParityBit , 6);
			break;
		case 5 :		
			Outp8(&pUartCon->cParityBit , 7);
			break;
	}
	//Set the number of stop bit	
//	printf("\n\nSelect Number of Stop Bit\n 1. One stop bit per frame[D] 2. Two stop bit per frame");
	switch(uNumStop)
	{
		default : 	
			Outp8(&pUartCon->cStopBit , 0);
			break;
			
		case 2 : 		
			Outp8(&pUartCon->cStopBit , 1);
			break;		
	}
	//Set Word Length	
//	printf("\n\nSelect Word Length\n 1. 5bits 2. 6bits 3. 7bits 4. 8bits[D] \n Choose : ");
	switch(uWordLength)
	{		
		case 1 :		
			Outp8(&pUartCon->cDataBit , 0);
			break;
		case 2 :		
			Outp8(&pUartCon->cDataBit , 1);
			break;
		case 3 :		
			Outp8(&pUartCon->cDataBit , 2);		
			break;	
		default :		
			Outp8(&pUartCon->cDataBit , 3);
			break;
	}
	
	
	// Set Operation clock
//	printf("\n\nSelect Operating Clock\n 1. PCLK[D]	2. UEXTCLK	3. EPLL \n Choose : ");
	switch (uOpCLK)
	{
	case 2 :
		Outp8(&pUartCon->cOpClock , 1);
		
		// connect CLKOUT and UEXTCLK
//		rGPHCON = rGPHCON & ~(3<<24) | (1<<25);// Uextclk using			
//		UextClk = PCLK; 		
		break;

	case 3 :
		Outp8(&pUartCon->cOpClock , 3);
//		SetEPLL(42, 1, 2); // Epll output - 96MHz, pll input - 12MHz
		 // use EPLL output clock
//		rCLKSRC = rCLKSRC & ~(1<<6)|(1<<6); // epll output select
//		EpllClk = 50000000; 		
		break;

	default :
		Outp8(&pUartCon->cOpClock , 0); // PCLK		
		break;
	}

	// Select UART or IrDA 1.0
//	printf("\n\nSelect External Interface Type\n 1. UART[D]   2. IrDA mode\n Choose : ");
	if (uExtIFtype==2)		
		Outp8(&pUartCon->cSelUartIrda , 1); // IrDA mode
	else					
		Outp8(&pUartCon->cSelUartIrda , 0); // IrDA mode

	// Set Baudrate
//	printf("\n\nType the baudrate and then change the same baudrate of host, too.\n");
//	printf(" Baudrate (ex 9600, 115200[D], 921600) : ");
	Outp32(&pUartCon->uBaudrate , uBaudrate);

//	if ((s32)Inp32(&pUartCon->uBaudrate) == -1) 
//		Outp32(&pUartCon->uBaudrate , 115200);

	// Select UART operating mode
//	printf("\n\nSelect Operating Mode\n 1. Interrupt[D]	2. DMA\n Choose : ");
	if (uSelOpmode==2)
	{
		Outp8(&pUartCon->cTxMode , 2); // DMA0 mode
		Outp8(&pUartCon->cRxMode , 3); // DMA1 mode
	}
	else
	{	
		Outp8(&pUartCon->cTxMode , 1); // Int mode
		Outp8(&pUartCon->cRxMode , 1); // Int mode
	}

	// Select UART FIFO mode
//	printf("\n\nSelect FIFO Mode (Tx/Rx[byte])\n 1. no FIFO[D]  2. Empty/1  3. 16/8   4. 32/16  5. 48/32 \n Choose : ");

	if ( (uSelFIFO>1)&&(uSelFIFO<6) )
	{
		Outp8(&pUartCon->cEnableFifo , 1);
		Outp8(&pUartCon->cTxTrig , uSelFIFO -2);
		Outp8(&pUartCon->cRxTrig , uSelFIFO -2);
	}
	else 
	{
		Outp8(&pUartCon->cEnableFifo , 0);
	}

	// Select AFC mode enable/disable
//	printf("\n\nSelect AFC Mode\n 1. Disable[D]	2. Enable\n Choose : ");
	if (uSelAFC == 2)
	{
		Outp8(&pUartCon->cAfc , 1); // AFC mode enable
//		printf("Select nRTS trigger level(byte)\n 1. 63[D]   2. 56   3. 48   4. 40   5. 32   6. 24   7. 16   8. 8\n Choose : ");
		
		
		if ( (uRTSLvL>1)&&(uRTSLvL<9) )	
			Outp8(&pUartCon->cRtsTrig , uRTSLvL -1);

		else						
			Outp8(&pUartCon->cRtsTrig , 0); // default 63 byte
	}
	else
	{
		Outp8(&pUartCon->cAfc , 0); // AFC mode disable
	}

#if 0
	printf("SendBreakSignal=%d\n",Inp8(&pUartCon->cSendBreakSignal));
	printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",Inp32(&pUartCon->uBaudrate)
		,Inp8(&pUartCon->cSelUartIrda),
		Inp8(&pUartCon->cLoopTest),
		Inp8(&pUartCon->cAfc),
		Inp8(&pUartCon->cEnableFifo),
		Inp8(&pUartCon->cOpClock),
		Inp8(&pUartCon->cDataBit),
		Inp8(&pUartCon->cParityBit),
		Inp8(&pUartCon->cStopBit),
		Inp8(&pUartCon->cTxMode),
		Inp8(&pUartCon->cTxTrig),
		Inp8(&pUartCon->cRxMode),
		Inp8(&pUartCon->cRxTrig),
		Inp8(&pUartCon->cRtsTrig),
		Inp8(&pUartCon->cSendBreakSignal));
#endif
	return cCh;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -