diff --git a/components/esp_phy/CMakeLists.txt b/components/esp_phy/CMakeLists.txt index 9f3064e125..b59948788e 100644 --- a/components/esp_phy/CMakeLists.txt +++ b/components/esp_phy/CMakeLists.txt @@ -17,7 +17,9 @@ endif() idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "include" "${idf_target}/include" PRIV_REQUIRES nvs_flash - LDFRAGMENTS "${ldfragments}") + LDFRAGMENTS "${ldfragments}" + EMBED_FILES "${CMAKE_CURRENT_SOURCE_DIR}/${idf_target}/phy_multiple_init_data.bin" + ) idf_build_get_property(build_dir BUILD_DIR) @@ -52,7 +54,10 @@ if(CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION) partition_table_get_partition_info(phy_partition_offset "--partition-type data --partition-subtype phy" "offset") if(CONFIG_ESP32_SUPPORT_MULTIPLE_PHY_INIT_DATA_BIN) - set(phy_init_data_bin "${CMAKE_CURRENT_SOURCE_DIR}/phy_multiple_init_data.bin") + set(phy_init_data_bin "${CMAKE_CURRENT_SOURCE_DIR}/${idf_target}/phy_multiple_init_data.bin") + if(CONFIG_ESP32_MULTIPLE_PHY_DATA_BIN_EMBEDDED) + set(COMPONENT_EMBED_FILES "${CMAKE_CURRENT_SOURCE_DIR}/${idf_target}/phy_multiple_init_data.bin") + endif() else() set(phy_init_data_bin "${build_dir}/phy_init_data.bin") diff --git a/components/esp_phy/Kconfig b/components/esp_phy/Kconfig index e3bb40f3db..b929df68b3 100644 --- a/components/esp_phy/Kconfig +++ b/components/esp_phy/Kconfig @@ -57,6 +57,14 @@ menu "PHY" 3. Country configured by API esp_wifi_set_country() and the parameter policy is WIFI_COUNTRY_POLICY_AUTO. + config ESP32_MULTIPLE_PHY_DATA_BIN_EMBEDDED + bool "Support embedded multiple phy init data bin to app bin" + depends on ESP32_SUPPORT_MULTIPLE_PHY_INIT_DATA_BIN + default n + help + If enabled, multiple phy init data bin will embedded into app bin + If not enabled, multiple phy init data bin will still leave alone, and need to be flashed by users. + config ESP32_PHY_INIT_DATA_ERROR bool "Terminate operation when PHY init data error" depends on ESP32_SUPPORT_MULTIPLE_PHY_INIT_DATA_BIN diff --git a/components/esp_phy/Makefile.projbuild b/components/esp_phy/Makefile.projbuild index d759446c3e..0d70e7b710 100644 --- a/components/esp_phy/Makefile.projbuild +++ b/components/esp_phy/Makefile.projbuild @@ -3,7 +3,7 @@ ifdef CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION ESP_PHY_COMPONENT_PATH := $(COMPONENT_PATH) ifdef CONFIG_ESP32_SUPPORT_MULTIPLE_PHY_INIT_DATA_BIN -PHY_INIT_DATA_BIN = $(ESP_PHY_COMPONENT_PATH)/phy_multiple_init_data.bin +PHY_INIT_DATA_BIN = $(ESP_PHY_COMPONENT_PATH)/$(IDF_TARGET)/phy_multiple_init_data.bin else PHY_INIT_DATA_OBJ = $(BUILD_DIR_BASE)/phy_init_data.o PHY_INIT_DATA_BIN = $(BUILD_DIR_BASE)/phy_init_data.bin diff --git a/components/esp_phy/phy_multiple_init_data.bin b/components/esp_phy/esp32/phy_multiple_init_data.bin similarity index 100% rename from components/esp_phy/phy_multiple_init_data.bin rename to components/esp_phy/esp32/phy_multiple_init_data.bin diff --git a/components/esp_phy/esp32c3/phy_multiple_init_data.bin b/components/esp_phy/esp32c3/phy_multiple_init_data.bin new file mode 100644 index 0000000000..0f754a2c49 Binary files /dev/null and b/components/esp_phy/esp32c3/phy_multiple_init_data.bin differ diff --git a/components/esp_phy/esp32s2/phy_multiple_init_data.bin b/components/esp_phy/esp32s2/phy_multiple_init_data.bin new file mode 100644 index 0000000000..61ce8eb8e9 Binary files /dev/null and b/components/esp_phy/esp32s2/phy_multiple_init_data.bin differ diff --git a/components/esp_phy/esp32s3/phy_multiple_init_data.bin b/components/esp_phy/esp32s3/phy_multiple_init_data.bin new file mode 100644 index 0000000000..0f754a2c49 Binary files /dev/null and b/components/esp_phy/esp32s3/phy_multiple_init_data.bin differ diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c index 86e9925374..b5dcff7b8c 100644 --- a/components/esp_phy/src/phy_init.c +++ b/components/esp_phy/src/phy_init.c @@ -79,6 +79,10 @@ uint32_t* s_mac_bb_pd_mem = NULL; #endif #if CONFIG_ESP32_SUPPORT_MULTIPLE_PHY_INIT_DATA_BIN +#if CONFIG_ESP32_MULTIPLE_PHY_DATA_BIN_EMBEDDED +extern uint8_t multi_phy_init_data_bin_start[] asm("_binary_phy_multiple_init_data_bin_start"); +extern uint8_t multi_phy_init_data_bin_end[] asm("_binary_phy_multiple_init_data_bin_end"); +#endif /* The following static variables are only used by Wi-Fi tasks, so they can be handled without lock */ static phy_init_data_type_t s_phy_init_data_type = 0; @@ -322,7 +326,16 @@ IRAM_ATTR void esp_mac_bb_power_down(void) const esp_phy_init_data_t* esp_phy_get_init_data(void) { - const esp_partition_t* partition = esp_partition_find_first( + esp_err_t err = ESP_OK; + const esp_partition_t* partition = NULL; +#if CONFIG_ESP32_MULTIPLE_PHY_DATA_BIN_EMBEDDED + size_t init_data_store_length = sizeof(phy_init_magic_pre) + + sizeof(esp_phy_init_data_t) + sizeof(phy_init_magic_post); + uint8_t* init_data_store = (uint8_t*) malloc(init_data_store_length); + memcpy(init_data_store, multi_phy_init_data_bin_start, init_data_store_length); + ESP_LOGI(TAG, "loading embedded multiple PHY init data"); +#else + partition = esp_partition_find_first( ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_PHY, NULL); if (partition == NULL) { ESP_LOGE(TAG, "PHY data partition not found"); @@ -337,12 +350,13 @@ const esp_phy_init_data_t* esp_phy_get_init_data(void) return NULL; } // read phy data from flash - esp_err_t err = esp_partition_read(partition, 0, init_data_store, init_data_store_length); + err = esp_partition_read(partition, 0, init_data_store, init_data_store_length); if (err != ESP_OK) { ESP_LOGE(TAG, "failed to read PHY data partition (0x%x)", err); free(init_data_store); return NULL; } +#endif // verify data if (memcmp(init_data_store, PHY_INIT_MAGIC, sizeof(phy_init_magic_pre)) != 0 || memcmp(init_data_store + init_data_store_length - sizeof(phy_init_magic_post), @@ -716,14 +730,17 @@ static esp_err_t phy_get_multiple_init_data(const esp_partition_t* partition, ESP_LOGE(TAG, "failed to allocate memory for PHY init data control info"); return ESP_FAIL; } - - esp_err_t err = esp_partition_read(partition, init_data_store_length, init_data_control_info, sizeof(phy_control_info_data_t)); + esp_err_t err = ESP_OK; +#if CONFIG_ESP32_MULTIPLE_PHY_DATA_BIN_EMBEDDED + memcpy(init_data_control_info, multi_phy_init_data_bin_start + init_data_store_length, sizeof(phy_control_info_data_t)); +#else + err = esp_partition_read(partition, init_data_store_length, init_data_control_info, sizeof(phy_control_info_data_t)); if (err != ESP_OK) { free(init_data_control_info); ESP_LOGE(TAG, "failed to read PHY control info data partition (0x%x)", err); return ESP_FAIL; } - +#endif if ((init_data_control_info->check_algorithm) == PHY_CRC_ALGORITHM) { err = phy_crc_check_init_data(init_data_control_info->multiple_bin_checksum, init_data_control_info->control_info_checksum, sizeof(phy_control_info_data_t) - sizeof(init_data_control_info->control_info_checksum)); @@ -745,6 +762,9 @@ static esp_err_t phy_get_multiple_init_data(const esp_partition_t* partition, return ESP_FAIL; } +#if CONFIG_ESP32_MULTIPLE_PHY_DATA_BIN_EMBEDDED + memcpy(init_data_multiple, multi_phy_init_data_bin_start + init_data_store_length + sizeof(phy_control_info_data_t), sizeof(esp_phy_init_data_t) * init_data_control_info->number); +#else err = esp_partition_read(partition, init_data_store_length + sizeof(phy_control_info_data_t), init_data_multiple, sizeof(esp_phy_init_data_t) * init_data_control_info->number); if (err != ESP_OK) { @@ -753,7 +773,7 @@ static esp_err_t phy_get_multiple_init_data(const esp_partition_t* partition, ESP_LOGE(TAG, "failed to read PHY init data multiple bin partition (0x%x)", err); return ESP_FAIL; } - +#endif if ((init_data_control_info->check_algorithm) == PHY_CRC_ALGORITHM) { err = phy_crc_check_init_data(init_data_multiple, init_data_control_info->multiple_bin_checksum, sizeof(esp_phy_init_data_t) * init_data_control_info->number); @@ -785,6 +805,19 @@ static esp_err_t phy_get_multiple_init_data(const esp_partition_t* partition, esp_err_t esp_phy_update_init_data(phy_init_data_type_t init_data_type) { +#if CONFIG_ESP32_MULTIPLE_PHY_DATA_BIN_EMBEDDED + esp_err_t err = ESP_OK; + const esp_partition_t* partition = NULL; + size_t init_data_store_length = sizeof(phy_init_magic_pre) + + sizeof(esp_phy_init_data_t) + sizeof(phy_init_magic_post); + uint8_t* init_data_store = (uint8_t*) malloc(init_data_store_length); + if (init_data_store == NULL) { + ESP_LOGE(TAG, "failed to allocate memory for updated country code PHY init data"); + return ESP_ERR_NO_MEM; + } + memcpy(init_data_store, multi_phy_init_data_bin_start, init_data_store_length); + ESP_LOGI(TAG, "load embedded multi phy init data"); +#else const esp_partition_t* partition = esp_partition_find_first( ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_PHY, NULL); if (partition == NULL) { @@ -805,6 +838,7 @@ esp_err_t esp_phy_update_init_data(phy_init_data_type_t init_data_type) ESP_LOGE(TAG, "failed to read updated country code PHY data partition (0x%x)", err); return ESP_FAIL; } +#endif if (memcmp(init_data_store, PHY_INIT_MAGIC, sizeof(phy_init_magic_pre)) != 0 || memcmp(init_data_store + init_data_store_length - sizeof(phy_init_magic_post), PHY_INIT_MAGIC, sizeof(phy_init_magic_post)) != 0) { diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 0c3f24cc83..681c8bfeb7 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 0c3f24cc83d595f60e3b785e3eb098c3bc5ce2d3 +Subproject commit 681c8bfeb739c2fcd579e404b1df8b19acc07497