mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 13:09:38 +00:00 
			
		
		
		
	Init phy data to default if invalid in flash partition to avoid bootloops
Signed-off-by: ronghulin <ronghulin@espressif.com> Merges https://github.com/espressif/esp-idf/pull/6610
This commit is contained in:
		| @@ -357,6 +357,16 @@ menu "PHY" | ||||
|  | ||||
|             If unsure, choose 'n'. | ||||
|  | ||||
|     config ESP32_PHY_DEFAULT_INIT_IF_INVALID | ||||
|         bool "Reset default PHY init data if invalid" | ||||
|         default n | ||||
|         depends on ESP32_PHY_INIT_DATA_IN_PARTITION | ||||
|         help | ||||
|             If enabled, PHY init data will be restored to default if | ||||
|             it cannot be verified successfully to avoid endless bootloops. | ||||
|  | ||||
|             If unsure, choose 'n'. | ||||
|  | ||||
|     if ESP32_PHY_INIT_DATA_IN_PARTITION | ||||
|         config ESP32_SUPPORT_MULTIPLE_PHY_INIT_DATA_BIN | ||||
|             bool "Support multiple PHY init data bin" | ||||
|   | ||||
| @@ -421,6 +421,7 @@ const esp_phy_init_data_t* esp_phy_get_init_data(void) | ||||
|         ESP_LOGE(TAG, "failed to allocate memory for PHY init data"); | ||||
|         return NULL; | ||||
|     } | ||||
|     // read phy data from flash | ||||
|     esp_err_t 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); | ||||
| @@ -428,12 +429,36 @@ const esp_phy_init_data_t* esp_phy_get_init_data(void) | ||||
|         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), | ||||
|                 PHY_INIT_MAGIC, sizeof(phy_init_magic_post)) != 0) { | ||||
| #ifndef CONFIG_ESP32_PHY_DEFAULT_INIT_IF_INVALID | ||||
|         ESP_LOGE(TAG, "failed to validate PHY data partition"); | ||||
|         free(init_data_store); | ||||
|         return NULL; | ||||
| #else | ||||
|         ESP_LOGE(TAG, "failed to validate PHY data partition, restoring default data into flash..."); | ||||
|  | ||||
|         memcpy(init_data_store, | ||||
|                PHY_INIT_MAGIC, sizeof(phy_init_magic_pre)); | ||||
|         memcpy(init_data_store + sizeof(phy_init_magic_pre), | ||||
|                &phy_init_data, sizeof(phy_init_data)); | ||||
|         memcpy(init_data_store + sizeof(phy_init_magic_pre) + sizeof(phy_init_data), | ||||
|                PHY_INIT_MAGIC, sizeof(phy_init_magic_post)); | ||||
|  | ||||
|         assert(memcmp(init_data_store, PHY_INIT_MAGIC, sizeof(phy_init_magic_pre)) == 0); | ||||
|         assert(memcmp(init_data_store + init_data_store_length - sizeof(phy_init_magic_post), | ||||
|                       PHY_INIT_MAGIC, sizeof(phy_init_magic_post)) == 0); | ||||
|  | ||||
|         // write default data | ||||
|         err = esp_partition_write(partition, 0, init_data_store, init_data_store_length); | ||||
|         if (err != ESP_OK) { | ||||
|             ESP_LOGE(TAG, "failed to write default PHY data partition (0x%x)", err); | ||||
|             free(init_data_store); | ||||
|             return NULL; | ||||
|         } | ||||
| #endif // CONFIG_ESP32_PHY_DEFAULT_INIT_IF_INVALID | ||||
|     } | ||||
| #if CONFIG_ESP32_SUPPORT_MULTIPLE_PHY_INIT_DATA_BIN | ||||
|     if ((*(init_data_store + (sizeof(phy_init_magic_pre) + PHY_SUPPORT_MULTIPLE_BIN_OFFSET)))) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 0xFEEDC0DE64
					0xFEEDC0DE64