diff --git a/firmware/lib/dispatch.cpp b/firmware/lib/dispatch.cpp index b303f88..2e79966 100644 --- a/firmware/lib/dispatch.cpp +++ b/firmware/lib/dispatch.cpp @@ -8,6 +8,7 @@ #include "timer_queue.h" #include "net.h" #include "debug_log.h" +#include "hardware/sync.h" static timer_queue timers; @@ -39,6 +40,8 @@ void dispatch_schedule_ms(uint32_t ms, std::function fn) { }); while (true) { + uint32_t save = save_and_disable_interrupts(); + dlog_if_slow("tud_task", 1000, [&]{ tud_task(); }); dlog_if_slow("drain", 1000, [&]{ usb.drain(); }); dlog_if_slow("timers", 1000, [&]{ timers.run(); }); @@ -76,6 +79,7 @@ void dispatch_schedule_ms(uint32_t ms, std::function fn) { } } - // __wfi(); + __wfi(); + restore_interrupts(save); } } diff --git a/firmware/lib/net.cpp b/firmware/lib/net.cpp index b5ab3fa..af82c8f 100644 --- a/firmware/lib/net.cpp +++ b/firmware/lib/net.cpp @@ -283,6 +283,10 @@ bool net_init() { w6300::open_socket(raw_socket, w6300::protocol::macraw, w6300::port_num{0}, w6300::sock_flag::none); w6300::set_socket_io_mode(raw_socket, w6300::sock_io_mode::nonblock); + // CHECK START + w6300::set_socket_interrupt_mask(raw_socket, 0x04); + w6300::set_interrupt_mask(w6300::ik_sock_0); + // CHECK END return true; } @@ -296,6 +300,7 @@ void net_set_handler(net_handler handler) { } void net_poll() { + w6300::clear_interrupt(w6300::ik_int_all); if (w6300::get_socket_recv_buf(raw_socket) == 0) return; static uint8_t rx_buf[1518]; w6300::ip_address dummy_addr = {}; diff --git a/firmware/w6300/w6300.cpp b/firmware/w6300/w6300.cpp index 4e8b001..ed368f3 100644 --- a/firmware/w6300/w6300.cpp +++ b/firmware/w6300/w6300.cpp @@ -71,11 +71,15 @@ void pio_init() { gpio_put(pin, false); } gpio_init(PIN_CS); + // CHECK START gpio_set_dir(PIN_CS, GPIO_OUT); gpio_put(PIN_CS, true); gpio_init(PIN_INT); gpio_set_dir(PIN_INT, GPIO_IN); - gpio_set_pulls(PIN_INT, false, false); + gpio_pull_up(PIN_INT); + gpio_set_irq_enabled_with_callback(PIN_INT, GPIO_IRQ_EDGE_FALL, true, + [](uint, uint32_t){}); + // CHECK END pio_hw_t *pios[2] = {pio0, pio1}; uint pio_index = 1; @@ -822,11 +826,15 @@ inline uint16_t get_sn_rx_wr(uint8_t sn) { return ((uint16_t)reg_read(REG_SN_RX_ static critical_section_t g_cris_sec; void cris_enter() { - critical_section_enter_blocking(&g_cris_sec); + // CHECK START + // critical_section_enter_blocking(&g_cris_sec); + // CHECK END } void cris_exit() { - critical_section_exit(&g_cris_sec); + // CHECK START + // critical_section_exit(&g_cris_sec); + // CHECK END } static uint8_t make_opcode(uint32_t addr, uint8_t rw) { @@ -1647,6 +1655,11 @@ void init_net(const net_info& info) { set_net_info(info); } +void enable_interrupt_pin() { + chip_unlock(); + set_sycr1(get_sycr1() | SYCR1_IEN); +} + std::expected set_socket_io_mode(socket_id sid, sock_io_mode mode) { uint8_t sn = static_cast(sid); if (sn >= sock_count) FAIL(sock_num); diff --git a/firmware/w6300/w6300.h b/firmware/w6300/w6300.h index 212431b..b956041 100644 --- a/firmware/w6300/w6300.h +++ b/firmware/w6300/w6300.h @@ -195,6 +195,7 @@ int8_t init_buffers(std::span txsize, std::span rx void clear_interrupt(intr_kind intr); intr_kind get_interrupt(); void set_interrupt_mask(intr_kind intr); +void enable_interrupt_pin(); intr_kind get_interrupt_mask(); int8_t get_phy_link();