|
|
@@ -239,30 +239,6 @@ void UART_SendChar(UART_TypeDef *uartx, u8 ch)
|
|
|
while (!(uartx->USR & (1 << 2)));
|
|
|
}
|
|
|
|
|
|
-void UART0_IrqHandler(void)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
-void UART2_IrqHandler(void)
|
|
|
-{
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-void UART3_IrqHandler(void)
|
|
|
-{
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-static void UART_StopTx(UartPort_t *uap)
|
|
|
-{
|
|
|
- uap->uartx->DLH_IER &= ~(1 << 1);
|
|
|
-}
|
|
|
-
|
|
|
-static void UART_StartTx(UartPort_t *uap)
|
|
|
-{
|
|
|
- uap->uartx->DLH_IER |= 1 << 1;
|
|
|
-}
|
|
|
-
|
|
|
static int UART_RxChars(UartPort_t *uap)
|
|
|
{
|
|
|
u32 lsr;
|
|
|
@@ -294,6 +270,16 @@ static int UART_RxChars(UartPort_t *uap)
|
|
|
|
|
|
}
|
|
|
|
|
|
+static void UART_StartTx(UartPort_t *uap)
|
|
|
+{
|
|
|
+ uap->uartx->DLH_IER |= 1 << 1;
|
|
|
+}
|
|
|
+
|
|
|
+static void UART_StopTx(UartPort_t *uap)
|
|
|
+{
|
|
|
+ uap->uartx->DLH_IER &= ~(1 << 1);
|
|
|
+}
|
|
|
+
|
|
|
/* Returns true if tx interrupts have to be (kept) enabled */
|
|
|
static BaseType_t UART_TxChars(UartPort_t *uap, int from_irq)
|
|
|
{
|
|
|
@@ -318,29 +304,50 @@ static BaseType_t UART_TxChars(UartPort_t *uap, int from_irq)
|
|
|
return pdTRUE;
|
|
|
}
|
|
|
|
|
|
-void UART1_IrqHandler(void)
|
|
|
+static void UART_IRQHandler(UartPort_t *uap)
|
|
|
{
|
|
|
- UartPort_t *uap = pxUartPort[1];
|
|
|
u32 iir;
|
|
|
u32 status;
|
|
|
|
|
|
- iir = uap->uartx->IIR_FCR;
|
|
|
- switch (iir & UART_IIR_IID_MASK) {
|
|
|
- case UART_IIR_IID_THR_EMPTY:
|
|
|
- UART_TxChars(uap, 1);
|
|
|
- break;
|
|
|
- case UART_IIR_IID_REV_DATA_AVAIL:
|
|
|
- case UART_IIR_IID_REV_LINE_STATUS:
|
|
|
- case UART_IIR_IID_CHAR_TIMEOUT:
|
|
|
- UART_RxChars(uap);
|
|
|
- break;
|
|
|
- case UART_IIR_IID_BUSY_DETECT:
|
|
|
- status = uap->uartx->USR;
|
|
|
- printf("busy status 0x%x.\n", status);
|
|
|
- break;
|
|
|
+ if (uap) {
|
|
|
+ iir = uap->uartx->IIR_FCR;
|
|
|
+ switch (iir & UART_IIR_IID_MASK) {
|
|
|
+ case UART_IIR_IID_THR_EMPTY:
|
|
|
+ UART_TxChars(uap, 1);
|
|
|
+ break;
|
|
|
+ case UART_IIR_IID_REV_DATA_AVAIL:
|
|
|
+ case UART_IIR_IID_REV_LINE_STATUS:
|
|
|
+ case UART_IIR_IID_CHAR_TIMEOUT:
|
|
|
+ UART_RxChars(uap);
|
|
|
+ break;
|
|
|
+ case UART_IIR_IID_BUSY_DETECT:
|
|
|
+ status = uap->uartx->USR;
|
|
|
+ printf("busy status 0x%x.\n", status);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void UART0_IRQHandler(void)
|
|
|
+{
|
|
|
+ UART_IRQHandler(pxUartPort[0]);
|
|
|
+}
|
|
|
+
|
|
|
+void UART2_IRQHandler(void)
|
|
|
+{
|
|
|
+ UART_IRQHandler(pxUartPort[2]);
|
|
|
+}
|
|
|
+
|
|
|
+void UART3_IRQHandler(void)
|
|
|
+{
|
|
|
+ UART_IRQHandler(pxUartPort[3]);
|
|
|
+}
|
|
|
+
|
|
|
+void UART1_IrqHandler(void)
|
|
|
+{
|
|
|
+ UART_IRQHandler(pxUartPort[1]);
|
|
|
+}
|
|
|
+
|
|
|
UartPort_t *UART_Open(eUartID id)
|
|
|
{
|
|
|
UART_TypeDef *uartx = NULL;
|
|
|
@@ -400,7 +407,10 @@ UartPort_t *UART_Open(eUartID id)
|
|
|
configASSERT(uap->xSend);
|
|
|
|
|
|
uap->uartx = uartx;
|
|
|
- uap->fifosize = 128;
|
|
|
+ if (id == UART_ID3)
|
|
|
+ uap->fifosize = 64;
|
|
|
+ else
|
|
|
+ uap->fifosize = 128;
|
|
|
|
|
|
return pxUartPort[id] = uap;
|
|
|
|
|
|
@@ -424,22 +434,26 @@ void UART_Close(UartPort_t *uap)
|
|
|
uap->rxbuf.tail = uap->rxbuf.head = 0;
|
|
|
vPortFree(uap->txbuf.buf);
|
|
|
uap->rxbuf.tail = uap->rxbuf.head = 0;
|
|
|
- vPortFree(uap);
|
|
|
#ifdef _UART0
|
|
|
if (uap->uartx == UART0)
|
|
|
pxUartPort[0] = NULL;
|
|
|
#endif
|
|
|
#ifdef _UART1
|
|
|
+ if (uap->uartx == UART1)
|
|
|
pxUartPort[1] = NULL;
|
|
|
#endif
|
|
|
|
|
|
#ifdef _UART2
|
|
|
+ if (uap->uartx == UART2)
|
|
|
pxUartPort[2] = NULL;
|
|
|
#endif
|
|
|
|
|
|
#ifdef _UART3
|
|
|
+ if (uap->uartx == UART3)
|
|
|
pxUartPort[3] = NULL;
|
|
|
#endif
|
|
|
+
|
|
|
+ vPortFree(uap);
|
|
|
}
|
|
|
|
|
|
int UART_Write(UartPort_t *uap, u8 *buf, size_t len, TickType_t xBlockTime)
|
|
|
@@ -541,8 +555,8 @@ int uart_demo(eUartID id)
|
|
|
snprintf(taskname, 16, "uartdemo%d", id);
|
|
|
|
|
|
/* Create a task to process uart rx data */
|
|
|
- if (xTaskCreate(uart_demo_thread, taskname, configMINIMAL_STACK_SIZE, uap,
|
|
|
- configMAX_PRIORITIES / 3, NULL) != pdPASS) {
|
|
|
+ if (xTaskCreate(uart_demo_thread, taskname, configMINIMAL_STACK_SIZE , uap,
|
|
|
+ (tskIDLE_PRIORITY + 1) | portPRIVILEGE_BIT, NULL) != pdPASS) {
|
|
|
printf("create uart rx demo task fail.\n");
|
|
|
return -1;
|
|
|
}
|