summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--esp8266/esp_mphal.c6
-rw-r--r--esp8266/esp_mphal.h6
-rw-r--r--esp8266/uart.c20
3 files changed, 25 insertions, 7 deletions
diff --git a/esp8266/esp_mphal.c b/esp8266/esp_mphal.c
index 3681a028da..c8a88c725e 100644
--- a/esp8266/esp_mphal.c
+++ b/esp8266/esp_mphal.c
@@ -39,6 +39,8 @@ extern void ets_wdt_disable(void);
extern void wdt_feed(void);
extern void ets_delay_us();
+STATIC byte input_buf_array[256];
+ringbuf_t input_buf = {input_buf_array, sizeof(input_buf_array)};
void mp_hal_debug_tx_strn_cooked(void *env, const char *str, uint32_t len);
const mp_print_t mp_debug_print = {NULL, mp_hal_debug_tx_strn_cooked};
@@ -151,3 +153,7 @@ void __assert_func(const char *file, int line, const char *func, const char *exp
nlr_raise(mp_obj_new_exception_msg(&mp_type_AssertionError,
"C-level assert"));
}
+
+void mp_hal_signal_input(void) {
+ system_os_post(UART_TASK_ID, 0, 0);
+}
diff --git a/esp8266/esp_mphal.h b/esp8266/esp_mphal.h
index 9a08f5a14d..bedf80b19f 100644
--- a/esp8266/esp_mphal.h
+++ b/esp8266/esp_mphal.h
@@ -27,10 +27,16 @@
#ifndef _INCLUDED_MPHAL_H_
#define _INCLUDED_MPHAL_H_
+#include "py/ringbuf.h"
+
struct _mp_print_t;
// Structure for UART-only output via mp_printf()
extern const struct _mp_print_t mp_debug_print;
+extern ringbuf_t input_buf;
+// Call this after putting data to input_buf
+void mp_hal_signal_input(void);
+
void mp_hal_init(void);
void mp_hal_rtc_init(void);
void mp_hal_feed_watchdog(void);
diff --git a/esp8266/uart.c b/esp8266/uart.c
index 4f45a952ba..c4d08eac4b 100644
--- a/esp8266/uart.c
+++ b/esp8266/uart.c
@@ -159,7 +159,18 @@ static void uart0_rx_intr_handler(void *para) {
read_chars:
#if 1 //MICROPY_REPL_EVENT_DRIVEN is not available here
ETS_UART_INTR_DISABLE();
- system_os_post(UART_TASK_ID, 0, 0);
+
+ while (READ_PERI_REG(UART_STATUS(uart_no)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) {
+ uint8 RcvChar = READ_PERI_REG(UART_FIFO(uart_no)) & 0xff;
+ ringbuf_put(&input_buf, RcvChar);
+ }
+
+ mp_hal_signal_input();
+
+ // Clear pending FIFO interrupts
+ WRITE_PERI_REG(UART_INT_CLR(UART_REPL), UART_RXFIFO_TOUT_INT_CLR | UART_RXFIFO_FULL_INT_ST);
+ ETS_UART_INTR_ENABLE();
+
#else
while (READ_PERI_REG(UART_STATUS(uart_no)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) {
uint8 RcvChar = READ_PERI_REG(UART_FIFO(uart_no)) & 0xff;
@@ -224,7 +235,7 @@ void mp_keyboard_interrupt(void);
int interrupt_char;
void uart_task_handler(os_event_t *evt) {
int c, ret = 0;
- while ((c = uart_rx_one_char(UART_REPL)) >= 0) {
+ while ((c = ringbuf_get(&input_buf)) >= 0) {
if (c == interrupt_char) {
mp_keyboard_interrupt();
}
@@ -234,11 +245,6 @@ void uart_task_handler(os_event_t *evt) {
}
}
- // Clear pending FIFO interrupts
- WRITE_PERI_REG(UART_INT_CLR(UART_REPL), UART_RXFIFO_TOUT_INT_CLR | UART_RXFIFO_FULL_INT_ST);
- // Enable UART interrupts, so our task will receive events again from IRQ handler
- ETS_UART_INTR_ENABLE();
-
if (ret & PYEXEC_FORCED_EXIT) {
soft_reset();
}