From 0603b09cdfea4ca31df013f589c0044333987a49 Mon Sep 17 00:00:00 2001 From: Flavio Ceolin Date: Mon, 8 Jun 2026 12:36:10 -0700 Subject: [PATCH 1/6] sat: nrf52: Set timeouts for transmissions Prevent a transmission to possibly lock indefinitely seting a timeout for used sempahores. Signed-off-by: Flavio Ceolin --- include/hubble/port/sat_radio.h | 11 ++++++++++ port/zephyr/boards/nordic/nrf52/nrf52_soc.c | 23 +++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/include/hubble/port/sat_radio.h b/include/hubble/port/sat_radio.h index ee4878f8..dd8cfb91 100644 --- a/include/hubble/port/sat_radio.h +++ b/include/hubble/port/sat_radio.h @@ -64,6 +64,17 @@ extern "C" { #define HUBBLE_SAT_PREAMBLE_SEQUENCE \ (const int8_t[]){63, 0, 63, 0, 63, 0, 63, 63} + +/** + * @brief Timeout, in seconds, to wait to start a transmission. + * + * Transmissions are serialized so that only one transmission runs at + * a time. This value bounds how long a caller waits to acquire that + * start a transmission before giving up, preventing a stuck or + * long-running transmission from blocking other callers indefinitely. + */ +#define HUBBLE_SAT_TRANSMISSION_TIMEOUT_S 2U + /** * @brief Initialize the satellite radio port. * diff --git a/port/zephyr/boards/nordic/nrf52/nrf52_soc.c b/port/zephyr/boards/nordic/nrf52/nrf52_soc.c index abc3dc03..1fb6e252 100644 --- a/port/zephyr/boards/nordic/nrf52/nrf52_soc.c +++ b/port/zephyr/boards/nordic/nrf52/nrf52_soc.c @@ -18,11 +18,14 @@ #include #include -#define RADIO_NODE DT_NODELABEL(radio) +#define RADIO_NODE DT_NODELABEL(radio) /* From NRF52840_PS_v1.2 6.20.15.8 Time between TXEN -> READ is 140us */ -#define WAIT_SYMBOL_OFF_US (HUBBLE_WAIT_SYMBOL_OFF_US - 140) -#define WAIT_SYMBOL_US (HUBBLE_WAIT_SYMBOL_US + 140) +#define WAIT_SYMBOL_OFF_US (HUBBLE_WAIT_SYMBOL_OFF_US - 140) +#define WAIT_SYMBOL_US (HUBBLE_WAIT_SYMBOL_US + 140) + +/* Max time for semaphore symbol to wait before failing. */ +#define WAIT_SYMBOL_TIMEOUT_US K_USEC(2 * (WAIT_SYMBOL_OFF_US + WAIT_SYMBOL_US)) static uint32_t _radio_shorts; @@ -168,9 +171,14 @@ int hubble_sat_soc_disable(void) int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) { + int ret; int8_t frame = -1; - k_sem_take(&_transmit_sem, K_FOREVER); + ret = k_sem_take(&_transmit_sem, + K_SECONDS(HUBBLE_SAT_TRANSMISSION_TIMEOUT_S)); + if (ret != 0) { + return ret; + } k_sem_reset(&_symbol_sem); @@ -186,7 +194,10 @@ int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) hubble_nrf_lib_frequency_set(packet->frame[frame].channel, packet->frame[frame].data[data_pos]); - k_sem_take(&_symbol_sem, K_FOREVER); + ret = k_sem_take(&_symbol_sem, WAIT_SYMBOL_TIMEOUT_US); + if (ret != 0) { + break; + } } _ppi_disable(); @@ -194,7 +205,7 @@ int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) k_sem_give(&_transmit_sem); - return 0; + return ret; } #ifdef CONFIG_HUBBLE_SAT_NETWORK_DTM_MODE From 055e7f6f1bc7d091a6c3d217050707ccaef35f01 Mon Sep 17 00:00:00 2001 From: Flavio Ceolin Date: Mon, 8 Jun 2026 12:39:18 -0700 Subject: [PATCH 2/6] sat: nrf53: Set timeouts for transmissions Prevent a transmission to possibly lock indefinitely seting a timeout for used sempahores. Signed-off-by: Flavio Ceolin --- port/zephyr/boards/nordic/nrf53/nrf53_soc.c | 24 +++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/port/zephyr/boards/nordic/nrf53/nrf53_soc.c b/port/zephyr/boards/nordic/nrf53/nrf53_soc.c index 836de3fd..92e01ad3 100644 --- a/port/zephyr/boards/nordic/nrf53/nrf53_soc.c +++ b/port/zephyr/boards/nordic/nrf53/nrf53_soc.c @@ -42,14 +42,17 @@ #endif /* CONFIG_HUBBLE_SAT_NETWORK_DTM_MODE */ -#define RADIO_NODE DT_NODELABEL(radio) +#define RADIO_NODE DT_NODELABEL(radio) /** * Time between TXEN task and READY event with fast ramp-up enabled is * 40us. nRF5340_PS_v1.6 - 7.26.16.8 */ -#define WAIT_SYMBOL_OFF_US (HUBBLE_WAIT_SYMBOL_OFF_US - 40) -#define WAIT_SYMBOL_US (HUBBLE_WAIT_SYMBOL_US + 40) +#define WAIT_SYMBOL_OFF_US (HUBBLE_WAIT_SYMBOL_OFF_US - 40) +#define WAIT_SYMBOL_US (HUBBLE_WAIT_SYMBOL_US + 40) + +/* Max time for semaphore symbol to wait before failing. */ +#define WAIT_SYMBOL_TIMEOUT_US K_USEC(2 * (WAIT_SYMBOL_OFF_US + WAIT_SYMBOL_US)) #define RADIO_ENABLE_TX_ON_CC0_PPI 9U #define RADIO_DISABLE_ON_CC1_PPI 12U @@ -231,9 +234,15 @@ int hubble_sat_soc_enable(void) int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) { + int ret; int8_t frame = -1; - k_sem_take(&_transmit_sem, K_FOREVER); + ret = k_sem_take(&_transmit_sem, + K_SECONDS(HUBBLE_SAT_TRANSMISSION_TIMEOUT_S)); + if (ret != 0) { + return ret; + } + k_sem_reset(&_symbol_sem); _dppi_enable(); @@ -248,7 +257,10 @@ int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) hubble_nrf_lib_frequency_set(packet->frame[frame].channel, packet->frame[frame].data[data_pos]); - k_sem_take(&_symbol_sem, K_FOREVER); + ret = k_sem_take(&_symbol_sem, WAIT_SYMBOL_TIMEOUT_US); + if (ret != 0) { + break; + } } _dppi_disable(); @@ -256,7 +268,7 @@ int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) k_sem_give(&_transmit_sem); - return 0; + return ret; } #ifdef CONFIG_HUBBLE_SAT_NETWORK_DTM_MODE From 003d79bd6bc002af071039264d357bbda67bd666 Mon Sep 17 00:00:00 2001 From: Flavio Ceolin Date: Mon, 8 Jun 2026 12:40:56 -0700 Subject: [PATCH 3/6] sat: nrf54: Set timeouts for transmissions Prevent a transmission to possibly lock indefinitely seting a timeout for used sempahores. Signed-off-by: Flavio Ceolin --- port/zephyr/boards/nordic/nrf54/nrf54_soc.c | 26 +++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/port/zephyr/boards/nordic/nrf54/nrf54_soc.c b/port/zephyr/boards/nordic/nrf54/nrf54_soc.c index 8157592a..3b8637f0 100644 --- a/port/zephyr/boards/nordic/nrf54/nrf54_soc.c +++ b/port/zephyr/boards/nordic/nrf54/nrf54_soc.c @@ -27,13 +27,16 @@ #include #include -#define RADIO_NODE DT_NODELABEL(radio) +#define RADIO_NODE DT_NODELABEL(radio) /* From nRF54L15 PS: Time between TXEN -> READY is ~40us with fast ramp-up */ -#define WAIT_SYMBOL_OFF_US (HUBBLE_WAIT_SYMBOL_OFF_US - 40) -#define WAIT_SYMBOL_US (HUBBLE_WAIT_SYMBOL_US + 40) +#define WAIT_SYMBOL_OFF_US (HUBBLE_WAIT_SYMBOL_OFF_US - 40) +#define WAIT_SYMBOL_US (HUBBLE_WAIT_SYMBOL_US + 40) -#define NRF_DPPIC NRF_DPPIC10 +/* Max time for semaphore symbol to wait before failing. */ +#define WAIT_SYMBOL_TIMEOUT_US K_USEC(2 * (WAIT_SYMBOL_OFF_US + WAIT_SYMBOL_US)) + +#define NRF_DPPIC NRF_DPPIC10 #define RADIO_ENABLE_TX_ON_CC0_PPI 9U #define RADIO_DISABLE_ON_CC1_PPI 12U @@ -216,9 +219,15 @@ int hubble_sat_soc_enable(void) int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) { + int ret; int8_t frame = -1; - k_sem_take(&_transmit_sem, K_FOREVER); + ret = k_sem_take(&_transmit_sem, + K_SECONDS(HUBBLE_SAT_TRANSMISSION_TIMEOUT_S)); + if (ret != 0) { + return ret; + } + k_sem_reset(&_symbol_sem); _dppi_enable(); @@ -233,7 +242,10 @@ int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) hubble_nrf_lib_frequency_set(packet->frame[frame].channel, packet->frame[frame].data[data_pos]); - k_sem_take(&_symbol_sem, K_FOREVER); + ret = k_sem_take(&_symbol_sem, WAIT_SYMBOL_TIMEOUT_US); + if (ret != 0) { + break; + } } _dppi_disable(); @@ -241,7 +253,7 @@ int hubble_sat_soc_packet_send(const struct hubble_sat_packet_frames *packet) k_sem_give(&_transmit_sem); - return 0; + return ret; } #ifdef CONFIG_HUBBLE_SAT_NETWORK_DTM_MODE From b3fa9373291ea49f625855cabedb738e980f927d Mon Sep 17 00:00:00 2001 From: Flavio Ceolin Date: Mon, 8 Jun 2026 12:42:43 -0700 Subject: [PATCH 4/6] sat: efr32: Set timeouts for transmissions Prevent a transmission to possibly lock indefinitely seting a timeout for used sempahores. Signed-off-by: Flavio Ceolin --- port/zephyr/boards/silabs/efr32/radio.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/port/zephyr/boards/silabs/efr32/radio.c b/port/zephyr/boards/silabs/efr32/radio.c index 6edde136..ee622f95 100644 --- a/port/zephyr/boards/silabs/efr32/radio.c +++ b/port/zephyr/boards/silabs/efr32/radio.c @@ -104,6 +104,7 @@ static void _timer_cb(sl_rail_handle_t rail_handle) static int _radio_cw_start(uint8_t channel, uint16_t step, uint32_t delay, uint32_t duration_us) { + int ret; sl_rail_status_t status; sl_rail_time_t anchor; @@ -126,21 +127,24 @@ static int _radio_cw_start(uint8_t channel, uint16_t step, uint32_t delay, return _sl_status_to_errno(status); } - k_sem_take(&_symbol_sem, K_FOREVER); + ret = k_sem_take(&_symbol_sem, (2 * duration_us)); status = sl_rail_stop_tx_stream(_rail_handle); if (status != SL_RAIL_STATUS_NO_ERROR) { return _sl_status_to_errno(status); } + if (ret != 0) { + return ret; + } + status = sl_rail_set_timer(_rail_handle, anchor + duration_us + delay, SL_RAIL_TIME_ABSOLUTE, &_timer_cb); if (status != SL_RAIL_STATUS_NO_ERROR) { return _sl_status_to_errno(status); } - k_sem_take(&_symbol_sem, K_FOREVER); - return 0; + return k_sem_take(&_symbol_sem, (2 * delay)); } static int _radio_channel_set(uint8_t channel) @@ -255,10 +259,15 @@ int hubble_sat_board_disable(void) int hubble_sat_board_packet_send(const struct hubble_sat_packet_frames *packet) { - int ret = 0; + int ret; int8_t frame = -1; - k_sem_take(&_transmit_sem, K_FOREVER); + ret = k_sem_take(&_transmit_sem, + K_SECONDS(HUBBLE_SAT_TRANSMISSION_TIMEOUT_S)); + if (ret != 0) { + return ret; + } + k_sem_reset(&_symbol_sem); for (uint8_t i = 0; i < packet->total_number_of_symbols; i++) { From 41ddcbf379dd1d2fc95b8faf6ada92b1ef24f7ad Mon Sep 17 00:00:00 2001 From: Flavio Ceolin Date: Mon, 8 Jun 2026 13:14:46 -0700 Subject: [PATCH 5/6] sat: esp32: Set timeouts for transmissions Prevent a transmission to possibly lock indefinitely seting a timeout for used sempahores. Signed-off-by: Flavio Ceolin --- .../hubblenetwork-sdk/boards/esp32c6/radio.c | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/port/esp-idf/hubblenetwork-sdk/boards/esp32c6/radio.c b/port/esp-idf/hubblenetwork-sdk/boards/esp32c6/radio.c index 7bbd27d9..9b534297 100644 --- a/port/esp-idf/hubblenetwork-sdk/boards/esp32c6/radio.c +++ b/port/esp-idf/hubblenetwork-sdk/boards/esp32c6/radio.c @@ -37,6 +37,9 @@ #define HUBBLE_BASE_FREQUENCY 2482U #define HUBBLE_CHANNEL_OFFSET(_channel) (((_channel) * 64) + 489) +#define _TIME_US_TO_TICK(_time_us) ((_time_us / 1000U) / portTICK_PERIOD_MS) +#define _TIME_S_TO_TICK(_time_s) ((_time_s * 1000U) / portTICK_PERIOD_MS) + /** * This semaphore is used to protect a packet transmission and avoid * race conditions. @@ -195,17 +198,25 @@ static int _radio_cw_start(uint16_t step, uint32_t delay, uint32_t duration_us) return ret; } - xSemaphoreTake(_symbol_sem, portMAX_DELAY); + ret = !(xSemaphoreTake(_symbol_sem, _TIME_US_TO_TICK(2 * duration_us)) == + pdTRUE); /* Symbol off time */ phy_tx_tone(false, true, DEFAULT_TX_POWER_DBM); + if (ret != 0) { + return -ETIMEDOUT; + } + ret = _timer_start(delay); if (ret != 0) { return ret; } - xSemaphoreTake(_symbol_sem, portMAX_DELAY); + if (xSemaphoreTake(_symbol_sem, _TIME_US_TO_TICK(2 * delay)) != pdTRUE) { + return -ETIMEDOUT; + } + return 0; } @@ -273,7 +284,12 @@ int hubble_sat_board_packet_send(const struct hubble_sat_packet_frames *packet) int ret = 0; int8_t frame = -1; - xSemaphoreTake(_transmit_sem, portMAX_DELAY); + if (xSemaphoreTake(_transmit_sem, + _TIME_S_TO_TICK(HUBBLE_SAT_TRANSMISSION_TIMEOUT_S)) != + pdTRUE) { + return -ETIMEDOUT; + } + xSemaphoreTake(_symbol_sem, 0); /* Reset semaphore */ for (uint8_t i = 0; i < packet->total_number_of_symbols; i++) { From 81ef9572e8c6fd0782b07492649273eba6577b89 Mon Sep 17 00:00:00 2001 From: Flavio Ceolin Date: Mon, 8 Jun 2026 13:28:46 -0700 Subject: [PATCH 6/6] sat: ti: Set timeouts for transmissions Prevent a transmission to possibly lock indefinitely seting a timeout for used sempahores. Signed-off-by: Flavio Ceolin --- port/freertos/boards/ti/cc23xx_cc27xx/radio.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/port/freertos/boards/ti/cc23xx_cc27xx/radio.c b/port/freertos/boards/ti/cc23xx_cc27xx/radio.c index 86519b12..f070c86b 100644 --- a/port/freertos/boards/ti/cc23xx_cc27xx/radio.c +++ b/port/freertos/boards/ti/cc23xx_cc27xx/radio.c @@ -24,6 +24,7 @@ /* Hubble */ #include #include +#include /* DMM */ #if defined(USE_DMM_OVRDE) @@ -61,6 +62,8 @@ #error "Device not supported" #endif +#define _TIME_S_TO_TICK(_time_s) ((_time_s * 1000U) / portTICK_PERIOD_MS) + /** * This semaphore is used to protect a packet transmission and avoid * race conditions. @@ -231,7 +234,11 @@ int hubble_sat_board_packet_send(const struct hubble_sat_packet_frames *packet) { int8_t frame = -1; - xSemaphoreTake(_transmit_sem, portMAX_DELAY); + if (xSemaphoreTake(_transmit_sem, + _TIME_S_TO_TICK(HUBBLE_SAT_TRANSMISSION_TIMEOUT_S)) != + pdTRUE) { + return -ETIMEDOUT; + } for (uint8_t i = 0; i < packet->total_number_of_symbols; i++) { int16_t step;