2 个版本
0.1.1 | 2024 年 7 月 22 日 |
---|---|
0.1.0 | 2024 年 7 月 22 日 |
#249 在 硬件支持
每月 227 次下载
19KB
317 行
esp-hal-ota
esp-hal 的 OTA(无标准库)。
限制
目前仅适用于 esp32s3(未来将支持 esp32c3)。
功能
- 显然是 OTA 更新
- 动态分区读取(没有宏,不读取 partitions.csv) - 完全自动
- 检查当前启动的分区(使用 ESP-IDF 的一些指针魔法)
- CRC32 验证
入门指南
- 在项目根目录中创建
partitions.csv
文件(复制partitions.csv.template
文件) - 在您的项目中编辑
./.cargo/config.toml
文件,并将-T ./partitions.csv
添加到runner
属性 - 可选地,将
--erase-parts otadata
添加到./cargo/config.toml
以修复一些 ota 问题
[target.xtensa-esp32s3-none-elf]
runner = "espflash flash --monitor -T ./partitions.csv --erase-parts otadata"
示例
要查看现实世界的示例,请查看 ./examples
和 ./simple-ota-server
目录。
let flash_size = 1234; // get it from OTA server
let target_crc = 65436743; // get it from OTA server
let mut ota = Ota::new(FlashStorage::new()).unwrap();
ota.ota_begin(flash_size, target_crc);
let mut buf = [0; 4096];
loop {
let n = read_next_chunk(&mut buf);
if n == 0 {
break;
}
let res = ota.ota_write_chunk(&buf[..n]);
if res == Ok(true) { // end of flash
if ota.ota_flush(true).is_ok() { // true if you want to verify crc reading flash
esp_hal::reset::software_reset();
}
}
let progress = (ota.get_ota_progress() * 100) as u8;
log::info!("progress: {}%", progress);
}
待办事项
- 功能齐全的库
- 简单示例
- 更好的错误处理
- 其他 esp32 型号(如 esp32c3、esp32s2 等)
- 回滚
资源
- https://github.com/esp-rs/espflash(这让我找到了 esp-idf-part)
- https://github.com/esp-rs/esp-idf-part
- https://github.com/espressif/esp-idf/blob/master/docs/en/api-reference/system/ota.rst(特别是 Python API)
- https://github.com/python/cpython/blob/main/Modules/binascii.c(internal_crc32)
- https://github.com/espressif/esp-idf/blob/master/components/app_update/esp_ota_ops.c#L552(esp 获取当前分区(paddr))
- https://github.com/bjoernQ/esp32c3-ota-experiment(我在第一次实验后才看到这个,所以还没有研究它)
依赖项
~105KB