From cb84623d1927f18fc1576185cc8a71fe4081c606 Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Tue, 4 Nov 2025 09:28:51 +0100 Subject: [PATCH 1/5] feat: check pin G13 for host boot complete --- src/bridge.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/bridge.h b/src/bridge.h index 81f4ca4..23a2f54 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -14,6 +14,8 @@ #ifndef ROUTER_BRIDGE_H #define ROUTER_BRIDGE_H +#define CTRL_GPIOG_13_ID 0 + #define RESET_METHOD "$/reset" #define BIND_METHOD "$/register" //#define BRIDGE_ERROR "$/bridgeLog" @@ -24,6 +26,8 @@ #define DEFAULT_SERIAL_BAUD 115200 #include +#include +#include #include @@ -139,6 +143,14 @@ class BridgeClass { if (is_started()) return true; + const struct gpio_dt_spec mpu_boot_pin = GPIO_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user), control_gpios, CTRL_GPIOG_13_ID); + + gpio_pin_configure_dt(&mpu_boot_pin, GPIO_INPUT | GPIO_PULL_DOWN); + k_sleep(K_MSEC(200)); + while (gpio_pin_get_dt(&mpu_boot_pin) == 0) { + k_sleep(K_MSEC(10)); + } + serial_ptr->begin(baud); transport = new SerialTransport(*serial_ptr); From 1ccd336a6d592a18f134f667312297a4e183bc5b Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Mon, 10 Nov 2025 11:08:35 +0100 Subject: [PATCH 2/5] mod: extract init and ready methods --- src/bridge.h | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/bridge.h b/src/bridge.h index 23a2f54..f5425d7 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -115,6 +115,7 @@ class BridgeClass { k_tid_t upd_tid{}; k_thread_stack_t *upd_stack_area{}; struct k_thread upd_thread_data{}; + const struct gpio_dt_spec mpu_boot_pin = GPIO_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user), control_gpios, CTRL_GPIOG_13_ID); bool started = false; @@ -135,19 +136,18 @@ class BridgeClass { return out; } + bool ready() { + return gpio_pin_get_dt(&mpu_boot_pin) == 1; + } + // Initialize the bridge bool begin(unsigned long baud=DEFAULT_SERIAL_BAUD) { - k_mutex_init(&read_mutex); - k_mutex_init(&write_mutex); - k_mutex_init(&bridge_mutex); - if (is_started()) return true; + init(); - const struct gpio_dt_spec mpu_boot_pin = GPIO_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user), control_gpios, CTRL_GPIOG_13_ID); + if (is_started()) return true; - gpio_pin_configure_dt(&mpu_boot_pin, GPIO_INPUT | GPIO_PULL_DOWN); - k_sleep(K_MSEC(200)); - while (gpio_pin_get_dt(&mpu_boot_pin) == 0) { + while (!ready()) { k_sleep(K_MSEC(10)); } @@ -240,6 +240,16 @@ class BridgeClass { private: + void init() { + + k_mutex_init(&read_mutex); + k_mutex_init(&write_mutex); + k_mutex_init(&bridge_mutex); + + gpio_pin_configure_dt(&mpu_boot_pin, GPIO_INPUT | GPIO_PULL_DOWN); + k_sleep(K_MSEC(200)); + } + void update_safe() { // Lock read mutex From 84410c0d8b1f1adbaffab685bed9eba1d89361c0 Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Mon, 10 Nov 2025 11:49:58 +0100 Subject: [PATCH 3/5] fix: ready checks non-initialized pin --- src/bridge.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/bridge.h b/src/bridge.h index f5425d7..abd25d2 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -137,6 +137,7 @@ class BridgeClass { } bool ready() { + init(); return gpio_pin_get_dt(&mpu_boot_pin) == 1; } @@ -242,6 +243,11 @@ class BridgeClass { void init() { + static bool initialized = false; + + if (initialized) return; + initialized = true; + k_mutex_init(&read_mutex); k_mutex_init(&write_mutex); k_mutex_init(&bridge_mutex); From 797f39cf24acae0e0af7c90ba5882b88b5a8cf18 Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Mon, 10 Nov 2025 15:08:34 +0100 Subject: [PATCH 4/5] feat: begin waits for MPU until timeout --- src/bridge.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/bridge.h b/src/bridge.h index abd25d2..9fac7ee 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -142,13 +142,16 @@ class BridgeClass { } // Initialize the bridge - bool begin(unsigned long baud=DEFAULT_SERIAL_BAUD) { + bool begin(unsigned long baud=DEFAULT_SERIAL_BAUD, const uint32_t timeout=0) { init(); if (is_started()) return true; + uint8_t start = k_uptime_get_32(); + while (!ready()) { + if (timeout>0 && (k_uptime_get_32()-start)>timeout) break; k_sleep(K_MSEC(10)); } From 1b14cf92036e3dc4423b50e26e13d4fb385bdce2 Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Tue, 11 Nov 2025 17:23:56 +0100 Subject: [PATCH 5/5] mod: one second delay after mpu_boot_pin is high --- src/bridge.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bridge.h b/src/bridge.h index 9fac7ee..9515b2c 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -155,6 +155,8 @@ class BridgeClass { k_sleep(K_MSEC(10)); } + k_sleep(K_MSEC(1000)); + serial_ptr->begin(baud); transport = new SerialTransport(*serial_ptr);