MCU JeeSDK OTA 升级
开发者完成 ”OTA 升级“ 功能的开发,设备就具备了 OTA 升级能力。后续进行设备维护时,开发者可在物栖开放平台实施固件升级操作。
关于什么是固件 OTA 升级,请参考:名词解释 - OTA 升级。
关于如何使用固件 OTA 升级功能,请参考:固件升级。
前提条件
开发者已在物栖开放平台完成注册和资质认证。
开发者应具备 MCU 开发能力,熟悉固件开发流程。
准备工作
已经完成 JeeSDK的 MCU 的设备接入功能的开发。如何进行设备接入功能开发,请参见:设备接入
已经完成 JeeSDK的 MCU 的接收命令功能的开发。如何进行接收命令功能开发,请参见:接收命令
OTA 流程
使用示例
实现步骤:
在接收命令一节的示例代码中,我们注册了OTA的事件回调函数,其中 :
on_ota_begin()函数在收到OTA命令时回调,应在此函数中初始化flash,为下载数据做准备。
on_ota_download()函数在下载升级包数据时回调,此函数可能会被调用多次,按顺序依次下载固件数据。应在此函数中将下载的数据写入flash。
on_ota_finish()函数在升级包下载完成后回调,其参数指示了下载是否成功。如果下载成功,应当在此函数中校验下载的数据,校验通过后开始进入OTA流程;如果下载失败,则应当擦除已下载的数据,并报错。
代码示例:
void on_ota_begin(void)
{
dataWriteAddr = 0;
dlPart = NULL;
// 使 flash 升级分区可写
bk_flash_enable_security(FLASH_UNPROTECT_LAST_BLOCK); // last or custom
if ((dlPart = fal_partition_find(RT_BK_DL_PART_NAME)) == NULL)
{
printf("Firmware download failed! Partition (%s) find error!", RT_BK_DL_PART_NAME);
}
}
void on_ota_download(uint8 *data, uint32 length)
{
int res;
// 擦除 flash 升级分区
res = fal_partition_erase(dlPart, dataWriteAddr, length);
if (res < 0)
{
printf("Firmware download failed! Partition (%s) write data error!", dlPart->name);
}
// 将下载的固件数据写入 flash 升级分区
res = fal_partition_write(dlPart, dataWriteAddr, data, length);
if (res < 0)
{
printf("Firmware download failed! Partition (%s) write data error!", dlPart->name);
}
// 累加已写入数据的总长度
dataWriteAddr += length;
}
void on_ota_finish(uint32 successful)
{
// 固件下载成功
if (successful)
{
// 对 OTA 分区进行校验
if (rt_ota_part_fw_verify(dlPart) < 0)
{
printf("Firmware download failed! Partition (%s) header and body verify failed!", RT_BK_DL_PART_NAME);
return;
}
bk_flash_enable_security(FLASH_UNPROTECT_LAST_BLOCK); // last or custom
printf("reboot \r\n");
// 重启设备,开始升级
bk_reboot();
}
else // 固件下载失败
{
printf("Firmware download failed! erase data length %x\r\n", dataWriteAddr);
// 擦除 OTA 分区
if (fal_partition_erase(dlPart, 0, dataWriteAddr) < 0)
{
printf("Firmware download failed! Partition (%s) write data error!", dlPart->name);
}
message_upgrade_timer_stop();
}
}