Skip to content

Commit 4ebd5f5

Browse files
authored
Merge pull request #9409 from dhalbert/serial-jtag-atomic
Add more atomicity in usb_serial_jtag.c; handle C6 in more places
2 parents 8fbbb59 + b2a4a20 commit 4ebd5f5

File tree

4 files changed

+32
-9
lines changed

4 files changed

+32
-9
lines changed

ports/espressif/common-hal/microcontroller/__init__.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ void common_hal_mcu_enable_interrupts(void) {
8181
void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) {
8282
switch (runmode) {
8383
case RUNMODE_UF2:
84-
#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32C3)
84+
#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)
8585
mp_arg_error_invalid(MP_QSTR_run_mode);
8686
#else
8787
// 0x11F2 is APP_REQUEST_UF2_RESET_HINT & is defined by TinyUF2

ports/espressif/supervisor/port.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,12 @@ safe_mode_t port_init(void) {
240240

241241
#if DEBUG
242242
// debug UART
243-
#ifdef CONFIG_IDF_TARGET_ESP32C3
243+
#if defined(CONFIG_IDF_TARGET_ESP32C3)
244244
common_hal_never_reset_pin(&pin_GPIO20);
245245
common_hal_never_reset_pin(&pin_GPIO21);
246+
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
247+
common_hal_never_reset_pin(&pin_GPIO16);
248+
common_hal_never_reset_pin(&pin_GPIO17);
246249
#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
247250
common_hal_never_reset_pin(&pin_GPIO43);
248251
common_hal_never_reset_pin(&pin_GPIO44);
@@ -256,7 +259,7 @@ safe_mode_t port_init(void) {
256259
#if ENABLE_JTAG
257260
ESP_LOGI(TAG, "Marking JTAG pins never_reset");
258261
// JTAG
259-
#ifdef CONFIG_IDF_TARGET_ESP32C3
262+
#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)
260263
common_hal_never_reset_pin(&pin_GPIO4);
261264
common_hal_never_reset_pin(&pin_GPIO5);
262265
common_hal_never_reset_pin(&pin_GPIO6);

ports/espressif/supervisor/usb.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
#include "driver/gpio.h"
2121
#include "esp_private/periph_ctrl.h"
2222

23-
#ifdef CONFIG_IDF_TARGET_ESP32C3
23+
#if defined(CONFIG_IDF_TARGET_ESP32C3)
2424
#include "components/esp_rom/include/esp32c3/rom/gpio.h"
25+
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
26+
#include "components/esp_rom/include/esp32c6/rom/gpio.h"
2527
#elif defined(CONFIG_IDF_TARGET_ESP32S2)
2628
#include "components/esp_rom/include/esp32s2/rom/gpio.h"
2729
#elif defined(CONFIG_IDF_TARGET_ESP32S3)

ports/espressif/supervisor/usb_serial_jtag.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ static void _copy_out_of_fifo(void) {
3939
req_len = USB_SERIAL_JTAG_BUF_SIZE;
4040
}
4141
uint8_t rx_buf[USB_SERIAL_JTAG_BUF_SIZE];
42+
43+
// Read up to req_len bytes. Does not block.
4244
size_t len = usb_serial_jtag_ll_read_rxfifo(rx_buf, req_len);
45+
4346
for (size_t i = 0; i < len; ++i) {
4447
if (rx_buf[i] == mp_interrupt_char) {
4548
mp_sched_keyboard_interrupt();
@@ -62,7 +65,9 @@ static void usb_serial_jtag_isr_handler(void *arg) {
6265
}
6366

6467
if (flags & USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT) {
68+
// New bytes are in the FIFO. Read them and check for keyboard interrupt.
6569
usb_serial_jtag_ll_clr_intsts_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT);
70+
// This is executed at interrupt level, so we don't explicitly need to make it atomic.
6671
_copy_out_of_fifo();
6772
port_wake_main_task_from_isr();
6873
}
@@ -81,28 +86,41 @@ bool usb_serial_jtag_connected(void) {
8186
}
8287

8388
char usb_serial_jtag_read_char(void) {
84-
if (ringbuf_num_filled(&ringbuf) == 0 && !usb_serial_jtag_ll_rxfifo_data_available()) {
89+
uint32_t num_filled = ringbuf_num_filled(&ringbuf);
90+
91+
if (num_filled == 0 && !usb_serial_jtag_ll_rxfifo_data_available()) {
8592
return -1;
8693
}
8794
char c = -1;
88-
if (ringbuf_num_filled(&ringbuf) > 0) {
95+
96+
if (num_filled > 0) {
97+
common_hal_mcu_disable_interrupts();
8998
c = ringbuf_get(&ringbuf);
99+
common_hal_mcu_enable_interrupts();
100+
101+
num_filled--;
90102
}
103+
91104
// Maybe re-enable the recv interrupt if we've emptied the ringbuf.
92-
if (ringbuf_num_filled(&ringbuf) == 0) {
105+
if (num_filled == 0) {
93106
usb_serial_jtag_ll_disable_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT);
94107
_copy_out_of_fifo();
95-
usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT);
108+
96109
// May have only been ctrl-c.
97110
if (c == -1 && ringbuf_num_filled(&ringbuf) > 0) {
98111
c = ringbuf_get(&ringbuf);
99112
}
113+
usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_OUT_RECV_PKT);
100114
}
101115
return c;
102116
}
103117

104118
uint32_t usb_serial_jtag_bytes_available(void) {
105-
return ringbuf_num_filled(&ringbuf) + usb_serial_jtag_ll_rxfifo_data_available();
119+
// Atomically get the number of bytes in the ringbuf plus what is not yet in the ringbuf.
120+
common_hal_mcu_disable_interrupts();
121+
const uint32_t count = ringbuf_num_filled(&ringbuf) + usb_serial_jtag_ll_rxfifo_data_available();
122+
common_hal_mcu_enable_interrupts();
123+
return count;
106124
}
107125

108126
void usb_serial_jtag_write(const char *text, uint32_t length) {

0 commit comments

Comments
 (0)