From a635aa04e0a17ec46d6cf1162261bb2895e73a5c Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sat, 11 Apr 2026 21:51:22 +0900 Subject: [PATCH] Level-triggered w6300 interrupt, drain until empty, rearm after drain --- firmware/lib/net.cpp | 6 ++---- firmware/w6300/w6300.cpp | 11 +++++++++-- firmware/w6300/w6300.h | 1 + 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/firmware/lib/net.cpp b/firmware/lib/net.cpp index 87784d9..8c645c4 100644 --- a/firmware/lib/net.cpp +++ b/firmware/lib/net.cpp @@ -137,13 +137,11 @@ void net_poll(std::span tx) { w6300::irq_pending = false; w6300::clear_interrupt(w6300::ik_int_all); static uint8_t rx_buf[1518]; - uint16_t available = w6300::get_socket_recv_buf(raw_socket); - uint16_t consumed = 0; - while (consumed < available) { + while (w6300::get_socket_recv_buf(raw_socket) > 0) { auto result = w6300::recv(raw_socket, std::span{rx_buf}); if (!result) break; - consumed += *result + 2; span_writer tx_writer(tx); process_frame({rx_buf, *result}, tx_writer); } + w6300::rearm_gpio_irq(); } diff --git a/firmware/w6300/w6300.cpp b/firmware/w6300/w6300.cpp index 365e38b..e11c9c4 100644 --- a/firmware/w6300/w6300.cpp +++ b/firmware/w6300/w6300.cpp @@ -77,8 +77,11 @@ void pio_init() { gpio_init(PIN_INT); gpio_set_dir(PIN_INT, GPIO_IN); gpio_pull_up(PIN_INT); - gpio_set_irq_enabled_with_callback(PIN_INT, GPIO_IRQ_EDGE_FALL, true, - [](uint, uint32_t){ irq_pending = true; }); + gpio_set_irq_enabled_with_callback(PIN_INT, GPIO_IRQ_LEVEL_LOW, true, + [](uint gpio, uint32_t){ + irq_pending = true; + gpio_set_irq_enabled(gpio, GPIO_IRQ_LEVEL_LOW, false); + }); pio_hw_t *pios[2] = {pio0, pio1}; uint pio_index = 1; @@ -500,6 +503,10 @@ void clear_interrupt(intr_kind intr) { set_slirclr((uint8_t)((uint32_t)intr >> 16)); } +void rearm_gpio_irq() { + gpio_set_irq_enabled(PIN_INT, GPIO_IRQ_LEVEL_LOW, true); +} + void set_interrupt_mask(intr_kind intr) { set_imr((uint8_t)intr); set_simr((uint8_t)((uint16_t)intr >> 8)); diff --git a/firmware/w6300/w6300.h b/firmware/w6300/w6300.h index 00c4037..ccd70e2 100644 --- a/firmware/w6300/w6300.h +++ b/firmware/w6300/w6300.h @@ -41,6 +41,7 @@ extern volatile bool irq_pending; void clear_interrupt(intr_kind intr); void set_interrupt_mask(intr_kind intr); +void rearm_gpio_irq(); std::expected open_socket(socket_id sn, protocol proto, sock_flag flag); std::expected send(socket_id sn, std::span buf);