summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-03-22 00:14:46 +1100
committerDamien George <damien@micropython.org>2023-03-23 13:51:17 +1100
commit38e7b842c6bc8122753cbf0845eb141f28fbcb72 (patch)
tree8b0d37b9e425cda2d28f24318d1e6093ffe9cbe6
parent6c7624896063e58f67d732b5f080e96f36bc5eda (diff)
ports: Implement simple write polling for stdout.
This is a best-effort implementation of write polling. It's difficult to do correctly because if there are multiple output streams (eg UART and USB CDC) then some may not be writeable while others are. A full solution should also have a return value from mp_hal_stdout_tx_strn(), returning the number of bytes written to the stream(s). That's also hard to define. The renesas-ra and stm32 ports already implement a similar best-effort mechanism for write polling. Fixes issue #11026. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/esp32/mphalport.c3
-rw-r--r--ports/esp8266/esp_mphal.c3
-rw-r--r--ports/mimxrt/mphalport.c3
-rw-r--r--ports/nrf/drivers/bluetooth/ble_uart.c3
-rw-r--r--ports/nrf/drivers/usb/usb_cdc.c3
-rw-r--r--ports/nrf/mphalport.c3
-rw-r--r--ports/pic16bit/pic16bit_mphal.c3
-rw-r--r--ports/rp2/mphalport.c9
-rw-r--r--ports/samd/mphalport.c4
-rw-r--r--ports/teensy/teensy_hal.c5
10 files changed, 39 insertions, 0 deletions
diff --git a/ports/esp32/mphalport.c b/ports/esp32/mphalport.c
index 2aaeb9755..b187b422d 100644
--- a/ports/esp32/mphalport.c
+++ b/ports/esp32/mphalport.c
@@ -88,6 +88,9 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
if ((poll_flags & MP_STREAM_POLL_RD) && stdin_ringbuf.iget != stdin_ringbuf.iput) {
ret |= MP_STREAM_POLL_RD;
}
+ if (poll_flags & MP_STREAM_POLL_WR) {
+ ret |= MP_STREAM_POLL_WR;
+ }
return ret;
}
diff --git a/ports/esp8266/esp_mphal.c b/ports/esp8266/esp_mphal.c
index 3cb480733..219e61484 100644
--- a/ports/esp8266/esp_mphal.c
+++ b/ports/esp8266/esp_mphal.c
@@ -62,6 +62,9 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
if ((poll_flags & MP_STREAM_POLL_RD) && stdin_ringbuf.iget != stdin_ringbuf.iput) {
ret |= MP_STREAM_POLL_RD;
}
+ if (poll_flags & MP_STREAM_POLL_WR) {
+ ret |= mp_uos_dupterm_poll(poll_flags);
+ }
return ret;
}
diff --git a/ports/mimxrt/mphalport.c b/ports/mimxrt/mphalport.c
index 2730b9a85..beb471ab8 100644
--- a/ports/mimxrt/mphalport.c
+++ b/ports/mimxrt/mphalport.c
@@ -86,6 +86,9 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
if ((poll_flags & MP_STREAM_POLL_RD) && ringbuf_peek(&stdin_ringbuf) != -1) {
ret |= MP_STREAM_POLL_RD;
}
+ if ((poll_flags & MP_STREAM_POLL_WR) && tud_cdc_connected() && tud_cdc_write_available() > 0) {
+ ret |= MP_STREAM_POLL_WR;
+ }
#if MICROPY_PY_OS_DUPTERM
ret |= mp_uos_dupterm_poll(poll_flags);
#endif
diff --git a/ports/nrf/drivers/bluetooth/ble_uart.c b/ports/nrf/drivers/bluetooth/ble_uart.c
index 3020f1af6..320657370 100644
--- a/ports/nrf/drivers/bluetooth/ble_uart.c
+++ b/ports/nrf/drivers/bluetooth/ble_uart.c
@@ -164,6 +164,9 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
&& !isBufferEmpty(mp_rx_ring_buffer)) {
ret |= MP_STREAM_POLL_RD;
}
+ if ((poll_flags & MP_STREAM_POLL_WR) && ble_uart_enabled()) {
+ ret |= MP_STREAM_POLL_WR;
+ }
return ret;
}
#endif
diff --git a/ports/nrf/drivers/usb/usb_cdc.c b/ports/nrf/drivers/usb/usb_cdc.c
index 16d69fff6..e33a42548 100644
--- a/ports/nrf/drivers/usb/usb_cdc.c
+++ b/ports/nrf/drivers/usb/usb_cdc.c
@@ -213,6 +213,9 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
ret |= MP_STREAM_POLL_RD;
}
}
+ if (poll_flags & MP_STREAM_POLL_WR) {
+ ret |= MP_STREAM_POLL_WR;
+ }
return ret;
}
diff --git a/ports/nrf/mphalport.c b/ports/nrf/mphalport.c
index 9405cb2e3..a2eec7fce 100644
--- a/ports/nrf/mphalport.c
+++ b/ports/nrf/mphalport.c
@@ -179,6 +179,9 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
&& uart_rx_any(MP_STATE_PORT(board_stdio_uart))) {
ret |= MP_STREAM_POLL_RD;
}
+ if ((poll_flags & MP_STREAM_POLL_WR) && MP_STATE_PORT(board_stdio_uart) != NULL) {
+ ret |= MP_STREAM_POLL_WR;
+ }
return ret;
}
diff --git a/ports/pic16bit/pic16bit_mphal.c b/ports/pic16bit/pic16bit_mphal.c
index 48e8af87d..b2c80ba1b 100644
--- a/ports/pic16bit/pic16bit_mphal.c
+++ b/ports/pic16bit/pic16bit_mphal.c
@@ -57,6 +57,9 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
if ((poll_flags & MP_STREAM_POLL_RD) && uart_rx_any()) {
ret |= MP_STREAM_POLL_RD;
}
+ if (poll_flags & MP_STREAM_POLL_WR) {
+ ret |= MP_STREAM_POLL_WR;
+ }
return ret;
}
diff --git a/ports/rp2/mphalport.c b/ports/rp2/mphalport.c
index 510d486d9..f56c2bda1 100644
--- a/ports/rp2/mphalport.c
+++ b/ports/rp2/mphalport.c
@@ -98,6 +98,15 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
if ((poll_flags & MP_STREAM_POLL_RD) && ringbuf_peek(&stdin_ringbuf) != -1) {
ret |= MP_STREAM_POLL_RD;
}
+ if (poll_flags & MP_STREAM_POLL_WR) {
+ #if MICROPY_HW_ENABLE_UART_REPL
+ ret |= MP_STREAM_POLL_WR;
+ #else
+ if (tud_cdc_connected() && tud_cdc_write_available() > 0) {
+ ret |= MP_STREAM_POLL_WR;
+ }
+ #endif
+ }
#endif
#if MICROPY_PY_OS_DUPTERM
ret |= mp_uos_dupterm_poll(poll_flags);
diff --git a/ports/samd/mphalport.c b/ports/samd/mphalport.c
index d7511e61f..3dc6b70a8 100644
--- a/ports/samd/mphalport.c
+++ b/ports/samd/mphalport.c
@@ -162,6 +162,10 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
ret |= MP_STREAM_POLL_RD;
}
+ if ((poll_flags & MP_STREAM_POLL_WR) && tud_cdc_connected() && tud_cdc_write_available() > 0) {
+ ret |= MP_STREAM_POLL_WR;
+ }
+
#if MICROPY_PY_OS_DUPTERM
ret |= mp_uos_dupterm_poll(poll_flags);
#endif
diff --git a/ports/teensy/teensy_hal.c b/ports/teensy/teensy_hal.c
index 93103319b..62a826517 100644
--- a/ports/teensy/teensy_hal.c
+++ b/ports/teensy/teensy_hal.c
@@ -32,6 +32,11 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
ret |= MP_STREAM_POLL_RD;
}
}
+ if (poll_flags & MP_STREAM_POLL_WR) {
+ if (MP_STATE_PORT(pyb_stdio_uart) != NULL || usb_vcp_is_enabled()) {
+ ret |= MP_STREAM_POLL_WR;
+ }
+ }
return ret;
}