Skip to content

Commit be4e3d6

Browse files
committed
zephyr: Replace BLE bindings with extmod/zephyr_ble.
Replace the native Zephyr port's custom BLE bindings with the shared extmod/zephyr_ble integration layer. This unifies the BLE API across all ports using Zephyr BLE, with the native Zephyr port using Zephyr's own kernel primitives instead of the HAL shim stubs. Includes machine.idle() fix to yield to Zephyr threads, and test fixes for nRF52840 DK BLE multitests. Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
1 parent edf2fd6 commit be4e3d6

10 files changed

Lines changed: 294 additions & 1046 deletions

extmod/zephyr_ble/hal/zephyr_ble_timer.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
#include <stdint.h>
3232
#include <stdbool.h>
3333

34+
#ifdef __ZEPHYR__
35+
// Native Zephyr: use real kernel types
36+
#include <zephyr/kernel.h>
37+
#else
38+
3439
// Zephyr k_timer abstraction layer for MicroPython
3540
//
3641
// When MICROPY_PY_THREAD is enabled (FreeRTOS available):
@@ -81,12 +86,14 @@ void k_timer_stop(struct k_timer *timer);
8186
// Note: K_MSEC, K_NO_WAIT, K_FOREVER are defined in zephyr_ble_work.h
8287
// Note: k_yield() is defined in zephyr_ble_kernel.h
8388

84-
// Called by MicroPython scheduler to process timer callbacks
85-
void mp_bluetooth_zephyr_timer_process(void);
86-
8789
// Check if two timeouts are equal
8890
static inline bool K_TIMEOUT_EQ(k_timeout_t a, k_timeout_t b) {
8991
return a.ticks == b.ticks;
9092
}
9193

94+
#endif // __ZEPHYR__
95+
96+
// Called by MicroPython scheduler to process timer callbacks
97+
void mp_bluetooth_zephyr_timer_process(void);
98+
9299
#endif // MICROPY_INCLUDED_EXTMOD_ZEPHYR_BLE_HAL_ZEPHYR_BLE_TIMER_H

ports/zephyr/CMakeLists.txt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,6 @@ include(${MICROPY_DIR}/extmod/extmod.cmake)
3737

3838
list(APPEND DTS_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/dts)
3939

40-
# Define mpy-cross flags, for use with frozen code.
41-
if(CONFIG_RISCV_ISA_RV32I AND CONFIG_RISCV_ISA_EXT_M AND CONFIG_RISCV_ISA_EXT_C)
42-
set(ARCH_FLAGS "")
43-
set(RV32_EXT "")
44-
if(CONFIG_RISCV_ISA_EXT_ZBA)
45-
list(APPEND RV32_EXT "zba")
46-
endif()
47-
if(CONFIG_RISCV_ISA_EXT_ZCMP)
48-
list(APPEND RV32_EXT "zcmp")
49-
endif()
50-
if(RV32_EXT)
51-
list(JOIN RV32_EXT "," RV32_EXT)
52-
set(ARCH_FLAGS "-march-flags=${RV32_EXT}")
53-
endif()
54-
set(MICROPY_CROSS_FLAGS "-march=rv32imc ${ARCH_FLAGS}")
55-
elseif(CONFIG_RISCV_ISA_RV64I AND CONFIG_RISCV_ISA_EXT_M AND CONFIG_RISCV_ISA_EXT_C)
56-
set(MICROPY_CROSS_FLAGS -march=rv64imc)
57-
endif()
58-
5940
if (CONFIG_MICROPY_FROZEN_MODULES)
6041
cmake_path(ABSOLUTE_PATH CONFIG_MICROPY_FROZEN_MANIFEST BASE_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
6142
set(MICROPY_FROZEN_MANIFEST ${CONFIG_MICROPY_FROZEN_MANIFEST})
@@ -68,7 +49,7 @@ set(MICROPY_SOURCE_PORT
6849
machine_spi.c
6950
machine_pin.c
7051
machine_timer.c
71-
modbluetooth_zephyr.c
52+
mpzephyrport_ble.c
7253
modsocket.c
7354
modzephyr.c
7455
modzsensor.c
@@ -173,6 +154,25 @@ zephyr_library_compile_definitions(
173154
zephyr_library_sources(${MICROPY_SOURCE_QSTR})
174155
zephyr_library_link_libraries(kernel)
175156
157+
if(CONFIG_BT)
158+
set(MICROPY_SOURCE_ZEPHYR_BLE
159+
${MICROPY_DIR}/extmod/zephyr_ble/modbluetooth_zephyr.c
160+
)
161+
zephyr_library_sources(${MICROPY_SOURCE_ZEPHYR_BLE})
162+
list(APPEND MICROPY_SOURCE_QSTR ${MICROPY_SOURCE_ZEPHYR_BLE})
163+
zephyr_library_include_directories(
164+
${MICROPY_DIR}/extmod/zephyr_ble/hal
165+
${ZEPHYR_BASE}/subsys/bluetooth
166+
)
167+
zephyr_library_compile_definitions(
168+
MICROPY_BLUETOOTH_ZEPHYR=1
169+
MICROPY_PY_BLUETOOTH_USE_SYNC_EVENTS=1
170+
MICROPY_PY_BLUETOOTH_USE_SYNC_EVENTS_WITH_INTERLOCK=1
171+
MICROPY_PY_BLUETOOTH_SYNC_EVENT_STACK_SIZE=4096
172+
ZEPHYR_BLE_DEBUG=0
173+
)
174+
endif()
175+
176176
include(${MICROPY_DIR}/py/mkrules.cmake)
177177
178178
add_dependencies(BUILD_VERSION_HEADER zephyr_generated_headers)
Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,65 @@
11
CONFIG_NETWORKING=n
2+
3+
# USB CDC ACM console
4+
CONFIG_USB_DEVICE_STACK_NEXT=y
5+
CONFIG_USBD_CDC_ACM_CLASS=y
6+
27
CONFIG_BT=y
38
CONFIG_BT_DEVICE_NAME_DYNAMIC=y
49
CONFIG_BT_GATT_DYNAMIC_DB=y
510
CONFIG_BT_PERIPHERAL=y
611
CONFIG_BT_CENTRAL=y
712
CONFIG_BT_GATT_CLIENT=y
8-
CONFIG_BT_L2CAP_TX_MTU=252
13+
CONFIG_BT_L2CAP_TX_MTU=512
914
CONFIG_BT_BUF_ACL_RX_SIZE=256
1015
CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n
1116

17+
# L2CAP CoC throughput: enable DLE and increase buffer counts
18+
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
19+
CONFIG_BT_BUF_ACL_TX_COUNT=10
20+
CONFIG_BT_L2CAP_TX_BUF_COUNT=10
21+
CONFIG_BT_CONN_TX_MAX=10
22+
CONFIG_BT_CTLR_RX_BUFFERS=3
23+
CONFIG_BT_BUF_EVT_RX_COUNT=20
24+
CONFIG_BT_SMP=y
25+
CONFIG_BT_SMP_SC_PAIR_ONLY=n
26+
CONFIG_BT_SMP_ENFORCE_MITM=n
27+
CONFIG_BT_SMP_MIN_ENC_KEY_SIZE=7
28+
CONFIG_BT_MAX_PAIRED=8
29+
CONFIG_BT_BONDABLE=y
30+
CONFIG_BT_KEYS_OVERWRITE_OLDEST=y
31+
32+
# Settings subsystem for bond persistence (required for bonded=true in pairing_complete)
33+
CONFIG_SETTINGS=y
34+
CONFIG_BT_SETTINGS=y
35+
CONFIG_FLASH=y
36+
CONFIG_FLASH_MAP=y
37+
CONFIG_NVS=y
38+
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
39+
CONFIG_BT_RX_STACK_SIZE=8192
40+
41+
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
42+
1243
CONFIG_MICROPY_HEAP_SIZE=98304
13-
CONFIG_MAIN_STACK_SIZE=8192
44+
CONFIG_MAIN_STACK_SIZE=16384
1445

1546
# CONFIG_DYNAMIC_THREAD=y
1647
CONFIG_THREAD_CUSTOM_DATA=y
1748
CONFIG_THREAD_MONITOR=y
1849
CONFIG_THREAD_STACK_INFO=y
50+
51+
# ECDH config — use default p256-m driver (needed for SMP Secure Connections)
52+
# Full mbedTLS ECP causes DHKey check failure on nRF52840 native controller
53+
CONFIG_BT_LONG_WQ_STACK_SIZE=4096
54+
55+
# SMP/pairing debug via RTT
56+
CONFIG_LOG=y
57+
CONFIG_LOG_BACKEND_RTT=y
58+
CONFIG_LOG_BACKEND_UART=n
59+
CONFIG_USE_SEGGER_RTT=y
60+
CONFIG_LOG_BUFFER_SIZE=8192
61+
CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=8192
62+
CONFIG_BT_LOG_LEVEL_WRN=y
63+
CONFIG_BT_SMP_LOG_LEVEL_DBG=y
64+
CONFIG_BT_CONN_LOG_LEVEL_INF=y
65+
CONFIG_BT_L2CAP_LOG_LEVEL_INF=y
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/ {
2+
chosen {
3+
/* Use USB CDC ACM as the console. */
4+
zephyr,console = &cdc_acm_uart0;
5+
};
6+
};
7+
8+
&zephyr_udc0 {
9+
cdc_acm_uart0: cdc_acm_uart0 {
10+
compatible = "zephyr,cdc-acm-uart";
11+
};
12+
};

ports/zephyr/boards/nucleo_wb55rg.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ CONFIG_BT_GATT_CLIENT=y
1717
CONFIG_BT_L2CAP_TX_MTU=252
1818
CONFIG_BT_BUF_ACL_RX_SIZE=256
1919
CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n
20+
CONFIG_BT_SMP=y
21+
CONFIG_BT_BONDABLE=y
22+
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
2023

2124
# MicroPython config
2225
CONFIG_MICROPY_HEAP_SIZE=131072

ports/zephyr/boards/xiao_ble_nrf52840_sense.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ CONFIG_BT_GATT_CLIENT=y
2020
CONFIG_BT_L2CAP_TX_MTU=252
2121
CONFIG_BT_BUF_ACL_RX_SIZE=256
2222
CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n
23+
CONFIG_BT_SMP=y
24+
CONFIG_BT_BONDABLE=y
25+
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
2326

2427
CONFIG_MICROPY_HEAP_SIZE=98304
2528
CONFIG_MAIN_STACK_SIZE=8192

0 commit comments

Comments
 (0)