From 2400e7494ea8f5c9952424c6278260659dd62cd9 Mon Sep 17 00:00:00 2001 From: Maurice Ribble Date: Thu, 25 Jan 2018 11:48:40 -0500 Subject: [PATCH 1/7] Add a new resetmethod_menu_all macro to give the choice of all the reset options. Then only offer all these options for the generic modules. --- boards.txt | 20 -------------------- tools/boards.txt.py | 12 ++++++++++-- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/boards.txt b/boards.txt index 2058d96e7d..0839b9a3ef 100644 --- a/boards.txt +++ b/boards.txt @@ -817,10 +817,6 @@ espresso_lite_v1.menu.ResetMethod.ck=ck espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -espresso_lite_v1.menu.ResetMethod.none=none -espresso_lite_v1.menu.ResetMethod.none.upload.resetmethod=none -espresso_lite_v1.menu.ResetMethod.dtrset=dtrset -espresso_lite_v1.menu.ResetMethod.dtrset.upload.resetmethod=dtrset espresso_lite_v1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2 @@ -951,10 +947,6 @@ espresso_lite_v2.menu.ResetMethod.ck=ck espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=ck espresso_lite_v2.menu.ResetMethod.nodemcu=nodemcu espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -espresso_lite_v2.menu.ResetMethod.none=none -espresso_lite_v2.menu.ResetMethod.none.upload.resetmethod=none -espresso_lite_v2.menu.ResetMethod.dtrset=dtrset -espresso_lite_v2.menu.ResetMethod.dtrset.upload.resetmethod=dtrset espresso_lite_v2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2 @@ -1085,10 +1077,6 @@ phoenix_v1.menu.ResetMethod.ck=ck phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=ck phoenix_v1.menu.ResetMethod.nodemcu=nodemcu phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -phoenix_v1.menu.ResetMethod.none=none -phoenix_v1.menu.ResetMethod.none.upload.resetmethod=none -phoenix_v1.menu.ResetMethod.dtrset=dtrset -phoenix_v1.menu.ResetMethod.dtrset.upload.resetmethod=dtrset phoenix_v1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2 @@ -1219,10 +1207,6 @@ phoenix_v2.menu.ResetMethod.ck=ck phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=ck phoenix_v2.menu.ResetMethod.nodemcu=nodemcu phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -phoenix_v2.menu.ResetMethod.none=none -phoenix_v2.menu.ResetMethod.none.upload.resetmethod=none -phoenix_v2.menu.ResetMethod.dtrset=dtrset -phoenix_v2.menu.ResetMethod.dtrset.upload.resetmethod=dtrset phoenix_v2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2 @@ -2644,10 +2628,6 @@ espino.menu.ResetMethod.ck=ck espino.menu.ResetMethod.ck.upload.resetmethod=ck espino.menu.ResetMethod.nodemcu=nodemcu espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -espino.menu.ResetMethod.none=none -espino.menu.ResetMethod.none.upload.resetmethod=none -espino.menu.ResetMethod.dtrset=dtrset -espino.menu.ResetMethod.dtrset.upload.resetmethod=dtrset espino.build.flash_mode=qio espino.build.flash_freq=40 espino.menu.FlashSize.4M1M=4M (1M SPIFFS) diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 79bace0e47..8462e76d4e 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -26,6 +26,7 @@ # flashfreq_40/_80: fixed flash frequency # selection menu: # resetmethod_menu menus for reset method +# resetmethod_menu_all menus for all reset methods # crystalfreq/flashfreq_menu: menus for crystal/flash frequency selection # flashmode_menu: menus for flashmode selection (dio/dout/qio/qout) # 512K/1M/2M/4M/8M/16M: menus for flash & SPIFFS size @@ -61,7 +62,7 @@ '.build.board': 'ESP8266_GENERIC', }, 'macro': [ - 'resetmethod_menu', + 'resetmethod_menu_all', 'crystalfreq_menu', 'flashfreq_menu', 'flashmode_menu', @@ -271,7 +272,7 @@ '.build.board': 'ESP8266_ESP01', }, 'macro': [ - 'resetmethod_menu', + 'resetmethod_menu_all', 'crystalfreq_menu', 'flashmode_dout', 'flashfreq_40', @@ -761,6 +762,13 @@ ####################### menu.resetmethod 'resetmethod_menu': collections.OrderedDict([ + ( '.menu.ResetMethod.ck', 'ck' ), + ( '.menu.ResetMethod.ck.upload.resetmethod', 'ck' ), + ( '.menu.ResetMethod.nodemcu', 'nodemcu' ), + ( '.menu.ResetMethod.nodemcu.upload.resetmethod', 'nodemcu' ), + ]), + + 'resetmethod_menu_all': collections.OrderedDict([ ( '.menu.ResetMethod.ck', 'ck' ), ( '.menu.ResetMethod.ck.upload.resetmethod', 'ck' ), ( '.menu.ResetMethod.nodemcu', 'nodemcu' ), From 8fe27272e3d4d0633005f734799089a00390a66c Mon Sep 17 00:00:00 2001 From: Maurice Ribble Date: Fri, 26 Jan 2018 08:32:48 -0500 Subject: [PATCH 2/7] Change reset menu from all to extra. This gets rid of duplicated code --- tools/boards.txt.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 8462e76d4e..c286ee13fa 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -26,7 +26,7 @@ # flashfreq_40/_80: fixed flash frequency # selection menu: # resetmethod_menu menus for reset method -# resetmethod_menu_all menus for all reset methods +# resetmethod_menu_extra menus for additional reset methods # crystalfreq/flashfreq_menu: menus for crystal/flash frequency selection # flashmode_menu: menus for flashmode selection (dio/dout/qio/qout) # 512K/1M/2M/4M/8M/16M: menus for flash & SPIFFS size @@ -62,7 +62,8 @@ '.build.board': 'ESP8266_GENERIC', }, 'macro': [ - 'resetmethod_menu_all', + 'resetmethod_menu', + 'resetmethod_menu_extra', 'crystalfreq_menu', 'flashfreq_menu', 'flashmode_menu', @@ -272,7 +273,8 @@ '.build.board': 'ESP8266_ESP01', }, 'macro': [ - 'resetmethod_menu_all', + 'resetmethod_menu', + 'resetmethod_menu_extra', 'crystalfreq_menu', 'flashmode_dout', 'flashfreq_40', @@ -768,11 +770,7 @@ ( '.menu.ResetMethod.nodemcu.upload.resetmethod', 'nodemcu' ), ]), - 'resetmethod_menu_all': collections.OrderedDict([ - ( '.menu.ResetMethod.ck', 'ck' ), - ( '.menu.ResetMethod.ck.upload.resetmethod', 'ck' ), - ( '.menu.ResetMethod.nodemcu', 'nodemcu' ), - ( '.menu.ResetMethod.nodemcu.upload.resetmethod', 'nodemcu' ), + 'resetmethod_menu_extra': collections.OrderedDict([ ( '.menu.ResetMethod.none', 'none' ), ( '.menu.ResetMethod.none.upload.resetmethod', 'none' ), ( '.menu.ResetMethod.dtrset', 'dtrset' ), From 0cb961748ffedeb9777fa9f24239d3b8ba1701ae Mon Sep 17 00:00:00 2001 From: Maurice Ribble Date: Thu, 8 Feb 2018 11:40:47 -0500 Subject: [PATCH 3/7] Fix boards.txt --- boards.txt | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/boards.txt b/boards.txt index c4fefc2b90..187c0ee5b2 100644 --- a/boards.txt +++ b/boards.txt @@ -817,17 +817,7 @@ espresso_lite_v1.menu.ResetMethod.ck=ck espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -<<<<<<< HEAD -espresso_lite_v1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) -||||||| merged common ancestors -espresso_lite_v1.menu.ResetMethod.none=none -espresso_lite_v1.menu.ResetMethod.none.upload.resetmethod=none -espresso_lite_v1.menu.ResetMethod.dtrset=dtrset -espresso_lite_v1.menu.ResetMethod.dtrset.upload.resetmethod=dtrset -espresso_lite_v1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) -======= espresso_lite_v1.menu.LwIPVariant.v2mss536=v2 Lower Memory ->>>>>>> f6f977fb039f7c8ae08f4518902a1b0cf114ea7b espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2 espresso_lite_v1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 @@ -957,17 +947,7 @@ espresso_lite_v2.menu.ResetMethod.ck=ck espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=ck espresso_lite_v2.menu.ResetMethod.nodemcu=nodemcu espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -<<<<<<< HEAD -espresso_lite_v2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) -||||||| merged common ancestors -espresso_lite_v2.menu.ResetMethod.none=none -espresso_lite_v2.menu.ResetMethod.none.upload.resetmethod=none -espresso_lite_v2.menu.ResetMethod.dtrset=dtrset -espresso_lite_v2.menu.ResetMethod.dtrset.upload.resetmethod=dtrset -espresso_lite_v2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) -======= espresso_lite_v2.menu.LwIPVariant.v2mss536=v2 Lower Memory ->>>>>>> f6f977fb039f7c8ae08f4518902a1b0cf114ea7b espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2 espresso_lite_v2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 @@ -1097,17 +1077,7 @@ phoenix_v1.menu.ResetMethod.ck=ck phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=ck phoenix_v1.menu.ResetMethod.nodemcu=nodemcu phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -<<<<<<< HEAD -phoenix_v1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) -||||||| merged common ancestors -phoenix_v1.menu.ResetMethod.none=none -phoenix_v1.menu.ResetMethod.none.upload.resetmethod=none -phoenix_v1.menu.ResetMethod.dtrset=dtrset -phoenix_v1.menu.ResetMethod.dtrset.upload.resetmethod=dtrset -phoenix_v1.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) -======= phoenix_v1.menu.LwIPVariant.v2mss536=v2 Lower Memory ->>>>>>> f6f977fb039f7c8ae08f4518902a1b0cf114ea7b phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2 phoenix_v1.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 @@ -1237,17 +1207,7 @@ phoenix_v2.menu.ResetMethod.ck=ck phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=ck phoenix_v2.menu.ResetMethod.nodemcu=nodemcu phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu -<<<<<<< HEAD -phoenix_v2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) -||||||| merged common ancestors -phoenix_v2.menu.ResetMethod.none=none -phoenix_v2.menu.ResetMethod.none.upload.resetmethod=none -phoenix_v2.menu.ResetMethod.dtrset=dtrset -phoenix_v2.menu.ResetMethod.dtrset.upload.resetmethod=dtrset -phoenix_v2.menu.LwIPVariant.v2mss536=v2 Prebuilt (MSS=536) -======= phoenix_v2.menu.LwIPVariant.v2mss536=v2 Lower Memory ->>>>>>> f6f977fb039f7c8ae08f4518902a1b0cf114ea7b phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_include=lwip2/include phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_lib=-llwip2 phoenix_v2.menu.LwIPVariant.v2mss536.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 From a4e1b91dad0b09b87e69750c628e6dfdbffebabb Mon Sep 17 00:00:00 2001 From: Maurice Ribble Date: Thu, 8 Feb 2018 11:48:02 -0500 Subject: [PATCH 4/7] Flush the rx fifo when checking available bytes in fifo. This gives a more correct result rather than waiting until either the fifo is full or until a serial rx timeout occurs. --- cores/esp8266/uart.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cores/esp8266/uart.c b/cores/esp8266/uart.c index 74da8b84fb..3304e251c9 100644 --- a/cores/esp8266/uart.c +++ b/cores/esp8266/uart.c @@ -119,6 +119,16 @@ size_t uart_rx_available(uart_t* uart) if(uart == NULL || !uart->rx_enabled) { return 0; } + ETS_UART_INTR_DISABLE(); + while((USS(uart->uart_nr) >> USRXC) & 0x7F){ + uint8_t data = USF(uart->uart_nr); + size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size; + if(nextPos != uart->rx_buffer->rpos) { + uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data; + uart->rx_buffer->wpos = nextPos; + } + } + ETS_UART_INTR_ENABLE(); if(uart->rx_buffer->wpos < uart->rx_buffer->rpos) { return (uart->rx_buffer->wpos + uart->rx_buffer->size) - uart->rx_buffer->rpos; } From d1d17d2fb172bb4119aa8ec24922efd736ab260d Mon Sep 17 00:00:00 2001 From: Maurice Ribble Date: Thu, 8 Feb 2018 15:54:49 -0500 Subject: [PATCH 5/7] When rx_avaiable is checked return rx_buffer plus rx_fifo. Then during rx_read and rx_peek functions copy over the data in the fifo as needed. --- cores/esp8266/uart.c | 56 +++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/cores/esp8266/uart.c b/cores/esp8266/uart.c index 3304e251c9..2b66d94b0e 100644 --- a/cores/esp8266/uart.c +++ b/cores/esp8266/uart.c @@ -91,6 +91,33 @@ size_t uart_resize_rx_buffer(uart_t* uart, size_t new_size) return uart->rx_buffer->size; } +inline size_t uart_rx_buffer_available(uart_t* uart) { + if(uart->rx_buffer->wpos < uart->rx_buffer->rpos) { + return (uart->rx_buffer->wpos + uart->rx_buffer->size) - uart->rx_buffer->rpos; + } + return uart->rx_buffer->wpos - uart->rx_buffer->rpos; +} + +inline size_t uart_rx_fifo_available(uart_t* uart) { + return (USS(uart->uart_nr) >> USRXC) & 0x7F; +} + +// Copy all the rx fifo bytes that fit into the rx buffer +inline void uart_rx_copy_fifo_to_buffer(uart_t* uart) { + while(uart_rx_fifo_available(uart)){ + size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size; + if(nextPos != uart->rx_buffer->rpos) { + uint8_t data = USF(uart->uart_nr); + uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data; + uart->rx_buffer->wpos = nextPos; + } + else { + // Stop copying if rx buffer is full + break; + } + } +} + int uart_peek_char(uart_t* uart) { if(uart == NULL || !uart->rx_enabled) { @@ -99,6 +126,11 @@ int uart_peek_char(uart_t* uart) if (!uart_rx_available(uart)) { return -1; } + if (uart_rx_buffer_available(uart) == 0) { + ETS_UART_INTR_DISABLE(); + uart_rx_copy_fifo_to_buffer(uart); + ETS_UART_INTR_ENABLE(); + } return uart->rx_buffer->buffer[uart->rx_buffer->rpos]; } @@ -119,20 +151,7 @@ size_t uart_rx_available(uart_t* uart) if(uart == NULL || !uart->rx_enabled) { return 0; } - ETS_UART_INTR_DISABLE(); - while((USS(uart->uart_nr) >> USRXC) & 0x7F){ - uint8_t data = USF(uart->uart_nr); - size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size; - if(nextPos != uart->rx_buffer->rpos) { - uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data; - uart->rx_buffer->wpos = nextPos; - } - } - ETS_UART_INTR_ENABLE(); - if(uart->rx_buffer->wpos < uart->rx_buffer->rpos) { - return (uart->rx_buffer->wpos + uart->rx_buffer->size) - uart->rx_buffer->rpos; - } - return uart->rx_buffer->wpos - uart->rx_buffer->rpos; + return uart_rx_buffer_available(uart) + uart_rx_fifo_available(uart); } @@ -145,14 +164,7 @@ void ICACHE_RAM_ATTR uart_isr(void * arg) return; } if(USIS(uart->uart_nr) & ((1 << UIFF) | (1 << UITO))){ - while((USS(uart->uart_nr) >> USRXC) & 0x7F){ - uint8_t data = USF(uart->uart_nr); - size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size; - if(nextPos != uart->rx_buffer->rpos) { - uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data; - uart->rx_buffer->wpos = nextPos; - } - } + uart_rx_copy_fifo_to_buffer(uart); } USIC(uart->uart_nr) = USIS(uart->uart_nr); } From f4a62c0f684cb968859b9cf71da93f1ce98d64fb Mon Sep 17 00:00:00 2001 From: Maurice Ribble Date: Thu, 8 Feb 2018 20:27:53 -0500 Subject: [PATCH 6/7] Clean up early out case. --- cores/esp8266/uart.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cores/esp8266/uart.c b/cores/esp8266/uart.c index 2b66d94b0e..ac88435e5f 100644 --- a/cores/esp8266/uart.c +++ b/cores/esp8266/uart.c @@ -106,15 +106,13 @@ inline size_t uart_rx_fifo_available(uart_t* uart) { inline void uart_rx_copy_fifo_to_buffer(uart_t* uart) { while(uart_rx_fifo_available(uart)){ size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size; - if(nextPos != uart->rx_buffer->rpos) { - uint8_t data = USF(uart->uart_nr); - uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data; - uart->rx_buffer->wpos = nextPos; - } - else { + if(nextPos == uart->rx_buffer->rpos) { // Stop copying if rx buffer is full break; } + uint8_t data = USF(uart->uart_nr); + uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data; + uart->rx_buffer->wpos = nextPos; } } From c527a76e0db0c9f7ed4578b2d7aae76019ffff21 Mon Sep 17 00:00:00 2001 From: Maurice Ribble Date: Wed, 14 Feb 2018 12:10:33 -0500 Subject: [PATCH 7/7] Set the rx full fifo ISR to trigger a little sooner. This makes the uart rx isr more robust in cases where the ISR can't trigger very fast --- cores/esp8266/uart.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/uart.c b/cores/esp8266/uart.c index ac88435e5f..328acca7df 100644 --- a/cores/esp8266/uart.c +++ b/cores/esp8266/uart.c @@ -172,7 +172,11 @@ void uart_start_isr(uart_t* uart) if(uart == NULL || !uart->rx_enabled) { return; } - USC1(uart->uart_nr) = (127 << UCFFT) | (0x02 << UCTOT) | (1 <uart_nr) = (100 << UCFFT) | (0x02 << UCTOT) | (1 <uart_nr) = 0xffff; USIE(uart->uart_nr) = (1 << UIFF) | (1 << UIFR) | (1 << UITO); ETS_UART_INTR_ATTACH(uart_isr, (void *)uart);