This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
esp32_ota [2024/03/19 18:47] sausage [The stock firmware] |
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 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 process, or 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. |