summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2026-04-04 13:20:58 +0700
committerhathach <[email protected]>2026-04-04 13:20:58 +0700
commit3c6c87479be6a9fdd04240b8bb1267ef80b1a0e8 (patch)
tree2f0d2aecb4360c71fc760dc8afbe4ac92618b73f
parente01f1538b74cf3fa535e7d7f4924905b3cd35b1f (diff)
implement board_uart_read()/write() as non-blocking for all families
-rw-r--r--hw/bsp/at32f402_405/family.c24
-rw-r--r--hw/bsp/at32f403a_407/family.c21
-rw-r--r--hw/bsp/at32f413/family.c21
-rw-r--r--hw/bsp/at32f415/family.c21
-rw-r--r--hw/bsp/at32f423/family.c21
-rw-r--r--hw/bsp/at32f425/family.c21
-rw-r--r--hw/bsp/at32f435_437/family.c21
-rw-r--r--hw/bsp/at32f45x/family.c21
-rw-r--r--hw/bsp/broadcom_32bit/family.c16
-rw-r--r--hw/bsp/broadcom_64bit/family.c16
-rw-r--r--hw/bsp/ch32f20x/family.c8
-rw-r--r--hw/bsp/ch32v10x/family.c16
-rw-r--r--hw/bsp/ch32v20x/family.c17
-rw-r--r--hw/bsp/ch32v30x/family.c8
-rw-r--r--hw/bsp/f1c100s/family.c18
-rw-r--r--hw/bsp/fomu/family.c12
-rw-r--r--hw/bsp/ft9xx/family.c21
-rw-r--r--hw/bsp/gd32vf103/family.c15
-rw-r--r--hw/bsp/kinetis_k/family.c18
-rw-r--r--hw/bsp/kinetis_k32l/family.c38
-rw-r--r--hw/bsp/kinetis_kl/family.c25
-rw-r--r--hw/bsp/lpc15/family.c12
-rw-r--r--hw/bsp/lpc18/family.c14
-rw-r--r--hw/bsp/lpc43/family.c14
-rw-r--r--hw/bsp/lpc54/family.c17
-rw-r--r--hw/bsp/lpc55/family.c19
-rw-r--r--hw/bsp/maxim/family.c16
-rw-r--r--hw/bsp/mcx/family.c13
-rw-r--r--hw/bsp/mm32/family.c17
-rw-r--r--hw/bsp/msp430/family.c18
-rw-r--r--hw/bsp/msp432e4/family.c13
-rw-r--r--hw/bsp/rw61x/family.c13
-rw-r--r--hw/bsp/samd5x_e5x/boards/metro_m4_express/board.cmake2
-rw-r--r--hw/bsp/samd5x_e5x/boards/metro_m4_express/board.mk2
-rw-r--r--hw/bsp/samg/family.c13
-rw-r--r--hw/bsp/stm32l0/family.c13
-rw-r--r--hw/bsp/tm4c/family.c15
-rw-r--r--hw/bsp/xmc4000/family.c22
-rw-r--r--test/hil/tinyusb.json7
39 files changed, 397 insertions, 242 deletions
diff --git a/hw/bsp/at32f402_405/family.c b/hw/bsp/at32f402_405/family.c
index b7dbcbd98..56d4a7bea 100644
--- a/hw/bsp/at32f402_405/family.c
+++ b/hw/bsp/at32f402_405/family.c
@@ -205,22 +205,18 @@ int board_uart_read(uint8_t *buf, int len) {
int board_uart_write(void const *buf, int len)
{
#if CFG_TUSB_OS == OPT_OS_NONE
- int txsize = len;
- u16 timeout = 0xffff;
- while (txsize--)
- {
- while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET)
- {
- timeout--;
- if(timeout == 0)
- {
- return 0;
- }
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) != RESET) {
+ PRINT_UART->dt = (*p & 0x01FF);
+ p++;
+ count++;
+ } else {
+ break;
}
- PRINT_UART->dt = (*((uint8_t const *)buf) & 0x01FF);
- buf++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/at32f403a_407/family.c b/hw/bsp/at32f403a_407/family.c
index d4a7e446d..942e15872 100644
--- a/hw/bsp/at32f403a_407/family.c
+++ b/hw/bsp/at32f403a_407/family.c
@@ -223,19 +223,18 @@ int board_uart_read(uint8_t *buf, int len) {
int board_uart_write(void const *buf, int len) {
#if CFG_TUSB_OS == OPT_OS_NONE
- int txsize = len;
- u16 timeout = 0xffff;
- while (txsize--) {
- while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {
- timeout--;
- if (timeout == 0) {
- return 0;
- }
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) != RESET) {
+ PRINT_UART->dt = (*p & 0x01FF);
+ p++;
+ count++;
+ } else {
+ break;
}
- PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);
- buf++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/at32f413/family.c b/hw/bsp/at32f413/family.c
index adf29e097..d9af0ae4d 100644
--- a/hw/bsp/at32f413/family.c
+++ b/hw/bsp/at32f413/family.c
@@ -223,19 +223,18 @@ int board_uart_read(uint8_t *buf, int len) {
int board_uart_write(void const *buf, int len) {
#if CFG_TUSB_OS == OPT_OS_NONE
- int txsize = len;
- u16 timeout = 0xffff;
- while (txsize--) {
- while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {
- timeout--;
- if (timeout == 0) {
- return 0;
- }
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) != RESET) {
+ PRINT_UART->dt = (*p & 0x01FF);
+ p++;
+ count++;
+ } else {
+ break;
}
- PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);
- buf++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/at32f415/family.c b/hw/bsp/at32f415/family.c
index b592bf6c5..ca205d480 100644
--- a/hw/bsp/at32f415/family.c
+++ b/hw/bsp/at32f415/family.c
@@ -197,19 +197,18 @@ int board_uart_read(uint8_t *buf, int len) {
// Send characters to UART. Return number of sent bytes
int board_uart_write(void const *buf, int len) {
#if CFG_TUSB_OS == OPT_OS_NONE
- int txsize = len;
- u16 timeout = 0xffff;
- while (txsize--) {
- while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {
- timeout--;
- if (timeout == 0) {
- return 0;
- }
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) != RESET) {
+ PRINT_UART->dt = (*p & 0x01FF);
+ p++;
+ count++;
+ } else {
+ break;
}
- PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);
- buf++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/at32f423/family.c b/hw/bsp/at32f423/family.c
index 71cb559dc..9f13dba07 100644
--- a/hw/bsp/at32f423/family.c
+++ b/hw/bsp/at32f423/family.c
@@ -224,19 +224,18 @@ int board_uart_read(uint8_t *buf, int len) {
int board_uart_write(void const *buf, int len) {
#if CFG_TUSB_OS == OPT_OS_NONE
- int txsize = len;
- u16 timeout = 0xffff;
- while (txsize--) {
- while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {
- timeout--;
- if (timeout == 0) {
- return 0;
- }
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) != RESET) {
+ PRINT_UART->dt = (*p & 0x01FF);
+ p++;
+ count++;
+ } else {
+ break;
}
- PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);
- buf++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/at32f425/family.c b/hw/bsp/at32f425/family.c
index 7f443509e..1629ad7c0 100644
--- a/hw/bsp/at32f425/family.c
+++ b/hw/bsp/at32f425/family.c
@@ -205,19 +205,18 @@ int board_uart_read(uint8_t *buf, int len) {
// Send characters to UART. Return number of sent bytes
int board_uart_write(void const *buf, int len) {
#if CFG_TUSB_OS == OPT_OS_NONE
- int txsize = len;
- u16 timeout = 0xffff;
- while (txsize--) {
- while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {
- timeout--;
- if (timeout == 0) {
- return 0;
- }
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) != RESET) {
+ PRINT_UART->dt = (*p & 0x01FF);
+ p++;
+ count++;
+ } else {
+ break;
}
- PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);
- buf++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/at32f435_437/family.c b/hw/bsp/at32f435_437/family.c
index 6c6bc4d72..59a4fe120 100644
--- a/hw/bsp/at32f435_437/family.c
+++ b/hw/bsp/at32f435_437/family.c
@@ -250,19 +250,18 @@ int board_uart_read(uint8_t *buf, int len) {
// Send characters to UART. Return number of sent bytes
int board_uart_write(void const *buf, int len) {
#if CFG_TUSB_OS == OPT_OS_NONE
- int txsize = len;
- u16 timeout = 0xffff;
- while (txsize--) {
- while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {
- timeout--;
- if (timeout == 0) {
- return 0;
- }
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) != RESET) {
+ PRINT_UART->dt = (*p & 0x01FF);
+ p++;
+ count++;
+ } else {
+ break;
}
- PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);
- buf++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/at32f45x/family.c b/hw/bsp/at32f45x/family.c
index fa0c1139f..27eae861f 100644
--- a/hw/bsp/at32f45x/family.c
+++ b/hw/bsp/at32f45x/family.c
@@ -201,19 +201,18 @@ int board_uart_read(uint8_t *buf, int len) {
int board_uart_write(void const *buf, int len) {
#if CFG_TUSB_OS == OPT_OS_NONE
- int txsize = len;
- uint16_t timeout = 0xffff;
- while (txsize--) {
- while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {
- timeout--;
- if (timeout == 0) {
- return 0;
- }
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) != RESET) {
+ PRINT_UART->dt = (*p & 0x01FF);
+ p++;
+ count++;
+ } else {
+ break;
}
- PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);
- buf++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/broadcom_32bit/family.c b/hw/bsp/broadcom_32bit/family.c
index 399397bb4..1c7f6c7a5 100644
--- a/hw/bsp/broadcom_32bit/family.c
+++ b/hw/bsp/broadcom_32bit/family.c
@@ -125,16 +125,16 @@ int board_uart_read(uint8_t* buf, int len) {
}
int board_uart_write(void const* buf, int len) {
- for (int i = 0; i < len; i++) {
- const char* cbuf = buf;
- while (!UART1->STAT_b.TX_READY) {}
- if (cbuf[i] == '\n') {
- UART1->IO = '\r';
- while (!UART1->STAT_b.TX_READY) {}
+ const uint8_t* p = (const uint8_t*) buf;
+ int count = 0;
+ while (count < len) {
+ if (!UART1->STAT_b.TX_READY) {
+ break;
}
- UART1->IO = cbuf[i];
+ UART1->IO = p[count];
+ count++;
}
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/broadcom_64bit/family.c b/hw/bsp/broadcom_64bit/family.c
index 399397bb4..1c7f6c7a5 100644
--- a/hw/bsp/broadcom_64bit/family.c
+++ b/hw/bsp/broadcom_64bit/family.c
@@ -125,16 +125,16 @@ int board_uart_read(uint8_t* buf, int len) {
}
int board_uart_write(void const* buf, int len) {
- for (int i = 0; i < len; i++) {
- const char* cbuf = buf;
- while (!UART1->STAT_b.TX_READY) {}
- if (cbuf[i] == '\n') {
- UART1->IO = '\r';
- while (!UART1->STAT_b.TX_READY) {}
+ const uint8_t* p = (const uint8_t*) buf;
+ int count = 0;
+ while (count < len) {
+ if (!UART1->STAT_b.TX_READY) {
+ break;
}
- UART1->IO = cbuf[i];
+ UART1->IO = p[count];
+ count++;
}
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/ch32f20x/family.c b/hw/bsp/ch32f20x/family.c
index dd84b7c77..ab6a6007a 100644
--- a/hw/bsp/ch32f20x/family.c
+++ b/hw/bsp/ch32f20x/family.c
@@ -136,11 +136,9 @@ int board_uart_read(uint8_t *buf, int len)
int board_uart_write(void const *buf, int len)
{
- int txsize = len;
- while ( txsize-- )
- {
- uart_write(*(uint8_t const*) buf);
- buf++;
+ uint8_t const *p = (uint8_t const *) buf;
+ for (int i = 0; i < len; i++) {
+ uart_write(p[i]);
}
return len;
}
diff --git a/hw/bsp/ch32v10x/family.c b/hw/bsp/ch32v10x/family.c
index 344dcaf0b..72dae7086 100644
--- a/hw/bsp/ch32v10x/family.c
+++ b/hw/bsp/ch32v10x/family.c
@@ -143,11 +143,15 @@ int board_uart_read(uint8_t *buf, int len) {
}
int board_uart_write(void const *buf, int len) {
- const char *bufc = (const char *) buf;
- for (int i = 0; i < len; i++) {
- while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
- USART_SendData(USART1, *bufc++);
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (USART_GetFlagStatus(USART1, USART_FLAG_TC) != RESET) {
+ USART_SendData(USART1, p[count]);
+ count++;
+ } else {
+ break;
+ }
}
-
- return len;
+ return count;
}
diff --git a/hw/bsp/ch32v20x/family.c b/hw/bsp/ch32v20x/family.c
index 4c22450f9..221f62107 100644
--- a/hw/bsp/ch32v20x/family.c
+++ b/hw/bsp/ch32v20x/family.c
@@ -207,14 +207,19 @@ int board_uart_read(uint8_t *buf, int len) {
int board_uart_write(void const *buf, int len) {
#ifdef UART_DEV
- const char *bufc = (const char *) buf;
- for (int i = 0; i < len; i++) {
- while (USART_GetFlagStatus(UART_DEV, USART_FLAG_TC) == RESET);
- USART_SendData(UART_DEV, *bufc++);
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (USART_GetFlagStatus(UART_DEV, USART_FLAG_TC) != RESET) {
+ USART_SendData(UART_DEV, p[count]);
+ count++;
+ } else {
+ break;
+ }
}
+ return count;
#else
(void) buf; (void) len;
+ return 0;
#endif
-
- return len;
}
diff --git a/hw/bsp/ch32v30x/family.c b/hw/bsp/ch32v30x/family.c
index 6295f7723..aee4e7d4f 100644
--- a/hw/bsp/ch32v30x/family.c
+++ b/hw/bsp/ch32v30x/family.c
@@ -173,12 +173,10 @@ int board_uart_read(uint8_t* buf, int len) {
}
int board_uart_write(void const* buf, int len) {
- int txsize = len;
- const char* bufc = (const char*) buf;
- while (txsize--) {
- uart_write(*bufc++);
+ uint8_t const *p = (uint8_t const *) buf;
+ for (int i = 0; i < len; i++) {
+ uart_write(p[i]);
}
- uart_sync();
return len;
}
diff --git a/hw/bsp/f1c100s/family.c b/hw/bsp/f1c100s/family.c
index 1e71333d4..e221217ef 100644
--- a/hw/bsp/f1c100s/family.c
+++ b/hw/bsp/f1c100s/family.c
@@ -68,12 +68,20 @@ int board_uart_read(uint8_t* buf, int len) {
}
int board_uart_write(void const* buf, int len) {
- int txsize = len;
- while (txsize--) {
- sys_uart_putc(*(uint8_t const*) buf);
- buf++;
+ // UART0 base = 0x01c25000, USR register at +0x7c, bit 1 = TFNF (TX FIFO not full)
+ volatile uint32_t *uart_usr = (volatile uint32_t *) (0x01c25000 + 0x7c);
+ volatile uint32_t *uart_thr = (volatile uint32_t *) (0x01c25000 + 0x00);
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (*uart_usr & (1 << 1)) {
+ *uart_thr = p[count];
+ count++;
+ } else {
+ break;
+ }
}
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/fomu/family.c b/hw/bsp/fomu/family.c
index cf04a1f6f..d3ad7a738 100644
--- a/hw/bsp/fomu/family.c
+++ b/hw/bsp/fomu/family.c
@@ -104,16 +104,18 @@ int board_uart_read(uint8_t* buf, int len)
int board_uart_write(void const * buf, int len)
{
- int32_t offset = 0;
uint8_t const* buf8 = (uint8_t const*) buf;
- for (offset = 0; offset < len; offset++)
+ int count = 0;
+ while (count < len)
{
- if (!(messible_status_read() & CSR_MESSIBLE_STATUS_FULL_OFFSET))
+ if (messible_status_read() & CSR_MESSIBLE_STATUS_FULL_OFFSET)
{
- messible_in_write(buf8[offset]);
+ break;
}
+ messible_in_write(buf8[count]);
+ count++;
}
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/ft9xx/family.c b/hw/bsp/ft9xx/family.c
index ff24cfe89..5ee134eb0 100644
--- a/hw/bsp/ft9xx/family.c
+++ b/hw/bsp/ft9xx/family.c
@@ -221,16 +221,21 @@ int board_uart_read(uint8_t *buf, int len)
// Send characters to UART
int board_uart_write(void const *buf, int len)
{
- int r = 0;
-
+ int count = 0;
#ifdef BOARD_UART
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wcast-qual" // uart_writen does not have const for buffer parameter.
- r = uart_writen(BOARD_UART, (uint8_t *)((const void *)buf), len);
-#pragma GCC diagnostic pop
+ uint8_t const *p = (uint8_t const *) buf;
+ while (count < len) {
+ if (BOARD_UART->LSR_ICR_XON2 & MASK_UART_LSR_THRE) {
+ BOARD_UART->RHR_THR_DLL = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+#else
+ (void) buf; (void) len;
#endif
-
- return r;
+ return count;
}
// Get current milliseconds
diff --git a/hw/bsp/gd32vf103/family.c b/hw/bsp/gd32vf103/family.c
index 4c1099317..c1dc82bda 100644
--- a/hw/bsp/gd32vf103/family.c
+++ b/hw/bsp/gd32vf103/family.c
@@ -160,12 +160,17 @@ int board_uart_read(uint8_t* buf, int len) {
int board_uart_write(void const* buf, int len) {
#if defined(UART_DEV)
- int txsize = len;
- while (txsize--) {
- usart_write(UART_DEV, *(uint8_t const*)buf);
- buf++;
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (usart_flag_get(UART_DEV, USART_FLAG_TBE) != RESET) {
+ usart_data_transmit(UART_DEV, p[count]);
+ count++;
+ } else {
+ break;
+ }
}
- return len;
+ return count;
#else
(void)buf;
(void)len;
diff --git a/hw/bsp/kinetis_k/family.c b/hw/bsp/kinetis_k/family.c
index 1505defe0..8efab2762 100644
--- a/hw/bsp/kinetis_k/family.c
+++ b/hw/bsp/kinetis_k/family.c
@@ -125,13 +125,21 @@ int board_uart_read(uint8_t *buf, int len) {
}
int board_uart_write(void const *buf, int len) {
- (void) buf;
- (void) len;
-
#ifdef UART_DEV
- UART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);
- return len;
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UART_DEV->S1 & UART_S1_TDRE_MASK) {
+ UART_DEV->D = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
#else
+ (void) buf;
+ (void) len;
return 0;
#endif
}
diff --git a/hw/bsp/kinetis_k32l/family.c b/hw/bsp/kinetis_k32l/family.c
index ec8dc6ecf..a3bd92cec 100644
--- a/hw/bsp/kinetis_k32l/family.c
+++ b/hw/bsp/kinetis_k32l/family.c
@@ -117,28 +117,30 @@ uint32_t board_button_read(void) {
}
int board_uart_read(uint8_t* buf, int len) {
-#if 0 /*
- Use this version if want the LED to blink during BOARD=board_test,
- without having to hit a key.
- */
- if( 0U != (kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags( UART_PORT )) )
- {
- LPUART_ReadBlocking(UART_PORT, buf, len);
- return len;
+ int count = 0;
+ while (count < len) {
+ if (UART_PORT->STAT & LPUART_STAT_RDRF_MASK) {
+ buf[count] = (uint8_t) UART_PORT->DATA;
+ count++;
+ } else {
+ break;
}
-
- return( 0 );
-#else /* Wait for 'len' characters to come in */
-
- LPUART_ReadBlocking(UART_PORT, buf, len);
- return len;
-
-#endif
+ }
+ return count;
}
int board_uart_write(void const* buf, int len) {
- LPUART_WriteBlocking(UART_PORT, (uint8_t const*) buf, len);
- return len;
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UART_PORT->STAT & LPUART_STAT_TDRE_MASK) {
+ UART_PORT->DATA = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/kinetis_kl/family.c b/hw/bsp/kinetis_kl/family.c
index f89434d06..b378b6821 100644
--- a/hw/bsp/kinetis_kl/family.c
+++ b/hw/bsp/kinetis_kl/family.c
@@ -125,14 +125,31 @@ uint32_t board_button_read(void)
int board_uart_read(uint8_t* buf, int len)
{
- LPSCI_ReadBlocking(UART_PORT, buf, len);
- return len;
+ int count = 0;
+ while (count < len) {
+ if (UART_PORT->S1 & UART0_S1_RDRF_MASK) {
+ buf[count] = UART_PORT->D;
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
}
int board_uart_write(void const * buf, int len)
{
- LPSCI_WriteBlocking(UART_PORT, (uint8_t const*) buf, len);
- return len;
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UART_PORT->S1 & UART0_S1_TDRE_MASK) {
+ UART_PORT->D = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/lpc15/family.c b/hw/bsp/lpc15/family.c
index 0d092d3a9..bbfee1b51 100644
--- a/hw/bsp/lpc15/family.c
+++ b/hw/bsp/lpc15/family.c
@@ -130,7 +130,17 @@ int board_uart_read(uint8_t* buf, int len)
int board_uart_write(void const * buf, int len)
{
- return Chip_UART_SendBlocking(UART_PORT, buf, len);
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (Chip_UART_GetStatus(UART_PORT) & UART_STAT_TXRDY) {
+ Chip_UART_SendByte(UART_PORT, p[count]);
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/lpc18/family.c b/hw/bsp/lpc18/family.c
index 2043cef99..8a612d9d8 100644
--- a/hw/bsp/lpc18/family.c
+++ b/hw/bsp/lpc18/family.c
@@ -128,12 +128,16 @@ int board_uart_read(uint8_t *buf, int len) {
int board_uart_write(void const *buf, int len) {
uint8_t const *buf8 = (uint8_t const *) buf;
- for (int i = 0; i < len; i++) {
- while ((Chip_UART_ReadLineStatus(UART_DEV) & UART_LSR_THRE) == 0) {}
- Chip_UART_SendByte(UART_DEV, buf8[i]);
+ int count = 0;
+ while (count < len) {
+ if (Chip_UART_ReadLineStatus(UART_DEV) & UART_LSR_THRE) {
+ Chip_UART_SendByte(UART_DEV, buf8[count]);
+ count++;
+ } else {
+ break;
+ }
}
-
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/lpc43/family.c b/hw/bsp/lpc43/family.c
index 56834a1b0..5aff49704 100644
--- a/hw/bsp/lpc43/family.c
+++ b/hw/bsp/lpc43/family.c
@@ -244,12 +244,16 @@ int board_uart_read(uint8_t *buf, int len) {
int board_uart_write(void const *buf, int len) {
uint8_t const *buf8 = (uint8_t const *) buf;
- for ( int i = 0; i < len; i++ ) {
- while ( (Chip_UART_ReadLineStatus(UART_DEV) & UART_LSR_THRE) == 0 ) {}
- Chip_UART_SendByte(UART_DEV, buf8[i]);
+ int count = 0;
+ while (count < len) {
+ if (Chip_UART_ReadLineStatus(UART_DEV) & UART_LSR_THRE) {
+ Chip_UART_SendByte(UART_DEV, buf8[count]);
+ count++;
+ } else {
+ break;
+ }
}
-
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/lpc54/family.c b/hw/bsp/lpc54/family.c
index 806bd53dc..129f9f0ec 100644
--- a/hw/bsp/lpc54/family.c
+++ b/hw/bsp/lpc54/family.c
@@ -228,8 +228,23 @@ int board_uart_read(uint8_t* buf, int len) {
}
int board_uart_write(void const* buf, int len) {
- USART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);
+#ifdef UART_DEV
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UART_DEV->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK) {
+ UART_DEV->FIFOWR = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
+#else
+ (void) buf;
+ (void) len;
return 0;
+#endif
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/lpc55/family.c b/hw/bsp/lpc55/family.c
index b5d097234..b9d856f86 100644
--- a/hw/bsp/lpc55/family.c
+++ b/hw/bsp/lpc55/family.c
@@ -177,8 +177,23 @@ int board_uart_read(uint8_t* buf, int len) {
}
int board_uart_write(void const* buf, int len) {
- USART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);
- return len;
+#ifdef UART_DEV
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UART_DEV->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK) {
+ UART_DEV->FIFOWR = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
+#else
+ (void) buf;
+ (void) len;
+ return 0;
+#endif
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/maxim/family.c b/hw/bsp/maxim/family.c
index 6ef4c12c1..7f2a0eee6 100644
--- a/hw/bsp/maxim/family.c
+++ b/hw/bsp/maxim/family.c
@@ -186,13 +186,17 @@ int board_uart_read(uint8_t *buf, int len) {
}
int board_uart_write(void const *buf, int len) {
- int act_len = 0;
- const uint8_t *ch_ptr = (const uint8_t *) buf;
- while (act_len < len) {
- MXC_UART_WriteCharacter(ConsoleUart, *ch_ptr++);
- act_len++;
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (MXC_UART_GetTXFIFOAvailable(ConsoleUart) > 0) {
+ MXC_UART_WriteCharacterRaw(ConsoleUart, p[count]);
+ count++;
+ } else {
+ break;
+ }
}
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/mcx/family.c b/hw/bsp/mcx/family.c
index a3969c217..f50a65120 100644
--- a/hw/bsp/mcx/family.c
+++ b/hw/bsp/mcx/family.c
@@ -204,8 +204,17 @@ int board_uart_read(uint8_t* buf, int len) {
int board_uart_write(void const* buf, int len) {
#ifdef UART_DEV
- LPUART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);
- return len;
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UART_DEV->STAT & LPUART_STAT_TDRE_MASK) {
+ UART_DEV->DATA = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
#else
(void) buf; (void) len;
return 0;
diff --git a/hw/bsp/mm32/family.c b/hw/bsp/mm32/family.c
index 330b01f6d..651c9496e 100644
--- a/hw/bsp/mm32/family.c
+++ b/hw/bsp/mm32/family.c
@@ -153,14 +153,17 @@ int board_uart_read(uint8_t* buf, int len) {
int board_uart_write(void const* buf, int len) {
#ifdef UART_DEV
- const char* buff = buf;
- while (len) {
- while ((UART1->CSR & UART_IT_TXIEN) == 0); //The loop is sent until it is finished
- UART1->TDR = (*buff & 0xFF);
- buff++;
- len--;
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UART1->CSR & UART_IT_TXIEN) {
+ UART1->TDR = (p[count] & 0xFF);
+ count++;
+ } else {
+ break;
+ }
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/msp430/family.c b/hw/bsp/msp430/family.c
index 413ad7db6..0438f0abc 100644
--- a/hw/bsp/msp430/family.c
+++ b/hw/bsp/msp430/family.c
@@ -186,16 +186,18 @@ int board_uart_read(uint8_t * buf, int len)
int board_uart_write(void const * buf, int len)
{
- const char * char_buf = (const char *) buf;
-
- for(int i = 0; i < len; i++)
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ while (count < len)
{
- // Wait until TX buffer is empty (cleared by writing buffer).
- while(!(UCA1IFG & UCTXIFG));
- UCA1TXBUF = char_buf[i];
+ if (UCA1IFG & UCTXIFG) {
+ UCA1TXBUF = p[count];
+ count++;
+ } else {
+ break;
+ }
}
-
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/msp432e4/family.c b/hw/bsp/msp432e4/family.c
index 90eb945f4..be93976a5 100644
--- a/hw/bsp/msp432e4/family.c
+++ b/hw/bsp/msp432e4/family.c
@@ -188,11 +188,16 @@ int board_uart_read(uint8_t * buf, int len)
int board_uart_write(void const * buf, int len)
{
uint8_t const *p = (uint8_t const *)buf;
- for (int i = 0; i < len; ++i) {
- while (UART0->FR & UART_FR_TXFF) ;
- UART0->DR = *p++;
+ int count = 0;
+ while (count < len) {
+ if (!(UART0->FR & UART_FR_TXFF)) {
+ UART0->DR = p[count];
+ count++;
+ } else {
+ break;
+ }
}
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/rw61x/family.c b/hw/bsp/rw61x/family.c
index fcc7fb262..951c266ea 100644
--- a/hw/bsp/rw61x/family.c
+++ b/hw/bsp/rw61x/family.c
@@ -113,8 +113,17 @@ int board_uart_read(uint8_t* buf, int len) {
int board_uart_write(void const* buf, int len) {
#ifdef UART_DEV
- USART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);
- return len;
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UART_DEV->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK) {
+ UART_DEV->FIFOWR = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
#else
(void) buf; (void) len;
return 0;
diff --git a/hw/bsp/samd5x_e5x/boards/metro_m4_express/board.cmake b/hw/bsp/samd5x_e5x/boards/metro_m4_express/board.cmake
index 86d12ca24..50fbe64b0 100644
--- a/hw/bsp/samd5x_e5x/boards/metro_m4_express/board.cmake
+++ b/hw/bsp/samd5x_e5x/boards/metro_m4_express/board.cmake
@@ -3,6 +3,8 @@ set(SAM_FAMILY samd51)
set(JLINK_DEVICE ATSAMD51J19)
set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)
+set(MAX3421_HOST 1)
+
function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
__SAMD51J19A__
diff --git a/hw/bsp/samd5x_e5x/boards/metro_m4_express/board.mk b/hw/bsp/samd5x_e5x/boards/metro_m4_express/board.mk
index eba7070c1..f0f097c2a 100644
--- a/hw/bsp/samd5x_e5x/boards/metro_m4_express/board.mk
+++ b/hw/bsp/samd5x_e5x/boards/metro_m4_express/board.mk
@@ -2,6 +2,8 @@ SAM_FAMILY = samd51
CFLAGS += -D__SAMD51J19A__
+MAX3421_HOST = 1
+
# All source paths should be relative to the top level.
LD_FILE = $(BOARD_PATH)/$(BOARD).ld
diff --git a/hw/bsp/samg/family.c b/hw/bsp/samg/family.c
index b27134305..519068986 100644
--- a/hw/bsp/samg/family.c
+++ b/hw/bsp/samg/family.c
@@ -134,11 +134,16 @@ int board_uart_read(uint8_t* buf, int len) {
int board_uart_write(void const* buf, int len) {
uint8_t const* buf8 = (uint8_t const*) buf;
- for (int i = 0; i < len; i++) {
- while (!_usart_sync_is_ready_to_send(&edbg_com)) {}
- _usart_sync_write_byte(&edbg_com, buf8[i]);
+ int count = 0;
+ while (count < len) {
+ if (_usart_sync_is_ready_to_send(&edbg_com)) {
+ _usart_sync_write_byte(&edbg_com, buf8[count]);
+ count++;
+ } else {
+ break;
+ }
}
- return len;
+ return count;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/stm32l0/family.c b/hw/bsp/stm32l0/family.c
index 2a32ba9f5..930fa2d66 100644
--- a/hw/bsp/stm32l0/family.c
+++ b/hw/bsp/stm32l0/family.c
@@ -162,8 +162,17 @@ int board_uart_read(uint8_t* buf, int len) {
int board_uart_write(void const* buf, int len) {
#ifdef UART_ID
- HAL_UART_Transmit(&UartHandle, (uint8_t*)(uintptr_t) buf, len, 0xffff);
- return len;
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (UartHandle.Instance->ISR & USART_ISR_TXE) {
+ UartHandle.Instance->TDR = p[count];
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
#else
(void) buf;
(void) len;
diff --git a/hw/bsp/tm4c/family.c b/hw/bsp/tm4c/family.c
index 503d0a8c9..6988a264e 100644
--- a/hw/bsp/tm4c/family.c
+++ b/hw/bsp/tm4c/family.c
@@ -189,13 +189,16 @@ size_t board_get_unique_id(uint8_t id[], size_t max_len) {
int board_uart_write(void const* buf, int len) {
uint8_t const* data = buf;
-
- for (int i = 0; i < len; i++) {
- while ((UART0->FR & (1 << 5)) != 0) {} // Poll until previous data was shofted out
- UART0->DR = data[i]; // Write UART0 DATA REGISTER
+ int count = 0;
+ while (count < len) {
+ if ((UART0->FR & (1 << 5)) == 0) { // TX FIFO not full
+ UART0->DR = data[count];
+ count++;
+ } else {
+ break;
+ }
}
-
- return len;
+ return count;
}
int board_uart_read(uint8_t* buf, int len) {
diff --git a/hw/bsp/xmc4000/family.c b/hw/bsp/xmc4000/family.c
index d0acd04cb..1325b784b 100644
--- a/hw/bsp/xmc4000/family.c
+++ b/hw/bsp/xmc4000/family.c
@@ -128,11 +128,25 @@ int board_uart_read(uint8_t* buf, int len) {
int board_uart_write(void const* buf, int len) {
#ifdef UART_DEV
- char const* bufch = (char const*) buf;
- for(int i=0;i<len;i++) {
- XMC_UART_CH_Transmit(UART_DEV, bufch[i]);
+ uint8_t const *p = (uint8_t const *) buf;
+ int count = 0;
+ bool fifo_enabled = (UART_DEV->TBCTR & USIC_CH_TBCTR_SIZE_Msk) != 0UL;
+ while (count < len) {
+ if (fifo_enabled) {
+ if (XMC_USIC_CH_TXFIFO_IsFull(UART_DEV)) {
+ break;
+ }
+ UART_DEV->IN[0U] = p[count];
+ } else {
+ if (XMC_USIC_CH_GetTransmitBufferStatus(UART_DEV) == XMC_USIC_CH_TBUF_STATUS_BUSY) {
+ break;
+ }
+ XMC_UART_CH_ClearStatusFlag(UART_DEV, (uint32_t)XMC_UART_CH_STATUS_FLAG_TRANSMIT_BUFFER_INDICATION);
+ UART_DEV->TBUF[0U] = p[count];
+ }
+ count++;
}
- return len;
+ return count;
#else
(void) buf;
(void) len;
diff --git a/test/hil/tinyusb.json b/test/hil/tinyusb.json
index 86ac902ce..b9c768d14 100644
--- a/test/hil/tinyusb.json
+++ b/test/hil/tinyusb.json
@@ -62,11 +62,10 @@
{
"name": "metro_m4_express",
"uid": "9995AD485337433231202020FF100A34",
- "build" : {
- "args": ["MAX3421_HOST=1"]
- },
"tests": {
- "device": true, "host": false, "dual": true,
+ "device": true,
+ "host": false,
+ "dual": true,
"dev_attached": [{"vid_pid": "067b_2303", "serial": "0", "is_cdc": true}],
"comment": "pl23x"
},