User Tools

Site Tools


esp32_ota

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
esp32_ota [2024/03/19 18:45]
sausage Troubleshooter
esp32_ota [2025/02/02 21:16] (current)
sausage CRC checksum details
Line 5: Line 5:
 Over The Air (OTA) provides a way to send firmware to your ESP32 board in the field without the need for a cable and physical access to the device. Over The Air (OTA) provides a way to send firmware to your ESP32 board in the field without the need for a cable and physical access to the device.
  
-The purpose of this article is manually step through the various stages of the OTA process and illustrate the state of the ESP32 at each stage. ​+The purpose of this article is to manually step through the various stages of the OTA process and illustrate the state of the ESP32 at each stage. ​
  
 Together we will set up a number of firmwares suitable for testing on different partitions in flash memory. Together we will set up a number of firmwares suitable for testing on different partitions in flash memory.
Line 50: Line 50:
 </​code>​ </​code>​
  
-Ignoring the ''​nvs''​ and ''​phy_init''​ partitions, we have the default ''​factory''​ partition that starts at 0x10000. Ironically, the list of partitions doesn'​t list the bootloader partition at 0x1000 or the partition that the partition table itself is stored ​on (at 0x8000). ​+Ignoring the ''​nvs''​ and ''​phy_init''​ partitions, we have the default ''​factory''​ partition that starts at 0x10000. Ironically, the list of partitions doesn'​t list the bootloader partition at 0x1000 or the partition that the partition table itself is stored (at 0x8000). ​
  
 ===== OTA partitions ===== ===== OTA partitions =====
Line 216: Line 216:
   - 4blinks.bin   - 4blinks.bin
  
-Now the ''​idf.py flash''​ command is only able to flash the default project firmware to the ''​factory''​ partition. So we'll need to switch to a different command to flash a named firmware to a particular partition.+Note that the ''​idf.py flash''​ command is only able to flash the default project firmware to the ''​factory''​ partition. So we'll need to switch to a different command to flash a named firmware to a particular partition.
  
 Take another look at our partitions table. Take another look at our partitions table.
Line 303: Line 303:
 </​code>​ </​code>​
  
-Interesting. On the left is ''​ota_0''​. It has a boot sequence of ''​01''​ and a CRC check (not covered in this article). This partition will boot each time the ESP32 is reset. On the right is ''​ota_1'',​ and there is nothing here to indicate if it should boot.+Interesting. On the left is ''​ota_0''​. It has a boot sequence of ''​01''​ and a CRC checksum ​(keep a note of this, we will come back to this). This partition will boot each time the ESP32 is reset. On the right is ''​ota_1'',​ and there is nothing here to indicate if it should boot.
  
 We can also verify the ''​otadata''​ partition and take a closer look at what is stored there now. We can also verify the ''​otadata''​ partition and take a closer look at what is stored there now.
Line 319: Line 319:
  
 ''​9A 98 43 47''​ is the firmware checksum. ​ ''​9A 98 43 47''​ is the firmware checksum. ​
 +
 +Remember the CRC checksum in ''​ota_0''?​
 +
 +''​0x4743989a''​. This is how you can confirm which firmware is running.
  
 Let's switch to booting the firmware on ''​ota_1'':​ Let's switch to booting the firmware on ''​ota_1'':​
Line 358: Line 362:
  
 In our case, the second sector has a new entry, the ''​02''​ sequence. This is for the firmware on ''​ota_1''​. ''​02''​ is greater than ''​01''​ so this is the firmware selected for boot by the bootloader. In our case, the second sector has a new entry, the ''​02''​ sequence. This is for the firmware on ''​ota_1''​. ''​02''​ is greater than ''​01''​ so this is the firmware selected for boot by the bootloader.
 +
 +Again we can inspect the checksum: ''​0x55f63774''​ is ''​74 37 F6 55''​.
  
 How an OTA partition is determined from sequence numbers in the otadata partition is not explained in the documentation,​ but is explained in the code. You can see it here: https://​github.com/​pycom/​esp-idf-2.0/​blob/​master/​components/​app_update/​esp_ota_ops.c#​L297 How an OTA partition is determined from sequence numbers in the otadata partition is not explained in the documentation,​ but is explained in the code. You can see it here: https://​github.com/​pycom/​esp-idf-2.0/​blob/​master/​components/​app_update/​esp_ota_ops.c#​L297
Line 470: Line 476:
 All our firmwares failed to run the ''​esp_ota_mark_app_valid_cancel_rollback()''​ to mark the ''​otadata''​ as valid. So in each case, they have become aborted and rolled back to the previously known good firmware. All our firmwares failed to run the ''​esp_ota_mark_app_valid_cancel_rollback()''​ to mark the ''​otadata''​ as valid. So in each case, they have become aborted and rolled back to the previously known good firmware.
  
-The ''​factory''​ firmware isn'​t ​controlled ​by the ''​otadata'',​ the rollback process or OTA at all.+The ''​factory''​ firmware isn'​t ​affected ​by ''​otadata'', ​or the rollback processor OTA at all.
  
 To finish up, let's take a last look at the raw otadata: To finish up, let's take a last look at the raw otadata:
Line 515: Line 521:
  
 ===== Thank yous ===== ===== Thank yous =====
-Many thanks to boarchuz and craig from the [[https://​discord.gg/​wwK29JJV|Espressif MCUs]] discord server for their advice on details in this article.+Many thanks to boarchuz and craig from the [[https://​discord.gg/​wwK29JJV|Espressif MCUs]] discord server for their assistance with this article.
  
esp32_ota.1710873931.txt.gz ยท Last modified: 2024/03/19 18:45 by sausage