diff --git a/prj.conf b/prj.conf index caf22e6..f026f4c 100644 --- a/prj.conf +++ b/prj.conf @@ -5,23 +5,28 @@ CONFIG_BT_DEVICE_NAME="GML670_System" CONFIG_BT_MAX_CONN=1 CONFIG_BT_NUS=y -# 借鉴 Kiwii: 禁用 NUS 安全限制,提高连接成功率 -CONFIG_BT_NUS_SECURITY_ENABLED=n +# DLE + PHY +CONFIG_BT_BUF_ACL_RX_SIZE=251 +CONFIG_BT_BUF_ACL_TX_SIZE=251 +CONFIG_BT_DATA_LEN_UPDATE=y +CONFIG_BT_USER_DATA_LEN_UPDATE=y +CONFIG_BT_AUTO_DATA_LEN_UPDATE=y +CONFIG_BT_L2CAP_TX_MTU=247 +CONFIG_BT_PHY_UPDATE=y +CONFIG_BT_USER_PHY_UPDATE=y +CONFIG_BT_AUTO_PHY_UPDATE=y -# SMP 配对与绑定 -CONFIG_BT_SMP=y -CONFIG_BT_SETTINGS=y -CONFIG_BT_KEYS_OVERWRITE_OLDEST=y +# 缓冲区 +CONFIG_BT_BUF_ACL_TX_COUNT=3 +CONFIG_BT_L2CAP_TX_BUF_COUNT=6 + +# 存储 CONFIG_FLASH=y CONFIG_FLASH_MAP=y CONFIG_NVS=y CONFIG_SETTINGS=y CONFIG_SETTINGS_NVS=y -# 借鉴 Kiwii: 优化缓冲区 (匹配硬件) -CONFIG_BT_BUF_ACL_TX_COUNT=3 -CONFIG_BT_L2CAP_TX_BUF_COUNT=3 - # 硬件驱动 CONFIG_SPI=y CONFIG_GPIO=y @@ -34,8 +39,11 @@ CONFIG_SERIAL=n CONFIG_LOG=y CONFIG_USE_SEGGER_RTT=y CONFIG_LOG_BACKEND_RTT=y +CONFIG_LOG_BACKEND_RTT_MODE_DROP=y CONFIG_LOG_BACKEND_UART=n -CONFIG_LOG_MODE_IMMEDIATE=y +CONFIG_LOG_MODE_DEFERRED=y +CONFIG_LOG_BUFFER_SIZE=4096 +CONFIG_SEGGER_RTT_BUFFER_SIZE_UP=4096 CONFIG_MAIN_STACK_SIZE=4096 CONFIG_CRC=y diff --git a/src/ble_transport.c b/src/ble_transport.c index bc22dbc..e8c96cb 100644 --- a/src/ble_transport.c +++ b/src/ble_transport.c @@ -62,6 +62,7 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { /** @brief NUS 通知使能状态回调。 */ static void nus_send_enabled(enum bt_nus_send_status status) { nus_notification_enabled = (status == BT_NUS_SEND_STATUS_ENABLED); + LOG_INF("NUS send_enabled: status=%d, enabled=%d", status, nus_notification_enabled); } /** @@ -106,10 +107,19 @@ void ble_transport_adv_start(void) { } void ble_transport_send(const uint8_t *data, uint16_t len) { + static bool first_send_logged = false; + if (!nus_notification_enabled || !current_conn) return; for (int i = 0; i < 3; i++) { - if (bt_nus_send(current_conn, data, len) == 0) return; + int err = bt_nus_send(current_conn, data, len); + if (err == 0) { + if (!first_send_logged) { + LOG_INF("First NUS send OK (len=%u)", len); + first_send_logged = true; + } + return; + } k_usleep(500); } LOG_WRN("NUS send failed after retries (len=%u)", len); diff --git a/sysbuild.cmake b/sysbuild.cmake new file mode 100644 index 0000000..3448781 --- /dev/null +++ b/sysbuild.cmake @@ -0,0 +1,6 @@ +# 用绝对路径将 hci_ipc overlay 传给网络核, +# 避免 sysbuild 在 SDK 源码目录下解析相对路径而找不到文件。 +set(hci_ipc_EXTRA_CONF_FILE + ${CMAKE_CURRENT_LIST_DIR}/sysbuild/hci_ipc.conf + CACHE INTERNAL "" FORCE +) diff --git a/sysbuild.conf b/sysbuild.conf new file mode 100644 index 0000000..75e7998 --- /dev/null +++ b/sysbuild.conf @@ -0,0 +1,2 @@ +# 让 sysbuild 自动构建 hci_ipc 网络核固件,west flash 一次刷两个核 +SB_CONFIG_NETCORE_HCI_IPC=y diff --git a/sysbuild/hci_ipc.conf b/sysbuild/hci_ipc.conf new file mode 100644 index 0000000..9a7a215 --- /dev/null +++ b/sysbuild/hci_ipc.conf @@ -0,0 +1,9 @@ +# 网络核 hci_ipc overlay: 开启 DLE 251B,解除链路层分片瓶颈 + +# DLE 依赖链: DATA_LEN_UPDATE -> BT_CTLR_DATA_LENGTH -> DATA_LENGTH_MAX +CONFIG_BT_DATA_LEN_UPDATE=y +CONFIG_BT_CTLR_DATA_LENGTH_MAX=251 + +# 控制器 ACL 缓冲区必须能容纳 251B 的 LL PDU +CONFIG_BT_BUF_ACL_RX_SIZE=251 +CONFIG_BT_BUF_ACL_TX_SIZE=251