diff --git a/zephcore/adapters/sensors/ZephyrEnvSensors.cpp b/zephcore/adapters/sensors/ZephyrEnvSensors.cpp index 3c97380..946b50e 100644 --- a/zephcore/adapters/sensors/ZephyrEnvSensors.cpp +++ b/zephcore/adapters/sensors/ZephyrEnvSensors.cpp @@ -54,8 +54,9 @@ static struct sensor_entry s_sensors[MAX_SENSORS]; static uint8_t s_count; /* Is this sensor usable? A node marked zephyr,deferred-init (a part behind a - * switched rail) is initialised here first. For any other device - * device_init() answers -EALREADY and this is a device_is_ready() check. */ + * switched rail) is initialised here first. A device whose boot-time init + * failed (an absent part) has its init run once more here; one that came up + * answers -EALREADY, so this is a device_is_ready() check. */ static bool sensor_ready(const struct device *dev) { if (dev == NULL) { diff --git a/zephcore/boards/nrf52840/meshtracker_x1/meshtracker_x1_nrf52840.dts b/zephcore/boards/nrf52840/meshtracker_x1/meshtracker_x1_nrf52840.dts index f9e07a0..c5b632e 100644 --- a/zephcore/boards/nrf52840/meshtracker_x1/meshtracker_x1_nrf52840.dts +++ b/zephcore/boards/nrf52840/meshtracker_x1/meshtracker_x1_nrf52840.dts @@ -319,8 +319,8 @@ * DRV2605_POWER_UP_DELAY_US *before* drv2605_gpio_config() raises en-gpios, * then reads the status register over I2C immediately after — so the part * gets no settling time at all between EN rising and being addressed, and - * NACKs. Without the deferral the driver has already run (and failed) by - * the time the app gets a say, and device_init() would answer -EALREADY. */ + * NACKs. Without the deferral the driver has already run (and failed) at + * boot, before the app could raise EN and wait. */ haptic: drv2605@5a { compatible = "ti,drv2605"; reg = <0x5a>; diff --git a/zephcore/helpers/pm_esp32_wake.c b/zephcore/helpers/pm_esp32_wake.c index 88d8736..94abf28 100644 --- a/zephcore/helpers/pm_esp32_wake.c +++ b/zephcore/helpers/pm_esp32_wake.c @@ -18,17 +18,20 @@ * entry (IRQs locked): save the pin's interrupt type and enable, mask its CPU * interrupt, arm a level wake at the pin's active level, keep the pad's * input live through the sleep (sleep-select off). - * exit (IRQs already back on, power.c post_ops): disarm, restore the saved - * type, clear the status the level mode latched, unmask, and if the pin - * is at its active level, re-raise its interrupt through status_w1ts. + * exit (IRQs still locked; the idle thread unlocks them after the kernel + * clock is corrected): disarm, restore the saved type, clear the status + * the level mode latched, unmask, and if the pin is at its active level, + * re-raise its interrupt through status_w1ts. * - * The CPU interrupt stays masked while the pin is in level mode because on - * this SoC the exit notifiers run after interrupts are re-enabled: a level - * interrupt on a line the radio holds high until ClearIrqStatus would storm. - * The re-raise is the missed edge: the level that woke us was reached while - * the pin was in level mode, so no edge will come. The driver's own ISR then - * runs the normal callbacks (the radio's dio1_isr, gpio-keys). A duplicate is - * harmless: both only queue work that re-reads the hardware. + * The pin's interrupt stays masked while it is in level mode: a level + * interrupt on a line the radio holds high until ClearIrqStatus would storm + * if interrupts ran before the type is restored. Since the 2026-10-22 Zephyr + * pin they do not (LLD 13 section 14); the mask keeps that true on a Zephyr + * version whose post_ops re-enables them. The re-raise is the missed edge: the level that + * woke us was reached while the pin was in level mode, so no edge will come. + * The driver's own ISR then runs the normal callbacks (the radio's dio1_isr, + * gpio-keys) once interrupts are unlocked. A duplicate is harmless: both only + * queue work that re-reads the hardware. * * The ESP32 GPIO wake source itself (ESP_SLEEP_WAKEUP_GPIO) is switched on by * `&gpio0 { wakeup-source; }` in boards/common/pm_esp32.overlay. diff --git a/zephcore/helpers/qspi_probe.c b/zephcore/helpers/qspi_probe.c index 1155ff9..438ca6e 100644 --- a/zephcore/helpers/qspi_probe.c +++ b/zephcore/helpers/qspi_probe.c @@ -67,10 +67,12 @@ static int qspi_rdid_probe(void) return 0; } - if (!flash->state->initialized) { - /* qspi-ext.dtsi defers the flash to first use, and a repeater - * never mounts /ext. Stealing the pins now would break the init - * a later factory reset runs, so there is nothing to probe. */ + if (!flash->state->initialized && flash->state->init_res == 0) { + /* Init never ran: qspi-ext.dtsi defers the flash to first use, + * and a repeater never mounts /ext. Stealing the pins now would + * break the init a later factory reset runs, so there is nothing + * to probe. A failed init leaves initialized clear too, with the + * errno in init_res (kernel/device.c). */ LOG_INF("qspi flash '%s' not initialised yet - RDID probe skipped", flash->name); return 0; diff --git a/zephcore/west.yml b/zephcore/west.yml index 985f962..f9d9237 100644 --- a/zephcore/west.yml +++ b/zephcore/west.yml @@ -6,7 +6,7 @@ manifest: projects: - name: zephyr remote: zephyrproject-rtos - revision: c136c73d7be3305d2c07ee5726d4c6d0d985068b + revision: b70dbaf045e06ee721316987df71c35d5a718693 import: true self: