summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/rp2/cyw43_configport.h4
-rw-r--r--ports/rp2/mpnetworkport.c36
-rw-r--r--ports/rp2/pendsv.h3
3 files changed, 19 insertions, 24 deletions
diff --git a/ports/rp2/cyw43_configport.h b/ports/rp2/cyw43_configport.h
index 8f64762df..a3a5c48e5 100644
--- a/ports/rp2/cyw43_configport.h
+++ b/ports/rp2/cyw43_configport.h
@@ -104,11 +104,9 @@ void cyw43_post_poll_hook(void);
extern volatile int cyw43_has_pending;
static inline void cyw43_yield(void) {
- uint32_t my_interrupts = save_and_disable_interrupts();
if (!cyw43_has_pending) {
- __WFI();
+ best_effort_wfe_or_timeout(make_timeout_time_ms(1));
}
- restore_interrupts(my_interrupts);
}
static inline void cyw43_delay_us(uint32_t us) {
diff --git a/ports/rp2/mpnetworkport.c b/ports/rp2/mpnetworkport.c
index dac04760b..09a543c2d 100644
--- a/ports/rp2/mpnetworkport.c
+++ b/ports/rp2/mpnetworkport.c
@@ -30,13 +30,14 @@
#if MICROPY_PY_LWIP
+#include "shared/runtime/softtimer.h"
#include "lwip/timeouts.h"
-#include "pico/time.h"
// Poll lwIP every 64ms by default
#define LWIP_TICK_RATE_MS 64
-static alarm_id_t lwip_alarm_id = -1;
+// Soft timer for running lwIP in the background.
+static soft_timer_entry_t mp_network_soft_timer;
#if MICROPY_PY_NETWORK_CYW43
#include "lib/cyw43-driver/src/cyw43.h"
@@ -56,6 +57,7 @@ static void gpio_irq_handler(void) {
// CYW43_POST_POLL_HOOK which is called at the end of cyw43_poll_func.
gpio_set_irq_enabled(CYW43_PIN_WL_HOST_WAKE, CYW43_IRQ_LEVEL, false);
cyw43_has_pending = 1;
+ __SEV();
pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll);
CYW43_STAT_INC(IRQ_COUNT);
}
@@ -88,11 +90,6 @@ u32_t sys_now(void) {
return mp_hal_ticks_ms();
}
-STATIC void lwip_poll(void) {
- // Run the lwIP internal updates
- sys_check_timeouts();
-}
-
void lwip_lock_acquire(void) {
// Prevent PendSV from running.
pendsv_suspend();
@@ -103,22 +100,25 @@ void lwip_lock_release(void) {
pendsv_resume();
}
-STATIC int64_t alarm_callback(alarm_id_t id, void *user_data) {
- pendsv_schedule_dispatch(PENDSV_DISPATCH_LWIP, lwip_poll);
+// This is called by soft_timer and executes at PendSV level.
+static void mp_network_soft_timer_callback(soft_timer_entry_t *self) {
+ // Run the lwIP internal updates.
+ sys_check_timeouts();
+
#if MICROPY_PY_NETWORK_WIZNET5K
- pendsv_schedule_dispatch(PENDSV_DISPATCH_WIZNET, wiznet5k_poll);
+ wiznet5k_poll();
#endif
- return LWIP_TICK_RATE_MS * 1000;
}
void mod_network_lwip_init(void) {
- #if MICROPY_PY_NETWORK_WIZNET5K
- wiznet5k_deinit();
- #endif
- if (lwip_alarm_id != -1) {
- cancel_alarm(lwip_alarm_id);
- }
- lwip_alarm_id = add_alarm_in_us(LWIP_TICK_RATE_MS * 1000, alarm_callback, mp_const_true, true);
+ soft_timer_static_init(
+ &mp_network_soft_timer,
+ SOFT_TIMER_MODE_PERIODIC,
+ LWIP_TICK_RATE_MS,
+ mp_network_soft_timer_callback
+ );
+
+ soft_timer_reinsert(&mp_network_soft_timer, LWIP_TICK_RATE_MS);
}
#endif // MICROPY_PY_LWIP
diff --git a/ports/rp2/pendsv.h b/ports/rp2/pendsv.h
index fd21ad9ef..bc8e8d61c 100644
--- a/ports/rp2/pendsv.h
+++ b/ports/rp2/pendsv.h
@@ -30,9 +30,6 @@
enum {
PENDSV_DISPATCH_SOFT_TIMER,
- #if MICROPY_PY_LWIP
- PENDSV_DISPATCH_LWIP,
- #endif
#if MICROPY_PY_NETWORK_CYW43
PENDSV_DISPATCH_CYW43,
#endif