Init BT controller with ESP_BT_MODE_BLE before NimBLEDevice::init to avoid BTDM crash on ESP32-S3

This commit is contained in:
ash
2026-06-30 06:59:32 +00:00
parent 68efe30682
commit 13aef3b2a0
+21
View File
@@ -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);