MCU JeeSDK OTA 升级

开发者完成 ”OTA 升级“ 功能的开发,设备就具备了 OTA 升级能力。后续进行设备维护时,开发者可在物栖开放平台实施固件升级操作。

关于什么是固件 OTA 升级,请参考:名词解释 - OTA 升级

关于如何使用固件 OTA 升级功能,请参考:固件升级

前提条件

开发者已在物栖开放平台完成注册和资质认证。

开发者应具备 MCU 开发能力,熟悉固件开发流程。

准备工作

已经完成 JeeSDK的 MCU 的设备接入功能的开发。如何进行设备接入功能开发,请参见:设备接入

已经完成 JeeSDK的 MCU 的接收命令功能的开发。如何进行接收命令功能开发,请参见:接收命令

OTA 流程

img

使用示例

实现步骤:

在接收命令一节的示例代码中,我们注册了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();  
    }  
}

results matching ""

    No results matching ""