FOTA 开发指导_Rev1.0

English

修订记录

版本

日期

作者

修订内容

Rev1.0

26-3-26

ljz

创建文档

1 简介

本文档介绍 LTE-EC71X 差分升级接口 API 情况, API 接口位于 components/kernel/lierda_api/liot_fota2/liot_fota2.h 文件声明。

功能限制说明

  1. 仅支持HTTP、FTP、本地文件系统三种升级方式,暂不支持 HTTPS 及 FTPS 加密协议。

  2. FOTA 功能预留空间充足,暂不支持用户自定义修改分区。

1.1 模组升级流程原理

总体流程说明

模组的 FOTA 升级流程主要包括 差分包下载、校验验证、固件还原及系统重启升级 四个阶段。
整体流程如下:

  1. 通过 HTTP/FTP/文件系统 下载差分升级包(.par 格式)至模组文件系统;

  2. 下载完成后,底层会进行完整性校验,校验不通过则终止升级,校验通过则进入下一步;

  3. 模组自动重启并进入 Bootloader 模式,由 Bootloader 执行固件还原与 Flash 擦写操作;

  4. 固件还原完成后,系统再次重启,加载新固件并正常运行。

校验机制

校验阶段包含旧固件一致性校验差分包完整性校验两部分,任一部分校验失败均会导致升级中止,校验逻辑如下:

  1. 旧固件一致性校验:对设备当前固件重新计算校验码,并与差分包中记录的校验码比对,以确保旧固件版本匹配;

  2. 差分包完整性校验:验证差分包的数据是否完整无损,防止因数据错误导致升级失败。

升级过程

  1. 模组接收到升级指令并完成差分包下载、校验后,自动重启,优先由 Bootloader 程序启动;

  2. Bootloader 检查差分包是否存在,并读取 升级标记位

  3. 若差分包存在且标记位为“未升级”,则执行 差分还原算法,按分段方式将新固件内容还原并覆盖至 Flash;

  4. 在还原过程中,Bootloader 会执行三个操作:

    • 写入升级标记位;

    • 更新升级进度信息;

    • 循环执行“还原 → 覆盖 → 记录进度”的过程,直到升级完成;

  5. 升级完成后,系统再次重启;

  6. 根据升级标记位状态:

    • 若升级成功,Bootloader 删除差分包文件并更新标记位;

    • 然后跳转执行新的应用程序。

2 API 函数概览

FOTA2 功能当前仅提供一个核心升级函数,负责校验升级包信息并写入 FOTA 分区,函数信息如下:

函数

说明

Liot_FotaUpgrade()

用于校验文件系统中存储的升级包信息,校验后写入fota分区

3 类型说明

3.1 liot_fota_err_e

FOTA 错误码。

声明

typedef enum
{
    L_FOTA_UPGRADE_SUCCESS             = 0,   /*!< Indicates that the FOTA upgrade was successful.*/
    L_FOTA_UPGRADE_FAIL                = 1,   /*!< General FOTA upgrade failure.*/
    L_FOTA_UPGRADE_CHECK_FAIL          = 2,   /*!< FOTA upgrade check failed.*/
    L_FOTA_UPGRADE_MD5_FAIL            = 3,   /*!< MD5 checksum verification of the FOTA package failed.*/
    L_FOTA_UPGRADE_MATCH_FAIL          = 4,   /*!< FOTA package does not match the device requirements.*/
    L_FOTA_UPGRADE_NO_FILE_FAIL        = 5,   /*!< FOTA file not found or missing.*/
    L_FOTA_UPGRADE_OPENFILE_FAIL       = 6,   /*!< Failed to open the FOTA upgrade file.*/
    L_FOTA_UPGRADE_FILESIZE_FAIL       = 7,   /*!< Invalid or unsupported FOTA file size.*/
    L_FOTA_UPGRADE_LFS_MOUNT_FAIL      = 8,   /*!< Failed to mount LittleFS (LFS) for FOTA.*/
    L_FOTA_UPGRADE_PARAM_FAIL          = 9,   /*!< Invalid input parameters for FOTA upgrade.*/
    L_FOTA_UPGRADE_PROJECT_MATCH_FAIL  = 10,  /*!< Project name in FOTA package does not match the device.*/
    L_FOTA_UPGRADE_BASELINE_MATCH_FAIL = 11,  /*!< Baseline version in FOTA package does not match the device.*/
    L_FOTA_UPGRADE_POINT_NULL_ERR      = 12,  /*!< Null pointer error during FOTA upgrade.*/
    L_FOTA_UPGRADE_FLAG_SET_ERR        = 13,  /*!< Failed to set the upgrade flag during FOTA.*/
} liot_fota_err_e;

参数

参数

说明

L_FOTA_UPGRADE_SUCCESS

执行成功

L_FOTA_UPGRADE_FAIL

执行失败

L_FOTA_UPGRADE_CHECK_FAIL

FOTA 升级包校验失败

L_FOTA_UPGRADE_MD5_FAIL

FOTA 升级包MD5校验失败

L_FOTA_UPGRADE_MATCH_FAIL

FOTA 升级匹配文件失败

L_FOTA_UPGRADE_NO_FILE_FAIL

无升级包文件

L_FOTA_UPGRADE_OPENFILE_FAIL

打开文件失败

L_FOTA_UPGRADE_FILESIZE_FAIL

升级包文件长度超过限制

L_FOTA_UPGRADE_LFS_MOUNT_FAIL

文件系统加载失败

L_FOTA_UPGRADE_PARAM_FAIL

参数错误

L_FOTA_UPGRADE_PROJECT_MATCH_FAIL

工程不匹配

L_FOTA_UPGRADE_BASELINE_MATCH_FAIL

基线不匹配

L_FOTA_UPGRADE_POINT_NULL_ERR

指针为空

L_FOTA_UPGRADE_FLAG_SET_ERR

标志位设置错误

3.2 Liot_FotaConfig_t

FOTA 参数配置结构体。用于配置 FOTA 升级的核心参数,包括升级链接、自动重启、超时时间、回调函数。

声明

typedef struct
{
    char *url;                   // 升级链接,支持http、ftp、本地文件系统三种类型
    bool enable;                 // 下载完成后是否自动重启升级:true-自动重启,false-仅下载校验不重启
    uint32_t timeout;            // 超时时间,单位:毫秒(ms)
    liot_fota_callback callback; // FOTA过程状态回调函数,用于实时上报下载进度
} Liot_FotaConfig_t;

参数

参数

说明

url

升级包的获取链接,格式要求严格:
1. 若使用HTTP升级:

url需要是 “http://” 或 “HTTP://” 开头

2. 若使用FTP升级

url需要是 “ftp://” 或 “FTP://” 开头

格式为:ftp://user:pass@ip:port / 路径 / 包名.par

3. 若使用文件系统升级

url需要是 “FILE:” 开头

enable

是否开启自动重启升级。
true - 下载 + 校验通过后,模组自动重启并执行升级;
false - 仅完成下载和校验,需用户手动触发重启(如调用:liot_power_reset()

timeout

下载超时时间(单位:毫秒)。

callback

FOTA过程状态回调函数,用于上报下载进度。

4 API 函数详解

4.1 Liot_FotaUpgrade

FOTA2 升级的核心函数,负责根据传入的配置参数,从指定地址(HTTP/FTP/ 本地文件)获取差分包,执行校验,校验通过后将差分包写入文件系统,并根据enable参数决定是否自动重启升级,在相关业务处理完成,可以调用liot_power_reset()来进行重启。

声明

liot_fota_err_e Liot_FotaUpgrade(Liot_FotaConfig_t *fota_config)

参数

fota_config

[In] 升级参数配置,详情请参考3.2 章。

返回值

liot_fota_err_e :执行结果码,请参考第 3.1 章。

5 升级前准备

5.1 差分包制作

差分包是 FOTA 升级的核心文件,由旧固件(当前设备运行版本)和新固件(目标升级版本)通过 FotaToolkit 工具生成,支持底包 + APP 差分升级单 APP 差分升级两种方式,制作前需完成工具准备和配置修改。

5.1.1 差分工具获取

FotaToolkit 工具:FotaToolKit,下载后直接解压即可使用,无需安装。

固件准备

需提前准备两个固件文件,固件在LSDK/gccout目录下,如果是底包+APP的升级方式,使用binpkg格式的固件,若单APP差分升级,使用bin格式的固件:

  • 旧固件文件(Old File):设备当前运行的固件版本。

  • 目标固件文件(Delta File):用于升级的目标固件版本。

5.1.2 确认APP分区大小

底包分离方案需要额外修改工具的配置文件,首先需要确认LSDK/components/basePkg/[模组型号]/partition_info.txt中当前APP的大小,(如 F6B_A 型号为LSDK/components/basePkg/F6B_A/partition_info.txt),查找appsdk分区的Size字段,记录其十六进制大小(如 0x0CB000)。

_images/fota-guide/image_1.png

5.1.3 修改 FotaToolkit 配置文件

  1. 进入 FotaToolkit 根目录,打开配置文件:./config/[模组型号].json(如 EC718PM 型号为ec718pm.json);

  2. 找到attr:“APP”(APP 分区)对应的size字段,该字段表示规划存储的加载最大尺寸,将其值修改为比实际 APP 分区适当大的数值(十进制),没有对其或需要在分区边界内的需求,例如实际 APP 大小为 831448,可修改为 933888;

  3. 使能APP升级

  4. 保存配置文件,修改后需关闭文件再重新打开工具,确保配置生效。

5.1.4 底包+APP差分升级

适用于底包和 APP 应用代码均有修改的场景,生成的差分包包含底包和 APP 的差异数据,操作步骤如下:

  1. 打开 FotaToolkit 工具,切换至 Generator 标签页;

  2. Config File:点击选择按钮,选择对应模组型号的配置文件(如ec718pm.json);

  3. Delta File:选择差分包的保存路径和名称,后缀为.par(如C:/FOTA/test.par);

  4. Old File:选择准备好的旧固件文件(binpkg格式);

  5. New File:选择准备好的新固件文件(binpkg格式);

  6. FLASH 配置:Load Addr 包类型选择BINPKG(默认);

  7. 所有参数配置完成后,点击Start按钮,工具开始生成差分包;

  8. 工具日志窗口显示>>>>>>>>>>>SUCC<<<<<<<<<<<,表示差分包制作成功;若显示错误,根据日志提示排查(如配置错误、固件格式错误)。

_images/fota-guide/image_4.png

5.1.5 单APP差分升级

适用于仅 APP 应用代码修改,底包无任何变化的场景,生成的差分包仅包含 APP 的差异数据,体积更小,操作步骤如下:

  1. 打开 FotaToolkit 工具,切换至 Generator 标签页;

  2. Config File:点击选择按钮,选择对应模组型号的配置文件(如ec718pm.json);

  3. Delta File:选择差分包的保存路径和名称,后缀为.par(如C:/FOTA/test.par);

  4. Old File:选择准备好的旧固件文件(bin格式);

  5. New File:选择准备好的新固件文件(bin格式);

  6. FLASH 配置:Load Addr 包类型选择 APP;

  7. 所有参数配置完成后,点击Start按钮,工具开始生成差分包;

  8. 工具日志窗口显示>>>>>>>>>>>SUCC<<<<<<<<<<<,表示差分包制作成功;若显示错误,根据日志提示排查(如配置错误、固件格式错误)。

_images/fota-guide/image_5.png

5.2 HTTP及FTP的环境搭建

用户在进行HTTP或FTP的FOTA测试时,需要使用自己的服务器进行远程升级,为了方便前期用户设备调测,这里给出利尔达 X 平台测试服务器的环境搭建流程和使用指导。

5.2.1 平台登陆

登陆利尔达 X 平台:https://account.xiot.senthink.com/,如下图所示,点击“控制台”进入功能模块窗口界面。

_images/fota-guide/image_6.png

图 2.1 Lierda X平台网络调试助手

开通后进入该功能模块,点击“网络调试助手”,创建所需要测试协议对应的服务器。

5.2.2 上传FOTA包

按照 2.1 章节开通“网络调试助手”后,进入该功能模块,选择左侧的“文件下载”,点击“添加文件”,上传已制作好的差分包。

_images/fota-guide/image_7.png

图2.2 上传差分包

Lierda X平台针对每个用户上传差分包对应的下载地址是固定的,只是根据用户差分包的名称不同而有所区别。如差分包的名称为fota_test3.par,完整下载地址为:http://xiot.oss.senthink.com/upload-http-ftp/5D6A3E7E/fota_test3.par。用户在进行初始程序编译时需要写入该地址:

_images/fota-guide/image_8.png

差分包上传后,可通过"查看下载地址"获取FOTA升级的地址。

_images/fota-guide/image_9.png

5.3 FILE升级

FILE 升级为本地文件系统升级,需先将制作好的差分包写入模组的文件系统中,模组从本地文件系统读取差分包完成升级,用户在进行初始程序编译时需要写入该地址:

_images/fota-guide/image_10.png

如下给出使用windows工具将差分包导入文件系统的方式:

工具链接:请至钉钉文档查看附件《文件系统读写工具》。

5.3.1 获取分区信息

分区信息在LSDK/components/basePkg/[模组型号]/partition_info.txt中,如下示例以F6B_A为例,,记录以下关键分区信息(十六进制),后续烧录需使用:

fs分区:Start(起始地址,如 0x321000)、Size(大小,如 0x0C3000);

_images/fota-guide/image_11.png

5.3.2 修改工具配置

将对应型号的烧录工具配置product_sets[芯片系列][芯片系列]products[芯片型号][芯片型号]\format\format[芯片型号].json,修改为实际地址和大小:

_images/fota-guide/image_12.png

5.3.3 导出文件系统

使用 EPAT 烧录工具将模组中的文件系统导出至本地,步骤如下:

  1. 打开 EPAT 工具,将模组通过 USB 转串口连接至电脑,选择正确的Com Port(串口号),波特率设置为921600;

  2. 点击工具顶部的Download标签页,确认已选择基础固件,模组能正常启动;

  3. 切换至Readback标签页,勾选 FS(文件系统);

  4. 点击Select Path,选择本地文件系统的保存路径,文件名称自定义;

  5. 点击Start按钮,工具开始读取模组的文件系统并导出至本地;

  6. 工具日志显示Read mem completed!,表示文件系统导出成功。

_images/fota-guide/image_13.png

导出成功如下图所示:

_images/fota-guide/image_14.png

5.3.4 使用lfsutil写入差分包

通过lfsutil工具将差分包写入文件系统中,比如导出的文件系统是fota_test.bin,差分包是testpar.par,存入文件系统后的名字需要与代码中的一致,demo中为fota_test.par

_images/fota-guide/image_15.png

5.3.5 烧录回设备

  1. 保持模组与电脑的串口连接,打开 EPAT 工具,选择正确的串口号和波特率;

  2. 点击工具顶部的Calibration标签页,点击Switch Burn Mode(切换烧录模式),模组进入烧录状态;

  3. 勾选Free burn Mode(自由烧录模式);

  4. BurnAddr:填写fs分区的起始地址(如 0x00B21000,从 partition_info.txt 中获取);

  5. Free burn file:点击Browse,选择步骤 6.3.4 中修改后的文件系统 bin 文件;

  6. 点击Start按钮,工具开始将文件系统烧录回模组;

  7. 烧录完成后,工具提示Burn Success,点击Reset重启模组,此时差分包已成功存入模组本地文件系统。

_images/fota-guide/image_16.png

6 代码示例

6.1 HTTP 升级

通过HTTP进行升级运行结果:

_images/fota-guide/image_17.png

6.2 FTP 升级

通过FTP进行升级运行结果:

_images/fota-guide/image_18.png

6.3 FILE 升级

通过文件系统进行升级运行结果:

_images/fota-guide/image_19.png

7 常见问题

7.1 测试Demo时提示"have no space"

有该提示说明差分包大于FOTA空间限制,可使用“过渡版本”进行升级,即如果从V1升级到V10,可以先从V1 -> V5,再从V5 -> V10。

7.2 是否存在超出存储空间的风险?

在制作差分包时,FotaToolkit 工具会根据所选芯片平台的配置文件自动进行 大小校验
若差分包大小超过芯片的 FOTA 分区容量,工具将提示错误并中止制作,无法生成差分包。

差分包制作成功后,还需结合模组的 文件系统容量 进行验证。
由于差分包文件下载后会暂存在文件系统中,实际可存储的最大差分包空间为:

可用空间 = 文件系统总大小 - 24 KB

24 KB用于存储原厂及我司相关配置信息。因此,只要在制作及下载阶段均通过校验,即不会出现超出存储空间的风险。

7.3 差分包合并还原后的固件存放位置

差分包在还原过程中,采用 边还原、边覆盖 的方式直接写入 Flash 的 应用代码区
即差分数据在解包时实时写入,不会额外占用独立存储空间,因此 不存在超出 Flash 空间的风险

7.4 FOTA 升级过程中异常掉电是否有保护机制?

在执行 Flash 擦写操作期间,如发生异常掉电,模组具备完善的 断点保护与恢复机制

  • 升级过程中,系统会记录当前的 升级标志位 和 分段进度信息

  • 当设备重新上电后,Bootloader 会读取标志位,判断升级状态;

  • 若检测到未完成的升级任务,将自动从中断位置继续执行后续升级,确保固件完整性与系统可恢复性。