|
| 1 | +/* |
| 2 | + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: Apache-2.0 |
| 5 | + */ |
| 6 | +/* |
| 7 | + * Tests bootloader update. |
| 8 | + */ |
| 9 | + |
| 10 | +#include "unity.h" |
| 11 | +#include "esp_log.h" |
| 12 | +#include "esp_efuse.h" |
| 13 | +#include "esp_flash_internal.h" |
| 14 | +#include "esp_rom_sys.h" |
| 15 | +#include "utils_update.h" |
| 16 | +#include "sdkconfig.h" |
| 17 | + |
| 18 | +#define BOOT_COUNT_NAMESPACE "boot_count" |
| 19 | + |
| 20 | +static __attribute__((unused)) const char *TAG = "btldr_update"; |
| 21 | + |
| 22 | +#if CONFIG_BOOTLOADER_RECOVERY_ENABLE |
| 23 | + |
| 24 | +/* @brief Checks and prepares the partition so that the factory app is launched after that. |
| 25 | + */ |
| 26 | +static void start_test(void) |
| 27 | +{ |
| 28 | + ESP_LOGI(TAG, "boot count 1 - reset"); |
| 29 | + set_boot_count_in_nvs(1); |
| 30 | + erase_ota_data(); |
| 31 | + ESP_LOGI(TAG, "ota_data erased"); |
| 32 | + ESP_LOGI(TAG, "Bootloader offset: 0x%x", esp_rom_get_bootloader_offset()); |
| 33 | + reboot_as_deep_sleep(); |
| 34 | +} |
| 35 | + |
| 36 | +static void test_flow1(void) |
| 37 | +{ |
| 38 | + uint8_t boot_count = get_boot_count_from_nvs(); |
| 39 | + boot_count++; |
| 40 | + set_boot_count_in_nvs(boot_count); |
| 41 | + ESP_LOGI(TAG, "boot count %d", boot_count); |
| 42 | + |
| 43 | + ESP_LOGI(TAG, "Bootloader offset: 0x%x", esp_rom_get_bootloader_offset()); |
| 44 | + |
| 45 | + const esp_partition_t *primary_bootloader; |
| 46 | + TEST_ESP_OK(esp_partition_register_external(NULL, ESP_PRIMARY_BOOTLOADER_OFFSET, ESP_BOOTLOADER_SIZE, "PrimaryBTLDR", ESP_PARTITION_TYPE_BOOTLOADER, ESP_PARTITION_SUBTYPE_BOOTLOADER_PRIMARY, &primary_bootloader)); |
| 47 | + const esp_partition_t *recovery_bootloader; |
| 48 | + TEST_ESP_OK(esp_partition_register_external(NULL, CONFIG_BOOTLOADER_RECOVERY_OFFSET, ESP_BOOTLOADER_SIZE, "RecoveryBTLDR", ESP_PARTITION_TYPE_BOOTLOADER, ESP_PARTITION_SUBTYPE_BOOTLOADER_RECOVERY, &recovery_bootloader)); |
| 49 | + ESP_LOGI(TAG, "Bootloaders are registered"); |
| 50 | + |
| 51 | + // Remove write protection for the bootloader |
| 52 | + esp_flash_set_dangerous_write_protection(esp_flash_default_chip, false); |
| 53 | + switch (boot_count) { |
| 54 | + case 2: |
| 55 | + TEST_ASSERT_EQUAL_HEX32(ESP_PRIMARY_BOOTLOADER_OFFSET, esp_rom_get_bootloader_offset()); |
| 56 | + |
| 57 | + TEST_ESP_OK(esp_partition_erase_range(recovery_bootloader, 0, recovery_bootloader->size)); |
| 58 | + ESP_LOGI(TAG, "Erase recovery bootloader"); |
| 59 | + |
| 60 | + TEST_ESP_OK(esp_efuse_set_recovery_bootloader_offset(CONFIG_BOOTLOADER_RECOVERY_OFFSET)); |
| 61 | + |
| 62 | + ESP_LOGI(TAG, "Backup, copy <%s> -> <%s>", primary_bootloader->label, recovery_bootloader->label); |
| 63 | + TEST_ESP_OK(esp_partition_copy(recovery_bootloader, 0, primary_bootloader, 0, primary_bootloader->size)); |
| 64 | + |
| 65 | + TEST_ESP_OK(esp_partition_erase_range(primary_bootloader, 0, primary_bootloader->size)); |
| 66 | + ESP_LOGI(TAG, "Erase primary bootloader"); |
| 67 | + reboot_as_deep_sleep(); |
| 68 | + break; |
| 69 | + case 3: |
| 70 | + TEST_ASSERT_EQUAL_HEX32(CONFIG_BOOTLOADER_RECOVERY_OFFSET, esp_rom_get_bootloader_offset()); |
| 71 | + |
| 72 | + ESP_LOGI(TAG, "Return to primary bootloader..."); |
| 73 | + ESP_LOGI(TAG, "Copy <%s> -> <%s>", recovery_bootloader->label, primary_bootloader->label); |
| 74 | + TEST_ESP_OK(esp_partition_copy(primary_bootloader, 0, recovery_bootloader, 0, primary_bootloader->size)); |
| 75 | + |
| 76 | + TEST_ESP_OK(esp_partition_erase_range(recovery_bootloader, 0, recovery_bootloader->size)); |
| 77 | + ESP_LOGI(TAG, "Erase recovery bootloader"); |
| 78 | + break; |
| 79 | + default: |
| 80 | + TEST_FAIL_MESSAGE("Unexpected stage"); |
| 81 | + break; |
| 82 | + } |
| 83 | +} |
| 84 | + |
| 85 | +TEST_CASE_MULTIPLE_STAGES("Recovery bootloader feature", "[recovery_bootloader][timeout=90][reset=DEEPSLEEP_RESET, DEEPSLEEP_RESET]", start_test, test_flow1, test_flow1); |
| 86 | + |
| 87 | +#endif // CONFIG_BOOTLOADER_RECOVERY_ENABLE |
0 commit comments