W800 OTA 升级实现

发布于 2024-09-25 14: 19: 17

固件在运行过程中通过外部方式将新的固件传送给 W800 并写入到 flash 中, 在下次上电重启时运行新的固件. 外部方式可以是 wifi 的 socket 或者 http, 也可以是 uart, spi, ble 等, 这些只是传输方式不同, 最终都是调用驱动里相同的接口来实现功能.

固件分两个区域, 一个是运行区, 一个是 OTA 区域, 升级时新的固件是写入到 OTA 区域, 在上电过程中, 启动程序会自动判断是否有新的固件并搬运到运行区域执行新的固件, 这个过程用户不需要参与. 用户需要做的是通过某种方式接收固件并调用 OTA 驱动接口写入到 FLASH 中.

升级的驱动是在 sdk 里的 wm_fwup. c 和 wm_fwup. h 里, 主要是如下几个接口.

u32 tls_fwup_enter (enum tls_fwup_image_src image_src) ; 

初始化接口, 参数 image_src 直接写 0 就可以, 实际并没有用到该参数. 里面会做一些初始化的操作. 返回值为 session id, 后续接口会用到该值, 也是判断是否是同一次升级的标志, 后续接口里会判断该值, 如果该值变了, 就认为不是同一次升级了, 会返回错误.

int tls_fwup_request_sync (u32 session_id,  u8 *data,  u32 data_len) ; 

通过不同的方式收到的新的固件内容写到 flash 里, session_id 就是初始化返回的值. data 和 data_len 是收到的固件内容和长度, 这里是固件的内容, 不包括自定义的传输协议的额外内容. 长度没有限制, 驱动里会自动判断并写入 flash 中. flash 的地址也不需要关心, 在生成固件时已经设置好了, 所以接收到的固件内容里已经包含了这些信息, 并且驱动里会自动解析.

u16 tls_fwup_current_state (u32 session_id) ; 

判断当前的操作状态, 每次调用写入接口后可以再调用该接口判断下状态是否出错.

int tls_fwup_exit (u32 session_id) ; 

如果判断到状态错误, 可以调用该接口退出升级. 下次再重新初始化开始.

驱动里会判断接收到的数据长度是否达到了固件的总长度, 如果达到了, 就会做固件的整体 CRC 校验来判断是否接收或写入出错. 判断正确后会自动重启. 如果用户不希望升级成功后自动重启, 可以在驱动里把 tls_sys_reset () ; 这行注释掉, 在应用层选择合适的时机来重启使新固件生效.

根据 "WM_W800_QFLASH 布局说明" 里, OTA 区域的起始地址默认是 0x08010000, 这里不需要改动.

如果使用的是 http 方式升级, 可以直接使用 int t_http_fwup (char *url) 接口来自动完成整个升级, 如果是其他方式, 则直接调用上面提到的接口来实现, 不需要参照 t_http_fwup 的实现方式, 因为里面做了一些较复杂的操作, 对其他接口不适用, 反而复杂化了问题.

0 条评论

发布
问题