aboutsummaryrefslogtreecommitdiff
path: root/stmhal/mphalport.c
diff options
context:
space:
mode:
authorDamien George2015-10-30 23:03:58 +0000
committerPaul Sokolovsky2015-10-31 19:14:30 +0300
commit731f359292c0e2630873df1a19c5baac7287024f (patch)
tree3aef09fd15b82baa9fff7c72fe3bc7e05a869614 /stmhal/mphalport.c
parent0bd3f3291d3ea0252a91653a1edcbfa83d524834 (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.c120
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
+ }
+}