📄 uart.c
字号:
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 + -