SoC common: src_ao: fix uart tx stuck issue [1/1]
PD#SH-20626
Problem:
AOCPU may stuck due to UART TX FIFO full when competition
for UART TX resource occurs between AOCPU and ARM, because
the UART transmission mode is polling mode both for AOCPU and
ARM, AOCPU UART transmission may stuck when there are mass
print logs transmitted by ARM, this may cause a long time
stuck on AOCPU which leads to exception for some drivers.
Solution:
1. Add TX buffer in UART driver to store characters when UART
TX FIFO is full, and the size of TX buffer can be changed.
2. When TX buffer is full, UART driver will discard the
transmitted characters and print warning logs when the
UART TX FIFO is empty.
Verify:
T3-T982
T5D-AM311
Change-Id: I49e5dbf73d11b68f0b342d68282e4350e0ae0518
Signed-off-by: Yao Jie <jie.yao@amlogic.com>
diff --git a/demos/amlogic/driver/uart/uart.c b/demos/amlogic/driver/uart/uart.c
index 1fe8972..4be4c03 100644
--- a/demos/amlogic/driver/uart/uart.c
+++ b/demos/amlogic/driver/uart/uart.c
@@ -28,11 +28,15 @@
* UART driver
*/
+#include "FreeRTOS.h"
+#include "timers.h"
#include "common.h"
#include "FreeRTOSConfig.h"
#include "uart.h"
#include "register.h"
#include "soc.h"
+#include "string.h"
+#include "timer_source.h"
//#define UART_PORT_CONS UART_B_WFIFO
@@ -71,6 +75,26 @@
#define P_UART_CTRL(uart_base) P_UART(uart_base, UART_CTRL)
#define P_UART_STATUS(uart_base) P_UART(uart_base, UART_STATUS)
+#define UART_TX_BUF_SIZE (512)
+#define POLL_TX_FIFO_PRD (portTICK_PERIOD_MS)
+#define POLL_TX_BUF_PRD (portTICK_PERIOD_MS * 10)
+#define UART_TXBUF_TASK_PRI (3)
+#define UART_TX_FIFO_FULL_WAIT (5000) //us
+
+struct xUartTxBuf_t {
+ char *pcTxBuf;
+ uint32_t ulRdPtr;
+ uint32_t ulWrPtr;
+ uint32_t ulBufCnt;
+ uint32_t ulTimerPeriod;
+ TimerHandle_t xTimer;
+ uint8_t ucWarnMsgPrtEn;
+ uint8_t ucBufReady;
+};
+
+static const char cWarnMsg[] = "\r\nWarning: AOCPU log is lost due to TX FIFO full!\n";
+static struct xUartTxBuf_t xUartTxBuf;
+
#ifdef ACS_DIS_PRINT_FLAG
static uint8_t bl30_print_en;
void enable_bl30_print(uint8_t enable)
@@ -112,6 +136,66 @@
UART_STAT_MASK_TFIFO_EMPTY));
}
+static int prvFillTxBuf(char c)
+{
+ char *pcBuf;
+
+ taskENTER_CRITICAL();
+ if (xUartTxBuf.ulBufCnt >= UART_TX_BUF_SIZE) {
+ xUartTxBuf.ucWarnMsgPrtEn = 1;
+ taskEXIT_CRITICAL();
+ return 1;
+ }
+
+ pcBuf = xUartTxBuf.pcTxBuf;
+ pcBuf[xUartTxBuf.ulWrPtr] = c;
+ xUartTxBuf.ulWrPtr++;
+ xUartTxBuf.ulBufCnt++;
+ if (xUartTxBuf.ulWrPtr >= UART_TX_BUF_SIZE)
+ xUartTxBuf.ulWrPtr = 0;
+ taskEXIT_CRITICAL();
+ return 0;
+}
+
+static int prvFillTxBufStr(const char *s)
+{
+ const char *pcChar = s;
+ int iCnt = 0;
+
+ while (*pcChar) {
+ if ('\n' == *pcChar) {
+ prvFillTxBuf('\r');
+ iCnt++;
+ }
+ prvFillTxBuf(*s);
+ iCnt++;
+ pcChar++;
+ }
+
+ return iCnt;
+}
+
+static uint8_t prvChkTxFifoBusy(void)
+{
+ uint8_t ucIsTxBusy = 0;
+ uint32_t time_start;
+ uint32_t time_end;
+ uint32_t time_elapse;
+
+ /* Check if UART TX FIFO is busy */
+ time_start = timere_read_us();
+ while (prvUartTxIsFull()) {
+ time_end = timere_read_us();
+ time_elapse = time_end - time_start;
+ if (time_elapse > UART_TX_FIFO_FULL_WAIT) {
+ ucIsTxBusy = 1;
+ break;
+ }
+ }
+
+ return ucIsTxBusy;
+}
+
void vUartPutc(const char c)
{
#ifdef ACS_DIS_PRINT_FLAG
@@ -134,13 +218,25 @@
while (prvUartTxIsFull());
REG32(P_UART_WFIFO(UART_PORT_CONS)) = (char)c;
- vUartTxFlush();
}
void vUartPuts(const char *s)
{
- while (*s)
- vUartPutc(*s++);
+ uint8_t ucIsTxBusy;
+
+ while (*s) {
+ ucIsTxBusy = prvChkTxFifoBusy();
+ /* If Uart TX FIFO is busy, send string to TX Buffer */
+ if (ucIsTxBusy && xUartTxBuf.ucBufReady) {
+ prvFillTxBufStr(s);
+ break;
+ }
+
+ if (!ucIsTxBusy || !xUartTxBuf.ucBufReady) {
+ vUartPutc(*s);
+ s++;
+ }
+ }
}
void vUartTxStart(void)
@@ -215,6 +311,41 @@
DECLARE_IRQ(IRQ_AO_UART_NUM, uart_interrupt, 1);
#endif
+static void prvUartTxBufHandle(TimerHandle_t xTimer)
+{
+ char cTxChar;
+ uint32_t ulIsTxFifoEmpty;
+
+ (void)xTimer;
+ taskENTER_CRITICAL();
+ if (xUartTxBuf.ulBufCnt == 0) {
+ if (xUartTxBuf.ulTimerPeriod != POLL_TX_BUF_PRD) {
+ xUartTxBuf.ulTimerPeriod = POLL_TX_BUF_PRD;
+ xTimerChangePeriod(xUartTxBuf.xTimer, xUartTxBuf.ulTimerPeriod, 0);
+ }
+ ulIsTxFifoEmpty = (REG32(P_UART_STATUS(UART_PORT_CONS)) &
+ UART_STAT_MASK_TFIFO_EMPTY);
+ if (ulIsTxFifoEmpty && xUartTxBuf.ucWarnMsgPrtEn) {
+ xUartTxBuf.ucWarnMsgPrtEn = 0;
+ vUartPuts(cWarnMsg);
+ }
+ } else {
+ if (xUartTxBuf.ulTimerPeriod != POLL_TX_FIFO_PRD) {
+ xUartTxBuf.ulTimerPeriod = POLL_TX_FIFO_PRD;
+ xTimerChangePeriod(xUartTxBuf.xTimer, xUartTxBuf.ulTimerPeriod, 0);
+ }
+ while (xUartTxBuf.ulBufCnt) {
+ cTxChar = xUartTxBuf.pcTxBuf[xUartTxBuf.ulRdPtr];
+ vUartPutc(cTxChar);
+ xUartTxBuf.ulRdPtr++;
+ xUartTxBuf.ulBufCnt--;
+ if (xUartTxBuf.ulRdPtr >= UART_TX_BUF_SIZE)
+ xUartTxBuf.ulRdPtr = 0;
+ }
+ }
+ taskEXIT_CRITICAL();
+}
+
/*
* Set UART to 115200-8-N-1
*
@@ -224,4 +355,25 @@
*/
void vUartInit(void)
{
+ TimerHandle_t xUartTimer = NULL;
+
+ xUartTxBuf.pcTxBuf = pvPortMalloc(UART_TX_BUF_SIZE);
+ if (xUartTxBuf.pcTxBuf) {
+ memset(xUartTxBuf.pcTxBuf, 0, UART_TX_BUF_SIZE);
+ xUartTimer = xTimerCreate("UartTimer", pdMS_TO_TICKS(POLL_TX_BUF_PRD),
+ pdTRUE, NULL, prvUartTxBufHandle);
+ if (xUartTimer) {
+ xUartTxBuf.ulRdPtr = 0;
+ xUartTxBuf.ulWrPtr = 0;
+ xUartTxBuf.ulBufCnt = 0;
+ xUartTxBuf.ucWarnMsgPrtEn = 0;
+ xUartTxBuf.ucBufReady = 1;
+ xUartTxBuf.xTimer = xUartTimer;
+ xUartTxBuf.ulTimerPeriod = POLL_TX_BUF_PRD;
+ xTimerStart(xUartTxBuf.xTimer, 0);
+ } else {
+ vPortFree(xUartTxBuf.pcTxBuf);
+ vUartPuts("Warning: xUartTimer create fail\n");
+ }
+ }
}
diff --git a/demos/amlogic/n200/a5/a5_av400/main.c b/demos/amlogic/n200/a5/a5_av400/main.c
index 7b168de..c2c1d2e 100644
--- a/demos/amlogic/n200/a5/a5_av400/main.c
+++ b/demos/amlogic/n200/a5/a5_av400/main.c
@@ -149,6 +149,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/a5/a5_av409/main.c b/demos/amlogic/n200/a5/a5_av409/main.c
index 7b168de..c2c1d2e 100644
--- a/demos/amlogic/n200/a5/a5_av409/main.c
+++ b/demos/amlogic/n200/a5/a5_av409/main.c
@@ -149,6 +149,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/p1/p1_as400/main.c b/demos/amlogic/n200/p1/p1_as400/main.c
index b6e70e1..ec8691a 100644
--- a/demos/amlogic/n200/p1/p1_as400/main.c
+++ b/demos/amlogic/n200/p1/p1_as400/main.c
@@ -153,6 +153,7 @@
hardware_init();
+ vUartInit();
printf("\n[ao]Starting AOCPU FreeRTOS...\r\n");
printf("\n[ao]Current board p1_as400...\r\n");
version();
diff --git a/demos/amlogic/n200/p1/p1_as408/main.c b/demos/amlogic/n200/p1/p1_as408/main.c
index fff8161..80f22ed 100644
--- a/demos/amlogic/n200/p1/p1_as408/main.c
+++ b/demos/amlogic/n200/p1/p1_as408/main.c
@@ -153,6 +153,7 @@
hardware_init();
+ vUartInit();
printf("\n[ao]Starting AOCPU FreeRTOS...\r\n");
printf("\n[ao]Current board p1_as408...\r\n");
version();
diff --git a/demos/amlogic/n200/p1/p1_as409/main.c b/demos/amlogic/n200/p1/p1_as409/main.c
index 83762fa..43ade3c 100644
--- a/demos/amlogic/n200/p1/p1_as409/main.c
+++ b/demos/amlogic/n200/p1/p1_as409/main.c
@@ -153,6 +153,7 @@
hardware_init();
+ vUartInit();
printf("\n[ao]Starting AOCPU FreeRTOS...\r\n");
printf("\n[ao]Current board p1_as409...\r\n");
version();
diff --git a/demos/amlogic/n200/p1/p1_ninox_4/main.c b/demos/amlogic/n200/p1/p1_ninox_4/main.c
index e112101..6b5f4d3 100644
--- a/demos/amlogic/n200/p1/p1_ninox_4/main.c
+++ b/demos/amlogic/n200/p1/p1_ninox_4/main.c
@@ -153,6 +153,7 @@
hardware_init();
+ vUartInit();
printf("\n[ao]Starting AOCPU FreeRTOS...\r\n");
printf("\n[ao]Current board p1_ninox_4...\r\n");
version();
diff --git a/demos/amlogic/n200/s4/s4_ap201/main.c b/demos/amlogic/n200/s4/s4_ap201/main.c
index 6586087..d0f4114 100644
--- a/demos/amlogic/n200/s4/s4_ap201/main.c
+++ b/demos/amlogic/n200/s4/s4_ap201/main.c
@@ -156,6 +156,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/s4/s4_ap222/main.c b/demos/amlogic/n200/s4/s4_ap222/main.c
index 6586087..d0f4114 100644
--- a/demos/amlogic/n200/s4/s4_ap222/main.c
+++ b/demos/amlogic/n200/s4/s4_ap222/main.c
@@ -156,6 +156,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/s4/s4_ap229/main.c b/demos/amlogic/n200/s4/s4_ap229/main.c
index 6586087..d0f4114 100644
--- a/demos/amlogic/n200/s4/s4_ap229/main.c
+++ b/demos/amlogic/n200/s4/s4_ap229/main.c
@@ -156,6 +156,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/s4/s4_ap232/main.c b/demos/amlogic/n200/s4/s4_ap232/main.c
index 6586087..d0f4114 100644
--- a/demos/amlogic/n200/s4/s4_ap232/main.c
+++ b/demos/amlogic/n200/s4/s4_ap232/main.c
@@ -156,6 +156,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/s4/s4_aq222/main.c b/demos/amlogic/n200/s4/s4_aq222/main.c
index 726ff76..a986fb1 100644
--- a/demos/amlogic/n200/s4/s4_aq222/main.c
+++ b/demos/amlogic/n200/s4/s4_aq222/main.c
@@ -156,6 +156,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/s4/s4_t211/main.c b/demos/amlogic/n200/s4/s4_t211/main.c
index 726ff76..a986fb1 100644
--- a/demos/amlogic/n200/s4/s4_t211/main.c
+++ b/demos/amlogic/n200/s4/s4_t211/main.c
@@ -156,6 +156,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/sc2/sc2_ah212/main.c b/demos/amlogic/n200/sc2/sc2_ah212/main.c
index 8add144..20a89ae 100644
--- a/demos/amlogic/n200/sc2/sc2_ah212/main.c
+++ b/demos/amlogic/n200/sc2/sc2_ah212/main.c
@@ -158,6 +158,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/sc2/sc2_ah219/main.c b/demos/amlogic/n200/sc2/sc2_ah219/main.c
index 79b187f..8e8af2f 100644
--- a/demos/amlogic/n200/sc2/sc2_ah219/main.c
+++ b/demos/amlogic/n200/sc2/sc2_ah219/main.c
@@ -154,6 +154,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/sc2/sc2_u212/main.c b/demos/amlogic/n200/sc2/sc2_u212/main.c
index a1990eb..5efdbff 100644
--- a/demos/amlogic/n200/sc2/sc2_u212/main.c
+++ b/demos/amlogic/n200/sc2/sc2_u212/main.c
@@ -154,6 +154,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t3/t3_t963d4/main.c b/demos/amlogic/n200/t3/t3_t963d4/main.c
index 5a1414c..1329a4d 100644
--- a/demos/amlogic/n200/t3/t3_t963d4/main.c
+++ b/demos/amlogic/n200/t3/t3_t963d4/main.c
@@ -129,6 +129,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t3/t3_t965d4/main.c b/demos/amlogic/n200/t3/t3_t965d4/main.c
index 5a1414c..1329a4d 100644
--- a/demos/amlogic/n200/t3/t3_t965d4/main.c
+++ b/demos/amlogic/n200/t3/t3_t965d4/main.c
@@ -129,6 +129,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t3/t3_t982/main.c b/demos/amlogic/n200/t3/t3_t982/main.c
index 0785592..564d8dc 100644
--- a/demos/amlogic/n200/t3/t3_t982/main.c
+++ b/demos/amlogic/n200/t3/t3_t982/main.c
@@ -130,6 +130,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t5/t5_ak301_v1/main.c b/demos/amlogic/n200/t5/t5_ak301_v1/main.c
index 6a906dd..b5fc0f9 100644
--- a/demos/amlogic/n200/t5/t5_ak301_v1/main.c
+++ b/demos/amlogic/n200/t5/t5_ak301_v1/main.c
@@ -166,6 +166,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t5/t5_ak309_v1/main.c b/demos/amlogic/n200/t5/t5_ak309_v1/main.c
index 6a906dd..b5fc0f9 100644
--- a/demos/amlogic/n200/t5/t5_ak309_v1/main.c
+++ b/demos/amlogic/n200/t5/t5_ak309_v1/main.c
@@ -166,6 +166,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t5/t5_ak311_v1/main.c b/demos/amlogic/n200/t5/t5_ak311_v1/main.c
index 6a906dd..b5fc0f9 100644
--- a/demos/amlogic/n200/t5/t5_ak311_v1/main.c
+++ b/demos/amlogic/n200/t5/t5_ak311_v1/main.c
@@ -166,6 +166,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t5/t5_ak329_v1/main.c b/demos/amlogic/n200/t5/t5_ak329_v1/main.c
index 6a906dd..b5fc0f9 100644
--- a/demos/amlogic/n200/t5/t5_ak329_v1/main.c
+++ b/demos/amlogic/n200/t5/t5_ak329_v1/main.c
@@ -166,6 +166,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t5d/t5d_am301_v1/main.c b/demos/amlogic/n200/t5d/t5d_am301_v1/main.c
index b7e9507..853d36d 100644
--- a/demos/amlogic/n200/t5d/t5d_am301_v1/main.c
+++ b/demos/amlogic/n200/t5d/t5d_am301_v1/main.c
@@ -169,6 +169,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t5d/t5d_am309_v1/main.c b/demos/amlogic/n200/t5d/t5d_am309_v1/main.c
index b7b9546..73e6d4e 100644
--- a/demos/amlogic/n200/t5d/t5d_am309_v1/main.c
+++ b/demos/amlogic/n200/t5d/t5d_am309_v1/main.c
@@ -168,6 +168,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t5d/t5d_am311_v1/main.c b/demos/amlogic/n200/t5d/t5d_am311_v1/main.c
index b7b9546..73e6d4e 100644
--- a/demos/amlogic/n200/t5d/t5d_am311_v1/main.c
+++ b/demos/amlogic/n200/t5d/t5d_am311_v1/main.c
@@ -168,6 +168,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t5d/t5d_am319_v1/main.c b/demos/amlogic/n200/t5d/t5d_am319_v1/main.c
index b7b9546..73e6d4e 100644
--- a/demos/amlogic/n200/t5d/t5d_am319_v1/main.c
+++ b/demos/amlogic/n200/t5d/t5d_am319_v1/main.c
@@ -168,6 +168,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t5w/t5w_at301/main.c b/demos/amlogic/n200/t5w/t5w_at301/main.c
index ef2b27d..2e9555a 100644
--- a/demos/amlogic/n200/t5w/t5w_at301/main.c
+++ b/demos/amlogic/n200/t5w/t5w_at301/main.c
@@ -167,6 +167,7 @@
// Test target board
int main(void)
{
+ vUartInit();
vUartPuts("Starting AOCPU FreeRTOS\n");
version();
diff --git a/demos/amlogic/n200/t7/t7_an400_lpddr4x/main.c b/demos/amlogic/n200/t7/t7_an400_lpddr4x/main.c
index f1a4e3a..d34fef0 100644
--- a/demos/amlogic/n200/t7/t7_an400_lpddr4x/main.c
+++ b/demos/amlogic/n200/t7/t7_an400_lpddr4x/main.c
@@ -161,6 +161,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t7/t7_an400_mercury/main.c b/demos/amlogic/n200/t7/t7_an400_mercury/main.c
index 2fbbf13..1181959 100644
--- a/demos/amlogic/n200/t7/t7_an400_mercury/main.c
+++ b/demos/amlogic/n200/t7/t7_an400_mercury/main.c
@@ -161,6 +161,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t7/t7_an400p_lpddr4x/main.c b/demos/amlogic/n200/t7/t7_an400p_lpddr4x/main.c
index e0715b2..851dd84 100644
--- a/demos/amlogic/n200/t7/t7_an400p_lpddr4x/main.c
+++ b/demos/amlogic/n200/t7/t7_an400p_lpddr4x/main.c
@@ -173,6 +173,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t7/t7_an408_lpddr4x/main.c b/demos/amlogic/n200/t7/t7_an408_lpddr4x/main.c
index b94fcee..601848f 100644
--- a/demos/amlogic/n200/t7/t7_an408_lpddr4x/main.c
+++ b/demos/amlogic/n200/t7/t7_an408_lpddr4x/main.c
@@ -154,6 +154,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t7/t7_an409_ddr4/main.c b/demos/amlogic/n200/t7/t7_an409_ddr4/main.c
index b94fcee..601848f 100644
--- a/demos/amlogic/n200/t7/t7_an409_ddr4/main.c
+++ b/demos/amlogic/n200/t7/t7_an409_ddr4/main.c
@@ -154,6 +154,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t7/t7_an40a1/main.c b/demos/amlogic/n200/t7/t7_an40a1/main.c
index 0fc1311..a873fb9 100644
--- a/demos/amlogic/n200/t7/t7_an40a1/main.c
+++ b/demos/amlogic/n200/t7/t7_an40a1/main.c
@@ -172,6 +172,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();
diff --git a/demos/amlogic/n200/t7/t7_t319/main.c b/demos/amlogic/n200/t7/t7_t319/main.c
index 2eca160..d7c9a1e 100644
--- a/demos/amlogic/n200/t7/t7_t319/main.c
+++ b/demos/amlogic/n200/t7/t7_t319/main.c
@@ -173,6 +173,7 @@
hardware_init();
+ vUartInit();
printf("\nStarting AOCPU FreeRTOS...\r\n");
version();