OTA服务
更新时间:2018-05-02 10:20:40
FOTA服务支持mqtt、coap、alink等协议连接阿里云,使用fota之前请确保至少启动了mqtt、coap、alink其中一种。
启动FOTA服务
启动FOTA服务无需其他的初始化代码,只需要在连接上阿里云之后,调用该函数启动FOTA服务即可。
aos_post_event(EV_SYS, CODE_SYS_ON_START_FOTA, 0u);
FOTA 回调函数
当启动了FOTA服务之后,系统会自动和云端交互。当有固件需要更新的时候,FOTA服务会自动从云端下载固件,然后通过FOTA的回调函数写入固件到flash中。
所以通过实现平台相关的的FOTA的回调函数就可以对接上FOTA功能。FOTA回调函数的实现代码位于platform/mcu/xxx/hal/ota_port.c
中。
FOTA回调函数的声明:
struct hal_ota_module_s {
hal_module_base_t base;
/* Link to HW */
int (*init)(hal_ota_module_t *m, void *something);
int (*ota_write)(hal_ota_module_t *m, volatile uint32_t *off_set,
uint8_t *in_buf , uint32_t in_buf_len);
int (*ota_read)(hal_ota_module_t *m, volatile uint32_t *off_set,
uint8_t *out_buf , uint32_t out_buf_len);
int (*ota_set_boot)(hal_ota_module_t *m, void *something);
};
这些回调函数一般在platform/mcu/xxx/hw.c
中的hw_start_hal()
函数中注册到ota服务中:
hal_ota_register_module(&esp8266_ota_module);
其中
esp8266_ota_module
类型为struct hal_ota_module_s
.
init
函数原型 | int (*init)(hal_ota_module_t *m, void *something); |
---|---|
描述 | 当已经从服务器获取到最新固件,需要写入到flash时,会调用该函数进行一些平台相关的flash初始化,系统更新准备等操作。 |
请求参数
参数
|
类型
|
描述
|
备注
|
m
|
hal_ota_module_t *
|
hal_module_base_t 结构体句柄
|
|
something
|
void *
|
传递特定的参数
|
根据不同的平台,传递不同的参数
|
返回值
值
|
描述
|
0
|
初始化成功
|
-1
|
初始化失败
|
ota_write
| 函数原型 | int (*ota_write)(hal_ota_module_t *m, volatile uint32_t *off_set, uint8_t *in_buf , uint32_t in_buf_len);
|
| :--- | :--- |
| 描述 | 写入固件到flash |
请求参数
参数
|
类型
|
描述
|
备注
|
m
|
hal_ota_module_t *
|
hal_module_base_t 结构体句柄
|
|
off_set
|
volatile uint32_t *
|
指定flash地址的偏移量(offset)
|
|
in_buf
|
uint8_t *
|
需要写入的数据
|
|
in_buf_len
|
uint32_t
|
需要写入的数据长度
|
返回值
值
|
描述
|
0
|
写入数据成功
|
-1
|
写入数据失败
|
ota_read
FOTA一般情况下不会调用该回调函数从flash中读取固件数据
函数原型 | int (*ota_read)(hal_ota_module_t *m, volatile uint32_t *off_set,uint8_t *out_buf , uint32_t out_buf_len); |
---|---|
描述 | 从flash中读取数据到buffer中 |
请求参数
参数
|
类型
|
描述
|
备注
|
m
|
hal_ota_module_t *
|
hal_module_base_t 结构体句柄
|
|
off_set
|
volatile uint32_t *
|
指定flash地址的偏移量(offset)
|
|
out_buf
|
uint8_t *
|
读取flash数据到该buf中
|
|
out_buf_len
|
uint32_t
|
需要读取的数据长度
|
返回值
值
|
描述
|
0
|
读取数据成功
|
-1
|
读取数据失败
|
ota_set_boot
函数原型 | int (*ota_set_boot)(hal_ota_module_t *m, void *something); |
---|---|
描述 | 设置启动参数 |
请求参数
参数
|
类型
|
描述
|
备注
|
m
|
hal_ota_module_t *
|
hal_module_base_t 结构体句柄
|
|
something
|
void *
|
更新完成参数
|
推荐的更新完成参数请参考下面的说明
|
更新完成参数
推荐的更新完成参数的结构体定义如下:
typedef struct {
OTA_ENUM_UPDATE_TYPE update_type;
OTA_ENUM_RESULT_TYPE result_type ;
} ota_finish_param_t;
详细说明:
update_type
|
OTA_KERNEL
|
更新内核
|
OTA_APP
|
更新app
|
|
OTA_ALL
|
更新内核和app
|
|
result_type
|
OTA_FINISH
|
更新完成
|
OTA_BREAKPOINT
|
更新中断
|
返回值
值
|
描述
|
0
|
设置成功
|
-1
|
设置失败
|