From 13aef3b2a07e47ed289ab1c5fd020911b92cf29b Mon Sep 17 00:00:00 2001 From: Ashley Strahle Date: Tue, 30 Jun 2026 06:59:32 +0000 Subject: [PATCH] Init BT controller with ESP_BT_MODE_BLE before NimBLEDevice::init to avoid BTDM crash on ESP32-S3 --- src/ble_midi_transport.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/ble_midi_transport.cpp b/src/ble_midi_transport.cpp index 5447185..7bf2460 100644 --- a/src/ble_midi_transport.cpp +++ b/src/ble_midi_transport.cpp @@ -46,23 +46,42 @@ BleMidiTransport::~BleMidiTransport() { bool BleMidiTransport::begin() { Serial.println("[BLE] Initializing BLE MIDI..."); + // ESP32-S3 only supports BLE (not BTDM). We must init the controller + // with BLE-only mode BEFORE NimBLEDevice::init(), which internally + // uses BTDM and would fail on S3. + esp_err_t err; + err = esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); + Serial.printf("[BLE] bt_mem_release: %d (%s)\n", err, esp_err_to_name(err)); + + esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + err = esp_bt_controller_init(&bt_cfg); + Serial.printf("[BLE] bt_controller_init: %d (%s)\n", err, esp_err_to_name(err)); + + err = esp_bt_controller_enable(ESP_BT_MODE_BLE); + Serial.printf("[BLE] bt_controller_enable(BLE): %d (%s)\n", err, esp_err_to_name(err)); + if (err != ESP_OK) { initialized = false; return false; } + Serial.println("[BLE] NimBLEDevice init..."); NimBLEDevice::init("JOC Midi"); Serial.println("[BLE] NimBLEDevice initialized"); + Serial.println("[BLE] Creating server..."); ble_server = NimBLEDevice::createServer(); if (!ble_server) { Serial.println("[BLE] FAILED to create server"); return false; } + Serial.println("[BLE] Server created, setting callbacks..."); ble_server->setCallbacks(new ServerCallbacks()); + Serial.println("[BLE] Creating service..."); ble_service = ble_server->createService(BLE_MIDI_SERVICE_UUID); if (!ble_service) { Serial.println("[BLE] FAILED to create service"); return false; } + Serial.println("[BLE] Creating characteristic..."); ble_char = ble_service->createCharacteristic( BLE_MIDI_CHAR_UUID, NIMBLE_PROPERTY::READ | @@ -76,9 +95,11 @@ bool BleMidiTransport::begin() { ble_char->createDescriptor(BLEUUID((uint16_t)0x2902), NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE); ble_char->setCallbacks(new CharCallbacks()); + Serial.println("[BLE] Starting service..."); ble_service->start(); Serial.println("[BLE] Service started"); + Serial.println("[BLE] Starting advertising..."); NimBLEAdvertising* adv = NimBLEDevice::getAdvertising(); adv->addServiceUUID(BLE_MIDI_SERVICE_UUID); adv->setScanResponse(true);