From 24a1e79564a24e5ba7a6bfd0c225ebc1b80ec31e Mon Sep 17 00:00:00 2001 From: Amigache Date: Sun, 4 Oct 2026 13:43:14 +0200 Subject: [PATCH 1/6] feat(bt): Bluetooth telemetry (S.Port) and configurable device name - Forward the radio's S.Port telemetry frames over BLE (service 0xFFF0, characteristic 0xFFF6), generalising the frame parser to delimit on 0x7E and classify by length (14 = trainer, 9 = S.Port). - Store the name sent by the radio via AT+NAME and use it as the GAP name and in the advertising payload; raise LEN_BLUETOOTH_NAME from 10 to 20. - Pin the espressif32 platform to 6.7.0 for reproducible builds. --- platformio.ini | 2 +- src/bt.c | 12 ++-- src/bt.h | 1 - src/bt_server.c | 63 ++++++++++++++--- src/frskybt.c | 182 ++++++++++++++++++++++++++---------------------- src/settings.h | 1 + 6 files changed, 163 insertions(+), 98 deletions(-) diff --git a/platformio.ini b/platformio.ini index 47cbe5a..c52e4bc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ default_envs = C3Mini [env] -platform = espressif32 +platform = espressif32@6.7.0 framework = espidf build_unflags = -Werror=all diff --git a/src/bt.c b/src/bt.c index 2c27063..12001fa 100644 --- a/src/bt.c +++ b/src/bt.c @@ -6,6 +6,8 @@ #include +#include "defines.h" +#include "settings.h" #include "esp_bt.h" #include "esp_bt_main.h" #include "esp_err.h" @@ -14,12 +16,10 @@ #define LOG_BT "BT" -#define MAX_BTNAME_LEN 50 esp_bd_addr_t localbtaddress; esp_bd_addr_t rmtbtaddress; -char btname[MAX_BTNAME_LEN] = "Hello"; void strtobtaddr(esp_bd_addr_t dest, char *src) { @@ -91,7 +91,9 @@ void bt_disable() void btSetName(const char *name) { - strncpy(btname, name, sizeof(btname)); - btname[sizeof(btname) - 1] = '\0'; - ESP_LOGI(LOG_BT, "Setting BT Name %s", name); + strncpy(settings.name, name, sizeof(settings.name)); + settings.name[sizeof(settings.name) - 1] = '\0'; + saveSettings(); + + ESP_LOGI(LOG_BT, "Setting BT Name %s", settings.name); } \ No newline at end of file diff --git a/src/bt.h b/src/bt.h index 7ded6b6..2e1b626 100644 --- a/src/bt.h +++ b/src/bt.h @@ -11,7 +11,6 @@ extern esp_bd_addr_t rmtbtaddress; extern esp_bd_addr_t localbtaddress; -extern char btname[]; void strtobtaddr(esp_bd_addr_t dest, char *src); char *btaddrtostr(char dest[13], esp_bd_addr_t src); diff --git a/src/bt_server.c b/src/bt_server.c index 85b1e97..1ccc55e 100644 --- a/src/bt_server.c +++ b/src/bt_server.c @@ -19,6 +19,7 @@ #include #include "bt.h" +#include "settings.h" #include "esp_bt.h" #include "esp_bt_defs.h" #include "esp_bt_main.h" @@ -64,12 +65,45 @@ static uint8_t adv_config_done = 0; #define scan_rsp_config_flag (1 << 1) // FORMAT -static uint8_t raw_adv_data[] = { - 0x02, 0x01, 0x06, // General | NoBREDR - 0x03, 0x02, 0xF0, 0xFF, // Available Service - 0x06, 0x09, 'H', 'e', 'l', 'l', 'o', // Name - 0x02, 0x0A, 0x00 // TX Power -}; +#define ADV_DATA_MAX_LEN 31 +static uint8_t raw_adv_data[ADV_DATA_MAX_LEN]; +static uint8_t raw_adv_data_len = 0; + +/* Builds the advertising payload using the device name received from the + * radio through AT+NAME (settings.name) when available. */ +static void buildAdvData(void) +{ + const char *name = settings.name[0] ? (const char *)settings.name : "BTWifiMod"; + uint8_t nameLen = strnlen(name, LEN_BLUETOOTH_NAME); + uint8_t idx = 0; + + // Flags: LE General Discoverable Mode | BR/EDR Not Supported + raw_adv_data[idx++] = 0x02; + raw_adv_data[idx++] = 0x01; + raw_adv_data[idx++] = 0x06; + + // Complete list of 16-bit Service UUIDs (0xFFF0, little endian) + raw_adv_data[idx++] = 0x03; + raw_adv_data[idx++] = 0x02; + raw_adv_data[idx++] = 0xF0; + raw_adv_data[idx++] = 0xFF; + + // Complete Local Name + if (nameLen > 0) { + raw_adv_data[idx++] = nameLen + 1; + raw_adv_data[idx++] = 0x09; + memcpy(&raw_adv_data[idx], name, nameLen); + idx += nameLen; + } + + // TX Power Level + raw_adv_data[idx++] = 0x02; + raw_adv_data[idx++] = 0x0A; + raw_adv_data[idx++] = 0x00; + + raw_adv_data_len = idx; + ESP_LOGI(GATTS_TAG, "Advertising as [%s]", name); +} // No Scan Response /* @@ -245,7 +279,7 @@ static void gatts_profile_a_event_handler(esp_gatts_cb_event_t event, esp_gatt_i if (set_dev_name_ret){ ESP_LOGE(GATTS_TAG, "set device name failed, error code = %x", set_dev_name_ret); }*/ - esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(raw_adv_data, sizeof(raw_adv_data)); + esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(raw_adv_data, raw_adv_data_len); if (raw_adv_ret) { ESP_LOGE(GATTS_TAG, "config raw adv data failed, error code = %x ", raw_adv_ret); } @@ -476,9 +510,22 @@ int btp_sendChannelData(uint8_t *data, int len) void btpInit(void) { + esp_err_t ret; + ESP_LOGI(GATTS_TAG, "Starting Peripherial"); - esp_err_t ret = esp_ble_gatts_register_callback(gatts_event_handler); + if (settings.name[0] != '\0') { + ESP_LOGI(GATTS_TAG, "Setting device name [%s]",settings.name); + ret = esp_ble_gap_set_device_name(settings.name); + if (ret) { + ESP_LOGE(GATTS_TAG, "set device name error, error code = %x", ret); + return; + } + } + + buildAdvData(); + + ret = esp_ble_gatts_register_callback(gatts_event_handler); if (ret) { ESP_LOGE(GATTS_TAG, "gatts register error, error code = %x", ret); return; diff --git a/src/frskybt.c b/src/frskybt.c index 80efa0d..4cdf90d 100644 --- a/src/frskybt.c +++ b/src/frskybt.c @@ -88,25 +88,54 @@ int setTrainer(uint8_t *addr, uint16_t chan_vals[BT_CHANNELS]) } //---------------------------------- -// Receieve Code +// Receive Code //---------------------------------- +// +// Both the Bluetooth Trainer frame (0x80 + 12 channel bytes + CRC, 14 inner +// bytes) and the S.Port telemetry frame forwarded by EdgeTX (8 byte +// SportTelemetryPacket + CRC, 9 inner bytes) use the same 0x7E delimited, +// 0x7D byte-stuffed framing. Instead of relying on a fixed 14 byte length we +// delimit frames on the raw 0x7E and classify them by their unstuffed length. -enum { STATE_DATA_IDLE, STATE_DATA_START, STATE_DATA_XOR, STATE_DATA_IN_FRAME }; +enum { STATE_DATA_IDLE, STATE_DATA_IN_FRAME, STATE_DATA_XOR }; -static uint8_t _otxbuffer[BLUETOOTH_LINE_LENGTH + 2] = {START_STOP}; -static uint8_t *otxbuffer = _otxbuffer + 1; -static uint8_t rsndbuf[BLUETOOTH_LINE_LENGTH + 2]; -uint8_t rsndbufindex = 0; -uint8_t otxbufferIndex = 0; -bool btprocessed = false; +#define FRSKY_SPORT_PACKET_SIZE 9 // 8 byte S.Port payload + XOR CRC +#define TRAINER_PACKET_SIZE BLUETOOTH_PACKET_SIZE // 0x80 + 12 channels + XOR CRC -void appendTrainerByte(uint8_t data) +static uint8_t rxFrame[BLUETOOTH_LINE_LENGTH]; +static uint8_t rxFrameIndex = 0; +static uint8_t dataState = STATE_DATA_IDLE; + +/** + * @brief Builds a 0x7E delimited, byte-stuffed frame from an already CRC'd + * payload (the CRC is expected to be the last payload byte). + * + * @return length written into dst + */ +static uint8_t buildFramedFrame(uint8_t *dst, const uint8_t *payload, uint8_t len) +{ + uint8_t idx = 0; + dst[idx++] = START_STOP; + for (uint8_t i = 0; i < len; i++) { + uint8_t byte = payload[i]; + if (byte == START_STOP || byte == BYTE_STUFF) { + dst[idx++] = BYTE_STUFF; + byte ^= STUFF_MASK; + } + dst[idx++] = byte; + } + dst[idx++] = START_STOP; + return idx; +} + +static void appendFrameByte(uint8_t data) { - if (otxbufferIndex < BLUETOOTH_LINE_LENGTH) { - otxbuffer[otxbufferIndex++] = data; + if (rxFrameIndex < sizeof(rxFrame)) { + rxFrame[rxFrameIndex++] = data; } else { - ESP_LOGE(FRSKYBT_TAG, "OTX Buffer Overflow"); - otxbufferIndex = 0; + ESP_LOGE(FRSKYBT_TAG, "RX Buffer Overflow"); + rxFrameIndex = 0; + dataState = STATE_DATA_IDLE; } } @@ -120,28 +149,64 @@ void processTrainerFrame(const uint8_t *otxbuffer) } if (settings.role == ROLE_BLE_PERIPHERAL) { - rsndbuf[rsndbufindex++] = 0x7e; - /*printf("BTDatOut "); - for(int i=0; i < rsndbufindex; i++) { - printf("%.2x ", rsndbuf[i]); - } - printf("\n");*/ - btp_sendChannelData(rsndbuf, rsndbufindex); + uint8_t outbuf[2 * TRAINER_PACKET_SIZE + 2]; + uint8_t outlen = buildFramedFrame(outbuf, otxbuffer, TRAINER_PACKET_SIZE); + btp_sendChannelData(outbuf, outlen); } } -void frSkyProcessByte(uint8_t data) +/** + * @brief Forwards an 8 byte S.Port telemetry packet (plus trailing CRC) to the + * connected BLE central, preserving the framing EdgeTX expects. + * + * frame[0] = physical id + * frame[1] = prim id (0x10 = data frame) + * frame[2..3]= data id (little endian) + * frame[4..7]= value (little endian) + * frame[8] = XOR CRC of the previous 8 bytes + */ +static void processSportFrame(const uint8_t *frame) +{ + if (settings.role == ROLE_BLE_PERIPHERAL) { + uint8_t outbuf[2 * FRSKY_SPORT_PACKET_SIZE + 2]; + uint8_t outlen = buildFramedFrame(outbuf, frame, FRSKY_SPORT_PACKET_SIZE); + btp_sendChannelData(outbuf, outlen); + } + + ESP_LOGD(FRSKYBT_TAG, "S.Port physical=%02X prim=%02X data=%04X", frame[0], frame[1], + (uint16_t)(frame[2] | (frame[3] << 8))); +} + +static void handleFrame(const uint8_t *frame, uint8_t len) { - static uint8_t dataState = STATE_DATA_IDLE; + if (len < 2) return; + + uint8_t crc = 0x00; + for (uint8_t i = 0; i < len - 1; i++) { + crc ^= frame[i]; + } + if (crc != frame[len - 1]) { + // logBTFrame(false, "CRC Fault"); + return; + } + if (len == TRAINER_PACKET_SIZE && frame[0] == TRAINER_FRAME) { + processTrainerFrame(frame); + // logBTFrame(true, ""); + } else if (len == FRSKY_SPORT_PACKET_SIZE) { + processSportFrame(frame); + } else { + // logBTFrame(false, "Unknown frame"); + } +} + +void frSkyProcessByte(uint8_t data) +{ switch (dataState) { - case STATE_DATA_START: + case STATE_DATA_IDLE: if (data == START_STOP) { + rxFrameIndex = 0; dataState = STATE_DATA_IN_FRAME; - otxbufferIndex = 0; - rsndbufindex = 0; - } else { - appendTrainerByte(data); } break; @@ -149,69 +214,20 @@ void frSkyProcessByte(uint8_t data) if (data == BYTE_STUFF) { dataState = STATE_DATA_XOR; // XOR next byte } else if (data == START_STOP) { - dataState = STATE_DATA_IN_FRAME; - otxbufferIndex = 0; - rsndbufindex = 0; + // Raw 0x7E can never appear inside a stuffed frame, so it delimits the end. + handleFrame(rxFrame, rxFrameIndex); + rxFrameIndex = 0; + dataState = STATE_DATA_IDLE; } else { - appendTrainerByte(data); + appendFrameByte(data); } break; case STATE_DATA_XOR: - switch (data) { - case BYTE_STUFF ^ STUFF_MASK: - case START_STOP ^ STUFF_MASK: - // Expected content, save the data - appendTrainerByte(data ^ STUFF_MASK); - dataState = STATE_DATA_IN_FRAME; - break; - case START_STOP: // Illegal situation, as we have START_STOP, try to start from the - // beginning - otxbufferIndex = 0; - rsndbufindex = 0; - dataState = STATE_DATA_IN_FRAME; - break; - default: - // Illegal situation, start looking for a new START_STOP byte - dataState = STATE_DATA_START; - break; - } - break; - - case STATE_DATA_IDLE: - if (data == START_STOP) { - otxbufferIndex = 0; - rsndbufindex = 0; - dataState = STATE_DATA_START; - } else { - appendTrainerByte(data); - } + appendFrameByte(data ^ STUFF_MASK); + dataState = STATE_DATA_IN_FRAME; break; } - - if (otxbufferIndex >= BLUETOOTH_PACKET_SIZE) { - if(rsndbufindex <= BLUETOOTH_LINE_LENGTH+1) - rsndbuf[rsndbufindex++] = data; - uint8_t crc = 0x00; - for (int i = 0; i < BLUETOOTH_PACKET_SIZE - 1; i++) { - crc ^= otxbuffer[i]; - } - if (crc == otxbuffer[BLUETOOTH_PACKET_SIZE - 1]) { - if (otxbuffer[0] == TRAINER_FRAME) { - processTrainerFrame(otxbuffer); - // logBTFrame(true, ""); - } else { - //logBTFrame(false, "Not a trainer frame"); - } - } else { - //logBTFrame(false, "CRC Fault"); - } - dataState = STATE_DATA_IDLE; - } else { - // Create a copy, split at start/stop - if(rsndbufindex <= BLUETOOTH_LINE_LENGTH+1) - rsndbuf[rsndbufindex++] = data; - } } void processFrame(const uint8_t *frame, uint8_t len) diff --git a/src/settings.h b/src/settings.h index 398f271..01baf0d 100644 --- a/src/settings.h +++ b/src/settings.h @@ -7,6 +7,7 @@ typedef struct { // uint8_t version // Todo the version info here, check on load it matches otherwise ignore char rmtbtaddr[13]; role_t role; + char name[LEN_BLUETOOTH_NAME]; // Name of the device to broadcast instead of ESP32 } settings_t; extern settings_t settings; From 7fc19c6ddf63b0a17d78c3dc0d0b080d18f6db49 Mon Sep 17 00:00:00 2001 From: Amigache Date: Sun, 4 Oct 2026 13:43:47 +0200 Subject: [PATCH 2/6] feat(bt): auto-connect to the last device and EdgeTX robustness - Auto-connect in central mode: continuous scan and connect as soon as the saved peer address appears (the peer's BLE address type is only known after scanning), including after a link loss. - Re-announce "Connected:" on AT+ROLE1 / AT+CON and every 2 s so EdgeTX reliably leaves "Not connected". - AT+CLEAR now forgets the saved peer (previously auto-connect brought it back); AT+DISC? drops the current link first so the OK+DISC lines are not interleaved with trainer frames; send "DisConnected" on link loss. - Require the "AT+" prefix when scanning for commands, to avoid false triggers inside binary telemetry/trainer frames. - Allow Bluetooth names up to 19 characters. --- src/bt_client.c | 54 ++++++++++++++++++-- src/bt_client.h | 3 ++ src/defines.h | 2 +- src/terminal.c | 132 ++++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 166 insertions(+), 25 deletions(-) diff --git a/src/bt_client.c b/src/bt_client.c index 55b7207..458e5eb 100644 --- a/src/bt_client.c +++ b/src/bt_client.c @@ -59,6 +59,7 @@ volatile bool btc_connected = false; volatile bool btc_scan_complete = true; volatile ble_board_type btc_board_type = BLE_BOARD_UNKNOWN; volatile bool btc_ht_reset = false; +static volatile bool btc_autoconnect = false; uint16_t bt_datahandle; uint16_t bt_htresethandle; @@ -456,6 +457,27 @@ static void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *par sizeof(esp_bd_addr_t)); } } + // Auto-connect: when looking for the last known device, connect as + // soon as it shows up in a scan result (so we know its address type). + if (btc_autoconnect && !btc_connected) { + esp_bd_addr_t saved; + strtobtaddr(saved, settings.rmtbtaddr); + if (memcmp(saved, scan_result->scan_rst.bda, sizeof(esp_bd_addr_t)) == 0) { + bool known = false; + for (int i = 0; i < bt_scanned_address_cnt; i++) { + if (memcmp(btc_scanned_addresses[i].addr, saved, sizeof(esp_bd_addr_t)) == 0) { + known = true; + break; + } + } + if (known) { + printf("Auto-connect: saved device found\r\n"); + btc_autoconnect = false; + btc_scan_stop(); + btc_connect(scan_result->scan_rst.bda); + } + } + } char addr[13]; btaddrtostr(addr, scan_result->scan_rst.bda); printf("Disc BT Address %s, RSSI=%d, Addr Type=%d\n", addr, scan_result->scan_rst.rssi, @@ -555,6 +577,7 @@ void btc_start_scan() return; } + btc_autoconnect = false; btc_scan_complete = false; bt_scanned_address_cnt = 0; printf("Clearing Addresses\r\n"); @@ -567,9 +590,33 @@ void btc_scan_stop() esp_ble_gap_stop_scanning(); } +bool btc_has_saved_address() +{ + return settings.rmtbtaddr[0] != '\0' && strcmp(settings.rmtbtaddr, "000000000000") != 0; +} + +/* Scans continuously until the last known device shows up, then btc_connect() + * is triggered from the scan result handler. Returns false when the module is + * not ready yet or already connected. */ +bool btc_start_autoconnect() +{ + if (!readytoscan || btc_connected) { + return false; + } + + btc_autoconnect = true; + btc_scan_complete = false; + btc_validslavefound = false; + bt_scanned_address_cnt = 0; + printf("Auto-connect: scanning for saved device\r\n"); + esp_ble_gap_start_scanning(0); // 0 = scan continuously until stopped + return true; +} + void btc_connect(esp_bd_addr_t addr) { if (btc_connected) return; + btc_autoconnect = false; btc_scan_complete = false; btc_validslavefound = false; char saddr[13]; @@ -583,6 +630,7 @@ void btc_connect(esp_bd_addr_t addr) esp_ble_gattc_open(gl_profile_tab[PROFILE_A_APP_ID].gattc_if, addr, BLE_ADDR_TYPE_PUBLIC, true); else if (btc_scanned_addresses[i].type == BLE_ADDR_TYPE_RANDOM) esp_ble_gattc_open(gl_profile_tab[PROFILE_A_APP_ID].gattc_if, addr, BLE_ADDR_TYPE_RANDOM, true); + connstarted = true; break; } } @@ -634,8 +682,6 @@ void btcInit() esp_ble_gap_get_local_used_addr(localbtaddress, &adrtype); vTaskDelay(pdMS_TO_TICKS(500)); - // Try to connect to saved address on startup - esp_bd_addr_t addr; - strtobtaddr(addr, settings.rmtbtaddr); - // btc_connect(addr); + // Auto-connect to the last known device is handled by the central state + // machine (CENTRAL_STATE_AUTOCONNECT) once scanning is ready. } \ No newline at end of file diff --git a/src/bt_client.h b/src/bt_client.h index 2d39308..5ae971f 100644 --- a/src/bt_client.h +++ b/src/bt_client.h @@ -48,4 +48,7 @@ extern volatile ble_board_type btc_board_type; void btcInit(); void btc_disconnect(); void btc_start_scan(); +void btc_scan_stop(); +bool btc_has_saved_address(); +bool btc_start_autoconnect(); void btc_dohtreset(); diff --git a/src/defines.h b/src/defines.h index 3520300..135917e 100644 --- a/src/defines.h +++ b/src/defines.h @@ -48,7 +48,7 @@ // Optional Debugging Options #define DEBUG_TIMERS -#define LEN_BLUETOOTH_NAME 10 +#define LEN_BLUETOOTH_NAME 20 #include extern const uart_port_t uart_num; diff --git a/src/terminal.c b/src/terminal.c index 18dbbc6..de00327 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -33,6 +33,7 @@ const uart_port_t uart_num = UART_NUM; typedef enum { CENTRAL_STATE_DISCONNECT, CENTRAL_STATE_IDLE, + CENTRAL_STATE_AUTOCONNECT, CENTRAL_STATE_SCAN_START, CENTRAL_STATE_SCANNING, CENTRAL_STATE_SCAN_COMPLETE, @@ -69,6 +70,38 @@ void sendBTMode() } } +/* Sends the "Connected" announcement block to the radio. Used when a + * connection is established and also to re-announce an already established + * connection (e.g. auto-connect finished before EdgeTX was listening). */ +void sendCentralConnected() +{ + if (curMode != ROLE_BLE_CENTRAL) return; + + btaddrtostr(rmtaddress, rmtbtaddress); + snprintf(reusablebuff, sizeof(reusablebuff), "Connected:%s\r\n", rmtaddress); + uart_write_bytes(uart_num, reusablebuff, strlen(reusablebuff)); + + snprintf(reusablebuff, sizeof(reusablebuff), + "MTU Size:65\r\nMTU Size: 65\r\nPHT Update Complete\r\nCurrent PHY:2M\r\n"); + uart_write_bytes(uart_num, reusablebuff, strlen(reusablebuff)); + + snprintf(reusablebuff, sizeof(reusablebuff), "Board:%s\r\n", str_ble_board_types[btc_board_type]); + uart_write_bytes(uart_num, reusablebuff, strlen(reusablebuff)); + + btCentralState = CENTRAL_STATE_CONNECTED; +} + +/* Sends the "Connected" announcement for peripheral mode. Used when a central + * connects, and periodically afterwards in case the radio missed the first. */ +void sendPeripheralConnected() +{ + if (curMode != ROLE_BLE_PERIPHERAL) return; + + btaddrtostr(rmtaddress, rmtbtaddress); + snprintf(reusablebuff, sizeof(reusablebuff), "Connected:%s\r\n", rmtaddress); + uart_write_bytes(uart_num, reusablebuff, strlen(reusablebuff)); +} + void parserATCommand(char atcommand[]) { // Strip trailing whitespace @@ -92,6 +125,11 @@ void parserATCommand(char atcommand[]) UART_WRITE_STRING(uart_num, "OK+Role:1\r\n"); setRole(ROLE_BLE_CENTRAL); sendBTMode(); + // If we are already connected (e.g. auto-connect finished before the radio + // was ready), re-announce it so EdgeTX moves to CONNECTED. + if (btc_connected) { + sendCentralConnected(); + } } else if (strncmp(atcommand, "+CON", 4) == 0) { if (curMode == ROLE_BLE_CENTRAL) { @@ -101,8 +139,13 @@ void parserATCommand(char atcommand[]) uart_write_bytes(uart_num, reusablebuff, strlen(reusablebuff)); // Store Remote Address to Connect to strcpy(rmtaddress, atcommand + 4); - // Start connection - btCentralState = CENTRAL_STATE_CONNECT; + if (btc_connected) { + // Already connected (e.g. via auto-connect) -> just re-announce. + sendCentralConnected(); + } else { + // Start connection + btCentralState = CENTRAL_STATE_CONNECT; + } } else { UART_WRITE_STRING(uart_num, "ERROR"); } @@ -122,15 +165,23 @@ void parserATCommand(char atcommand[]) } else if (strncmp(atcommand, "+DISC?", 6) == 0) { if (curMode == ROLE_BLE_CENTRAL) { ESP_LOGI(LOG_UART, "Discovery Requested"); + // Drop an existing connection first: otherwise the trainer frames being + // forwarded would interleave with the "OK+DISC" response lines and make + // EdgeTX miss them (stuck on "Scanning"). + if (btc_connected) { + btc_disconnect(); + } UART_WRITE_STRING(uart_num, "OK+DISCS\r\n"); laddcnt = 0; - if (btCentralState != CENTRAL_STATE_SCAN_START && btCentralState != CENTRAL_STATE_SCANNING) - btCentralState = CENTRAL_STATE_SCAN_START; + btCentralState = CENTRAL_STATE_SCAN_START; } } else if (strncmp(atcommand, "+CLEAR", 6) == 0) { if (curMode == ROLE_BLE_CENTRAL) { btCentralState = CENTRAL_STATE_DISCONNECT; + // Forget the paired device, otherwise auto-connect brings it back + memset(settings.rmtbtaddr, 0, sizeof(settings.rmtbtaddr)); + saveSettings(); UART_WRITE_STRING(uart_num, "OK+CLEAR\r\n"); } @@ -234,15 +285,19 @@ void runUARTHead() atcommandlen = -1; } } else { - // Scan for characters AT in the byte stream - static char lc = 0; - if (lc == 'A' && c == 'T') { + // Scan for the "AT+" prefix in the byte stream. Requiring the '+' + // (EdgeTX always sends "AT+...") avoids false triggers from 'A','T' + // sequences inside binary telemetry/trainer frames. + static char lc1 = 0; + static char lc2 = 0; + if (lc2 == 'A' && lc1 == 'T' && c == '+') { atcommandlen = 0; + atcommand[atcommandlen++] = '+'; } else { frSkyProcessByte(c); } - - lc = c; + lc2 = lc1; + lc1 = c; } } @@ -297,6 +352,18 @@ void runBTCentral() case CENTRAL_STATE_DISCONNECT: { // Stop scanning, disconnect from all periferials btc_disconnect(); + // Reconnect to the last known device when available + if (!btc_connected && btc_has_saved_address()) { + btCentralState = CENTRAL_STATE_AUTOCONNECT; + } + break; + } + case CENTRAL_STATE_AUTOCONNECT: { + if (btc_connected) { + btCentralState = CENTRAL_STATE_CONNECTED; + } else if (btc_start_autoconnect()) { + btCentralState = CENTRAL_STATE_WAITING_CONNECTION; + } break; } case CENTRAL_STATE_SCAN_START: { @@ -326,12 +393,10 @@ void runBTCentral() break; } case CENTRAL_STATE_IDLE: { - // TODO Automatically try to connect to the last known bluetooth address - // esp_bd_addr_t btaddr; - // if(!readBTAddress(btaddr)) { - // btCentralState = CENTRAL_STATE_CONNECT; - //} - // Do Nothing + // Try to reconnect to the last known bluetooth address + if (!btc_connected && btc_has_saved_address()) { + btCentralState = CENTRAL_STATE_AUTOCONNECT; + } break; } @@ -346,6 +411,9 @@ void runBTCentral() case CENTRAL_STATE_WAITING_CONNECTION: { if (btc_scan_complete) { if (btc_validslavefound) { + // btc_connect() stores the actual remote address, which is also the + // right value when we got here through auto-connect. + btaddrtostr(rmtaddress, rmtbtaddress); sprintf(reusablebuff, "Connected:%s\r\n", rmtaddress); uart_write_bytes(uart_num, reusablebuff, strlen(reusablebuff)); sprintf( @@ -367,8 +435,27 @@ void runBTCentral() case CENTRAL_STATE_CONNECTED: { if (!btc_connected) { // Connection Lost - btCentralState = CENTRAL_STATE_CONNECT; + // Tell the radio so EdgeTX leaves the CONNECTED state. The leading + // 0x7E resets EdgeTX's trainer frame parser to a known state so the + // "DisConnected" text is always recognised. + static const char disconnMsg[] = "\x7e" "DisConnected\r\n"; + uart_write_bytes(uart_num, disconnMsg, sizeof(disconnMsg) - 1); + if (btc_has_saved_address()) { + btCentralState = CENTRAL_STATE_AUTOCONNECT; + } else { + btCentralState = CENTRAL_STATE_CONNECT; + } + } else { + // Re-announce periodically in case the radio missed the initial + // "Connected:" message (e.g. it was not in an accepting state yet). + static int64_t lastAnnounce = 0; + int64_t now = esp_timer_get_time(); + if (now - lastAnnounce > 2000000) { // every 2s + lastAnnounce = now; + sendCentralConnected(); + } } + break; } } } @@ -378,10 +465,7 @@ void runBTPeripherial() switch (btPeripherialState) { case PERIPHERIAL_STATE_DISCONNECTED: if (btp_connected) { - // Save Remote Address - btaddrtostr(rmtaddress, rmtbtaddress); - sprintf(reusablebuff, "Connected:%s\r\n", rmtaddress); - uart_write_bytes(uart_num, reusablebuff, strlen(reusablebuff)); + sendPeripheralConnected(); btPeripherialState = PERIPHERIAL_STATE_CONNECTED; } break; @@ -389,6 +473,14 @@ void runBTPeripherial() if (!btp_connected) { btPeripherialState = PERIPHERIAL_STATE_DISCONNECTED; uart_write_bytes(uart_num, "DisConnected\r\nERROR\r\nERROR\r\n", 28); + } else { + // Re-announce periodically in case the radio missed the first one. + static int64_t lastAnnounce = 0; + int64_t now = esp_timer_get_time(); + if (now - lastAnnounce > 2000000) { // every 2s + lastAnnounce = now; + sendPeripheralConnected(); + } } break; } From ee6a51e2a934f64b0046c6ce8fb354a7306af951 Mon Sep 17 00:00:00 2001 From: Amigache Date: Sun, 4 Oct 2026 13:43:47 +0200 Subject: [PATCH 3/6] feat(nimble): selectable NimBLE BLE host Add an alternative BLE host based on Apache NimBLE, selectable with -DUSE_NIMBLE (build environment C3SuperMini_nimble and sdkconfig.C3SuperMini_nimble). The Bluedroid implementation is kept behind #if !defined(USE_NIMBLE). - bt.c: NimBLE host init/disable and the shared host task. - bt_server.c: peripheral (service 0xFFF0, characteristic 0xFFF6, raw advertising with the radio name, notify). - bt_client.c: central (scan, connect, discovery, CCCD subscribe, notify -> UART). NimBLE-specific fixes found during hardware validation: - reverse addresses between NimBLE's little-endian wire order and the display order used by btaddrtostr()/strtobtaddr(); - store the connected central address so "Connected:" is meaningful; - accept 128-bit UUIDs built on the Bluetooth base UUID as their 16-bit alias (some peripherals expose 0xFFF0/0xFFF6 that way); - set the initiator scan interval/window (zero made the controller reject the connect with HCI 0x12). Footprint on the ESP32-C3 (1 MB app): Bluedroid ~84% flash / 8.8% RAM, NimBLE ~52% flash / 6.3% RAM. --- platformio.ini | 18 + sdkconfig.C3SuperMini_nimble | 2110 ++++++++++++++++++++++++++++++++++ src/bt.c | 86 +- src/bt.h | 12 + src/bt_client.c | 393 ++++++- src/bt_client.h | 6 + src/bt_server.c | 223 +++- 7 files changed, 2823 insertions(+), 25 deletions(-) create mode 100644 sdkconfig.C3SuperMini_nimble diff --git a/platformio.ini b/platformio.ini index c52e4bc..7444d63 100644 --- a/platformio.ini +++ b/platformio.ini @@ -131,3 +131,21 @@ build_flags = -DCPU_ESP32=y -DBLUETOOTH=y -DBLUETOOTH5=y + +; NimBLE experiment build (same board, NimBLE host instead of Bluedroid) +[env:C3SuperMini_nimble] +board_build.flash_mode: dio +board = esp32-c3-devkitm-1 +board_build.esp-idf.sdkconfig_path = sdkconfig.C3SuperMini_nimble +upload_protocol = esptool +build_type = debug +monitor_speed = 115200 +upload_port = COM9 +monitor_port = COM9 +build_flags = + -DRTOS_FREERTOS=y + -DPCB_C3SUPERMINI=y + -DCPU_ESP32=y + -DBLUETOOTH=y + -DBLUETOOTH5=y + -DUSE_NIMBLE=y diff --git a/sdkconfig.C3SuperMini_nimble b/sdkconfig.C3SuperMini_nimble new file mode 100644 index 0000000..a87f0f4 --- /dev/null +++ b/sdkconfig.C3SuperMini_nimble @@ -0,0 +1,2110 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.2.1 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_XT_WDT_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_HAS_EFUSE_RST_BUG=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_MEMPROT_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_ASSIST_DEBUG_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_ARBITER_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=5 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=1 +CONFIG_SOC_ADC_PATT_LEN_MAX=8 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_APB_BACKUP_DMA=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y +CONFIG_SOC_CACHE_MEMORY_IBANK_SIZE=0x4000 +CONFIG_SOC_CPU_CORES_NUM=1 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FLEXIBLE_INTC=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=8 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=8 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x80000000 +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=3072 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=3 +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=22 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FILTER_CLK_SUPPORT_APB=y +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP=y +CONFIG_SOC_GPIO_IN_RANGE_MAX=21 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=21 +CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK=0 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x00000000003FFFC0 +CONFIG_SOC_GPIO_CLOCKOUT_BY_GPIO_MATRIX=y +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y +CONFIG_SOC_I2C_NUM=1 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2S_NUM=1 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_CHANNEL_NUM=6 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=14 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=2 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=4 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=108 +CONFIG_SOC_RTCIO_PIN_COUNT=0 +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=3072 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=4 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_PERIPH_NUM=2 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_IDLE_INTR=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_CHECK_SUS=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=1 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=2 +CONFIG_SOC_MWDT_SUPPORT_XTAL=y +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=16384 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_PAD_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 +CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=512 +CONFIG_SOC_UART_NUM=2 +CONFIG_SOC_UART_HP_NUM=2 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_MAC_BB_PD_MEM_SIZE=192 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_WIFI_PD=y +CONFIG_SOC_PM_SUPPORT_BT_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_CPU_RETENTION_BY_RTCCNTL=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_BACKUPDMA=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TARGET_ARCH_RISCV=y +CONFIG_IDF_TARGET_ARCH="riscv" +CONFIG_IDF_TARGET="esp32c3" +CONFIG_IDF_INIT_VERSION="5.4.0" +CONFIG_IDF_TARGET_ESP32C3=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0005 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=3 +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +CONFIG_ESPTOOLPY_FLASHMODE_DIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_40M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT=y +CONFIG_ESPTOOLPY_FLASHFREQ="40m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_SINGLE_APP=y +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_USB_CDC is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +CONFIG_BT_ENABLED=y +# CONFIG_BT_BLUEDROID_ENABLED is not set +CONFIG_BT_NIMBLE_ENABLED=y +# CONFIG_BT_CONTROLLER_ONLY is not set +CONFIG_BT_CONTROLLER_ENABLED=y +# CONFIG_BT_CONTROLLER_DISABLED is not set + +# +# NimBLE Options +# +CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL=y +# CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT is not set +# CONFIG_BT_NIMBLE_LOG_LEVEL_NONE is not set +# CONFIG_BT_NIMBLE_LOG_LEVEL_ERROR is not set +# CONFIG_BT_NIMBLE_LOG_LEVEL_WARNING is not set +CONFIG_BT_NIMBLE_LOG_LEVEL_INFO=y +# CONFIG_BT_NIMBLE_LOG_LEVEL_DEBUG is not set +CONFIG_BT_NIMBLE_LOG_LEVEL=1 +CONFIG_BT_NIMBLE_MAX_CONNECTIONS=3 +CONFIG_BT_NIMBLE_MAX_BONDS=3 +CONFIG_BT_NIMBLE_MAX_CCCDS=8 +CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM=0 +CONFIG_BT_NIMBLE_PINNED_TO_CORE=0 +CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=4096 +CONFIG_BT_NIMBLE_ROLE_CENTRAL=y +CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y +CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y +CONFIG_BT_NIMBLE_ROLE_OBSERVER=y +# CONFIG_BT_NIMBLE_NVS_PERSIST is not set +CONFIG_BT_NIMBLE_SECURITY_ENABLE=y +CONFIG_BT_NIMBLE_SM_LEGACY=y +CONFIG_BT_NIMBLE_SM_SC=y +# CONFIG_BT_NIMBLE_SM_SC_DEBUG_KEYS is not set +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=y +CONFIG_BT_NIMBLE_SM_SC_LVL=0 +# CONFIG_BT_NIMBLE_DEBUG is not set +# CONFIG_BT_NIMBLE_DYNAMIC_SERVICE is not set +CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="nimble" +CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31 +CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256 +CONFIG_BT_NIMBLE_SVC_GAP_APPEARANCE=0 + +# +# Memory Settings +# +CONFIG_BT_NIMBLE_MSYS_1_BLOCK_COUNT=12 +CONFIG_BT_NIMBLE_MSYS_1_BLOCK_SIZE=256 +CONFIG_BT_NIMBLE_MSYS_2_BLOCK_COUNT=24 +CONFIG_BT_NIMBLE_MSYS_2_BLOCK_SIZE=320 +CONFIG_BT_NIMBLE_TRANSPORT_ACL_FROM_LL_COUNT=24 +CONFIG_BT_NIMBLE_TRANSPORT_ACL_SIZE=255 +CONFIG_BT_NIMBLE_TRANSPORT_EVT_SIZE=70 +CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=30 +CONFIG_BT_NIMBLE_TRANSPORT_EVT_DISCARD_COUNT=8 +# end of Memory Settings + +CONFIG_BT_NIMBLE_GATT_MAX_PROCS=4 +# CONFIG_BT_NIMBLE_HS_FLOW_CTRL is not set +CONFIG_BT_NIMBLE_RPA_TIMEOUT=900 +# CONFIG_BT_NIMBLE_MESH is not set +CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS=y +CONFIG_BT_NIMBLE_HS_STOP_TIMEOUT_MS=2000 +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=y +CONFIG_BT_NIMBLE_MAX_CONN_REATTEMPT=3 +CONFIG_BT_NIMBLE_50_FEATURE_SUPPORT=y +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_2M_PHY=y +CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_CODED_PHY=y +# CONFIG_BT_NIMBLE_EXT_ADV is not set +CONFIG_BT_NIMBLE_MAX_PERIODIC_SYNCS=0 +# CONFIG_BT_NIMBLE_GATT_CACHING is not set +CONFIG_BT_NIMBLE_WHITELIST_SIZE=12 +# CONFIG_BT_NIMBLE_TEST_THROUGHPUT_TEST is not set +# CONFIG_BT_NIMBLE_BLUFI_ENABLE is not set +CONFIG_BT_NIMBLE_USE_ESP_TIMER=y +CONFIG_BT_NIMBLE_LEGACY_VHCI_ENABLE=y +# CONFIG_BT_NIMBLE_BLE_GATT_BLOB_TRANSFER is not set + +# +# GAP Service +# + +# +# GAP Appearance write permissions +# +# CONFIG_BT_NIMBLE_SVC_GAP_APPEAR_WRITE is not set +# end of GAP Appearance write permissions + +CONFIG_BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM=0 +CONFIG_BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ENC=0 +CONFIG_BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ATHN=0 +CONFIG_BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ATHR=0 +CONFIG_BT_NIMBLE_SVC_GAP_CAR_CHAR_NOT_SUPP=y +# CONFIG_BT_NIMBLE_SVC_GAP_CAR_NOT_SUPP is not set +# CONFIG_BT_NIMBLE_SVC_GAP_CAR_SUPP is not set +CONFIG_BT_NIMBLE_SVC_GAP_CENT_ADDR_RESOLUTION=-1 + +# +# GAP device name write permissions +# +# CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE is not set +# end of GAP device name write permissions + +CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM=0 +CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_ENC=0 +CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHEN=0 +CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHOR=0 +CONFIG_BT_NIMBLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL=0 +CONFIG_BT_NIMBLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL=0 +CONFIG_BT_NIMBLE_SVC_GAP_PPCP_SLAVE_LATENCY=0 +CONFIG_BT_NIMBLE_SVC_GAP_PPCP_SUPERVISION_TMO=0 +# end of GAP Service + +# +# BLE Services +# +# CONFIG_BT_NIMBLE_HID_SERVICE is not set +# end of BLE Services + +# CONFIG_BT_NIMBLE_VS_SUPPORT is not set +# CONFIG_BT_NIMBLE_HIGH_DUTY_ADV_ITVL is not set +# CONFIG_BT_NIMBLE_HOST_QUEUE_CONG_CHECK is not set + +# +# Host-controller Transport +# +CONFIG_UART_PARITY_NONE=y +# CONFIG_UART_PARITY_ODD is not set +# CONFIG_UART_PARITY_EVEN is not set +CONFIG_BT_NIMBLE_TRANSPORT_UART_PARITY_NONE=1 +CONFIG_BT_NIMBLE_TRANSPORT_UART_PARITY_ODD=0 +CONFIG_BT_NIMBLE_TRANSPORT_UART_PARITY_EVEN=0 +CONFIG_UART_HW_FLOWCTRL_DISABLE=y +# CONFIG_UART_HW_FLOWCTRL_CTS_RTS is not set +CONFIG_BT_NIMBLE_HCI_UART_FLOW_CTRL=0 +CONFIG_BT_NIMBLE_HCI_UART_RTS_PIN=19 +CONFIG_BT_NIMBLE_HCI_UART_CTS_PIN=23 +# end of Host-controller Transport +# end of NimBLE Options + +# +# Controller Options +# +CONFIG_BT_CTRL_MODE_EFF=1 +CONFIG_BT_CTRL_BLE_MAX_ACT=10 +CONFIG_BT_CTRL_BLE_MAX_ACT_EFF=10 +CONFIG_BT_CTRL_BLE_STATIC_ACL_TX_BUF_NB=0 +CONFIG_BT_CTRL_PINNED_TO_CORE=0 +CONFIG_BT_CTRL_HCI_MODE_VHCI=y +# CONFIG_BT_CTRL_HCI_MODE_UART_H4 is not set +CONFIG_BT_CTRL_HCI_TL=1 +CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=30 +CONFIG_BT_BLE_CCA_MODE_NONE=y +# CONFIG_BT_BLE_CCA_MODE_HW is not set +# CONFIG_BT_BLE_CCA_MODE_SW is not set +CONFIG_BT_BLE_CCA_MODE=0 +CONFIG_BT_CTRL_HW_CCA_VAL=20 +CONFIG_BT_CTRL_HW_CCA_EFF=0 +CONFIG_BT_CTRL_CE_LENGTH_TYPE_ORIG=y +# CONFIG_BT_CTRL_CE_LENGTH_TYPE_CE is not set +# CONFIG_BT_CTRL_CE_LENGTH_TYPE_SD is not set +CONFIG_BT_CTRL_CE_LENGTH_TYPE_EFF=0 +CONFIG_BT_CTRL_TX_ANTENNA_INDEX_0=y +# CONFIG_BT_CTRL_TX_ANTENNA_INDEX_1 is not set +CONFIG_BT_CTRL_TX_ANTENNA_INDEX_EFF=0 +CONFIG_BT_CTRL_RX_ANTENNA_INDEX_0=y +# CONFIG_BT_CTRL_RX_ANTENNA_INDEX_1 is not set +CONFIG_BT_CTRL_RX_ANTENNA_INDEX_EFF=0 +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N24 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N21 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N18 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N15 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N12 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N9 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N6 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N3 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_N0 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_P3 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_P6 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_P9 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_P12 is not set +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_P15 is not set +CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_P18=y +# CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_P21 is not set +CONFIG_BT_CTRL_DFT_TX_POWER_LEVEL_EFF=14 +CONFIG_BT_CTRL_BLE_ADV_REPORT_FLOW_CTRL_SUPP=y +CONFIG_BT_CTRL_BLE_ADV_REPORT_FLOW_CTRL_NUM=100 +CONFIG_BT_CTRL_BLE_ADV_REPORT_DISCARD_THRSHOLD=20 +# CONFIG_BT_CTRL_BLE_SCAN_DUPL is not set +# CONFIG_BT_CTRL_COEX_PHY_CODED_TX_RX_TLIM_EN is not set +CONFIG_BT_CTRL_COEX_PHY_CODED_TX_RX_TLIM_DIS=y +CONFIG_BT_CTRL_COEX_PHY_CODED_TX_RX_TLIM_EFF=0 + +# +# MODEM SLEEP Options +# +# CONFIG_BT_CTRL_MODEM_SLEEP is not set +# end of MODEM SLEEP Options + +CONFIG_BT_CTRL_SLEEP_MODE_EFF=0 +CONFIG_BT_CTRL_SLEEP_CLOCK_EFF=0 +CONFIG_BT_CTRL_HCI_TL_EFF=1 +# CONFIG_BT_CTRL_AGC_RECORRECT_EN is not set +# CONFIG_BT_CTRL_SCAN_BACKOFF_UPPERLIMITMAX is not set +# CONFIG_BT_BLE_ADV_DATA_LENGTH_ZERO_AUX is not set +# end of Controller Options +# end of Bluetooth + +# CONFIG_BLE_MESH is not set + +# +# Driver Configurations +# + +# +# Legacy ADC Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Configuration + +# +# SPI Configuration +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of SPI Configuration + +# +# TWAI Configuration +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of TWAI Configuration + +# +# Temperature sensor Configuration +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# end of Temperature sensor Configuration + +# +# UART Configuration +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of UART Configuration + +# +# GPIO Configuration +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of GPIO Configuration + +# +# Sigma Delta Modulator Configuration +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of Sigma Delta Modulator Configuration + +# +# GPTimer Configuration +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of GPTimer Configuration + +# +# RMT Configuration +# +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# end of RMT Configuration + +# +# I2S Configuration +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of I2S Configuration + +# +# USB Serial/JTAG Configuration +# +# end of USB Serial/JTAG Configuration + +# +# LEDC Configuration +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of LEDC Configuration + +# +# I2C Configuration +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# end of I2C Configuration +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set +# CONFIG_ADC_ONESHOT_FORCE_USE_ADC2_ON_C3 is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +# end of Common ESP-related + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +# CONFIG_ETH_SPI_ETHERNET_W5500 is not set +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +# end of GDB Stub + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 +CONFIG_HTTPD_MAX_URI_LEN=512 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +# CONFIG_HTTPD_WS_SUPPORT is not set +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# Chip revision +# +# CONFIG_ESP32C3_REV_MIN_0 is not set +# CONFIG_ESP32C3_REV_MIN_1 is not set +# CONFIG_ESP32C3_REV_MIN_2 is not set +CONFIG_ESP32C3_REV_MIN_3=y +# CONFIG_ESP32C3_REV_MIN_4 is not set +# CONFIG_ESP32C3_REV_MIN_101 is not set +CONFIG_ESP32C3_REV_MIN_FULL=3 +CONFIG_ESP_REV_MIN_FULL=3 + +# +# Maximum Supported ESP32-C3 Revision (Rev v1.99) +# +CONFIG_ESP32C3_REV_MAX_FULL=199 +CONFIG_ESP_REV_MAX_FULL=199 +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +# CONFIG_ESP32C3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32C3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32C3_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=0 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +CONFIG_ESP_SLEEP_SYSTIMER_STALL_WORKAROUND=y + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# GDMA Configuration +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# end of GDMA Configuration + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config +# end of Hardware Settings + +# +# LCD and Touch Panel +# + +# +# LCD Touch Drivers are maintained in the IDF Component Registry +# + +# +# LCD Peripheral Configuration +# +CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32 +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of LCD Peripheral Configuration +# end of LCD and Touch Panel + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +CONFIG_ESP_PHY_REDUCE_TX_POWER=y +CONFIG_ESP_PHY_ENABLE_USB=y +# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +# end of PHY + +# +# Power Management +# +# CONFIG_PM_ENABLE is not set +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +# end of Power Management + +# +# ESP PSRAM +# + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=160 +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y +# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=5 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +# end of Brownout Detector + +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP_SYSTEM_HW_STACK_GUARD=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 +# end of IPC (Inter-Processor Call) + +# +# High resolution timer (esp_timer) +# +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY=0x1 +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of High resolution timer (esp_timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP_WIFI_IRAM_OPT=y +# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +# CONFIG_ESP_WIFI_GMAC_SUPPORT is not set +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=2 +CONFIG_FATFS_LFN_NONE=y +# CONFIG_FATFS_LFN_HEAP is not set +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_OPTIMIZED_SCHEDULER=y +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=2304 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set +# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y +CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log output +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=3 +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +# CONFIG_LWIP_NETIF_API is not set +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=10 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +# CONFIG_LWIP_IP_FORWARD is not set +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=68 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 +CONFIG_LWIP_TCP_WND_DEFAULT=5744 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_LWIP_PPP_SUPPORT is not set +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=1 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y +# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +CONFIG_MBEDTLS_ECDH_LEGACY_CONTEXT=y +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +CONFIG_MBEDTLS_ECP_RESTARTABLE=y +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_MPI=y +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA512_C=y +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +# CONFIG_MBEDTLS_HKDF_C is not set +# CONFIG_MBEDTLS_THREADING_C is not set +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# Newlib +# +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# end of Newlib + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# Thread Operational Dataset +# +CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64" +CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 +CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 +CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff" +CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53" +# end of Thread Operational Dataset + +CONFIG_OPENTHREAD_XTAL_ACCURACY=130 +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE is not set + +# +# Thread Address Query Config +# +# end of Thread Address Query Config +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +CONFIG_SPI_FLASH_SUSPEND_QVL_SUPPORTED=y +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORTED=y +CONFIG_SPI_FLASH_VENDOR_TH_SUPPORTED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# end of Unity unit testing library + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=8 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +# CONFIG_WIFI_PROV_BLE_BONDING is not set +CONFIG_WIFI_PROV_BLE_SEC_CONN=y +CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION=y +# CONFIG_WIFI_PROV_KEEP_BLE_ON_AFTER_PROV is not set +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +# CONFIG_FLASHMODE_QIO is not set +# CONFIG_FLASHMODE_QOUT is not set +CONFIG_FLASHMODE_DIO=y +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +# CONFIG_BLUEDROID_ENABLED is not set +CONFIG_NIMBLE_ENABLED=y +CONFIG_NIMBLE_MEM_ALLOC_MODE_INTERNAL=y +# CONFIG_NIMBLE_MEM_ALLOC_MODE_DEFAULT is not set +CONFIG_NIMBLE_MAX_CONNECTIONS=3 +CONFIG_NIMBLE_MAX_BONDS=3 +CONFIG_NIMBLE_MAX_CCCDS=8 +CONFIG_NIMBLE_L2CAP_COC_MAX_NUM=0 +CONFIG_NIMBLE_PINNED_TO_CORE=0 +CONFIG_NIMBLE_TASK_STACK_SIZE=4096 +CONFIG_BT_NIMBLE_TASK_STACK_SIZE=4096 +CONFIG_NIMBLE_ROLE_CENTRAL=y +CONFIG_NIMBLE_ROLE_PERIPHERAL=y +CONFIG_NIMBLE_ROLE_BROADCASTER=y +CONFIG_NIMBLE_ROLE_OBSERVER=y +# CONFIG_NIMBLE_NVS_PERSIST is not set +CONFIG_NIMBLE_SM_LEGACY=y +CONFIG_NIMBLE_SM_SC=y +# CONFIG_NIMBLE_SM_SC_DEBUG_KEYS is not set +# CONFIG_NIMBLE_DEBUG is not set +CONFIG_NIMBLE_SVC_GAP_DEVICE_NAME="nimble" +CONFIG_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31 +CONFIG_NIMBLE_ATT_PREFERRED_MTU=256 +CONFIG_NIMBLE_SVC_GAP_APPEARANCE=0 +CONFIG_BT_NIMBLE_MSYS1_BLOCK_COUNT=12 +CONFIG_BT_NIMBLE_ACL_BUF_COUNT=24 +CONFIG_BT_NIMBLE_ACL_BUF_SIZE=255 +CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70 +CONFIG_BT_NIMBLE_HCI_EVT_HI_BUF_COUNT=30 +CONFIG_BT_NIMBLE_HCI_EVT_LO_BUF_COUNT=8 +# CONFIG_NIMBLE_HS_FLOW_CTRL is not set +CONFIG_NIMBLE_RPA_TIMEOUT=900 +# CONFIG_NIMBLE_MESH is not set +CONFIG_NIMBLE_CRYPTO_STACK_MBEDTLS=y +# CONFIG_BT_NIMBLE_COEX_PHY_CODED_TX_RX_TLIM_EN is not set +CONFIG_BT_NIMBLE_COEX_PHY_CODED_TX_RX_TLIM_DIS=y +CONFIG_SW_COEXIST_ENABLE=y +CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y +CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +# CONFIG_OTA_ALLOW_HTTP is not set +CONFIG_ESP_SYSTEM_PD_FLASH=y +CONFIG_ESP32C3_LIGHTSLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP32C3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32C3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32C3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32C3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32C3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +CONFIG_REDUCE_PHY_TX_POWER=y +CONFIG_ESP32_REDUCE_PHY_TX_POWER=y +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +# CONFIG_ESP32C3_DEFAULT_CPU_FREQ_80 is not set +CONFIG_ESP32C3_DEFAULT_CPU_FREQ_160=y +CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ=160 +CONFIG_ESP32C3_MEMPROT_FEATURE=y +CONFIG_ESP32C3_MEMPROT_FEATURE_LOCK=y +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_MAIN_TASK_STACK_SIZE=3584 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=5 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32C3_DEBUG_OCDAWARE=y +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32C3_BROWNOUT_DET=y +CONFIG_ESP32C3_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32C3_BROWNOUT_DET_LVL_SEL_2 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP32C3_BROWNOUT_DET_LVL=7 +CONFIG_IPC_TASK_STACK_SIZE=1024 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_WPA_TESTING_OPTIONS is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=2048 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=5744 +CONFIG_TCP_WND_DEFAULT=5744 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_ESP32C3_TIME_SYSCALL_USE_RTC_SYSTIMER=y +# CONFIG_ESP32C3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32C3_TIME_SYSCALL_USE_SYSTIMER is not set +# CONFIG_ESP32C3_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/src/bt.c b/src/bt.c index 12001fa..dee9197 100644 --- a/src/bt.c +++ b/src/bt.c @@ -6,20 +6,28 @@ #include -#include "defines.h" -#include "settings.h" #include "esp_bt.h" -#include "esp_bt_main.h" #include "esp_err.h" #include "esp_log.h" #include "freertos/task.h" +#if defined(USE_NIMBLE) +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "host/ble_hs.h" +#include "services/gap/ble_svc_gap.h" +#else +#include "esp_bt_main.h" +#endif + #define LOG_BT "BT" +#define MAX_BTNAME_LEN 50 esp_bd_addr_t localbtaddress; esp_bd_addr_t rmtbtaddress; +char btname[MAX_BTNAME_LEN] = "Hello"; void strtobtaddr(esp_bd_addr_t dest, char *src) { @@ -38,8 +46,68 @@ char *btaddrtostr(char dest[13], esp_bd_addr_t src) return dest; } +#if defined(USE_NIMBLE) +/* NimBLE reports addresses in little-endian (over-the-air) order, while + * btaddrtostr()/strtobtaddr() use display order. Reverse between the two. */ +void btReverseAddr(const uint8_t *src, uint8_t *dst) +{ + for (int i = 0; i < 6; i++) { + dst[i] = src[5 - i]; + } +} +#endif + bool memreleased = false; +#if defined(USE_NIMBLE) + +static void bt_on_reset(int reason) +{ + ESP_LOGE(LOG_BT, "NimBLE reset; reason=%d", reason); +} + +void bt_host_task(void *param) +{ + nimble_port_run(); + nimble_port_freertos_deinit(); +} + +void bt_init() +{ + esp_err_t ret = nimble_port_init(); + if (ret != ESP_OK) { + ESP_LOGE(LOG_BT, "nimble_port_init failed: %s", esp_err_to_name(ret)); + return; + } + + ble_hs_cfg.reset_cb = bt_on_reset; + // gatts_register_cb / sync_cb are set by the role init (btpInit / btcInit), + // which also starts the host task once the role is configured. + + esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, ESP_PWR_LVL_P9); +} + +void bt_disable() +{ + ESP_LOGI(LOG_BT, "Disabling Bluetooth (NimBLE)"); + nimble_port_stop(); + vTaskDelay(pdMS_TO_TICKS(BT_PAUSE_BEFORE_RESTART)); + nimble_port_deinit(); + + ESP_LOGI(LOG_BT, "Pausing to shutdown"); + vTaskDelay(pdMS_TO_TICKS(BT_PAUSE_BEFORE_RESTART)); +} + +void btSetName(const char *name) +{ + strncpy(btname, name, sizeof(btname)); + btname[sizeof(btname) - 1] = '\0'; + ble_svc_gap_device_name_set(btname); + ESP_LOGI(LOG_BT, "Setting BT Name %s", name); +} + +#else // !USE_NIMBLE (Bluedroid) + void bt_init() { esp_err_t ret; @@ -91,9 +159,9 @@ void bt_disable() void btSetName(const char *name) { - strncpy(settings.name, name, sizeof(settings.name)); - settings.name[sizeof(settings.name) - 1] = '\0'; - saveSettings(); - - ESP_LOGI(LOG_BT, "Setting BT Name %s", settings.name); -} \ No newline at end of file + strncpy(btname, name, sizeof(btname)); + btname[sizeof(btname) - 1] = '\0'; + ESP_LOGI(LOG_BT, "Setting BT Name %s", name); +} + +#endif // USE_NIMBLE diff --git a/src/bt.h b/src/bt.h index 2e1b626..aa39081 100644 --- a/src/bt.h +++ b/src/bt.h @@ -1,6 +1,11 @@ #pragma once +#if defined(USE_NIMBLE) +#include +typedef uint8_t esp_bd_addr_t[6]; +#else #include "esp_bt_defs.h" +#endif #define BT_PAUSE_BEFORE_RESTART 250 // ms @@ -17,3 +22,10 @@ char *btaddrtostr(char dest[13], esp_bd_addr_t src); void bt_disable(); void bt_init(); void btSetName(const char *name); + +#if defined(USE_NIMBLE) +/* NimBLE host task (runs nimble_port_run), shared by server and client. */ +void bt_host_task(void *param); +/* Reverses a 6 byte address between NimBLE wire order and display order. */ +void btReverseAddr(const uint8_t *src, uint8_t *dst); +#endif diff --git a/src/bt_client.c b/src/bt_client.c index 458e5eb..5dd922b 100644 --- a/src/bt_client.c +++ b/src/bt_client.c @@ -21,12 +21,6 @@ #include "bt.h" #include "defines.h" -#include "esp_bt.h" -#include "esp_bt_main.h" -#include "esp_gap_ble_api.h" -#include "esp_gatt_common_api.h" -#include "esp_gatt_defs.h" -#include "esp_gattc_api.h" #include "esp_log.h" #include "esp_timer.h" #include "freertos/FreeRTOS.h" @@ -34,7 +28,16 @@ #include "settings.h" #include "terminal.h" -#if defined(BLUETOOTH5) +#if !defined(USE_NIMBLE) +#include "esp_bt.h" +#include "esp_bt_main.h" +#include "esp_gap_ble_api.h" +#include "esp_gatt_common_api.h" +#include "esp_gatt_defs.h" +#include "esp_gattc_api.h" +#endif + +#if defined(BLUETOOTH5) && !defined(USE_NIMBLE) #include "esp_gap_ble_api.h" #endif @@ -42,10 +45,375 @@ #define REMOTE_SERVICE_UUID 0xFFF0 #define REMOTE_FRSKY_CHAR_UUID 0xFFF6 #define REMOTE_HTRESET_CHAR_UUID 0xAFF2 +#define REMOTE_HTCHAN_CHAR_UUID 0xAFF1 #define PROFILE_NUM 1 #define PROFILE_A_APP_ID 0 #define INVALID_HANDLE 0 +#if defined(USE_NIMBLE) + +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "host/ble_hs.h" +#include "host/ble_hs_mbuf.h" +#include "host/util/util.h" +#include "host/ble_gap.h" +#include "host/ble_gatt.h" +#include "os/os_mbuf.h" + +#define GATTC_TAG "BTCLIENT" + +char *str_ble_board_types[BLE_BOARD_COUNT] = {"Unknown", "CC2540", "PARA", "HeadTracker", + "FlySky"}; +uint8_t bt_scanned_address_cnt = 0; +esp_bt_addr_t_rp btc_scanned_addresses[MAX_BLE_ADDRESSES]; +volatile bool btc_connected = false; +volatile bool btc_scan_complete = true; +volatile bool btc_validslavefound = false; +volatile bool btc_ht_reset = false; +volatile ble_board_type btc_board_type = BLE_BOARD_UNKNOWN; +static volatile bool btc_autoconnect = false; +static volatile bool btc_readytoscan = false; + +static uint8_t btc_own_addr_type = BLE_OWN_ADDR_PUBLIC; +static uint16_t btc_conn_handle = 0xFFFF; +static uint16_t btc_svc_start = 0, btc_svc_end = 0; +static uint16_t btc_data_handle = 0; // 0xFFF6 trainer characteristic +static uint16_t btc_htreset_handle = 0; // 0xAFF2 headtracker reset +static uint16_t btc_cccd_handle = 0; +static bool btc_found_svc = false; + +/* Returns the 16-bit alias of a UUID. Besides native 16-bit UUIDs it accepts + * 128-bit UUIDs built on the Bluetooth base UUID + * (0000xxxx-0000-1000-8000-00805F9B34FB), which is how some peripherals (e.g. + * the HeadTracker) expose service 0xFFF0 / characteristic 0xFFF6. */ +static uint16_t btc_uuid16(const ble_uuid_any_t *uuid) +{ + if (uuid->u.type == BLE_UUID_TYPE_16) { + return uuid->u16.value; + } + if (uuid->u.type == BLE_UUID_TYPE_128) { + static const uint8_t base[12] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, + 0x00, 0x80, 0x00, 0x10, 0x00, 0x00}; + if (memcmp(uuid->u128.value, base, sizeof(base)) == 0 && + uuid->u128.value[14] == 0x00 && uuid->u128.value[15] == 0x00) { + return (uint16_t)(uuid->u128.value[12] | (uuid->u128.value[13] << 8)); + } + } + return 0; +} + +static int btc_gap_event(struct ble_gap_event *event, void *arg); +static int btc_on_disc_svc(uint16_t conn_handle, const struct ble_gatt_error *error, + const struct ble_gatt_svc *service, void *arg); +static int btc_on_disc_chr(uint16_t conn_handle, const struct ble_gatt_error *error, + const struct ble_gatt_chr *chr, void *arg); +static int btc_on_disc_dsc(uint16_t conn_handle, const struct ble_gatt_error *error, + uint16_t chr_val_handle, const struct ble_gatt_dsc *dsc, void *arg); + +static int btc_on_disc_dsc(uint16_t conn_handle, const struct ble_gatt_error *error, + uint16_t chr_val_handle, const struct ble_gatt_dsc *dsc, void *arg) +{ + if (error->status == 0 && dsc != NULL) { + if (btc_uuid16(&dsc->uuid) == BLE_GATT_DSC_CLT_CFG_UUID16) { + btc_cccd_handle = dsc->handle; + } + } else if (error->status == BLE_HS_EDONE) { + if (btc_cccd_handle) { + uint8_t val[2] = {0x01, 0x00}; + ble_gattc_write_flat(conn_handle, btc_cccd_handle, val, sizeof(val), NULL, NULL); + } + btc_scan_complete = true; + } + return 0; +} + +static int btc_on_disc_chr(uint16_t conn_handle, const struct ble_gatt_error *error, + const struct ble_gatt_chr *chr, void *arg) +{ + if (error->status == 0 && chr != NULL) { + char ubuf[BLE_UUID_STR_LEN]; + ESP_LOGD(GATTC_TAG, "chr %s val=%d", ble_uuid_to_str(&chr->uuid.u, ubuf), chr->val_handle); + uint16_t u = btc_uuid16(&chr->uuid); + if (u != 0) { + if (u == REMOTE_FRSKY_CHAR_UUID) { + btc_validslavefound = true; + btc_data_handle = chr->val_handle; + ESP_LOGI(GATTC_TAG, "Found the Trainer Characteristic"); + } else if (u == REMOTE_HTRESET_CHAR_UUID) { + btc_board_type = BLE_BOARD_HEADTRACKER; + btc_htreset_handle = chr->val_handle; + } else if (u == REMOTE_HTCHAN_CHAR_UUID) { + btc_board_type = BLE_BOARD_HEADTRACKER; + } + } + } else if (error->status == BLE_HS_EDONE) { + if (btc_validslavefound) { + // Save the remote address for auto-connect + struct ble_gap_conn_desc desc; + if (ble_gap_conn_find(conn_handle, &desc) == 0) { + btReverseAddr(desc.peer_ota_addr.val, rmtbtaddress); + btaddrtostr(settings.rmtbtaddr, rmtbtaddress); + saveSettings(); + } + // Subscribe to notifications on the trainer characteristic + ble_gattc_disc_all_dscs(conn_handle, btc_data_handle, btc_svc_end, btc_on_disc_dsc, NULL); + } else { + ble_gap_terminate(conn_handle, 0x13 /* remote user terminated */); + } + } + return 0; +} + +static int btc_on_disc_svc(uint16_t conn_handle, const struct ble_gatt_error *error, + const struct ble_gatt_svc *service, void *arg) +{ + if (error->status == 0 && service != NULL) { + char ubuf[BLE_UUID_STR_LEN]; + ESP_LOGD(GATTC_TAG, "svc %s start=%d end=%d", ble_uuid_to_str(&service->uuid.u, ubuf), + service->start_handle, service->end_handle); + if (btc_uuid16(&service->uuid) == REMOTE_SERVICE_UUID) { + btc_svc_start = service->start_handle; + btc_svc_end = service->end_handle; + btc_found_svc = true; + ESP_LOGI(GATTC_TAG, "service found 0x%04X", REMOTE_SERVICE_UUID); + } + } else if (error->status == BLE_HS_EDONE) { + if (btc_found_svc) { + ble_gattc_disc_all_chrs(conn_handle, btc_svc_start, btc_svc_end, btc_on_disc_chr, NULL); + } else { + ble_gap_terminate(conn_handle, 0x13 /* remote user terminated */); + } + } + return 0; +} + +static int btc_gap_event(struct ble_gap_event *event, void *arg) +{ + switch (event->type) { + case BLE_GAP_EVENT_DISC: { + // NimBLE reports the address in wire order; convert it to display order + // so it matches the saved address / AT command representation. + esp_bd_addr_t peer; + btReverseAddr(event->disc.addr.val, peer); + + if (bt_scanned_address_cnt < MAX_BLE_ADDRESSES && event->disc.rssi > MIN_BLE_RSSI) { + bool found = false; + for (int i = 0; i < bt_scanned_address_cnt; i++) { + if (memcmp(btc_scanned_addresses[i].addr, peer, sizeof(esp_bd_addr_t)) == 0) { + found = true; + break; + } + } + if (!found) { + btc_scanned_addresses[bt_scanned_address_cnt].type = event->disc.addr.type; + memcpy(btc_scanned_addresses[bt_scanned_address_cnt++].addr, peer, + sizeof(esp_bd_addr_t)); + } + } + + char addr[13]; + printf("Disc BT Address %s, RSSI=%d, Addr Type=%d\n", btaddrtostr(addr, peer), + event->disc.rssi, event->disc.addr.type); + + if (btc_autoconnect && !btc_connected) { + esp_bd_addr_t saved; + strtobtaddr(saved, settings.rmtbtaddr); + if (memcmp(saved, peer, sizeof(esp_bd_addr_t)) == 0) { + bool known = false; + for (int i = 0; i < bt_scanned_address_cnt; i++) { + if (memcmp(btc_scanned_addresses[i].addr, saved, sizeof(esp_bd_addr_t)) == 0) { + known = true; + break; + } + } + if (known) { + printf("Auto-connect: saved device found\r\n"); + btc_autoconnect = false; + ble_gap_disc_cancel(); + btc_connect(peer); + } + } + } + return 0; + } + + case BLE_GAP_EVENT_DISC_COMPLETE: + btc_scan_complete = true; + return 0; + + case BLE_GAP_EVENT_CONNECT: + if (event->connect.status == 0) { + btc_connected = true; + btc_conn_handle = event->connect.conn_handle; + btc_scan_complete = false; + btc_validslavefound = false; + btc_found_svc = false; + btc_board_type = BLE_BOARD_UNKNOWN; + ESP_LOGI(GATTC_TAG, "connected handle=%d", btc_conn_handle); + ble_gattc_disc_all_svcs(btc_conn_handle, btc_on_disc_svc, NULL); + } else { + btc_connected = false; + btc_scan_complete = true; + } + return 0; + + case BLE_GAP_EVENT_DISCONNECT: + btc_connected = false; + btc_conn_handle = 0xFFFF; + btc_scan_complete = false; + ESP_LOGI(GATTC_TAG, "disconnect reason=%d", event->disconnect.reason); + return 0; + + case BLE_GAP_EVENT_NOTIFY_RX: { + uint8_t buf[256]; + uint16_t len = 0; + if (ble_hs_mbuf_to_flat(event->notify_rx.om, buf, sizeof(buf), &len) == 0 && len > 0) { + uart_write_bytes(uart_num, buf, len); + } + return 0; + } + + case BLE_GAP_EVENT_MTU: + ESP_LOGI(GATTC_TAG, "mtu=%d", event->mtu.value); + return 0; + + default: + return 0; + } +} + +static void btc_on_sync(void) +{ + int rc = ble_hs_util_ensure_addr(0); + if (rc != 0) { + ESP_LOGE(GATTC_TAG, "ensure_addr rc=%d", rc); + return; + } + rc = ble_hs_id_infer_auto(0, &btc_own_addr_type); + if (rc != 0) { + ESP_LOGE(GATTC_TAG, "infer_auto rc=%d", rc); + return; + } + esp_bd_addr_t own; + ble_hs_id_copy_addr(btc_own_addr_type, own, NULL); + btReverseAddr(own, localbtaddress); + btc_readytoscan = true; +} + +void btcInit() +{ + ESP_LOGI(GATTC_TAG, "Starting Central (NimBLE)"); + ble_hs_cfg.sync_cb = btc_on_sync; + ble_att_set_preferred_mtu(85); + nimble_port_freertos_init(bt_host_task); +} + +void btc_start_scan() +{ + if (!btc_readytoscan) return; + + struct ble_gap_disc_params params = {0}; + params.passive = 0; + params.filter_duplicates = 1; + + btc_autoconnect = false; + btc_scan_complete = false; + bt_scanned_address_cnt = 0; + printf("Clearing Addresses\r\n"); + ble_gap_disc(btc_own_addr_type, 1000, ¶ms, btc_gap_event, NULL); +} + +void btc_scan_stop() +{ + ble_gap_disc_cancel(); +} + +bool btc_has_saved_address() +{ + return settings.rmtbtaddr[0] != '\0' && strcmp(settings.rmtbtaddr, "000000000000") != 0; +} + +bool btc_start_autoconnect() +{ + if (!btc_readytoscan || btc_connected) return false; + + struct ble_gap_disc_params params = {0}; + params.passive = 0; + params.filter_duplicates = 1; + + btc_autoconnect = true; + btc_scan_complete = false; + btc_validslavefound = false; + bt_scanned_address_cnt = 0; + printf("Auto-connect: scanning for saved device\r\n"); + ble_gap_disc(btc_own_addr_type, BLE_HS_FOREVER, ¶ms, btc_gap_event, NULL); + return true; +} + +void btc_connect(esp_bd_addr_t addr) +{ + if (btc_connected) return; + btc_autoconnect = false; + btc_scan_complete = false; + btc_validslavefound = false; + memcpy(rmtbtaddress, addr, sizeof(esp_bd_addr_t)); + + // The peer address type is only known after scanning, so the address must + // have been seen in the current scan list. addr is in display order; NimBLE + // expects wire order. + ble_addr_t peer; + btReverseAddr(addr, peer.val); + peer.type = BLE_ADDR_PUBLIC; + bool connstarted = false; + for (int i = 0; i < bt_scanned_address_cnt; i++) { + if (memcmp(btc_scanned_addresses[i].addr, addr, sizeof(esp_bd_addr_t)) == 0) { + peer.type = btc_scanned_addresses[i].type; + connstarted = true; + break; + } + } + + char saddr[13]; + if (!connstarted) { + printf("Unable to connect to %s, address not found in storage\r\n", btaddrtostr(saddr, addr)); + return; + } + + struct ble_gap_conn_params cp = {0}; + cp.scan_itvl = 0x0010; // initiator scan interval, 10 ms + cp.scan_window = 0x0010; // initiator scan window, 10 ms + cp.itvl_min = BT_CON_INT_MIN; + cp.itvl_max = BT_CON_INT_MAX; + cp.latency = 0; + cp.supervision_timeout = BT_CON_TIMEOUT; + + printf("Connecting to %s\r\n", btaddrtostr(saddr, addr)); + int rc = ble_gap_connect(btc_own_addr_type, &peer, 30000, &cp, btc_gap_event, NULL); + if (rc != 0) { + printf("Unable to connect to %s (rc=%d)\r\n", btaddrtostr(saddr, addr), rc); + } +} + +void btc_disconnect() +{ + if (btc_connected) { + ble_gap_terminate(btc_conn_handle, 0x13 /* remote user terminated */); + } + btc_connected = false; + btc_scan_complete = false; + btc_validslavefound = false; +} + +void btc_dohtreset() +{ + if (btc_connected && btc_htreset_handle) { + ble_gattc_write_flat(btc_conn_handle, btc_htreset_handle, (uint8_t *)"R", 1, NULL, NULL); + } +} + +#else // !USE_NIMBLE (Bluedroid) + char *str_ble_board_types[BLE_BOARD_COUNT] = {"Unknown", "CC2540", "PARA", "HeadTracker", "FlySky"}; static bool get_server = false; @@ -124,11 +492,14 @@ static struct gattc_profile_inst gl_profile_tab[PROFILE_NUM] = { #include #include "bt.h" -#include "esp_bt.h" -#include "esp_bt_main.h" #include "esp_err.h" #include "esp_log.h" +#if !defined(USE_NIMBLE) +#include "esp_bt.h" +#include "esp_bt_main.h" +#endif + void gattc_update_connection_params(esp_bd_addr_t *remote_bda) { esp_ble_conn_update_params_t conn_params; @@ -684,4 +1055,6 @@ void btcInit() vTaskDelay(pdMS_TO_TICKS(500)); // Auto-connect to the last known device is handled by the central state // machine (CENTRAL_STATE_AUTOCONNECT) once scanning is ready. -} \ No newline at end of file +} + +#endif // USE_NIMBLE \ No newline at end of file diff --git a/src/bt_client.h b/src/bt_client.h index 5ae971f..01808e3 100644 --- a/src/bt_client.h +++ b/src/bt_client.h @@ -13,7 +13,13 @@ #include #include +#if defined(USE_NIMBLE) +#include +typedef uint8_t esp_bd_addr_t[6]; +typedef uint8_t esp_ble_addr_type_t; +#else #include "esp_bt_defs.h" +#endif #define MAX_BLE_ADDRESSES 20 diff --git a/src/bt_server.c b/src/bt_server.c index 1ccc55e..b8c36cf 100644 --- a/src/bt_server.c +++ b/src/bt_server.c @@ -20,12 +20,6 @@ #include "bt.h" #include "settings.h" -#include "esp_bt.h" -#include "esp_bt_defs.h" -#include "esp_bt_main.h" -#include "esp_gap_ble_api.h" -#include "esp_gatt_common_api.h" -#include "esp_gatts_api.h" #include "esp_log.h" #include "esp_system.h" #include "freertos/FreeRTOS.h" @@ -34,8 +28,223 @@ #include "nvs_flash.h" #include "sdkconfig.h" +#if !defined(USE_NIMBLE) +#include "esp_bt.h" +#include "esp_bt_defs.h" +#include "esp_bt_main.h" +#include "esp_gap_ble_api.h" +#include "esp_gatt_common_api.h" +#include "esp_gatts_api.h" +#endif + #define GATTS_TAG "BTSERVER" +#if defined(USE_NIMBLE) + +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "host/ble_hs.h" +#include "host/util/util.h" +#include "host/ble_gap.h" +#include "host/ble_gatt.h" +#include "os/os_mbuf.h" + +#define BT_SVC_UUID 0xFFF0 +#define BT_CHR_UUID 0xFFF6 + +volatile bool btp_connected = false; + +static const ble_uuid16_t bt_svc_uuid = BLE_UUID16_INIT(BT_SVC_UUID); +static const ble_uuid16_t bt_chr_uuid = BLE_UUID16_INIT(BT_CHR_UUID); + +static uint16_t bt_chr_val_handle = 0; +static uint16_t bt_conn_handle = 0xFFFF; +static uint8_t bt_own_addr_type = 0; +static uint8_t bt_chr_value[3] = {0x11, 0x22, 0x33}; + +static uint8_t raw_adv_data[31]; +static uint8_t raw_adv_data_len = 0; + +static void buildAdvData(void) +{ + const char *name = settings.name[0] ? (const char *)settings.name : "BTWifiMod"; + uint8_t nameLen = strnlen(name, LEN_BLUETOOTH_NAME); + uint8_t idx = 0; + + // Flags: LE General Discoverable Mode | BR/EDR Not Supported + raw_adv_data[idx++] = 0x02; + raw_adv_data[idx++] = 0x01; + raw_adv_data[idx++] = 0x06; + + // Complete list of 16-bit Service UUIDs (0xFFF0, little endian) + raw_adv_data[idx++] = 0x03; + raw_adv_data[idx++] = 0x02; + raw_adv_data[idx++] = 0xF0; + raw_adv_data[idx++] = 0xFF; + + // Complete Local Name + if (nameLen > 0) { + raw_adv_data[idx++] = nameLen + 1; + raw_adv_data[idx++] = 0x09; + memcpy(&raw_adv_data[idx], name, nameLen); + idx += nameLen; + } + + // TX Power Level + raw_adv_data[idx++] = 0x02; + raw_adv_data[idx++] = 0x0A; + raw_adv_data[idx++] = 0x00; + + raw_adv_data_len = idx; + ESP_LOGI(GATTS_TAG, "Advertising as [%s]", name); +} + +static int bt_gap_event(struct ble_gap_event *event, void *arg); + +static void bt_advertise(void) +{ + struct ble_gap_adv_params adv_params = {0}; + adv_params.conn_mode = BLE_GAP_CONN_MODE_UND; + adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; + + int rc = ble_gap_adv_start(bt_own_addr_type, NULL, BLE_HS_FOREVER, &adv_params, + bt_gap_event, NULL); + if (rc != 0) { + ESP_LOGE(GATTS_TAG, "advertise start failed rc=%d", rc); + } +} + +static int bt_chr_access(uint16_t conn_handle, uint16_t attr_handle, + struct ble_gatt_access_ctxt *ctxt, void *arg) +{ + switch (ctxt->op) { + case BLE_GATT_ACCESS_OP_READ_CHR: + return os_mbuf_append(ctxt->om, bt_chr_value, sizeof(bt_chr_value)) == 0 + ? 0 + : BLE_ATT_ERR_INSUFFICIENT_RES; + case BLE_GATT_ACCESS_OP_WRITE_CHR: + // Incoming writes are not forwarded to the radio (same as Bluedroid build) + return 0; + default: + return BLE_ATT_ERR_UNLIKELY; + } +} + +static const struct ble_gatt_chr_def bt_chrs[] = { + { + .uuid = (ble_uuid_t *)&bt_chr_uuid, + .access_cb = bt_chr_access, + .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_NOTIFY, + .val_handle = &bt_chr_val_handle, + }, + {0}, +}; + +static const struct ble_gatt_svc_def bt_svcs[] = { + { + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t *)&bt_svc_uuid, + .characteristics = bt_chrs, + }, + {0}, +}; + +static int bt_gap_event(struct ble_gap_event *event, void *arg) +{ + switch (event->type) { + case BLE_GAP_EVENT_CONNECT: + if (event->connect.status == 0) { + btp_connected = true; + bt_conn_handle = event->connect.conn_handle; + struct ble_gap_conn_desc desc; + if (ble_gap_conn_find(event->connect.conn_handle, &desc) == 0) { + btReverseAddr(desc.peer_ota_addr.val, rmtbtaddress); + } + ESP_LOGI(GATTS_TAG, "connect handle=%d", bt_conn_handle); + } else { + bt_advertise(); + } + return 0; + + case BLE_GAP_EVENT_DISCONNECT: + btp_connected = false; + bt_conn_handle = 0xFFFF; + ESP_LOGI(GATTS_TAG, "disconnect reason=%d", event->disconnect.reason); + bt_advertise(); + return 0; + + case BLE_GAP_EVENT_SUBSCRIBE: + ESP_LOGI(GATTS_TAG, "subscribe handle=%d notify=%d", event->subscribe.attr_handle, + event->subscribe.cur_notify); + return 0; + + case BLE_GAP_EVENT_MTU: + ESP_LOGI(GATTS_TAG, "mtu=%d", event->mtu.value); + return 0; + + case BLE_GAP_EVENT_ADV_COMPLETE: + bt_advertise(); + return 0; + + default: + return 0; + } +} + +static void bt_on_sync(void) +{ + int rc = ble_hs_util_ensure_addr(0); + if (rc != 0) { + ESP_LOGE(GATTS_TAG, "ensure_addr rc=%d", rc); + return; + } + + rc = ble_hs_id_infer_auto(0, &bt_own_addr_type); + if (rc != 0) { + ESP_LOGE(GATTS_TAG, "infer_auto rc=%d", rc); + return; + } + + esp_bd_addr_t own; + ble_hs_id_copy_addr(bt_own_addr_type, own, NULL); + btReverseAddr(own, localbtaddress); + + buildAdvData(); + ble_gap_adv_set_data(raw_adv_data, raw_adv_data_len); + bt_advertise(); +} + +static void bt_gatts_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg) +{ + // no-op (kept for completeness) +} + +int btp_sendChannelData(uint8_t *data, int len) +{ + if (!btp_connected || bt_conn_handle == 0xFFFF) return -1; + + struct os_mbuf *om = ble_hs_mbuf_from_flat(data, len); + if (!om) return -1; + + int rc = ble_gatts_notify_custom(bt_conn_handle, bt_chr_val_handle, om); + return (rc == 0) ? 0 : -1; +} + +void btpInit(void) +{ + ESP_LOGI(GATTS_TAG, "Starting Peripherial (NimBLE)"); + + ble_hs_cfg.sync_cb = bt_on_sync; + ble_hs_cfg.gatts_register_cb = bt_gatts_register_cb; + + ble_gatts_count_cfg(bt_svcs); + ble_gatts_add_svcs(bt_svcs); + + nimble_port_freertos_init(bt_host_task); +} + +#else // !USE_NIMBLE (Bluedroid) + /// Declare the static function static void gatts_profile_a_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); @@ -550,3 +759,5 @@ void btpInit(void) uint8_t adrtype; esp_ble_gap_get_local_used_addr(localbtaddress, &adrtype); } + +#endif // USE_NIMBLE From 7aad051f5c4c6cdc12b3bafd4a50491c512fa711 Mon Sep 17 00:00:00 2001 From: Amigache Date: Sun, 4 Oct 2026 13:43:59 +0200 Subject: [PATCH 4/6] feat(bt): telemetry passthrough (S.Port + CRSF) and trainer gate - Peripheral mode now forwards the radio's UART bytes to the connected BLE central unchanged, in MTU-sized chunks, instead of re-framing only S.Port. EdgeTX already frames S.Port (0x7E delimited) and forwards CRSF raw, and the client app auto-detects the protocol, so this supports both and stops the previous S.Port-only parser from overflowing on CRSF streams. - Do not forward the connected central's trainer frames to the radio until EdgeTX has confirmed the mode (AT+ROLE1 / AT+CON). Previously a module booted in central mode auto-connected to the tracker and its high rate stream drowned EdgeTX's AT handshake, leaving it stuck after AT+NAME. --- src/bt_client.c | 15 ++++++++++++--- src/bt_client.h | 1 + src/terminal.c | 27 +++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/bt_client.c b/src/bt_client.c index 5dd922b..ce8d4b9 100644 --- a/src/bt_client.c +++ b/src/bt_client.c @@ -41,6 +41,12 @@ #include "esp_gap_ble_api.h" #endif +/* Set while the module is allowed to forward the connected central's trainer + * frames to the radio. It stays false during EdgeTX's AT handshake so the + * (high rate) trainer stream cannot drown the AT responses, and is enabled on + * AT+ROLE1 / AT+CON. */ +volatile bool btc_forwardHt = false; + #define GATTC_TAG "BTCLIENT" #define REMOTE_SERVICE_UUID 0xFFF0 #define REMOTE_FRSKY_CHAR_UUID 0xFFF6 @@ -268,7 +274,8 @@ static int btc_gap_event(struct ble_gap_event *event, void *arg) case BLE_GAP_EVENT_NOTIFY_RX: { uint8_t buf[256]; uint16_t len = 0; - if (ble_hs_mbuf_to_flat(event->notify_rx.om, buf, sizeof(buf), &len) == 0 && len > 0) { + if (btc_forwardHt && + ble_hs_mbuf_to_flat(event->notify_rx.om, buf, sizeof(buf), &len) == 0 && len > 0) { uart_write_bytes(uart_num, buf, len); } return 0; @@ -737,8 +744,10 @@ static void gattc_profile_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_ printf("%.2x ", p_data->notify.value[i]); } printf("\n");*/ - uart_write_bytes(uart_num, (void *)p_data->notify.value, - p_data->notify.value_len); // Write the received data to the UART port + if (btc_forwardHt) { + uart_write_bytes(uart_num, (void *)p_data->notify.value, + p_data->notify.value_len); // Write the received data to the UART port + } // if(p_data->notify.handle == bt_datahandle) // If notify coming from the // data handle, send it to the UART port diff --git a/src/bt_client.h b/src/bt_client.h index 01808e3..5c89797 100644 --- a/src/bt_client.h +++ b/src/bt_client.h @@ -51,6 +51,7 @@ extern volatile bool btc_scan_complete; extern volatile bool btc_validslavefound; extern volatile bool btc_ht_reset; extern volatile ble_board_type btc_board_type; +extern volatile bool btc_forwardHt; void btcInit(); void btc_disconnect(); void btc_start_scan(); diff --git a/src/terminal.c b/src/terminal.c index de00327..254e6e9 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -104,6 +104,11 @@ void sendPeripheralConnected() void parserATCommand(char atcommand[]) { + // Any AT command means EdgeTX is (re)initialising: pause the trainer + // passthrough until the role is confirmed again, so the AT handshake is not + // drowned by the high rate trainer stream. + btc_forwardHt = false; + // Strip trailing whitespace bool done = false; while (!done) { @@ -124,6 +129,7 @@ void parserATCommand(char atcommand[]) ESP_LOGI(LOG_UART, "Setting role as Central"); UART_WRITE_STRING(uart_num, "OK+Role:1\r\n"); setRole(ROLE_BLE_CENTRAL); + btc_forwardHt = true; sendBTMode(); // If we are already connected (e.g. auto-connect finished before the radio // was ready), re-announce it so EdgeTX moves to CONNECTED. @@ -139,6 +145,7 @@ void parserATCommand(char atcommand[]) uart_write_bytes(uart_num, reusablebuff, strlen(reusablebuff)); // Store Remote Address to Connect to strcpy(rmtaddress, atcommand + 4); + btc_forwardHt = true; if (btc_connected) { // Already connected (e.g. via auto-connect) -> just re-announce. sendCentralConnected(); @@ -264,6 +271,10 @@ void runUARTHead() } } + // Peripheral-mode passthrough buffer (fits the minimum ATT MTU payload). + static uint8_t passBuf[20]; + static uint8_t passLen = 0; + while (1) { int cnt = uart_read_bytes(uart_num, data, UART_RX_BUFFER, 0); for (int i = 0; i < cnt; i++) cb_push_back(&uartinbuf, &data[i]); @@ -293,6 +304,17 @@ void runUARTHead() if (lc2 == 'A' && lc1 == 'T' && c == '+') { atcommandlen = 0; atcommand[atcommandlen++] = '+'; + } else if (curMode == ROLE_BLE_PERIPHERAL) { + // Forward the radio's telemetry/trainer bytes unchanged. EdgeTX + // already frames S.Port (0x7E delimited) and forwards CRSF raw, and + // the client app auto-detects the protocol. Sent in MTU-sized chunks + // so both S.Port and CRSF work (the old S.Port-only parser overflowed + // on CRSF streams). + passBuf[passLen++] = c; + if (passLen >= sizeof(passBuf)) { + btp_sendChannelData(passBuf, passLen); + passLen = 0; + } } else { frSkyProcessByte(c); } @@ -301,6 +323,11 @@ void runUARTHead() } } + if (passLen > 0) { + btp_sendChannelData(passBuf, passLen); + passLen = 0; + } + runBT(); vTaskDelay(1); } From fbf02161148020570c2a5ac8a825530746db0655 Mon Sep 17 00:00:00 2001 From: Amigache Date: Sun, 4 Oct 2026 13:43:59 +0200 Subject: [PATCH 5/6] docs: rewrite README with features, BLE host options and telemetry app --- README.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8092360..ad2bddd 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,99 @@ # BTWifiModule -Frsky Bluetooth Emulator -This code is for use on a ESP Wroom 32, it emulates a FRSky Bluetooth module but with way more future possibilities. +FrSky Bluetooth emulator for ESP32, to be used inside an OpenTX/EdgeTX radio. +It emulates a FrSky Bluetooth module and adds **Bluetooth telemetry** +(S.Port and CRSF), **auto-connect** and a **selectable BLE host** +(Bluedroid or NimBLE). -## Documentation for this project is at Git Book -### https://btwifimod.gitbook.io/ +Based on the community project by **dlktdr** +(https://github.com/dlktdr/BTWifiModule). +Documentation: https://btwifimod.gitbook.io/ + +## Features + +| Feature | Status | +|---|---| +| Bluetooth Trainer — Master Mode (connect to a BLE trainer / headtracker) | Supported | +| Bluetooth Trainer — Slave Mode | Supported | +| Bluetooth Telemetry over BLE | Supported | +| — S.Port (FrSky models) | Supported | +| — CRSF (ELRS models) | Supported | +| Auto-connect to the last known device | Supported | +| Device name from `AT+NAME` (persisted and advertised) | Supported | +| Selectable BLE host: Bluedroid or NimBLE | Supported | + +## How telemetry works + +In *Telemetry* mode EdgeTX forwards the radio's telemetry over the BT serial +link. The module passes those bytes to the connected BLE central unchanged: + +- FrSky models: S.Port frames, `0x7E`-delimited and byte-stuffed. +- ELRS/CRSF models: raw CRSF frames. + +The client app auto-detects the protocol, so both work over the same GATT +service (`0xFFF0`, characteristic `0xFFF6`, NOTIFY). + +## Telemetry app + +- S.Port: **INAV / Telemetry Viewer**. +- CRSF: the maintained fork by **RomanLut** + (https://github.com/RomanLut/android-taranis-smartport-telemetry/releases), + which publishes ready-made APKs with CRSF support. + +## Hardware + +- **ESP32-C3 SuperMini** (primary target); other boards are listed in + `platformio.ini`. +- UART to the radio: **GPIO20 (RX) / GPIO21 (TX)** on the C3 SuperMini. +- **Radiomaster TX16S MK3** with **EdgeTX** (a recent nightly is recommended, + see below). + +> **TX16S MK3 note.** EdgeTX needs PR #7855 +> (`BT_PWR_GPIO = PC13` in `targets/tx16smk3/hal.h`) to power the AUX2/BT +> connector. It is included in current nightlies. + +## Building + +PlatformIO (ESP-IDF). Two BLE hosts are selectable: + +| Environment | BLE host | Flash (C3, 1 MB app) | Notes | +|---|---|---|---| +| `C3SuperMini` | Bluedroid (default) | ~84 % | | +| `C3SuperMini_nimble` | NimBLE | ~52 % | smaller footprint, recommended | + +```bash +pio run -e C3SuperMini -t upload # Bluedroid +pio run -e C3SuperMini_nimble -t upload # NimBLE +``` + +The Bluedroid path is kept behind `#if !defined(USE_NIMBLE)`, so both hosts +share the same application code. + +## AT command set + +The module speaks the same AT protocol EdgeTX uses for the FrSky Bluetooth +module: + +| Command | Meaning | +|---|---| +| `AT+BAUD4` | baud rate (this firmware stays at 115200) | +| `AT+NAME` | set the Bluetooth name (persisted and advertised) | +| `AT+TXPW` | TX power (acknowledged) | +| `AT+ROLE0` | Peripheral (telemetry / trainer slave) | +| `AT+ROLE1` | Central (trainer master) | +| `AT+DISC?` | start a scan (central) | +| `AT+CON` | connect to a device (central) | +| `AT+CLEAR` | forget the saved device | +| `AT+HTRESET` | reset the headtracker (BTWifiModule extension) | + +Responses: `OK+...`, `Central:`, `Peripheral:`, `Connected:`, +`DisConnected`, `ERROR`. + +## Branches + +- `1.0-dev` — consolidated development branch (this one). + +## Credits + +Original project: **dlktdr/BTWifiModule**. Bluetooth telemetry, auto-connect, +the CRSF passthrough and the NimBLE port by this fork. From c1ea37a3ee91ca488adf7ee145a2a8cc404f29cf Mon Sep 17 00:00:00 2001 From: Amigache Date: Sun, 4 Oct 2026 13:44:12 +0200 Subject: [PATCH 6/6] chore: default build environment to C3SuperMini --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 7444d63..6d27e44 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,7 +9,7 @@ ; https://docs.platformio.org/page/projectconf.html [platformio] -default_envs = C3Mini +default_envs = C3SuperMini [env] platform = espressif32@6.7.0