diff options
| author | Damien George | 2015-10-30 23:03:58 +0000 |
|---|---|---|
| committer | Paul Sokolovsky | 2015-10-31 19:14:30 +0300 |
| commit | 731f359292c0e2630873df1a19c5baac7287024f (patch) | |
| tree | 3aef09fd15b82baa9fff7c72fe3bc7e05a869614 /stmhal/mphalport.c | |
| parent | 0bd3f3291d3ea0252a91653a1edcbfa83d524834 (diff) | |
all: Add py/mphal.h and use it in all ports.
py/mphal.h contains declarations for generic mp_hal_XXX functions, such
as stdio and delay/ticks, which ports should provide definitions for. A
port will also provide mphalport.h with further HAL declarations.
Diffstat (limited to 'stmhal/mphalport.c')
| -rw-r--r-- | stmhal/mphalport.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/stmhal/mphalport.c b/stmhal/mphalport.c new file mode 100644 index 000000000..147a8682d --- /dev/null +++ b/stmhal/mphalport.c @@ -0,0 +1,120 @@ +#include <errno.h> +#include <string.h> + +#include "py/mpstate.h" +#include "py/mphal.h" +#include "usb.h" +#include "uart.h" + +// this table converts from HAL_StatusTypeDef to POSIX errno +const byte mp_hal_status_to_errno_table[4] = { + [HAL_OK] = 0, + [HAL_ERROR] = EIO, + [HAL_BUSY] = EBUSY, + [HAL_TIMEOUT] = ETIMEDOUT, +}; + +NORETURN void mp_hal_raise(HAL_StatusTypeDef status) { + nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(mp_hal_status_to_errno_table[status]))); +} + +void mp_hal_set_interrupt_char(int c) { + usb_vcp_set_interrupt_char(c); +} + +int mp_hal_stdin_rx_chr(void) { + for (;;) { +#if 0 +#ifdef USE_HOST_MODE + pyb_usb_host_process(); + int c = pyb_usb_host_get_keyboard(); + if (c != 0) { + return c; + } +#endif +#endif + + byte c; + if (usb_vcp_recv_byte(&c) != 0) { + return c; + } else if (MP_STATE_PORT(pyb_stdio_uart) != NULL && uart_rx_any(MP_STATE_PORT(pyb_stdio_uart))) { + return uart_rx_char(MP_STATE_PORT(pyb_stdio_uart)); + } + __WFI(); + } +} + +void mp_hal_stdout_tx_str(const char *str) { + mp_hal_stdout_tx_strn(str, strlen(str)); +} + +void mp_hal_stdout_tx_strn(const char *str, size_t len) { + if (MP_STATE_PORT(pyb_stdio_uart) != NULL) { + uart_tx_strn(MP_STATE_PORT(pyb_stdio_uart), str, len); + } +#if 0 && defined(USE_HOST_MODE) && MICROPY_HW_HAS_LCD + lcd_print_strn(str, len); +#endif + if (usb_vcp_is_enabled()) { + usb_vcp_send_strn(str, len); + } +} + +void mp_hal_stdout_tx_strn_cooked(const char *str, size_t len) { + // send stdout to UART and USB CDC VCP + if (MP_STATE_PORT(pyb_stdio_uart) != NULL) { + uart_tx_strn_cooked(MP_STATE_PORT(pyb_stdio_uart), str, len); + } + if (usb_vcp_is_enabled()) { + usb_vcp_send_strn_cooked(str, len); + } +} + +void mp_hal_gpio_clock_enable(GPIO_TypeDef *gpio) { + if (0) { + #ifdef __GPIOA_CLK_ENABLE + } else if (gpio == GPIOA) { + __GPIOA_CLK_ENABLE(); + #endif + #ifdef __GPIOB_CLK_ENABLE + } else if (gpio == GPIOB) { + __GPIOB_CLK_ENABLE(); + #endif + #ifdef __GPIOC_CLK_ENABLE + } else if (gpio == GPIOC) { + __GPIOC_CLK_ENABLE(); + #endif + #ifdef __GPIOD_CLK_ENABLE + } else if (gpio == GPIOD) { + __GPIOD_CLK_ENABLE(); + #endif + #ifdef __GPIOE_CLK_ENABLE + } else if (gpio == GPIOE) { + __GPIOE_CLK_ENABLE(); + #endif + #ifdef __GPIOF_CLK_ENABLE + } else if (gpio == GPIOF) { + __GPIOF_CLK_ENABLE(); + #endif + #ifdef __GPIOG_CLK_ENABLE + } else if (gpio == GPIOG) { + __GPIOG_CLK_ENABLE(); + #endif + #ifdef __GPIOH_CLK_ENABLE + } else if (gpio == GPIOH) { + __GPIOH_CLK_ENABLE(); + #endif + #ifdef __GPIOI_CLK_ENABLE + } else if (gpio == GPIOI) { + __GPIOI_CLK_ENABLE(); + #endif + #ifdef __GPIOJ_CLK_ENABLE + } else if (gpio == GPIOJ) { + __GPIOJ_CLK_ENABLE(); + #endif + #ifdef __GPIOK_CLK_ENABLE + } else if (gpio == GPIOK) { + __GPIOK_CLK_ENABLE(); + #endif + } +} |
