From d791e7a783876ce7a3212011d284906d0a2ae5ad Mon Sep 17 00:00:00 2001 From: Benedek Kupper Date: Tue, 14 Apr 2026 21:21:08 +0200 Subject: [PATCH 1/6] mcuxsdk version update --- ...-cmake-add-ihex-binary-output-option.patch | 40 ------------------- right/CMakeLists.txt | 8 +--- right/src/macros/command_hash.gperf | 9 +++++ west_mcuxsdk.yml | 2 +- 4 files changed, 11 insertions(+), 48 deletions(-) delete mode 100644 patches/core/0003-cmake-add-ihex-binary-output-option.patch diff --git a/patches/core/0003-cmake-add-ihex-binary-output-option.patch b/patches/core/0003-cmake-add-ihex-binary-output-option.patch deleted file mode 100644 index 842afbea5..000000000 --- a/patches/core/0003-cmake-add-ihex-binary-output-option.patch +++ /dev/null @@ -1,40 +0,0 @@ -From e4f2184a0371bdeee7d85dccf49f384f1862ef61 Mon Sep 17 00:00:00 2001 -From: Benedek Kupper -Date: Thu, 19 Jun 2025 10:39:21 +0200 -Subject: [PATCH] cmake: add ihex binary output option - ---- - cmake/extension/function.cmake | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - -diff --git a/cmake/extension/function.cmake b/cmake/extension/function.cmake -index ad53bf4..6d1000d 100644 ---- a/cmake/extension/function.cmake -+++ b/cmake/extension/function.cmake -@@ -583,12 +583,22 @@ function(mcux_convert_binary) - if (${CONFIG_TOOLCHAIN} STREQUAL "armgcc") - set(OBJDUMP_BIN_CMD "-Osrec") - elseif (${CONFIG_TOOLCHAIN} STREQUAL "iar") -- set(OBJDUMP_BIN_CMD "--srec") -+ set(OBJDUMP_BIN_CMD "--srec") - elseif (${CONFIG_TOOLCHAIN} STREQUAL "mdk") - set(OBJDUMP_BIN_CMD "--m32combined") - elseif (${CONFIG_TOOLCHAIN} STREQUAL "codewarrior") - set(OBJDUMP_BIN_CMD "-srec") - endif () -+ elseif(${FILE_EXT} STREQUAL ".hex") -+ if (${CONFIG_TOOLCHAIN} STREQUAL "armgcc") -+ set(OBJDUMP_BIN_CMD "-Oihex") -+ elseif (${CONFIG_TOOLCHAIN} STREQUAL "iar") -+ set(OBJDUMP_BIN_CMD "--intel") -+ elseif (${CONFIG_TOOLCHAIN} STREQUAL "mdk") -+ set(OBJDUMP_BIN_CMD "--i32combined") -+ elseif (${CONFIG_TOOLCHAIN} STREQUAL "codewarrior") -+ set(OBJDUMP_BIN_CMD "-ihex") -+ endif () - endif() - if (${CONFIG_TOOLCHAIN} STREQUAL "codewarrior") - if(NOT __EXTRA_ARGS) --- -2.44.0 - diff --git a/right/CMakeLists.txt b/right/CMakeLists.txt index dbe3a73fb..dda8bd53f 100644 --- a/right/CMakeLists.txt +++ b/right/CMakeLists.txt @@ -10,13 +10,7 @@ set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) - -set(WORKSPACE_TOPDIR "${CMAKE_CURRENT_LIST_DIR}/../..") -set(CPM_bitfilled_SOURCE "${WORKSPACE_TOPDIR}/modules/lib/bitfilled") -set(CPM_hid-rp_SOURCE "${WORKSPACE_TOPDIR}/modules/lib/hid-rp") -set(CPM_etl_SOURCE "${WORKSPACE_TOPDIR}/modules/lib/etl") - -set(EXTRA_MCUX_MODULES ${CMAKE_CURRENT_LIST_DIR}/../../c2usb) +set(WEST ON) # necessary for looking up mcux modules from west workspace set(board frdmk22f) # TODO: how to remove the board selection? set(device MK22F51212) diff --git a/right/src/macros/command_hash.gperf b/right/src/macros/command_hash.gperf index 74d7cee54..0e636542e 100644 --- a/right/src/macros/command_hash.gperf +++ b/right/src/macros/command_hash.gperf @@ -1,5 +1,10 @@ %{ #include "command_ids.h" + +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif %} %readonly-tables %compare-strncmp @@ -167,3 +172,7 @@ zephyr, CommandId_zephyr "{", CommandId_openBrace "}", CommandId_closeBrace %% + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif diff --git a/west_mcuxsdk.yml b/west_mcuxsdk.yml index db9a23473..208c641b7 100644 --- a/west_mcuxsdk.yml +++ b/west_mcuxsdk.yml @@ -14,7 +14,7 @@ manifest: - name: mcuxsdk-manifests remote: nxp-mcuxpresso path: mcuxsdk/manifest_int - revision: v25.06.00 + revision: v26.03.00 clone-depth: 1 import: name-allowlist: From f335c6757b804ba167f704ec27ab675c023f5e2d Mon Sep 17 00:00:00 2001 From: Benedek Kupper Date: Tue, 14 Apr 2026 23:53:53 +0200 Subject: [PATCH 2/6] update nrf sdk to version 3.2.4 --- boards/ugl/uhk-80/Kconfig.defconfig | 16 +++- boards/ugl/uhk-80/board.c | 13 +++ boards/ugl/uhk-80/board.cmake | 2 +- device/src/bt_advertise.c | 20 ++--- device/src/keyboard/charger.c | 1 - ...ls-early-and-with-meaningful-message.patch | 67 -------------- .../0001-Remove-mcuboot-build-warnings.patch | 30 ------- ...rs-udc-eliminate-C-compiler-warnings.patch | 89 ------------------- .../0001-udc-nrf-disable-SOF-interrupts.patch | 25 ------ ...-application-CMakePresets.json-files.patch | 76 +++++----------- right/src/hid/transport_ble.cpp | 3 +- west_nrfsdk.yml | 7 +- 12 files changed, 62 insertions(+), 287 deletions(-) delete mode 100644 patches/mcuboot/0003-zephyr-cmake-fails-early-and-with-meaningful-message.patch delete mode 100644 patches/sdk-nrf/0001-Remove-mcuboot-build-warnings.patch delete mode 100644 patches/zephyr/0001-drivers-udc-eliminate-C-compiler-warnings.patch delete mode 100644 patches/zephyr/0001-udc-nrf-disable-SOF-interrupts.patch diff --git a/boards/ugl/uhk-80/Kconfig.defconfig b/boards/ugl/uhk-80/Kconfig.defconfig index e1aa2c962..f8ac2f245 100644 --- a/boards/ugl/uhk-80/Kconfig.defconfig +++ b/boards/ugl/uhk-80/Kconfig.defconfig @@ -23,6 +23,11 @@ if BT_DIS && BT_DIS_PNP endif # BT_DIS && BT_DIS_PNP if BOARD_UHK_80_LEFT + config HAS_PM + default y + config HW_STACK_PROTECTION + default ARCH_HAS_STACK_PROTECTION + config USB_DEVICE_PRODUCT default "UHK 80 left half bootloader" if MCUBOOT config USB_DEVICE_PID @@ -30,6 +35,11 @@ if BOARD_UHK_80_LEFT endif # BOARD_UHK_80_LEFT if BOARD_UHK_80_RIGHT + config HAS_PM + default y + config HW_STACK_PROTECTION + default ARCH_HAS_STACK_PROTECTION + config USB_DEVICE_PRODUCT default "UHK 80 right half bootloader" if MCUBOOT config USB_DEVICE_PID @@ -37,6 +47,9 @@ if BOARD_UHK_80_RIGHT endif # BOARD_UHK_80_RIGHT if BOARD_UHK_DONGLE + config HW_STACK_PROTECTION + default ARCH_HAS_STACK_PROTECTION + config USB_DEVICE_PRODUCT default "UHK dongle bootloader" if MCUBOOT config USB_DEVICE_PID @@ -59,6 +72,3 @@ if BT config BT_DEVICE_APPEARANCE default 961 endif # BT - -config BT_CTLR - default BT diff --git a/boards/ugl/uhk-80/board.c b/boards/ugl/uhk-80/board.c index 1f8d0c317..5cb17a5ce 100644 --- a/boards/ugl/uhk-80/board.c +++ b/boards/ugl/uhk-80/board.c @@ -6,6 +6,19 @@ #include #include +#include + +__weak void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id) +{ + ARG_UNUSED(state); + ARG_UNUSED(substate_id); +} + +__weak void pm_state_set(enum pm_state state, uint8_t substate_id) +{ + ARG_UNUSED(state); + ARG_UNUSED(substate_id); +} #ifdef CONFIG_BOARD_UHK_DONGLE_NRF52840 static int board_uhk_dongle_nrf52840_init(void) diff --git a/boards/ugl/uhk-80/board.cmake b/boards/ugl/uhk-80/board.cmake index f95878945..1ebf65263 100644 --- a/boards/ugl/uhk-80/board.cmake +++ b/boards/ugl/uhk-80/board.cmake @@ -2,8 +2,8 @@ board_runner_args(jlink "--device=nRF52840_xxAA" "--speed=4000") board_runner_args(pyocd "--target=nrf52840" "--frequency=4000000") -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake) diff --git a/device/src/bt_advertise.c b/device/src/bt_advertise.c index 263b141b3..e1728af50 100644 --- a/device/src/bt_advertise.c +++ b/device/src/bt_advertise.c @@ -156,7 +156,7 @@ uint8_t BtAdvertise_Start(adv_config_t advConfig) case ADVERTISE_NUS | ADVERTISE_HID: LOG_DBG("Adv: advertise nus+hid."); /* our devices don't check service uuids, so hid advertisement effectively advertises nus too */ - advParam = *BT_LE_ADV_CONN_ONE_TIME; + advParam = *BT_LE_ADV_CONN_FAST_1; applyAdvInterval(&advParam); err = BT_LE_ADV_START(&advParam, adHid, sdHid); @@ -166,14 +166,14 @@ uint8_t BtAdvertise_Start(adv_config_t advConfig) LOG_DBG("Adv: advertise nus, with allow list."); setFilters(advConfig); - advParam = *BT_LE_ADV_CONN_ONE_TIME; - advParam.options = BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME | BT_LE_ADV_OPT_FILTER_CONN | BT_LE_ADV_OPT_USE_IDENTITY; + advParam = *BT_LE_ADV_CONN_FAST_1; + advParam.options = BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_FILTER_CONN | BT_LE_ADV_OPT_USE_IDENTITY; applyAdvInterval(&advParam); err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus); } else { LOG_DBG("Adv: advertise nus, without allow list."); - advParam = *BT_LE_ADV_CONN_ONE_TIME; + advParam = *BT_LE_ADV_CONN_FAST_1; applyAdvInterval(&advParam); err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus); } @@ -183,23 +183,17 @@ uint8_t BtAdvertise_Start(adv_config_t advConfig) LOG_DBG("Adv: direct advertise nus, with allow list."); setFilters(advConfig); - advParam = *BT_LE_ADV_CONN_ONE_TIME; - advParam.options = BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME | BT_LE_ADV_OPT_FILTER_CONN | BT_LE_ADV_OPT_USE_IDENTITY; + advParam = *BT_LE_ADV_CONN_FAST_1; + advParam.options = BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_FILTER_CONN | BT_LE_ADV_OPT_USE_IDENTITY; applyAdvInterval(&advParam); err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus); } else { LOG_DBG("Adv: direct advertise nus, without allow list."); - advParam = *BT_LE_ADV_CONN_ONE_TIME; + advParam = *BT_LE_ADV_CONN_FAST_1; applyAdvInterval(&advParam); err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus); } - - //// TODO: fix and reenable this? - // printk("Advertising against %s", GetAddrString(advConfig.addr)); - // advParam = *BT_LE_ADV_CONN_DIR_LOW_DUTY(advConfig.addr); - // advParam.options |= BT_LE_ADV_OPT_DIR_ADDR_RPA; - // err = BT_LE_ADV_START(&advParam, BY_SIDE(adNusLeft, adNusRight), sdNus); break; default: LOG_INF("Adv: Attempted to start advertising without any type! Ignoring."); diff --git a/device/src/keyboard/charger.c b/device/src/keyboard/charger.c index e7feb1304..998811c3d 100644 --- a/device/src/keyboard/charger.c +++ b/device/src/keyboard/charger.c @@ -4,7 +4,6 @@ #include "charger.h" #include "battery_window_calculator.h" #include "keyboard/charger.h" -#include "nrf52840.h" #include "oled/screens/notification_screen.h" #include "power_mode.h" #include "shell.h" diff --git a/patches/mcuboot/0003-zephyr-cmake-fails-early-and-with-meaningful-message.patch b/patches/mcuboot/0003-zephyr-cmake-fails-early-and-with-meaningful-message.patch deleted file mode 100644 index 1c400525e..000000000 --- a/patches/mcuboot/0003-zephyr-cmake-fails-early-and-with-meaningful-message.patch +++ /dev/null @@ -1,67 +0,0 @@ -From edcda8be37a5dbba0eeb01e97822358ac933ae24 Mon Sep 17 00:00:00 2001 -From: Benedek Kupper -Date: Tue, 12 Aug 2025 23:11:10 +0200 -Subject: [PATCH] zephyr: cmake fails early and with meaningful message - ---- - boot/zephyr/CMakeLists.txt | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/boot/zephyr/CMakeLists.txt b/boot/zephyr/CMakeLists.txt -index 3a340646..b51a729d 100644 ---- a/boot/zephyr/CMakeLists.txt -+++ b/boot/zephyr/CMakeLists.txt -@@ -419,7 +419,7 @@ function(dt_get_parent node) - string(FIND "${${node}}" "/" pos REVERSE) - - if(pos EQUAL -1) -- message(ERROR "Unable to get parent of node: ${${node}}") -+ message(FATAL_ERROR "Unable to get parent of node: ${${node}}") - endif() - - string(SUBSTRING "${${node}}" 0 ${pos} ${node}) -@@ -427,7 +427,7 @@ function(dt_get_parent node) - endfunction() - - if(CONFIG_BOOT_MAX_IMG_SECTORS_AUTO) -- dt_nodelabel(slot0_flash NODELABEL "slot0_partition") -+ dt_nodelabel(slot0_flash NODELABEL "slot0_partition" REQUIRED) - dt_prop(slot0_size PATH "${slot0_flash}" PROPERTY "reg" INDEX 1) - dt_get_parent(slot0_flash) - dt_get_parent(slot0_flash) -@@ -442,7 +442,7 @@ if(CONFIG_BOOT_MAX_IMG_SECTORS_AUTO) - endif() - - if(NOT CONFIG_SINGLE_APPLICATION_SLOT) -- dt_nodelabel(slot1_flash NODELABEL "slot1_partition") -+ dt_nodelabel(slot1_flash NODELABEL "slot1_partition" REQUIRED) - dt_prop(slot1_size PATH "${slot1_flash}" PROPERTY "reg" INDEX 1) - dt_get_parent(slot1_flash) - dt_get_parent(slot1_flash) -@@ -472,12 +472,12 @@ endif() - if(SYSBUILD) - if(CONFIG_SINGLE_APPLICATION_SLOT OR CONFIG_BOOT_FIRMWARE_LOADER OR CONFIG_BOOT_SWAP_USING_SCRATCH OR CONFIG_BOOT_SWAP_USING_MOVE OR CONFIG_BOOT_UPGRADE_ONLY OR CONFIG_BOOT_DIRECT_XIP OR CONFIG_BOOT_RAM_LOAD) - # TODO: RAM LOAD support -- dt_nodelabel(slot0_flash NODELABEL "slot0_partition") -+ dt_nodelabel(slot0_flash NODELABEL "slot0_partition" REQUIRED) - dt_get_parent(slot0_flash) - dt_get_parent(slot0_flash) - - if(NOT CONFIG_SINGLE_APPLICATION_SLOT) -- dt_nodelabel(slot1_flash NODELABEL "slot1_partition") -+ dt_nodelabel(slot1_flash NODELABEL "slot1_partition" REQUIRED) - dt_get_parent(slot1_flash) - dt_get_parent(slot1_flash) - -@@ -626,7 +626,7 @@ endif() - if(SYSBUILD AND CONFIG_PCD_APP) - # Sysbuild requires details of the RAM flash device are stored to the cache of MCUboot so - # that they can be read when running partition manager -- dt_nodelabel(ram_flash_dev NODELABEL flash_sim0) -+ dt_nodelabel(ram_flash_dev NODELABEL flash_sim0 REQUIRED) - dt_reg_addr(ram_flash_addr PATH ${ram_flash_dev}) - dt_reg_size(ram_flash_size PATH ${ram_flash_dev}) - --- -2.43.0 - diff --git a/patches/sdk-nrf/0001-Remove-mcuboot-build-warnings.patch b/patches/sdk-nrf/0001-Remove-mcuboot-build-warnings.patch deleted file mode 100644 index 89f690342..000000000 --- a/patches/sdk-nrf/0001-Remove-mcuboot-build-warnings.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 9f6342a09c416553381e4d478c894903ead17566 Mon Sep 17 00:00:00 2001 -From: Benedek Kupper -Date: Tue, 9 Jul 2024 22:38:48 +0200 -Subject: [PATCH] Remove mcuboot default key build warning - ---- - modules/mcuboot/CMakeLists.txt | 7 ------- - 1 files changed, 7 deletions(-) - -diff --git a/modules/mcuboot/CMakeLists.txt b/modules/mcuboot/CMakeLists.txt -index 5ec2643d7..70c706d52 100644 ---- a/modules/mcuboot/CMakeLists.txt -+++ b/modules/mcuboot/CMakeLists.txt -@@ -379,13 +379,6 @@ if(CONFIG_BOOTLOADER_MCUBOOT) - if(CONFIG_SIGN_IMAGES) - # Set default key - if (NOT DEFINED mcuboot_key_file) -- message(WARNING " -- --------------------------------------------------------- -- --- WARNING: Using default MCUBoot key, it should not --- -- --- be used for production. --- -- --------------------------------------------------------- -- \n" -- ) - set(mcuboot_key_file ${ZEPHYR_MCUBOOT_MODULE_DIR}/${CONFIG_BOOT_SIGNATURE_KEY_FILE}) - endif() - --- -2.44.0 - diff --git a/patches/zephyr/0001-drivers-udc-eliminate-C-compiler-warnings.patch b/patches/zephyr/0001-drivers-udc-eliminate-C-compiler-warnings.patch deleted file mode 100644 index 0c11b6d64..000000000 --- a/patches/zephyr/0001-drivers-udc-eliminate-C-compiler-warnings.patch +++ /dev/null @@ -1,89 +0,0 @@ -From f5755b7348d6ee2464ad41652a1a93950349738d Mon Sep 17 00:00:00 2001 -From: Benedek Kupper -Date: Tue, 9 Jul 2024 22:34:13 +0200 -Subject: [PATCH] drivers: udc: eliminate C++ compiler warnings - -Pending upstream PR: https://github.com/zephyrproject-rtos/zephyr/pull/69490 ---- - include/zephyr/drivers/usb/udc.h | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/include/zephyr/drivers/usb/udc.h b/include/zephyr/drivers/usb/udc.h -index 15b99cf5251..fd35c8e2749 100644 ---- a/include/zephyr/drivers/usb/udc.h -+++ b/include/zephyr/drivers/usb/udc.h -@@ -309,7 +309,7 @@ struct udc_data { - */ - static inline bool udc_is_initialized(const struct device *dev) - { -- struct udc_data *data = dev->data; -+ struct udc_data *data = (struct udc_data *)dev->data; - - return atomic_test_bit(&data->status, UDC_STATUS_INITIALIZED); - } -@@ -323,7 +323,7 @@ static inline bool udc_is_initialized(const struct device *dev) - */ - static inline bool udc_is_enabled(const struct device *dev) - { -- struct udc_data *data = dev->data; -+ struct udc_data *data = (struct udc_data *)dev->data; - - return atomic_test_bit(&data->status, UDC_STATUS_ENABLED); - } -@@ -337,7 +337,7 @@ static inline bool udc_is_enabled(const struct device *dev) - */ - static inline bool udc_is_suspended(const struct device *dev) - { -- struct udc_data *data = dev->data; -+ struct udc_data *data = (struct udc_data *)dev->data; - - return atomic_test_bit(&data->status, UDC_STATUS_SUSPENDED); - } -@@ -413,7 +413,7 @@ int udc_shutdown(const struct device *dev); - */ - static inline struct udc_device_caps udc_caps(const struct device *dev) - { -- struct udc_data *data = dev->data; -+ struct udc_data *data = (struct udc_data *)dev->data; - - return data->caps; - } -@@ -443,7 +443,7 @@ enum udc_bus_speed udc_device_speed(const struct device *dev); - */ - static inline int udc_set_address(const struct device *dev, const uint8_t addr) - { -- const struct udc_api *api = dev->api; -+ const struct udc_api *api = (struct udc_api *)dev->api; - int ret; - - if (!udc_is_enabled(dev)) { -@@ -475,7 +475,7 @@ static inline int udc_set_address(const struct device *dev, const uint8_t addr) - static inline int udc_test_mode(const struct device *dev, - const uint8_t mode, const bool dryrun) - { -- const struct udc_api *api = dev->api; -+ const struct udc_api *api = (const struct udc_api *)dev->api; - int ret; - - if (!udc_is_enabled(dev)) { -@@ -505,7 +505,7 @@ static inline int udc_test_mode(const struct device *dev, - */ - static inline int udc_host_wakeup(const struct device *dev) - { -- const struct udc_api *api = dev->api; -+ const struct udc_api *api = (struct udc_api *)dev->api; - int ret; - - if (!udc_is_enabled(dev)) { -@@ -722,7 +722,7 @@ static inline struct udc_buf_info *udc_get_buf_info(const struct net_buf *const - */ - static inline const void *udc_get_event_ctx(const struct device *dev) - { -- struct udc_data *data = dev->data; -+ struct udc_data *data = (struct udc_data *)dev->data; - - return data->event_ctx; - } --- -2.43.0 - diff --git a/patches/zephyr/0001-udc-nrf-disable-SOF-interrupts.patch b/patches/zephyr/0001-udc-nrf-disable-SOF-interrupts.patch deleted file mode 100644 index 8f565fa42..000000000 --- a/patches/zephyr/0001-udc-nrf-disable-SOF-interrupts.patch +++ /dev/null @@ -1,25 +0,0 @@ -From a64431fb94f0bec11c74e47497d146a26c27df0e Mon Sep 17 00:00:00 2001 -From: Benedek Kupper -Date: Thu, 27 Mar 2025 10:30:49 +0100 -Subject: [PATCH] udc: nrf: disable SOF interrupts - ---- - drivers/usb/udc/udc_nrf.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/usb/udc/udc_nrf.c b/drivers/usb/udc/udc_nrf.c -index e722917446..fdb713db2e 100644 ---- a/drivers/usb/udc/udc_nrf.c -+++ b/drivers/usb/udc/udc_nrf.c -@@ -553,7 +553,7 @@ static void udc_nrf_power_handler(nrfx_power_usb_evt_t pwr_evt) - break; - case NRFX_POWER_USB_EVT_READY: - LOG_DBG("POWER event ready"); -- nrf_usbd_common_start(true); -+ nrf_usbd_common_start(false); - break; - case NRFX_POWER_USB_EVT_REMOVED: - LOG_DBG("POWER event removed"); --- -2.44.0 - diff --git a/patches/zephyr/0003-sysbuild-support-application-CMakePresets.json-files.patch b/patches/zephyr/0003-sysbuild-support-application-CMakePresets.json-files.patch index 2d79a386f..a4cc01a63 100644 --- a/patches/zephyr/0003-sysbuild-support-application-CMakePresets.json-files.patch +++ b/patches/zephyr/0003-sysbuild-support-application-CMakePresets.json-files.patch @@ -1,4 +1,4 @@ -From 2669cb1f5240bfa5a92bf47bed97e3ce00a26a2c Mon Sep 17 00:00:00 2001 +From 27fabc6173a802d31b28f1f4e8cbaa3571e10a41 Mon Sep 17 00:00:00 2001 From: Torsten Rasmussen Date: Fri, 26 Sep 2025 12:55:07 +0200 Subject: [PATCH] sysbuild: support application CMakePresets.json files with @@ -14,88 +14,58 @@ sample's presets file. Signed-off-by: Torsten Rasmussen --- scripts/west_commands/build.py | 5 ++++- - scripts/west_commands/zcmake.py | 5 +++-- share/sysbuild/CMakePresets.json | 11 +++++++++++ - 3 files changed, 18 insertions(+), 3 deletions(-) + 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 share/sysbuild/CMakePresets.json diff --git a/scripts/west_commands/build.py b/scripts/west_commands/build.py -index 260945483cf..5710da41c95 100644 +index a271e4075a5..a7138694b5c 100644 --- a/scripts/west_commands/build.py +++ b/scripts/west_commands/build.py -@@ -578,6 +578,7 @@ class Build(Forceable): +@@ -618,6 +618,7 @@ class Build(Forceable): if not self.run_cmake: return + cmake_env = None - _banner('generating a build system') + self._banner('generating a build system') if board is not None and origin != 'CMakeCache.txt': -@@ -604,6 +605,8 @@ class Build(Forceable): +@@ -651,6 +652,8 @@ class Build(Forceable): if self.args.sysbuild or (config_sysbuild and not self.args.no_sysbuild): - cmake_opts.extend(['-S{}'.format(SYSBUILD_PROJ_DIR), - '-DAPP_DIR:PATH={}'.format(self.source_dir)]) + cmake_opts.extend([f'-S{SYSBUILD_PROJ_DIR}', + f'-DAPP_DIR:PATH={self.source_dir}']) + cmake_env = os.environ.copy() + cmake_env["APP_DIR"] = str(self.source_dir) else: # self.args.no_sysbuild == True or config sysbuild False - cmake_opts.extend(['-S{}'.format(self.source_dir)]) -@@ -620,7 +623,7 @@ class Build(Forceable): - DEFAULT_CMAKE_GENERATOR))] + cmake_opts.extend([f'-S{self.source_dir}']) +@@ -666,7 +669,7 @@ class Build(Forceable): + f'-G{config_get("generator", DEFAULT_CMAKE_GENERATOR)}'] if cmake_opts: final_cmake_args.extend(cmake_opts) - run_cmake(final_cmake_args, dry_run=self.args.dry_run) + run_cmake(final_cmake_args, dry_run=self.args.dry_run, env=cmake_env) def _run_pristine(self): - _banner('making build dir {} pristine'.format(self.build_dir)) -diff --git a/scripts/west_commands/zcmake.py b/scripts/west_commands/zcmake.py -index aad616aadd4..25e3d6407b5 100644 ---- a/scripts/west_commands/zcmake.py -+++ b/scripts/west_commands/zcmake.py -@@ -26,7 +26,7 @@ DEFAULT_CMAKE_GENERATOR = 'Ninja' - '''Name of the default CMake generator.''' - - --def run_cmake(args, cwd=None, capture_output=False, dry_run=False): -+def run_cmake(args, cwd=None, capture_output=False, dry_run=False, env=None): - '''Run cmake to (re)generate a build system, a script, etc. - - :param args: arguments to pass to CMake -@@ -36,6 +36,7 @@ def run_cmake(args, cwd=None, capture_output=False, dry_run=False): - dry_run is also True) - :param dry_run: don't actually execute the command, just print what - would have been run -+ :param env: used adjusted environment when running CMake - - If capture_output is set to True, returns the output of the command instead - of displaying it on stdout/stderr..''' -@@ -60,7 +61,7 @@ def run_cmake(args, cwd=None, capture_output=False, dry_run=False): - return None - - log.dbg('Running CMake:', quote_sh_list(cmd), level=log.VERBOSE_NORMAL) -- p = subprocess.Popen(cmd, **kwargs) -+ p = subprocess.Popen(cmd, env=env, **kwargs) - out, _ = p.communicate() - if p.returncode == 0: - if out: + self._banner(f'making build dir {self.build_dir} pristine') diff --git a/share/sysbuild/CMakePresets.json b/share/sysbuild/CMakePresets.json new file mode 100644 -index 00000000000..437f3b68a94 +index 00000000000..e6db7774f2e --- /dev/null +++ b/share/sysbuild/CMakePresets.json @@ -0,0 +1,11 @@ +{ -+ "version": 7, -+ "cmakeMinimumRequired": { -+ "major": 3, -+ "minor": 27, -+ "patch": 0 -+ }, -+ "include": [ -+ "$penv{APP_DIR}/CMakePresets.json" -+ ] ++ "version": 7, ++ "cmakeMinimumRequired": { ++ "major": 3, ++ "minor": 27, ++ "patch": 0 ++ }, ++ "include": [ ++ "$penv{APP_DIR}/CMakePresets.json" ++ ] +} +\ No newline at end of file -- 2.43.0 diff --git a/right/src/hid/transport_ble.cpp b/right/src/hid/transport_ble.cpp index b6efce317..8c2ae39d0 100644 --- a/right/src/hid/transport_ble.cpp +++ b/right/src/hid/transport_ble.cpp @@ -86,7 +86,6 @@ extern "C" int HOGP_HealthCheck() return -3; } - printk("HOGP HealthCheck: OK (registered, peer connected, interval %u)\n", - info.le.interval); + printk("HOGP HealthCheck: OK (registered, peer connected, interval %u)\n", info.le.interval_us); return 0; } diff --git a/west_nrfsdk.yml b/west_nrfsdk.yml index a7de254aa..6e4b77215 100644 --- a/west_nrfsdk.yml +++ b/west_nrfsdk.yml @@ -16,17 +16,18 @@ manifest: - name: sdk-nrf remote: sdk path: nrf - revision: v2.8.0 + revision: v3.2.4 clone-depth: 1 import: # path-prefix: nrfconnect name-allowlist: - zephyr - - cmsis + - cmsis_6 - hal_nordic - mcuboot - nrfxlib - lvgl - segger - - tinycrypt - zcbor + - mbedtls + - oberon-psa-crypto From 26aa7a1eeb7d4ef3010f9b9f6f730198091b41b9 Mon Sep 17 00:00:00 2001 From: Benedek Kupper Date: Thu, 23 Apr 2026 21:12:31 +0200 Subject: [PATCH 3/6] remove required heap size limit as we are out of RAM on uhk80-right --- device/prj.conf.overlays/c2usb.conf | 3 +-- device/prj.conf.overlays/nrf_shared.conf | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/device/prj.conf.overlays/c2usb.conf b/device/prj.conf.overlays/c2usb.conf index de59a510c..40537f528 100644 --- a/device/prj.conf.overlays/c2usb.conf +++ b/device/prj.conf.overlays/c2usb.conf @@ -18,5 +18,4 @@ CONFIG_C2USB_UDC_MAC=y CONFIG_C2USB_UDC_MAC_THREAD_STACK_SIZE=2048 # needed as at suspend the msgq is flooded otherwise -CONFIG_C2USB_UDC_MAC_MSGQ_SIZE=32 - +CONFIG_C2USB_UDC_MAC_MSGQ_SIZE=24 diff --git a/device/prj.conf.overlays/nrf_shared.conf b/device/prj.conf.overlays/nrf_shared.conf index 1ad6bee13..4a5fa6bcd 100644 --- a/device/prj.conf.overlays/nrf_shared.conf +++ b/device/prj.conf.overlays/nrf_shared.conf @@ -113,3 +113,5 @@ CONFIG_SPEED_OPTIMIZATIONS=y # macro evaluation can take some depth... CONFIG_MAIN_STACK_SIZE=4096 +# we are out of RAM, limit required heap to minimum +CONFIG_NEWLIB_LIBC_MIN_REQUIRED_HEAP_SIZE=0 From ef184b8058722b31e24849cad995d00fabe97304 Mon Sep 17 00:00:00 2001 From: Benedek Kupper Date: Thu, 23 Apr 2026 21:44:08 +0200 Subject: [PATCH 4/6] fix some kconfig warnings --- device/prj.conf.overlays/ble_hid.conf | 1 + device/prj.conf.overlays/c2usb.conf | 1 - device/sysbuild.conf | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/device/prj.conf.overlays/ble_hid.conf b/device/prj.conf.overlays/ble_hid.conf index c04763694..4f5314ffe 100644 --- a/device/prj.conf.overlays/ble_hid.conf +++ b/device/prj.conf.overlays/ble_hid.conf @@ -7,6 +7,7 @@ CONFIG_BT_MAX_PAIRED=20 # use BLE HID over GATT from c2usb CONFIG_C2USB_BLUETOOTH=y +CONFIG_C2USB_HOGP_LOG_LEVEL_DBG=y # battery status to generic client CONFIG_BT_BAS=y # device information to generic client diff --git a/device/prj.conf.overlays/c2usb.conf b/device/prj.conf.overlays/c2usb.conf index 40537f528..ef0b41180 100644 --- a/device/prj.conf.overlays/c2usb.conf +++ b/device/prj.conf.overlays/c2usb.conf @@ -6,7 +6,6 @@ CONFIG_NEWLIB_LIBC_NANO=y # CONFIG_WARN_EXPERIMENTAL=y # CONFIG_UDC_DRIVER_LOG_LEVEL_DBG=y -CONFIG_C2USB_HOGP_LOG_LEVEL_DBG=y CONFIG_C2USB_UDC_MAC_LOG_LEVEL_DBG=y CONFIG_WARN_EXPERIMENTAL=n diff --git a/device/sysbuild.conf b/device/sysbuild.conf index 3565f9dbd..3e7ec5666 100644 --- a/device/sysbuild.conf +++ b/device/sysbuild.conf @@ -1,3 +1,4 @@ SB_CONFIG_BOOTLOADER_MCUBOOT=y SB_CONFIG_PARTITION_MANAGER=y SB_CONFIG_MCUBOOT_MODE_SINGLE_APP=y +SB_CONFIG_MCUBOOT_APP_SYNC_UPDATEABLE_IMAGES=n From faf460e73e9de25dcf84767307ecf106b2c51005 Mon Sep 17 00:00:00 2001 From: Benedek Kupper Date: Tue, 12 May 2026 20:57:05 +0200 Subject: [PATCH 5/6] update nrf sdk to v3.3.0 --- boards/ugl/uhk-80/board.yml | 3 + ...-application-CMakePresets.json-files.patch | 71 ------------------- right/src/hid/transport_usb.cpp | 5 +- submanifests/c2usb.yml | 2 +- west_nrfsdk.yml | 2 +- 5 files changed, 8 insertions(+), 75 deletions(-) delete mode 100644 patches/zephyr/0003-sysbuild-support-application-CMakePresets.json-files.patch diff --git a/boards/ugl/uhk-80/board.yml b/boards/ugl/uhk-80/board.yml index d9adb6a70..d6c0c1848 100644 --- a/boards/ugl/uhk-80/board.yml +++ b/boards/ugl/uhk-80/board.yml @@ -1,13 +1,16 @@ boards: - name: uhk-80-left + full_name: Ultimate Hacking Keyboard 80 Left vendor: ugl socs: - name: nrf52840 - name: uhk-80-right + full_name: Ultimate Hacking Keyboard 80 Right vendor: ugl socs: - name: nrf52840 - name: uhk-dongle + full_name: Ultimate Hacking Keyboard Dongle vendor: ugl socs: - name: nrf52840 diff --git a/patches/zephyr/0003-sysbuild-support-application-CMakePresets.json-files.patch b/patches/zephyr/0003-sysbuild-support-application-CMakePresets.json-files.patch deleted file mode 100644 index a4cc01a63..000000000 --- a/patches/zephyr/0003-sysbuild-support-application-CMakePresets.json-files.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 27fabc6173a802d31b28f1f4e8cbaa3571e10a41 Mon Sep 17 00:00:00 2001 -From: Torsten Rasmussen -Date: Fri, 26 Sep 2025 12:55:07 +0200 -Subject: [PATCH] sysbuild: support application CMakePresets.json files with - sysbuild - -This commit provides a CMakePresets.json which includes the sample's -CMakePresets.json file. - -`west build` is extended to set `APP_DIR` in environment when sysbuild -is used. This allows sysbuild's CMakePresets.json to include the -sample's presets file. - -Signed-off-by: Torsten Rasmussen ---- - scripts/west_commands/build.py | 5 ++++- - share/sysbuild/CMakePresets.json | 11 +++++++++++ - 2 files changed, 15 insertions(+), 1 deletion(-) - create mode 100644 share/sysbuild/CMakePresets.json - -diff --git a/scripts/west_commands/build.py b/scripts/west_commands/build.py -index a271e4075a5..a7138694b5c 100644 ---- a/scripts/west_commands/build.py -+++ b/scripts/west_commands/build.py -@@ -618,6 +618,7 @@ class Build(Forceable): - if not self.run_cmake: - return - -+ cmake_env = None - self._banner('generating a build system') - - if board is not None and origin != 'CMakeCache.txt': -@@ -651,6 +652,8 @@ class Build(Forceable): - if self.args.sysbuild or (config_sysbuild and not self.args.no_sysbuild): - cmake_opts.extend([f'-S{SYSBUILD_PROJ_DIR}', - f'-DAPP_DIR:PATH={self.source_dir}']) -+ cmake_env = os.environ.copy() -+ cmake_env["APP_DIR"] = str(self.source_dir) - else: - # self.args.no_sysbuild == True or config sysbuild False - cmake_opts.extend([f'-S{self.source_dir}']) -@@ -666,7 +669,7 @@ class Build(Forceable): - f'-G{config_get("generator", DEFAULT_CMAKE_GENERATOR)}'] - if cmake_opts: - final_cmake_args.extend(cmake_opts) -- run_cmake(final_cmake_args, dry_run=self.args.dry_run) -+ run_cmake(final_cmake_args, dry_run=self.args.dry_run, env=cmake_env) - - def _run_pristine(self): - self._banner(f'making build dir {self.build_dir} pristine') -diff --git a/share/sysbuild/CMakePresets.json b/share/sysbuild/CMakePresets.json -new file mode 100644 -index 00000000000..e6db7774f2e ---- /dev/null -+++ b/share/sysbuild/CMakePresets.json -@@ -0,0 +1,11 @@ -+{ -+ "version": 7, -+ "cmakeMinimumRequired": { -+ "major": 3, -+ "minor": 27, -+ "patch": 0 -+ }, -+ "include": [ -+ "$penv{APP_DIR}/CMakePresets.json" -+ ] -+} -\ No newline at end of file --- -2.43.0 - diff --git a/right/src/hid/transport_usb.cpp b/right/src/hid/transport_usb.cpp index de2179e97..5c0ccc6a2 100644 --- a/right/src/hid/transport_usb.cpp +++ b/right/src/hid/transport_usb.cpp @@ -175,8 +175,9 @@ extern "C" void USB_Enable() extern "C" void USB_Reconfigure() { - assert(usb_manager::active()); - usb_manager::instance().select_config(HID_GetGamepadActive()); + if (usb_manager::active()) { + usb_manager::instance().select_config(HID_GetGamepadActive()); + } } extern "C" bool USB_RemoteWakeup() diff --git a/submanifests/c2usb.yml b/submanifests/c2usb.yml index fed6203c5..a6817addd 100644 --- a/submanifests/c2usb.yml +++ b/submanifests/c2usb.yml @@ -5,5 +5,5 @@ manifest: projects: - name: c2usb remote: IntergatedCircuits - revision: 384056c11afa25245695e55e47cb17d69ebb9e73 + revision: c263b00c48047d3845fd76f5938e0644d905de07 import: true diff --git a/west_nrfsdk.yml b/west_nrfsdk.yml index 6e4b77215..219e1905e 100644 --- a/west_nrfsdk.yml +++ b/west_nrfsdk.yml @@ -16,7 +16,7 @@ manifest: - name: sdk-nrf remote: sdk path: nrf - revision: v3.2.4 + revision: v3.3.0 clone-depth: 1 import: # path-prefix: nrfconnect From c76b42f41e5bd3429d25d43f2d826ea32387b91f Mon Sep 17 00:00:00 2001 From: Karel Tucek Date: Thu, 28 May 2026 16:10:38 +0200 Subject: [PATCH 6/6] Do connection setup work from system workqueue instead of bluetooth's. --- device/src/bt_conn.c | 138 ++++++++++++++++++++++++++++++++----------- 1 file changed, 103 insertions(+), 35 deletions(-) diff --git a/device/src/bt_conn.c b/device/src/bt_conn.c index 2c5c1ff09..3b0a9a5d5 100644 --- a/device/src/bt_conn.c +++ b/device/src/bt_conn.c @@ -96,6 +96,28 @@ uint32_t BleHidReportIntervalMs = 11; static void disconnectAllHids(); static void auth_cancel(struct bt_conn *conn); +// BLE APIs that allocate HCI/ATT buffers (data length update, MTU exchange, +// GATT discovery, security elevation) must not run directly in connection +// callbacks: those execute on the BT RX workqueue, and a blocking buffer +// allocation there can stall/deadlock the very thread that frees the buffers. +// We defer that work onto the system workqueue instead. Because scanning and +// advertising are mutually exclusive (see bt_manager.c) and separated by a +// rescheduling delay, connection callbacks are effectively serialized, so a +// single slot is sufficient; if it is ever occupied we refuse rather than +// clobber it. +typedef enum { + BtFlow_Connected, + BtFlow_AuthenticatedConnection, +} bt_flow_t; + +static struct k_work btDeferredWork; +static struct bt_conn *btDeferredConn = NULL; +static bt_flow_t btDeferredAction; +static connection_id_t btDeferredConnectionId; +static connection_type_t btDeferredConnectionType; + +static void scheduleBtFlow(struct bt_conn *conn, bt_flow_t action, connection_id_t connectionId, connection_type_t connectionType); + peer_t Peers[PeerCount] = { { .id = PeerIdUnknown, @@ -622,46 +644,21 @@ static void connectUnknown(struct bt_conn *conn) { #endif } -static void connected(struct bt_conn *conn, uint8_t err) { +static void connectedCallback(struct bt_conn *conn, uint8_t err) { BT_TRACE_AND_ASSERT("bc1"); LOG_DBG("Connected cb"); Bt_LastConnectedTime = Timer_GetCurrentTime(); - // Without this, linux pairing fails, because tiny 27 byte packets - // exhaust acl buffers easily - enableDataLengthExtension(conn); - if (!DEBUG_STRESS_GATT) { - requestMtuExchange(conn); - } - if (err) { LOG_WRN("Failed to connect (in connected cb) to %s, err %u", GetPeerStringByConn(conn), err); BtManager_StartScanningAndAdvertisingAsync(true, "connected with error"); return; } - const bt_addr_le_t * addr = bt_conn_get_dst(conn); - connection_id_t connectionId = Connections_GetConnectionIdByHostAddr(addr); - connection_type_t connectionType = Connections_Type(connectionId); - - LOG_INF("Connected %s, %d %d", GetPeerStringByConn(conn), connectionId, connectionType); - - if (connectionId == ConnectionId_Invalid) { - connectUnknown(conn); - BtManager_StartScanningAndAdvertisingAsync(true, "connected - invalid connection"); - } else { - - if (isWanted(conn, false, connectionId, connectionType)) { - bt_conn_set_security(conn, BT_SECURITY_L4); - // advertising/scanning needs to be started only after peers are assigned :-/ - } else { - youAreNotWanted(conn); - BtManager_StartScanningAndAdvertisingAsync(true, "connected - they are not wanted"); - } - } - - + // The buffer-allocating setup (data length, MTU, security) is deferred off + // the BT RX workqueue. See submitDeferredBtWork / handleConnectedDeferred. + scheduleBtFlow(conn, BtFlow_Connected, ConnectionId_Invalid, ConnectionType_Unknown); return; } @@ -729,7 +726,7 @@ static bool isUhkDeviceConnection(connection_type_t connectionType) { } } -static void connectAuthenticatedConnection(struct bt_conn *conn, connection_id_t connectionId, connection_type_t connectionType) { +static void authenticatedConnectionFlow(struct bt_conn *conn, connection_id_t connectionId, connection_type_t connectionType) { // in case we don't have free connection slots and this is not the selected connection, then refuse if (!isWanted(conn, true, connectionId, connectionType)) { LOG_WRN("Refusing authenticated connenction %d (this is not a selected connection(%d))", connectionId, SelectedHostConnectionId); @@ -755,6 +752,77 @@ static void connectAuthenticatedConnection(struct bt_conn *conn, connection_id_t } } +// Runs on the system workqueue; performs the buffer-allocating setup that used +// to live at the top of connected(). +static void connectedFlow(struct bt_conn *conn) { + // Without this, linux pairing fails, because tiny 27 byte packets + // exhaust acl buffers easily + enableDataLengthExtension(conn); + if (!DEBUG_STRESS_GATT) { + requestMtuExchange(conn); + } + + const bt_addr_le_t * addr = bt_conn_get_dst(conn); + connection_id_t connectionId = Connections_GetConnectionIdByHostAddr(addr); + connection_type_t connectionType = Connections_Type(connectionId); + + LOG_INF("Connected %s, %d %d", GetPeerStringByConn(conn), connectionId, connectionType); + + if (connectionId == ConnectionId_Invalid) { + connectUnknown(conn); + BtManager_StartScanningAndAdvertisingAsync(true, "connected - invalid connection"); + } else { + if (isWanted(conn, false, connectionId, connectionType)) { + bt_conn_set_security(conn, BT_SECURITY_L4); + // advertising/scanning needs to be started only after peers are assigned :-/ + } else { + youAreNotWanted(conn); + BtManager_StartScanningAndAdvertisingAsync(true, "connected - they are not wanted"); + } + } +} + + +static void btDeferredWorkHandler(struct k_work *work) { + struct bt_conn *conn = btDeferredConn; + bt_flow_t action = btDeferredAction; + connection_id_t connectionId = btDeferredConnectionId; + connection_type_t connectionType = btDeferredConnectionType; + + switch (action) { + case BtFlow_Connected: + connectedFlow(conn); + break; + case BtFlow_AuthenticatedConnection: + authenticatedConnectionFlow(conn, connectionId, connectionType); + break; + } + + btDeferredConn = NULL; + bt_conn_unref(conn); +} + +static void scheduleBtFlow(struct bt_conn *conn, bt_flow_t action, connection_id_t connectionId, connection_type_t connectionType) { + bool accepted = false; + DISABLE_IRQ(); + if (btDeferredConn == NULL) { + btDeferredConn = conn; + accepted = true; + } + ENABLE_IRQ(); + + if (!accepted) { + LOG_ERR("BT deferred work slot busy, dropping action %d for %s", action, GetPeerStringByConn(conn)); + return; + } + + bt_conn_ref(conn); + btDeferredAction = action; + btDeferredConnectionId = connectionId; + btDeferredConnectionType = connectionType; + k_work_submit(&btDeferredWork); +} + static void securityChanged(struct bt_conn *conn, bt_security_t level, enum bt_security_err err) { BT_TRACE_AND_ASSERT("bc3"); // In case of failure, disconnect @@ -784,7 +852,7 @@ static void securityChanged(struct bt_conn *conn, bt_security_t level, enum bt_s const bt_addr_le_t *addr = bt_conn_get_dst(conn); connection_id_t connectionId = Connections_GetConnectionIdByHostAddr(addr); connection_type_t connectionType = Connections_Type(connectionId); - connectAuthenticatedConnection(conn, connectionId, connectionType); + scheduleBtFlow(conn, BtFlow_AuthenticatedConnection, connectionId, connectionType); } __attribute__((unused)) static void infoLatencyParamsUpdated(struct bt_conn* conn, uint16_t interval, uint16_t latency, uint16_t timeout) @@ -808,7 +876,7 @@ __attribute__((unused)) static void infoLatencyParamsUpdated(struct bt_conn* con } BT_CONN_CB_DEFINE(conn_callbacks) = { - .connected = connected, + .connected = connectedCallback, .disconnected = disconnected, .security_changed = securityChanged, .le_param_updated = infoLatencyParamsUpdated, @@ -827,8 +895,6 @@ static void auth_passkey_entry(struct bt_conn *conn) { LOG_INF("Received passkey pairing inquiry."); - enableDataLengthExtension(conn); - if (!auth_conn) { LOG_INF("Returning: no auth conn"); return; @@ -932,7 +998,7 @@ static void pairing_complete(struct bt_conn *conn, bool bonded) { LOG_INF("Pairing complete, passing connection %d to authenticatedConnection handler. Selected conn is %d", connectionId, SelectedHostConnectionId); // we have to connect from here, because central changes its address *after* setting security - connectAuthenticatedConnection(conn, connectionId, connectionType); + scheduleBtFlow(conn, BtFlow_AuthenticatedConnection, connectionId, connectionType); } if (auth_conn) { @@ -1020,6 +1086,8 @@ void BtConn_Init(void) { BT_TRACE_AND_ASSERT("bc6"); int err = 0; + k_work_init(&btDeferredWork, btDeferredWorkHandler); + for (uint8_t peerId = PeerIdFirstHost; peerId <= PeerIdLastHost; peerId++) { Peers[peerId].id = peerId; Peers[peerId].conn = NULL;