summaryrefslogtreecommitdiff
path: root/ports/stm32/mphalport.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/stm32/mphalport.c')
-rw-r--r--ports/stm32/mphalport.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/ports/stm32/mphalport.c b/ports/stm32/mphalport.c
index fcd08cbd8..51fb32ae8 100644
--- a/ports/stm32/mphalport.c
+++ b/ports/stm32/mphalport.c
@@ -8,6 +8,17 @@
#include "usb.h"
#include "uart.h"
+#if MICROPY_HW_TINYUSB_STACK
+#include "shared/tinyusb/mp_usbd_cdc.h"
+
+#ifndef MICROPY_HW_STDIN_BUFFER_LEN
+#define MICROPY_HW_STDIN_BUFFER_LEN 512
+#endif
+
+static uint8_t stdin_ringbuf_array[MICROPY_HW_STDIN_BUFFER_LEN];
+ringbuf_t stdin_ringbuf = { stdin_ringbuf_array, sizeof(stdin_ringbuf_array), 0, 0 };
+#endif
+
// this table converts from HAL_StatusTypeDef to POSIX errno
const byte mp_hal_status_to_errno_table[4] = {
[HAL_OK] = 0,
@@ -26,6 +37,9 @@ MP_NORETURN void mp_hal_raise(HAL_StatusTypeDef status) {
MP_WEAK uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
uintptr_t ret = 0;
+ #if MICROPY_HW_USB_CDC && MICROPY_HW_TINYUSB_STACK
+ ret |= mp_usbd_cdc_poll_interfaces(poll_flags);
+ #endif
if (MP_STATE_PORT(pyb_stdio_uart) != NULL) {
mp_obj_t pyb_stdio_uart = MP_OBJ_FROM_PTR(MP_STATE_PORT(pyb_stdio_uart));
int errcode;
@@ -53,6 +67,13 @@ MP_WEAK int mp_hal_stdin_rx_chr(void) {
if (dupterm_c >= 0) {
return dupterm_c;
}
+ #if MICROPY_HW_USB_CDC && MICROPY_HW_TINYUSB_STACK
+ mp_usbd_cdc_poll_interfaces(0);
+ int c = ringbuf_get(&stdin_ringbuf);
+ if (c != -1) {
+ return c;
+ }
+ #endif
MICROPY_EVENT_POLL_HOOK
}
}
@@ -64,6 +85,13 @@ MP_WEAK mp_uint_t mp_hal_stdout_tx_strn(const char *str, size_t len) {
uart_tx_strn(MP_STATE_PORT(pyb_stdio_uart), str, len);
did_write = true;
}
+ #if MICROPY_HW_USB_CDC && MICROPY_HW_TINYUSB_STACK
+ mp_uint_t cdc_res = mp_usbd_cdc_tx_strn(str, len);
+ if (cdc_res > 0) {
+ did_write = true;
+ ret = MIN(cdc_res, ret);
+ }
+ #endif
#if 0 && defined(USE_HOST_MODE) && MICROPY_HW_HAS_LCD
lcd_print_strn(str, len);
#endif
@@ -90,7 +118,7 @@ void mp_hal_ticks_cpu_enable(void) {
#endif
void mp_hal_gpio_clock_enable(GPIO_TypeDef *gpio) {
- #if defined(STM32L476xx) || defined(STM32L496xx)
+ #if defined(STM32L476xx) || defined(STM32L496xx) || defined(STM32U5)
if (gpio == GPIOG) {
// Port G pins 2 thru 15 are powered using VddIO2 on these MCUs.
HAL_PWREx_EnableVddIO2();
@@ -117,6 +145,9 @@ void mp_hal_gpio_clock_enable(GPIO_TypeDef *gpio) {
#elif defined(STM32G4) || defined(STM32H5) || defined(STM32L4) || defined(STM32WB) || defined(STM32WL)
#define AHBxENR AHB2ENR
#define AHBxENR_GPIOAEN_Pos RCC_AHB2ENR_GPIOAEN_Pos
+ #elif defined(STM32U5)
+ #define AHBxENR AHB2ENR1
+ #define AHBxENR_GPIOAEN_Pos RCC_AHB2ENR1_GPIOAEN_Pos
#endif
uint32_t gpio_idx = ((uint32_t)gpio - GPIOA_BASE) / (GPIOB_BASE - GPIOA_BASE);