32#include "esphome/core/hal.h"
34#ifdef IOHOME_LR1121_FIRMWARE_UPDATE
45inline constexpr uint16_t LR1121_UPDATER_CMD_GET_VERSION = 0x0101;
46inline constexpr uint16_t LR1121_UPDATER_CMD_ERASE_FLASH = 0x8000;
47inline constexpr uint16_t LR1121_UPDATER_CMD_WRITE_FLASH_ENCRYPTED = 0x8003;
48inline constexpr uint16_t LR1121_UPDATER_CMD_GET_HASH = 0x8004;
49inline constexpr uint16_t LR1121_UPDATER_CMD_REBOOT = 0x8005;
52inline constexpr uint8_t LR1121_UPDATER_BOOTLOADER_TYPE = 0xDF;
57inline constexpr size_t LR1121_UPDATER_HASH_LENGTH = 16;
61inline constexpr size_t LR1121_UPDATER_FLASH_CHUNK_WORDS = 64;
65inline constexpr uint32_t LR1121_UPDATER_BUSY_TIMEOUT_MS = 3000;
68inline constexpr uint32_t LR1121_UPDATER_ERASE_BUSY_TIMEOUT_MS = 30000;
70#ifdef IOHOME_LR1121_BOOTLOADER_UPDATE
89inline constexpr uint8_t LR1121_UPDATER_LOADER_DEVICE_TYPE = 0xDE;
91inline constexpr uint16_t LR1121_UPDATER_CMD_UPDATE_BOOTLOADER = 0x8100;
92inline constexpr uint16_t LR1121_UPDATER_CMD_VERIFY_BOOTLOADER = 0x8101;
93inline constexpr uint16_t LR1121_UPDATER_CMD_UPDATER_REBOOT = 0x8102;
99inline constexpr uint32_t LR1121_UPDATER_BOOTLOADER_UPDATE_BUSY_TIMEOUT_MS = LR1121_UPDATER_ERASE_BUSY_TIMEOUT_MS;
103enum class Lr1121UpdaterCommandStatus : uint8_t {
114struct Lr1121UpdaterStatus {
115 Lr1121UpdaterCommandStatus command_status = Lr1121UpdaterCommandStatus::FAIL;
116 bool interrupt_active =
false;
117 bool running_from_flash =
false;
118 uint8_t chip_mode = 0;
119 uint8_t reset_status = 0;
120 uint32_t irq_status = 0;
126struct Lr1121BootloaderVerification {
127 bool signature_verified =
false;
128 bool version_verified =
false;
129 bool use_case_verified =
false;
130 bool version_major_verified =
false;
131 bool version_minor_verified =
false;
132 bool anti_rollback_verified =
false;
133 uint8_t use_case = 0;
134 uint8_t version_major = 0;
135 uint8_t version_minor = 0;
140 [[nodiscard]]
bool all_checks_passed()
const {
141 return this->signature_verified && this->version_verified && this->use_case_verified &&
142 this->version_major_verified && this->version_minor_verified && this->anti_rollback_verified;
150class Lr1121FirmwareUpdater {
156 Lr1121FirmwareUpdater(SpiAccess *spi, InternalGPIOPin *rst_pin, InternalGPIOPin *busy_pin);
164 bool read_normal_version(uint8_t &device_type, uint8_t &fw_major, uint8_t &fw_minor);
177 bool enter_bootloader(uint8_t &type, uint16_t &bootloader_version);
191 bool read_bootloader_version(uint8_t &type, uint16_t &bootloader_version);
193#ifdef IOHOME_LR1121_BOOTLOADER_UPDATE
203 bool update_bootloader();
216 bool read_updater_status(Lr1121UpdaterStatus &status);
222 bool verify_bootloader(Lr1121BootloaderVerification &report);
232 bool updater_reboot(
bool stay_in_bootloader);
250 bool write_image(
const uint32_t *image,
size_t word_count,
const std::function<
void(
size_t,
size_t)> &on_progress);
266 bool read_hash(uint8_t *out,
size_t out_len);
275 bool reboot(
bool stay_in_bootloader);
282 bool wait_busy_(uint32_t timeout_ms);
287 bool write_command_(uint16_t opcode,
const uint8_t *params,
size_t len, uint32_t busy_timeout_ms);
291 bool read_command_(uint16_t opcode,
const uint8_t *params,
size_t params_len, uint8_t *out,
size_t out_len,
292 uint32_t busy_timeout_ms);
295 InternalGPIOPin *rst_pin_;
296 InternalGPIOPin *busy_pin_;
Radio abstraction layer for IO-Homecontrol.