Skip to content

Commit a8361a5

Browse files
authored
Merge branch 'espressif:release/v5.3' into release/v5.3
2 parents 888b2c8 + 9a2a3d0 commit a8361a5

File tree

208 files changed

+6740
-1482
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

208 files changed

+6740
-1482
lines changed

.gitmodules

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@
5454
sbom-supplier = Person: Dave Gamble
5555
sbom-url = https://github.com/DaveGamble/cJSON
5656
sbom-description = Ultralightweight JSON parser in ANSI C
57-
sbom-hash = acc76239bee01d8e9c858ae2cab296704e52d916
57+
sbom-hash = 8f2beb57ddad1f94bed899790b00f46df893ccac
5858
sbom-cve-exclude-list = CVE-2024-31755 Resolved in v1.7.18
59+
sbom-cve-exclude-list = CVE-2023-26819 Resolved in commit a328d65ad490b64da8c87523cbbfe16050ba5bf6
5960

6061
[submodule "components/mbedtls/mbedtls"]
6162
path = components/mbedtls/mbedtls

Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,5 +655,4 @@ mainmenu "Espressif IoT Development Framework Configuration"
655655
- CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH
656656
- CONFIG_ESP_WIFI_EAP_TLS1_3
657657
- CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
658-
- CONFIG_USB_HOST_EXT_PORT_SUPPORT_LS
659658
- CONFIG_USB_HOST_EXT_PORT_RESET_ATTEMPTS

components/app_trace/app_trace_membufs_proto.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0 OR MIT
55
*/
@@ -148,6 +148,18 @@ static esp_err_t esp_apptrace_membufs_swap_waitus(esp_apptrace_membufs_proto_dat
148148
if (res != ESP_OK) {
149149
break;
150150
}
151+
#if CONFIG_IDF_TARGET_ESP32S3
152+
/*
153+
* ESP32S3 has a serious data corruption issue with the transferred data to host.
154+
* This delay helps reduce the failure rate by temporarily reducing heavy memory writes
155+
* from RTOS-level tracing and giving OpenOCD more time to read trace memory before
156+
* the current thread continues execution. While this doesn't completely prevent
157+
* memory access from other threads/cores/ISRs, it has shown to significantly improve
158+
* reliability when combined with CRC checks in OpenOCD. In practice, this reduces the
159+
* number of retries needed to read an entire block without corruption.
160+
*/
161+
esp_rom_delay_us(100);
162+
#endif
151163
}
152164
return res;
153165
}
@@ -339,7 +351,7 @@ uint8_t *esp_apptrace_membufs_up_buffer_get(esp_apptrace_membufs_proto_data_t *p
339351
esp_err_t esp_apptrace_membufs_up_buffer_put(esp_apptrace_membufs_proto_data_t *proto, uint8_t *ptr, esp_apptrace_tmo_t *tmo)
340352
{
341353
esp_apptrace_membufs_pkt_end(ptr);
342-
// TODO: mark block as busy in order not to re-use it for other tracing calls until it is completely written
354+
// TODO: mark block as busy in order not to reuse it for other tracing calls until it is completely written
343355
// TODO: avoid potential situation when all memory is consumed by low prio tasks which can not complete writing due to
344356
// higher prio tasks and the latter can not allocate buffers at all
345357
// this is abnormal situation can be detected on host which will receive only uncompleted buffers

components/app_trace/port/xtensa/port.c

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0 OR MIT
55
*/
@@ -12,7 +12,7 @@
1212
// ======================
1313

1414
// Xtensa has useful feature: TRAX debug module. It allows recording program execution flow at run-time without disturbing CPU.
15-
// Exectution flow data are written to configurable Trace RAM block. Besides accessing Trace RAM itself TRAX module also allows to read/write
15+
// Execution flow data are written to configurable Trace RAM block. Besides accessing Trace RAM itself TRAX module also allows to read/write
1616
// trace memory via its registers by means of JTAG, APB or ERI transactions.
1717
// ESP32 has two Xtensa cores with separate TRAX modules on them and provides two special memory regions to be used as trace memory.
1818
// Chip allows muxing access to those trace memory blocks in such a way that while one block is accessed by CPUs another one can be accessed by host
@@ -47,17 +47,23 @@
4747
// 2. TRAX Registers layout
4848
// ========================
4949

50-
// This module uses two TRAX HW registers to communicate with host SW (OpenOCD).
50+
// This module uses two TRAX HW registers and one Performance Monitor register to communicate with host SW (OpenOCD).
5151
// - Control register uses TRAX_DELAYCNT as storage. Only lower 24 bits of TRAX_DELAYCNT are writable. Control register has the following bitfields:
5252
// | 31..XXXXXX..24 | 23 .(host_connect). 23| 22..(block_id)..15 | 14..(block_len)..0 |
5353
// 14..0 bits - actual length of user data in trace memory block. Target updates it every time it fills memory block and exposes it to host.
5454
// Host writes zero to this field when it finishes reading exposed block;
5555
// 21..15 bits - trace memory block transfer ID. Block counter. It can overflow. Updated by target, host should not modify it. Actually can be 2 bits;
5656
// 22 bit - 'host data present' flag. If set to one there is data from host, otherwise - no host data;
5757
// 23 bit - 'host connected' flag. If zero then host is not connected and tracing module works in post-mortem mode, otherwise in streaming mode;
58-
// - Status register uses TRAX_TRIGGERPC as storage. If this register is not zero then current CPU is changing TRAX registers and
59-
// this register holds address of the instruction which application will execute when it finishes with those registers modifications.
60-
// See 'Targets Connection' setion for details.
58+
// - Status register uses TRAX_TRIGGERPC as storage. If this register is not zero then current CPU is changing TRAX registers and
59+
// this register holds address of the instruction which application will execute when it finishes with those registers modifications.
60+
// See 'Targets Connection' section for details.
61+
// - CRC16 register uses ERI_PERFMON_PM1 as storage. This register is used to store CRC16 checksum of the exposed trace memory block.
62+
// The register has the following format:
63+
// | 31..16 (CRC indicator) | 15..0 (CRC16 value) |
64+
// CRC indicator (0xA55A) is used to distinguish valid CRC values from other data that might be in the register.
65+
// CRC16 is calculated over the entire exposed block and is updated every time a block is exposed to the host.
66+
// This allows the host to verify data integrity of the received trace data.
6167

6268
// 3. Modes of operation
6369
// =====================
@@ -127,7 +133,7 @@
127133

128134
// Access to internal module's data is synchronized with custom mutex. Mutex is a wrapper for portMUX_TYPE and uses almost the same sync mechanism as in
129135
// vPortCPUAcquireMutex/vPortCPUReleaseMutex. The mechanism uses S32C1I Xtensa instruction to implement exclusive access to module's data from tasks and
130-
// ISRs running on both cores. Also custom mutex allows specifying timeout for locking operation. Locking routine checks underlaying mutex in cycle until
136+
// ISRs running on both cores. Also custom mutex allows specifying timeout for locking operation. Locking routine checks underlying mutex in cycle until
131137
// it gets its ownership or timeout expires. The differences of application tracing module's mutex implementation from vPortCPUAcquireMutex/vPortCPUReleaseMutex are:
132138
// - Support for timeouts.
133139
// - Local IRQs for CPU which owns the mutex are disabled till the call to unlocking routine. This is made to avoid possible task's prio inversion.
@@ -142,9 +148,9 @@
142148

143149
// Timeout mechanism is based on xthal_get_ccount() routine and supports timeout values in microseconds.
144150
// There are two situations when task/ISR can be delayed by tracing API call. Timeout mechanism takes into account both conditions:
145-
// - Trace data are locked by another task/ISR. When wating on trace data lock.
151+
// - Trace data are locked by another task/ISR. When waiting on trace data lock.
146152
// - Current TRAX memory input block is full when working in streaming mode (host is connected). When waiting for host to complete previous block reading.
147-
// When wating for any of above conditions xthal_get_ccount() is called periodically to calculate time elapsed from trace API routine entry. When elapsed
153+
// When waiting for any of above conditions xthal_get_ccount() is called periodically to calculate time elapsed from trace API routine entry. When elapsed
148154
// time exceeds specified timeout value operation is canceled and ESP_ERR_TIMEOUT code is returned.
149155
#include "sdkconfig.h"
150156
#include "soc/soc.h"
@@ -159,11 +165,15 @@
159165
#include "esp_log.h"
160166
#include "esp_app_trace_membufs_proto.h"
161167
#include "esp_app_trace_port.h"
168+
#include "esp_rom_crc.h"
162169

163170
// TRAX is disabled, so we use its registers for our own purposes
164171
// | 31..XXXXXX..24 | 23 .(host_connect). 23 | 22 .(host_data). 22| 21..(block_id)..15 | 14..(block_len)..0 |
165172
#define ESP_APPTRACE_TRAX_CTRL_REG ERI_TRAX_DELAYCNT
166173
#define ESP_APPTRACE_TRAX_STAT_REG ERI_TRAX_TRIGGERPC
174+
#define ESP_APPTRACE_TRAX_CRC16_REG ERI_PERFMON_PM1
175+
176+
#define ESP_APPTRACE_CRC_INDICATOR (0xA55AU << 16)
167177

168178
#define ESP_APPTRACE_TRAX_BLOCK_LEN_MSK 0x7FFFUL
169179
#define ESP_APPTRACE_TRAX_BLOCK_LEN(_l_) ((_l_) & ESP_APPTRACE_TRAX_BLOCK_LEN_MSK)
@@ -498,7 +508,8 @@ static esp_err_t esp_apptrace_trax_buffer_swap_start(uint32_t curr_block_id)
498508
uint32_t acked_block = ESP_APPTRACE_TRAX_BLOCK_ID_GET(ctrl_reg);
499509
uint32_t host_to_read = ESP_APPTRACE_TRAX_BLOCK_LEN_GET(ctrl_reg);
500510
if (host_to_read != 0 || acked_block != (curr_block_id & ESP_APPTRACE_TRAX_BLOCK_ID_MSK)) {
501-
ESP_APPTRACE_LOGD("HC[%d]: Can not switch %" PRIx32 " %" PRIu32 " %" PRIx32 " %" PRIx32 "/%" PRIx32, esp_cpu_get_core_id(), ctrl_reg, host_to_read, acked_block,
511+
ESP_APPTRACE_LOGD("HC[%d]: Can not switch %" PRIx32 " %" PRIu32 " %" PRIx32 " %" PRIx32 "/%" PRIx32,
512+
esp_cpu_get_core_id(), ctrl_reg, host_to_read, acked_block,
502513
curr_block_id & ESP_APPTRACE_TRAX_BLOCK_ID_MSK, curr_block_id);
503514
res = ESP_ERR_NO_MEM;
504515
goto _on_err;
@@ -514,6 +525,14 @@ static esp_err_t esp_apptrace_trax_buffer_swap_end(uint32_t new_block_id, uint32
514525
{
515526
uint32_t ctrl_reg = eri_read(ESP_APPTRACE_TRAX_CTRL_REG);
516527
uint32_t host_connected = ESP_APPTRACE_TRAX_HOST_CONNECT & ctrl_reg;
528+
529+
/* calculate CRC16 of the already switched block */
530+
if (prev_block_len > 0) {
531+
const uint8_t *prev_block_start = s_trax_blocks[!((new_block_id % 2))];
532+
uint16_t crc16 = esp_rom_crc16_le(0, prev_block_start, prev_block_len);
533+
eri_write(ESP_APPTRACE_TRAX_CRC16_REG, crc16 | ESP_APPTRACE_CRC_INDICATOR);
534+
ESP_APPTRACE_LOGD("CRC16:%x %d @%x", crc16, prev_block_len, prev_block_start);
535+
}
517536
eri_write(ESP_APPTRACE_TRAX_CTRL_REG, ESP_APPTRACE_TRAX_BLOCK_ID(new_block_id) |
518537
host_connected | ESP_APPTRACE_TRAX_BLOCK_LEN(prev_block_len));
519538
esp_apptrace_trax_buffer_swap_unlock();

components/app_trace/sys_view/Sample/FreeRTOSV10.4/SEGGER_SYSVIEW_FreeRTOS.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ static void _cbSendTaskList(void) {
108108
* Called from SystemView when asked by the host, returns the
109109
* current system time in micro seconds.
110110
*/
111-
static U64 _cbGetTime(void) {
111+
__attribute__((unused)) static U64 _cbGetTime(void) {
112112
U64 Time;
113113

114114
Time = xTaskGetTickCountFromISR();
@@ -260,7 +260,10 @@ void SYSVIEW_SendTaskInfo(U32 TaskID, const char* sName, unsigned Prio, U32 Stac
260260
*/
261261
// Callbacks provided to SYSTEMVIEW by FreeRTOS
262262
const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = {
263-
_cbGetTime,
263+
/* Callback _cbGetTime locks xKernelLock inside xTaskGetTickCountFromISR, this can cause deadlock on multi-core.
264+
To prevent deadlock, always lock xKernelLock before s_sys_view_lock. Omitting the callback here results in sending
265+
SYSVIEW_EVTID_SYSTIME_CYCLES events instead of SYSVIEW_EVTID_SYSTIME_US */
266+
NULL,
264267
_cbSendTaskList,
265268
};
266269

components/bootloader/Kconfig.projbuild

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,33 @@ menu "Security features"
801801
This can lead to permanent bricking of the device, in case all keys are revoked
802802
because of signature verification failure.
803803

804+
config SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS
805+
bool "Do not disable the ability to further read protect eFuses"
806+
depends on SECURE_BOOT_V2_ENABLED
807+
default n
808+
help
809+
If not set (default, recommended), on first boot the bootloader will burn the WR_DIS_RD_DIS
810+
efuse when Secure Boot is enabled. This prevents any more efuses from being read protected.
811+
812+
If this option is set, it will remain possible to write the EFUSE_RD_DIS efuse field after Secure
813+
Boot is enabled. This may allow an attacker to read-protect the BLK2 efuse (for ESP32) and
814+
BLOCK4-BLOCK10 (i.e. BLOCK_KEY0-BLOCK_KEY5)(for other chips) holding the secure boot public key digest,
815+
causing an immediate denial of service and possibly allowing an additional fault injection attack to
816+
bypass the signature protection.
817+
818+
The option must be set when you need to program any read-protected key type into the efuses,
819+
e.g., HMAC, ECDSA etc. after secure boot has already been enabled on the device.
820+
Please refer to secure boot V2 documentation guide for more details.
821+
822+
NOTE: Once a BLOCK is read-protected, the application will read all zeros from that block
823+
824+
NOTE: If "UART ROM download mode (Permanently disabled (recommended))" or
825+
"UART ROM download mode (Permanently switch to Secure mode (recommended))" is set,
826+
then it is __NOT__ possible to read/write efuses using espefuse.py utility.
827+
However, efuse can be read/written from the application
828+
829+
Please refer to the Secure Boot V2 documentation guide for more information.
830+
804831
config SECURE_BOOT_FLASH_BOOTLOADER_DEFAULT
805832
bool "Flash bootloader along with other artifacts when using the default flash command"
806833
depends on SECURE_BOOT_V2_ENABLED && SECURE_BOOT_BUILD_SIGNED_BINARIES
@@ -981,26 +1008,6 @@ menu "Security features"
9811008
image to this length. It is generally not recommended to set this option, unless you have a legacy
9821009
partitioning scheme which doesn't support 64KB aligned partition lengths.
9831010

984-
config SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS
985-
bool "Allow additional read protecting of efuses"
986-
depends on SECURE_BOOT_INSECURE && SECURE_BOOT_V2_ENABLED
987-
help
988-
If not set (default, recommended), on first boot the bootloader will burn the WR_DIS_RD_DIS
989-
efuse when Secure Boot is enabled. This prevents any more efuses from being read protected.
990-
991-
If this option is set, it will remain possible to write the EFUSE_RD_DIS efuse field after Secure
992-
Boot is enabled. This may allow an attacker to read-protect the BLK2 efuse (for ESP32) and
993-
BLOCK4-BLOCK10 (i.e. BLOCK_KEY0-BLOCK_KEY5)(for other chips) holding the public key digest, causing an
994-
immediate denial of service and possibly allowing an additional fault injection attack to
995-
bypass the signature protection.
996-
997-
NOTE: Once a BLOCK is read-protected, the application will read all zeros from that block
998-
999-
NOTE: If "UART ROM download mode (Permanently disabled (recommended))" or
1000-
"UART ROM download mode (Permanently switch to Secure mode (recommended))" is set,
1001-
then it is __NOT__ possible to read/write efuses using espefuse.py utility.
1002-
However, efuse can be read/written from the application
1003-
10041011
config SECURE_BOOT_ALLOW_UNUSED_DIGEST_SLOTS
10051012
bool "Leave unused digest slots available (not revoke)"
10061013
depends on SECURE_BOOT_INSECURE && SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS

components/bt/controller/esp32c2/bt.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ struct ext_funcs_t {
119119

120120
#if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
121121
typedef void (*interface_func_t) (uint32_t len, const uint8_t *addr, uint32_t len_append, const uint8_t *addr_append, uint32_t flag);
122+
123+
enum {
124+
BLE_LOG_INTERFACE_FLAG_CONTINUE = 0,
125+
BLE_LOG_INTERFACE_FLAG_END,
126+
};
122127
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
123128

124129
/* External functions or variables
@@ -411,20 +416,22 @@ void esp_bt_read_ctrl_log_from_flash(bool output)
411416
#if !CONFIG_BT_LE_CONTROLLER_LOG_SPI_OUT_ENABLED
412417
static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, uint32_t len_append, const uint8_t *addr_append, uint32_t flag)
413418
{
414-
bool end = flag ? true : false;
419+
bool end = (flag & BIT(BLE_LOG_INTERFACE_FLAG_END));
415420
#if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
416421
esp_bt_controller_log_storage(len, addr, end);
417422
#else // !CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
418423
portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
419424
portENTER_CRITICAL_SAFE(&spinlock);
420425
esp_panic_handler_feed_wdts();
421-
for (int i = 0; i < len; i++) {
422-
esp_rom_printf("%02x ", addr[i]);
423-
}
424426

425-
if (end) {
426-
esp_rom_printf("\n");
427+
if (len && addr) {
428+
for (int i = 0; i < len; i++) { esp_rom_printf("%02x ", addr[i]); }
427429
}
430+
if (len_append && addr_append) {
431+
for (int i = 0; i < len_append; i++) { esp_rom_printf("%02x ", addr_append[i]); }
432+
}
433+
if (end) { esp_rom_printf("\n"); }
434+
428435
portEXIT_CRITICAL_SAFE(&spinlock);
429436
#endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
430437
}
@@ -474,11 +481,12 @@ static DRAM_ATTR esp_pm_lock_handle_t s_pm_lock = NULL;
474481
#endif // CONFIG_PM_ENABLE
475482
#ifdef CONFIG_XTAL_FREQ_26
476483
#define MAIN_XTAL_FREQ_HZ (26000000)
484+
static DRAM_ATTR uint32_t s_bt_lpclk_freq = 40000;
477485
#else
478486
#define MAIN_XTAL_FREQ_HZ (40000000)
487+
static DRAM_ATTR uint32_t s_bt_lpclk_freq = 32000;
479488
#endif
480489
static DRAM_ATTR modem_clock_lpclk_src_t s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_INVALID;
481-
static DRAM_ATTR uint32_t s_bt_lpclk_freq = 100000;
482490

483491
#define BLE_RTC_DELAY_US (1800)
484492

components/bt/controller/esp32c5/bt.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ struct ext_funcs_t {
106106

107107
#if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
108108
typedef void (*interface_func_t) (uint32_t len, const uint8_t *addr, uint32_t len_append, const uint8_t *addr_append, uint32_t flag);
109+
110+
enum {
111+
BLE_LOG_INTERFACE_FLAG_CONTINUE = 0,
112+
BLE_LOG_INTERFACE_FLAG_END,
113+
};
109114
#endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
110115

111116
/* External functions or variables
@@ -1306,20 +1311,22 @@ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t po
13061311
#if !CONFIG_BT_LE_CONTROLLER_LOG_SPI_OUT_ENABLED
13071312
static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, uint32_t len_append, const uint8_t *addr_append, uint32_t flag)
13081313
{
1309-
bool end = flag ? true : false;
1314+
bool end = (flag & BIT(BLE_LOG_INTERFACE_FLAG_END));
13101315
#if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
13111316
esp_bt_controller_log_storage(len, addr, end);
13121317
#else // !CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
13131318
portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
13141319
portENTER_CRITICAL_SAFE(&spinlock);
13151320
esp_panic_handler_feed_wdts();
1316-
for (int i = 0; i < len; i++) {
1317-
esp_rom_printf("%02x ", addr[i]);
1318-
}
13191321

1320-
if (end) {
1321-
esp_rom_printf("\n");
1322+
if (len && addr) {
1323+
for (int i = 0; i < len; i++) { esp_rom_printf("%02x ", addr[i]); }
13221324
}
1325+
if (len_append && addr_append) {
1326+
for (int i = 0; i < len_append; i++) { esp_rom_printf("%02x ", addr_append[i]); }
1327+
}
1328+
if (end) { esp_rom_printf("\n"); }
1329+
13231330
portEXIT_CRITICAL_SAFE(&spinlock);
13241331
#endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
13251332
}

components/bt/controller/esp32c6/Kconfig.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,3 +839,10 @@ config BT_LE_CTRL_ADV_DATA_LENGTH_ZERO_AUX
839839
config BT_LE_RXBUF_OPT_ENABLED
840840
bool "Enable rxbuf optimization feature"
841841
default y
842+
843+
config BT_LE_CTRL_FAST_CONN_DATA_TX_EN
844+
bool "Enable fast sending of connection data"
845+
default y
846+
help
847+
If this option is enabled, The Controller will continue to
848+
Send an empty PDU after sending valid connection data within an interval.

0 commit comments

Comments
 (0)