mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-05-22 01:27:11 +08:00
Merge branch 'feature/load_old_phy_parameter' into 'master'
Add feature to copy old RF parameters to new SDK partition See merge request sdk/ESP8266_RTOS_SDK!928
This commit is contained in:
@ -22,6 +22,7 @@ extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include "sdkconfig.h"
|
||||
#include "esp_flash_data_types.h"
|
||||
|
||||
#define SPI_SEC_SIZE 0x1000
|
||||
@ -34,6 +35,9 @@ typedef struct {
|
||||
esp_partition_pos_t ota_info;
|
||||
esp_partition_pos_t factory;
|
||||
esp_partition_pos_t test;
|
||||
#ifdef CONFIG_LOAD_OLD_RF_PARAMETER
|
||||
esp_partition_pos_t rf;
|
||||
#endif
|
||||
esp_partition_pos_t ota[MAX_OTA_SLOTS];
|
||||
uint32_t app_count;
|
||||
uint32_t selected_subtype;
|
||||
|
@ -590,6 +590,9 @@ bool bootloader_utility_load_partition_table(bootloader_state_t* bs)
|
||||
partition_usage = "OTA data";
|
||||
break;
|
||||
case PART_SUBTYPE_DATA_RF:
|
||||
#ifdef CONFIG_LOAD_OLD_RF_PARAMETER
|
||||
bs->rf = partition->pos;
|
||||
#endif
|
||||
partition_usage = "RF data";
|
||||
break;
|
||||
case PART_SUBTYPE_DATA_WIFI:
|
||||
|
@ -277,7 +277,7 @@ config INIT_OS_BEFORE_START
|
||||
FreeRTOS need not do this.
|
||||
|
||||
config ESP8266_OTA_FROM_OLD
|
||||
bool "(**Expected**)ESP8266 update from old SDK by OTA"
|
||||
bool "ESP8266 update from old SDK by OTA"
|
||||
default n
|
||||
depends on IDF_TARGET_ESP8266
|
||||
select ESP8266_BOOT_COPY_APP if ESPTOOLPY_FLASHSIZE_1MB
|
||||
@ -289,8 +289,21 @@ config ESP8266_OTA_FROM_OLD
|
||||
|
||||
The old RTOS SDK(before V3.0) or NonOS SDK can download the firmware to its partition and run it as it self's application.
|
||||
|
||||
config LOAD_OLD_RF_PARAMETER
|
||||
bool "Load old RF Parameters"
|
||||
default n
|
||||
depends on ESP8266_OTA_FROM_OLD
|
||||
select ESP_PHY_INIT_DATA_IN_PARTITION
|
||||
help
|
||||
The function is not released.
|
||||
|
||||
Enable this option, after updating from old SDK to new SDK, bootloader will copy RF
|
||||
parameters from old SDK partition to new SDK partition.
|
||||
|
||||
Then application can read the RF parameters from new partition directly.
|
||||
|
||||
config ESP8266_BOOT_COPY_APP
|
||||
bool "(**Expected**)Boot copy app"
|
||||
bool "Boot copy app"
|
||||
default n
|
||||
help
|
||||
The function is not released.
|
||||
|
@ -40,9 +40,9 @@ ESPTOOL_ALL_FLASH_ARGS += $(PHY_DATA_OFFSET) $(PHY_INIT_DATA_BIN)
|
||||
|
||||
ESP8266_COMPONENT_PATH := $(COMPONENT_PATH)
|
||||
|
||||
$(PHY_INIT_DATA_OBJ): $(ESP8266_COMPONENT_PATH)/source/phy_init_data.h $(BUILD_DIR_BASE)/include/sdkconfig.h
|
||||
$(PHY_INIT_DATA_OBJ): $(ESP8266_COMPONENT_PATH)/include/internal/phy_init_data.h $(BUILD_DIR_BASE)/include/sdkconfig.h
|
||||
$(summary) CC $(notdir $@)
|
||||
printf "#include \"source/phy_init_data.h\"\n" | $(CC) -I $(BUILD_DIR_BASE)/include -I $(ESP8266_COMPONENT_PATH) -I $(ESP8266_COMPONENT_PATH)/include -c -o $@ -xc -
|
||||
printf "#include \"internal/phy_init_data.h\"\n" | $(CC) -I $(BUILD_DIR_BASE)/include -I $(ESP8266_COMPONENT_PATH) -I $(ESP8266_COMPONENT_PATH)/include -c -o $@ -xc -
|
||||
|
||||
$(PHY_INIT_DATA_BIN): $(PHY_INIT_DATA_OBJ)
|
||||
$(summary) BIN $(notdir $@)
|
||||
@ -120,7 +120,7 @@ endif
|
||||
PYTHON ?= $(call dequote,$(CONFIG_PYTHON))
|
||||
|
||||
ifdef CONFIG_ESP8266_OTA_FROM_OLD
|
||||
$(OTA_V2_TO_V3_BIN): all_binaries
|
||||
$(OTA_V2_TO_V3_BIN): all
|
||||
@$(PYTHON) $(IDF_PATH)/tools/pack_fw.py --output $(OTA_V2_TO_V3_BIN) --app $(PROJECT_NAME).bin pack3 $(ESPTOOL_ALL_FLASH_ARGS)
|
||||
@echo [GEN] $(OTA_V2_TO_V3_BIN)
|
||||
endif
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include "nvs_flash.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#include "phy_init_data.h"
|
||||
#include "internal/phy_init_data.h"
|
||||
#include "phy.h"
|
||||
|
||||
static const char *TAG = "phy_init";
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "esp_libc.h"
|
||||
#include "esp8266/rom_functions.h"
|
||||
#include "esp8266/eagle_soc.h"
|
||||
#include "internal/phy_init_data.h"
|
||||
|
||||
#define PARTITION_DATA_OFFSET (s_v2_flash_bin_size / 2)
|
||||
|
||||
@ -65,6 +66,7 @@ typedef union s_boot_param {
|
||||
static const char *TAG = "partition_port";
|
||||
static uint32_t s_partition_offset;
|
||||
static ROM_FLASH_BUF_DECLARE(s_cache_buf, SPI_FLASH_SEC_SIZE);
|
||||
static ROM_FLASH_BUF_DECLARE(check_buf, SPI_FLASH_SEC_SIZE);
|
||||
static uint32_t s_v2_flash_bin_size;
|
||||
static uint32_t s_v2_flash_size;
|
||||
static sys_param_t s_sys_param;
|
||||
@ -109,12 +111,12 @@ static const uint32_t s_v2_flash_bin_map_table[] = {
|
||||
|
||||
static const uint32_t s_v2_flash_bin_size_map_size = sizeof(s_v2_flash_bin_map_table) / sizeof(s_v2_flash_bin_map_table[0]);
|
||||
|
||||
static inline void esp_hw_reset(void)
|
||||
static void esp_hw_reset(uint32_t t, int block)
|
||||
{
|
||||
CLEAR_WDT_REG_MASK(WDT_CTL_ADDRESS, BIT0);
|
||||
|
||||
WDT_REG_WRITE(WDT_OP_ADDRESS, 8);
|
||||
WDT_REG_WRITE(WDT_OP_ND_ADDRESS, 8);
|
||||
WDT_REG_WRITE(WDT_OP_ADDRESS, t);
|
||||
WDT_REG_WRITE(WDT_OP_ND_ADDRESS, t);
|
||||
|
||||
SET_PERI_REG_BITS(PERIPHS_WDT_BASEADDR + WDT_CTL_ADDRESS, WDT_CTL_RSTLEN_MASK, 7 << WDT_CTL_RSTLEN_LSB, 0);
|
||||
// interrupt then reset
|
||||
@ -122,10 +124,18 @@ static inline void esp_hw_reset(void)
|
||||
// start task watch dog1
|
||||
SET_PERI_REG_BITS(PERIPHS_WDT_BASEADDR + WDT_CTL_ADDRESS, WDT_CTL_EN_MASK, 1 << WDT_CTL_EN_LSB, 0);
|
||||
|
||||
while (1);
|
||||
WDT_FEED();
|
||||
|
||||
if (block)
|
||||
while (1);
|
||||
}
|
||||
|
||||
static inline int spi_flash_read_data(uint32_t addr, void *buf, size_t n)
|
||||
static void esp_hw_feed_wdt(void)
|
||||
{
|
||||
WDT_FEED();
|
||||
}
|
||||
|
||||
static int spi_flash_read_data(uint32_t addr, void *buf, size_t n)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -138,10 +148,12 @@ static inline int spi_flash_read_data(uint32_t addr, void *buf, size_t n)
|
||||
|
||||
ret = SPI_read_data(&s_flash_chip, addr, buf, n);
|
||||
|
||||
esp_hw_feed_wdt();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int spi_flash_write_data(uint32_t addr, const void *buf, uint32_t n)
|
||||
static int spi_flash_write_data(uint32_t addr, const void *buf, uint32_t n)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -154,10 +166,12 @@ static inline int spi_flash_write_data(uint32_t addr, const void *buf, uint32_t
|
||||
|
||||
ret = SPIWrite(addr, (void *)buf, n);
|
||||
|
||||
esp_hw_feed_wdt();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int spi_flash_erase(uint32_t addr)
|
||||
static int spi_flash_erase(uint32_t addr)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -165,10 +179,12 @@ static inline int spi_flash_erase(uint32_t addr)
|
||||
|
||||
ret = SPIEraseSector(addr / SPI_FLASH_SEC_SIZE);
|
||||
|
||||
esp_hw_feed_wdt();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int get_v2_flash_map_size(void)
|
||||
static int get_v2_flash_map_size(void)
|
||||
{
|
||||
int ret;
|
||||
esp_image_header_t header;
|
||||
@ -197,7 +213,7 @@ static inline int get_v2_flash_map_size(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline uint32_t esp_get_updated_partition_table_addr(void)
|
||||
static uint32_t esp_get_updated_partition_table_addr(void)
|
||||
{
|
||||
int ret;
|
||||
size_t offset;
|
||||
@ -259,10 +275,9 @@ static inline uint32_t esp_get_updated_partition_table_addr(void)
|
||||
return s_partition_offset;
|
||||
}
|
||||
|
||||
static inline int spi_flash_write_data_safe(uint32_t addr, const void *buf, size_t n)
|
||||
static int spi_flash_write_data_safe(uint32_t addr, const void *buf, size_t n)
|
||||
{
|
||||
int ret;
|
||||
static ROM_FLASH_BUF_DECLARE(check_buf, SPI_FLASH_SEC_SIZE);
|
||||
int ret;
|
||||
|
||||
ret = spi_flash_erase(addr);
|
||||
if (ret) {
|
||||
@ -313,7 +328,79 @@ static int esp_flash_sector_copy(uint32_t dest, uint32_t src, uint32_t total_siz
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int esp_set_v2boot_app1(void)
|
||||
#ifdef CONFIG_LOAD_OLD_RF_PARAMETER
|
||||
|
||||
static bool esp_rf_param_need_unpack(size_t rf_dest, size_t rf_src, size_t rf_size)
|
||||
{
|
||||
bool ret;
|
||||
const uint32_t rf_magic_size = sizeof(phy_init_magic_pre);
|
||||
const uint32_t rf_new_size = rf_size + rf_magic_size * 2;
|
||||
|
||||
ret = spi_flash_read_data(rf_dest, check_buf, rf_new_size);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to read RF parameters from 0x%x", rf_src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = spi_flash_read_data(rf_src, ((uint8_t *)s_cache_buf) + rf_magic_size, rf_size);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to read RF parameters from 0x%x", rf_src);
|
||||
return -1;
|
||||
}
|
||||
memcpy(s_cache_buf, phy_init_magic_pre, rf_magic_size);
|
||||
memcpy(((uint8_t *)s_cache_buf) + rf_magic_size + rf_size, phy_init_magic_pre, rf_magic_size);
|
||||
|
||||
if (!memcmp(check_buf, s_cache_buf, rf_new_size))
|
||||
ret = false;
|
||||
else
|
||||
ret = true;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int esp_unpack_old_rf_param(size_t rf_dest, size_t rf_src, size_t rf_size)
|
||||
{
|
||||
int ret;
|
||||
const uint32_t rf_magic_size = sizeof(phy_init_magic_pre);
|
||||
const uint32_t rf_new_size = rf_size + rf_magic_size * 2;
|
||||
|
||||
ret = spi_flash_erase(rf_dest);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to erase new RF parameters from 0x%x", rf_src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = spi_flash_read_data(rf_src, ((uint8_t *)s_cache_buf) + rf_magic_size, rf_size);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to read old RF parameters from 0x%x", rf_src);
|
||||
return -1;
|
||||
}
|
||||
memcpy(s_cache_buf, phy_init_magic_pre, rf_magic_size);
|
||||
memcpy(((uint8_t *)s_cache_buf) + rf_magic_size + rf_size, phy_init_magic_pre, rf_magic_size);
|
||||
|
||||
ret = spi_flash_write_data(rf_dest, s_cache_buf , rf_new_size);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to write new RF parameters from 0x%x", rf_src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = spi_flash_read_data(rf_dest, check_buf, rf_new_size);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to read new RF parameters from 0x%x", rf_src);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (memcmp(check_buf, s_cache_buf, rf_new_size)) {
|
||||
ESP_LOGE(TAG, "Check RF parameters error");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int esp_set_v2boot_app1(void)
|
||||
{
|
||||
int ret;
|
||||
const size_t offset = s_sys_param.flag ? 1 : 0;
|
||||
@ -360,7 +447,7 @@ static inline int esp_set_v2boot_app1(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int esp_sdk_update_from_v2(void)
|
||||
static int esp_sdk_update_from_v2(void)
|
||||
{
|
||||
const int segment_cnt = 3;
|
||||
const size_t v2_max_size = 4096;
|
||||
@ -397,6 +484,8 @@ int esp_patition_table_init_location(void)
|
||||
{
|
||||
uint32_t addr;
|
||||
|
||||
esp_hw_reset(14, 0);
|
||||
|
||||
if (!esp_sdk_update_from_v2())
|
||||
return 0;
|
||||
|
||||
@ -433,6 +522,7 @@ int esp_patition_copy_ota1_to_ota0(const void *partition_info)
|
||||
int esp_patition_table_init_data(void *partition_info)
|
||||
{
|
||||
int ret;
|
||||
int reboot = 0;
|
||||
const uint32_t boot_base = 0x1000;
|
||||
const bootloader_state_t *bs = (const bootloader_state_t *)partition_info;
|
||||
const uint32_t boot_size = bs->ota[0].offset + bs->ota[0].size - boot_base;
|
||||
@ -440,29 +530,52 @@ int esp_patition_table_init_data(void *partition_info)
|
||||
if (!esp_sdk_update_from_v2())
|
||||
return 0;
|
||||
|
||||
if (esp_get_updated_partition_table_addr() == CONFIG_PARTITION_TABLE_OFFSET)
|
||||
return 0;
|
||||
if (esp_get_updated_partition_table_addr() != CONFIG_PARTITION_TABLE_OFFSET) {
|
||||
ESP_LOGD(TAG, "Copy firmware1 from %d total %d", boot_base + PARTITION_DATA_OFFSET, boot_size);
|
||||
|
||||
ESP_LOGD(TAG, "Copy firmware1 from %d total %d", boot_base + PARTITION_DATA_OFFSET, boot_size);
|
||||
ESP_LOGI(TAG, "Start unpacking V3 firmware ...");
|
||||
|
||||
ESP_LOGI(TAG, "Start unpacking V3 firmware ...");
|
||||
ret = esp_flash_sector_copy(boot_base, boot_base + PARTITION_DATA_OFFSET, boot_size);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to copy V3 firmware from 0x%x to 0x%x total %d", boot_base + PARTITION_DATA_OFFSET,
|
||||
boot_base, boot_size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = esp_flash_sector_copy(boot_base, boot_base + PARTITION_DATA_OFFSET, boot_size);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to copy V3 firmware from 0x%x to 0x%x total %d", boot_base + PARTITION_DATA_OFFSET,
|
||||
boot_base, boot_size);
|
||||
return -1;
|
||||
ret = esp_set_v2boot_app1();
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to set V2 app1 default");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ESP_LOGI(TAG, "Pack V3 firmware successfully and start to reboot");
|
||||
|
||||
reboot = 1;
|
||||
}
|
||||
|
||||
ret = esp_set_v2boot_app1();
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to set V2 app1 default");
|
||||
return -1;
|
||||
#ifdef CONFIG_LOAD_OLD_RF_PARAMETER
|
||||
const uint32_t rf_dest = bs->rf.offset;
|
||||
const uint32_t rf_src = s_v2_flash_bin_size - 4 * 4096;
|
||||
const uint32_t rf_size = 128;
|
||||
|
||||
if (esp_rf_param_need_unpack(rf_dest, rf_src, rf_size)) {
|
||||
|
||||
ESP_LOGI(TAG, "Start unpacking RF parameters from 0x%x to 0x%x total size 0x%x ...", rf_src, rf_dest, rf_size);
|
||||
|
||||
ret = esp_unpack_old_rf_param(rf_dest, rf_src, rf_size);
|
||||
if (ret) {
|
||||
ESP_LOGE(TAG, "Fail to copy RF parameters from 0x%x to 0x%x total %d", rf_src, rf_dest, rf_size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
reboot = 1;
|
||||
} else {
|
||||
ESP_LOGD(TAG, "RF parameters is same");
|
||||
}
|
||||
#endif
|
||||
|
||||
ESP_LOGI(TAG, "Pack V3 firmware successfully and start to reboot");
|
||||
|
||||
esp_hw_reset();
|
||||
if (reboot)
|
||||
esp_hw_reset(4, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user