Skip to content

Commit 4015fcd

Browse files
authored
Merge branch 'espressif:release/v5.2' into release/v5.2
2 parents 516b73f + a250f4e commit 4015fcd

File tree

94 files changed

+2317
-723
lines changed

Some content is hidden

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

94 files changed

+2317
-723
lines changed

.gitlab/ci/common.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ variables:
3939
GIT_FETCH_EXTRA_FLAGS: "--no-recurse-submodules --prune --prune-tags"
4040
# we're using .cache folder for caches
4141
GIT_CLEAN_FLAGS: -ffdx -e .cache/
42-
LATEST_GIT_TAG: v5.2.3
42+
LATEST_GIT_TAG: v5.2.4
4343

4444
SUBMODULE_FETCH_TOOL: "tools/ci/ci_fetch_submodule.py"
4545
# by default we will fetch all submodules

components/bootloader/Kconfig.projbuild

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,44 @@ menu "Security features"
11151115

11161116
If not set, the app does not care if the flash encryption eFuse bit is set or not.
11171117

1118+
config SECURE_FLASH_PSEUDO_ROUND_FUNC
1119+
bool "Permanently enable XTS-AES's pseudo rounds function"
1120+
default y
1121+
depends on SECURE_FLASH_ENCRYPTION_MODE_RELEASE && SOC_FLASH_ENCRYPTION_XTS_AES_SUPPORT_PSEUDO_ROUND
1122+
help
1123+
If set (default), the bootloader will permanently enable the XTS-AES peripheral's pseudo rounds function.
1124+
Note: Enabling this config would burn an efuse.
1125+
1126+
choice SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH
1127+
prompt "Strength of the pseudo rounds function"
1128+
depends on SECURE_FLASH_PSEUDO_ROUND_FUNC
1129+
default SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_LOW
1130+
help
1131+
The strength of the pseudo rounds functions can be configured to low, medium and high,
1132+
each denoting the values that would be stored in the efuses field.
1133+
By default the value to set to low.
1134+
You can configure the strength of the pseudo rounds functions according to your use cases,
1135+
for example, increasing the strength would provide higher security but would slow down the
1136+
flash encryption/decryption operations.
1137+
For more info regarding the performance impact, please checkout the pseudo round function section of the
1138+
security guide documentation.
1139+
1140+
config SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_LOW
1141+
bool "Low"
1142+
1143+
config SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_MEDIUM
1144+
bool "Medium"
1145+
1146+
config SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_HIGH
1147+
bool "High"
1148+
endchoice
1149+
1150+
config SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH
1151+
int
1152+
default 1 if SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_LOW
1153+
default 2 if SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_MEDIUM
1154+
default 3 if SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH_HIGH
1155+
11181156
config SECURE_ROM_DL_MODE_ENABLED
11191157
bool
11201158
default y if SOC_SUPPORTS_SECURE_DL_MODE && !SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT

components/bootloader_support/src/esp32h2/flash_encryption_secure_features.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7+
#include <stdint.h>
78
#include <strings.h>
89
#include "esp_flash_encrypt.h"
910
#include "esp_secure_boot.h"
1011
#include "esp_efuse.h"
1112
#include "esp_efuse_table.h"
1213
#include "esp_log.h"
14+
#include "hal/spi_flash_encrypted_ll.h"
15+
#include "soc/soc_caps.h"
1316
#include "sdkconfig.h"
1417

1518
static __attribute__((unused)) const char *TAG = "flash_encrypt";
@@ -33,6 +36,14 @@ esp_err_t esp_flash_encryption_enable_secure_features(void)
3336

3437
esp_efuse_write_field_bit(ESP_EFUSE_DIS_DIRECT_BOOT);
3538

39+
#if defined(CONFIG_SECURE_FLASH_ENCRYPTION_MODE_RELEASE) && defined(SOC_FLASH_ENCRYPTION_XTS_AES_SUPPORT_PSEUDO_ROUND)
40+
if (spi_flash_encrypt_ll_is_pseudo_rounds_function_supported()) {
41+
ESP_LOGI(TAG, "Enable XTS-AES pseudo rounds function...");
42+
uint8_t xts_pseudo_level = CONFIG_SECURE_FLASH_PSEUDO_ROUND_FUNC_STRENGTH;
43+
esp_efuse_write_field_blob(ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL, &xts_pseudo_level, ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL[0]->bit_count);
44+
}
45+
#endif
46+
3647
#if defined(CONFIG_SECURE_BOOT_V2_ENABLED) && !defined(CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS)
3748
// This bit is set when enabling Secure Boot V2, but we can't enable it until this later point in the first boot
3849
// otherwise the Flash Encryption key cannot be read protected

components/bootloader_support/src/flash_encrypt.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -12,6 +12,9 @@
1212
#include "esp_flash_encrypt.h"
1313
#include "esp_secure_boot.h"
1414
#include "hal/efuse_hal.h"
15+
#include "hal/spi_flash_encrypted_ll.h"
16+
#include "hal/spi_flash_encrypt_hal.h"
17+
#include "soc/soc_caps.h"
1518

1619
#if CONFIG_IDF_TARGET_ESP32
1720
#define CRYPT_CNT ESP_EFUSE_FLASH_CRYPT_CNT
@@ -211,6 +214,13 @@ void esp_flash_encryption_set_release_mode(void)
211214
#endif // CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128_DERIVED
212215
#endif // !CONFIG_IDF_TARGET_ESP32
213216

217+
#ifdef SOC_FLASH_ENCRYPTION_XTS_AES_SUPPORT_PSEUDO_ROUND
218+
if (spi_flash_encrypt_ll_is_pseudo_rounds_function_supported()) {
219+
uint8_t xts_pseudo_level = ESP_XTS_AES_PSEUDO_ROUNDS_LOW;
220+
esp_efuse_write_field_blob(ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL, &xts_pseudo_level, ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL[0]->bit_count);
221+
}
222+
#endif
223+
214224
#ifdef CONFIG_IDF_TARGET_ESP32
215225
esp_efuse_write_field_bit(ESP_EFUSE_WR_DIS_DIS_CACHE);
216226
#else
@@ -457,6 +467,17 @@ bool esp_flash_encryption_cfg_verify_release_mode(void)
457467
}
458468
result &= secure;
459469

470+
#if SOC_FLASH_ENCRYPTION_XTS_AES_SUPPORT_PSEUDO_ROUND
471+
if (spi_flash_encrypt_ll_is_pseudo_rounds_function_supported()) {
472+
uint8_t xts_pseudo_level = 0;
473+
esp_efuse_read_field_blob(ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL, &xts_pseudo_level, ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL[0]->bit_count);
474+
if (!xts_pseudo_level) {
475+
result &= false;
476+
ESP_LOGW(TAG, "Not enabled XTS-AES pseudo rounds function (set XTS_DPA_PSEUDO_LEVEL->1 or more)");
477+
}
478+
}
479+
#endif
480+
460481
return result;
461482
}
462483
#endif // not CONFIG_IDF_TARGET_ESP32

components/bt/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ if(CONFIG_BT_ENABLED)
893893
if(CONFIG_IDF_TARGET_ESP32C6)
894894
add_prebuilt_library(libble_app "controller/lib_${target}/${target}-bt-lib/esp32c6/libble_app.a")
895895
else()
896-
if(CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY)
896+
if(CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY AND CONFIG_IDF_TARGET_ESP32C2)
897897
add_prebuilt_library(libble_app "controller/lib_${target}/${target}-bt-lib/libble_app_flash.a")
898898
else()
899899
add_prebuilt_library(libble_app "controller/lib_${target}/${target}-bt-lib/libble_app.a")

components/bt/controller/esp32c2/bt.c

Lines changed: 24 additions & 6 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
55
*/
@@ -1145,9 +1145,17 @@ esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_
11451145

11461146
switch (power_type) {
11471147
case ESP_BLE_PWR_TYPE_DEFAULT:
1148+
if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1149+
stat = ESP_OK;
1150+
}
1151+
break;
11481152
case ESP_BLE_PWR_TYPE_ADV:
1153+
if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_ADV, 0xFF, power_level) == 0) {
1154+
stat = ESP_OK;
1155+
}
1156+
break;
11491157
case ESP_BLE_PWR_TYPE_SCAN:
1150-
if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1158+
if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_SCAN, 0, power_level) == 0) {
11511159
stat = ESP_OK;
11521160
}
11531161
break;
@@ -1177,9 +1185,13 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type
11771185
esp_err_t stat = ESP_FAIL;
11781186
switch (power_type) {
11791187
case ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT:
1188+
if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1189+
stat = ESP_OK;
1190+
}
1191+
break;
11801192
case ESP_BLE_ENHANCED_PWR_TYPE_SCAN:
11811193
case ESP_BLE_ENHANCED_PWR_TYPE_INIT:
1182-
if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1194+
if (ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_SCAN, 0, power_level) == 0) {
11831195
stat = ESP_OK;
11841196
}
11851197
break;
@@ -1202,11 +1214,15 @@ esp_power_level_t esp_ble_tx_power_get(esp_ble_power_type_t power_type)
12021214
int tx_level = 0;
12031215

12041216
switch (power_type) {
1205-
case ESP_BLE_PWR_TYPE_ADV:
1206-
case ESP_BLE_PWR_TYPE_SCAN:
12071217
case ESP_BLE_PWR_TYPE_DEFAULT:
12081218
tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
12091219
break;
1220+
case ESP_BLE_PWR_TYPE_ADV:
1221+
tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_ADV, 0);
1222+
break;
1223+
case ESP_BLE_PWR_TYPE_SCAN:
1224+
tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_SCAN, 0);
1225+
break;
12101226
case ESP_BLE_PWR_TYPE_CONN_HDL0:
12111227
case ESP_BLE_PWR_TYPE_CONN_HDL1:
12121228
case ESP_BLE_PWR_TYPE_CONN_HDL2:
@@ -1235,9 +1251,11 @@ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t po
12351251

12361252
switch (power_type) {
12371253
case ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT:
1254+
tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
1255+
break;
12381256
case ESP_BLE_ENHANCED_PWR_TYPE_SCAN:
12391257
case ESP_BLE_ENHANCED_PWR_TYPE_INIT:
1240-
tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
1258+
tx_level = ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_SCAN, 0);
12411259
break;
12421260
case ESP_BLE_ENHANCED_PWR_TYPE_ADV:
12431261
case ESP_BLE_ENHANCED_PWR_TYPE_CONN:

components/bt/controller/esp32c6/Kconfig.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,3 +697,11 @@ config BT_LE_CTRL_CHECK_CONNECT_IND_ACCESS_ADDRESS
697697
Enabling this option will add stricter verification of the Access Address in the CONNECT_IND PDU.
698698
This improves security by ensuring that only connection requests with valid Access Addresses are accepted.
699699
If disabled, only basic checks are applied, improving compatibility.
700+
701+
config BT_CTRL_RUN_IN_FLASH_ONLY
702+
bool "Reduce BLE IRAM usage (READ DOCS FIRST) (EXPERIMENTAL)"
703+
default n
704+
help
705+
Move most IRAM into flash. This will increase the usage of flash and reduce ble performance.
706+
Because the code is moved to the flash, the execution speed of the code is reduced.
707+
To have a small impact on performance, you need to enable flash suspend (SPI_FLASH_AUTO_SUSPEND).

components/bt/controller/esp32c6/bt.c

Lines changed: 38 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
55
*/
@@ -131,6 +131,10 @@ extern void r_ble_lll_rfmgmt_set_sleep_cb(void *s_cb, void *w_cb, void *s_arg,
131131
extern void r_ble_rtc_wake_up_state_clr(void);
132132
extern int os_msys_init(void);
133133
extern void os_msys_deinit(void);
134+
#if CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
135+
extern void r_ble_ll_scan_start_time_init_compensation(uint32_t init_compensation);
136+
extern void r_priv_sdk_config_insert_proc_time_set(uint16_t insert_proc_time);
137+
#endif // CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
134138
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
135139
extern sleep_retention_entries_config_t *r_esp_ble_mac_retention_link_get(uint8_t *size, uint8_t extra);
136140
extern void r_esp_ble_set_wakeup_overhead(uint32_t overhead);
@@ -495,11 +499,13 @@ static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer
495499
return rc;
496500
}
497501

498-
static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler,
499-
void *arg, void **ret_handle_in)
502+
static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle_in)
500503
{
501-
int rc = esp_intr_alloc(source, flags | ESP_INTR_FLAG_IRAM, handler,
502-
arg, (intr_handle_t *)ret_handle_in);
504+
#if CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
505+
int rc = esp_intr_alloc(source, flags, handler, arg, (intr_handle_t *)ret_handle_in);
506+
#else
507+
int rc = esp_intr_alloc(source, flags | ESP_INTR_FLAG_IRAM, handler, arg, (intr_handle_t *)ret_handle_in);
508+
#endif
503509
return rc;
504510
}
505511

@@ -1043,6 +1049,10 @@ esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode)
10431049
coex_enable();
10441050
#endif // CONFIG_SW_COEXIST_ENABLE
10451051

1052+
#if CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
1053+
r_ble_ll_scan_start_time_init_compensation(500);
1054+
r_priv_sdk_config_insert_proc_time_set(500);
1055+
#endif // CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY
10461056
if (r_ble_controller_enable(mode) != 0) {
10471057
ret = ESP_FAIL;
10481058
goto error;
@@ -1203,9 +1213,17 @@ esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_
12031213

12041214
switch (power_type) {
12051215
case ESP_BLE_PWR_TYPE_DEFAULT:
1216+
if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1217+
stat = ESP_OK;
1218+
}
1219+
break;
12061220
case ESP_BLE_PWR_TYPE_ADV:
1221+
if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_ADV, 0xFF, power_level) == 0) {
1222+
stat = ESP_OK;
1223+
}
1224+
break;
12071225
case ESP_BLE_PWR_TYPE_SCAN:
1208-
if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1226+
if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_SCAN, 0, power_level) == 0) {
12091227
stat = ESP_OK;
12101228
}
12111229
break;
@@ -1236,9 +1254,13 @@ esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type
12361254
esp_err_t stat = ESP_FAIL;
12371255
switch (power_type) {
12381256
case ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT:
1257+
if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1258+
stat = ESP_OK;
1259+
}
1260+
break;
12391261
case ESP_BLE_ENHANCED_PWR_TYPE_SCAN:
12401262
case ESP_BLE_ENHANCED_PWR_TYPE_INIT:
1241-
if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1263+
if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_SCAN, 0, power_level) == 0) {
12421264
stat = ESP_OK;
12431265
}
12441266
break;
@@ -1261,11 +1283,15 @@ esp_power_level_t esp_ble_tx_power_get(esp_ble_power_type_t power_type)
12611283
int tx_level = 0;
12621284

12631285
switch (power_type) {
1264-
case ESP_BLE_PWR_TYPE_ADV:
1265-
case ESP_BLE_PWR_TYPE_SCAN:
12661286
case ESP_BLE_PWR_TYPE_DEFAULT:
12671287
tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
12681288
break;
1289+
case ESP_BLE_PWR_TYPE_ADV:
1290+
tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_ADV, 0);
1291+
break;
1292+
case ESP_BLE_PWR_TYPE_SCAN:
1293+
tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_SCAN, 0);
1294+
break;
12691295
case ESP_BLE_PWR_TYPE_CONN_HDL0:
12701296
case ESP_BLE_PWR_TYPE_CONN_HDL1:
12711297
case ESP_BLE_PWR_TYPE_CONN_HDL2:
@@ -1295,9 +1321,11 @@ esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t po
12951321

12961322
switch (power_type) {
12971323
case ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT:
1324+
tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
1325+
break;
12981326
case ESP_BLE_ENHANCED_PWR_TYPE_SCAN:
12991327
case ESP_BLE_ENHANCED_PWR_TYPE_INIT:
1300-
tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
1328+
tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_SCAN, 0);
13011329
break;
13021330
case ESP_BLE_ENHANCED_PWR_TYPE_ADV:
13031331
case ESP_BLE_ENHANCED_PWR_TYPE_CONN:

components/bt/controller/esp32h2/Kconfig.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,3 +698,11 @@ config BT_LE_CTRL_CHECK_CONNECT_IND_ACCESS_ADDRESS
698698
Enabling this option will add stricter verification of the Access Address in the CONNECT_IND PDU.
699699
This improves security by ensuring that only connection requests with valid Access Addresses are accepted.
700700
If disabled, only basic checks are applied, improving compatibility.
701+
702+
config BT_CTRL_RUN_IN_FLASH_ONLY
703+
bool "Reduce BLE IRAM usage (READ DOCS FIRST) (EXPERIMENTAL)"
704+
default n
705+
help
706+
Move most IRAM into flash. This will increase the usage of flash and reduce ble performance.
707+
Because the code is moved to the flash, the execution speed of the code is reduced.
708+
To have a small impact on performance, you need to enable flash suspend (SPI_FLASH_AUTO_SUSPEND).

0 commit comments

Comments
 (0)