可左右滑动选省市

一种固件升级方法和存储设备发明专利

更新时间:2024-07-01
一种固件升级方法和存储设备发明专利 专利申请类型:发明专利;
地区:福建-福州;
源自:福州高价值专利检索信息库;

专利名称:一种固件升级方法和存储设备

专利类型:发明专利

专利申请号:CN202110881745.3

专利申请(专利权)人:瑞芯微电子股份有限公司
权利人地址:福建省福州市鼓楼区软件大道89号18号楼

专利发明(设计)人:纪大峣

专利摘要:本发明涉及固件升级技术领域,特别涉及一种固件升级方法和存储设备。所述一种固件升级方法,包括步骤:获取用于第一次升级的固件升级包;执行第一次升级,在当前设备的预设位置增加新分区,所述新分区包括:预留包分区,所述预留包分区用于:存放第二次升级的固件升级包;执行第二次升级,读取所述第二次升级的固件升级包并存储至设备Memory,基于所述设备Memory中的第二次升级的固件升级包进行升级操作。上述方法,通过两次的固件升级使得在不需要借助外部存储介质的情况下,实现对设备整块存储介质进行变更升级,支持分区表任意变更,克服了对外置存储介质的依赖,从而满足某些特殊场景的固件升级需求。

主权利要求:
1.一种固件升级方法,其特征在于,包括步骤:
获取用于第一次升级的固件升级包;
执行第一次升级,在当前设备的预设位置增加新分区,所述新分区包括:预留包分区,所述预留包分区用于:存放第二次升级的固件升级包;
执行第二次升级,读取所述第二次升级的固件升级包并存储至设备Memory,基于所述设备Memory中的第二次升级的固件升级包进行升级操作,其中执行第一次升级,在当前设备的预设位置增加新分区包括:
根据所述第一次升级的固件升级包中的分区表配置文件升级设备的新分区表,包括:
解析分区表配置文件,查看是否存在虚拟分区标记;
如果不存在虚拟分区标记或者虚拟分区标记为空,则根据分区表配置文件中的新分区表更新设备中的旧分区表;
如果虚拟分区标记不为空,进一步解析出虚拟分区标记中的3个参数,查看第一参数取值是否为模式1或者模式2;
如果不为模式1也不为模式2,则根据分区表配置文件中的新分区表更新设备中的旧分区表;
当第一参数为模式1时,检查分区表配置文件中的新分区表是否存在特定的预留包分区,如果存在,直接根据分区表配置文件中的新分区表更新设备中的旧分区表,如果不存在预留包分区,则首先读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,如果该最后一个分区的起始地址与第二参数的大小和大于设备可用的flash空间大小,则退出升级,若该最后一个分区的起始地址与第二参数的大小和不大于设备可用的flash空间大小,则在待升级的分区表的最后一个分区之前插入一个预留包分区,所述预留包分区的起始地址为前面获取到的旧分区表最后一个分区的起始地址,所述预留包分区长度大于第二参数,同时更新最后一个分区的起始地址和长度,新的起始地址为:所述预留包分区的起始地址+所述预留包分区的长度,新的长度为:设备可用的flash空间大小‑(所述预留包分区的起始地址+所述预留包分区的长度);
当第一参数为模式2时,检查分区表配置文件中的新分区表是否存在特定的虚拟分区和预留包分区,如果这两个分区都存在,直接根据分区表配置文件中的新分区表更新设备中的旧分区表;否则如果第三参数与第二参数的大小和小于设备可用的flash空间大小,首先读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,然后在待升级的分区表的最后一个分区之前,插入两个新分区,分别是虚拟分区和预留包分区,所述虚拟分区的起始地址为0,长度需大于第三参数和前面获取到的旧分区表最后一个分区的起始地址两者之间的最大值;所述预留包分区的起始地址为虚拟分区的起始地址+虚拟分区的长度,所述预留包分区的长度需大于第二参数;同时更新最后一个分区的起始地址和长度,新的起始地址为:预留包分区的起始地址+预留包分区的长度,新的长度为:设备可用的flash空间大小‑该最后一个分区新的起始地址;
如果第三参数+第二参数>=设备可用的flash空间大小,读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,如果该最后一个分区的起始地址+第二参数>设备可用的flash空间大小,退出升级;否则在待升级的分区表的最后一个分区之前,插入一个预留包分区,该预留包分区的起始地址为前面获取到的旧分区表最后一个分区的起始地址,分区长度需大于第二参数,同时更新最后一个分区的起始地址和长度,新的起始地址为:预留包分区的起始地址+预留包分区的长度,新的长度为:设备可用的flash空间大小‑(预留包分区的起始地址+预留包分区的长度)。
2.根据权利要求1所述的固件升级方法,其特征在于,在获取用于第一次升级的固件升级包之前,还包括步骤:制作第一次升级的固件升级包,所述第一次升级的固件升级包的内容包括:新的升级模式完整镜像文件和分区表配置文件;
所述新的升级模式完整镜像文件包括新增指令:在退出升级模式前,检查预留位置是否存在分区表变更标记文件,若存在则重新格式化分区表最后的用户数据分区并重新建立文件系统,同时检查设备分区节点是否有所述预留包分区节点,若有,则对所述预留包分区进行格式化建立可读写的文件系统;
所述分区表配置文件包括:分区表信息和虚拟分区标记,当所述虚拟分区标记配置为空时,在当前旧固件的分区表中增加预留包分区,所述预留包分区位于当前分区表的所有固件分区之后、最后一个用户数据分区之前,且所述预留包分区的大小大于第二次升级的固件升级包的大小;
或当所述虚拟分区标记不为空时,所述虚拟分区标记包括:第一参数、第二参数和第三参数,所述第一参数表示虚拟分区模式,所述虚拟分区模式包括但不限于:模式1、模式2,所述第二参数表示第二次升级的固件升级包的大小,所述第三参数表示待升级的新平台固件分区表中最后一个用户数据区之前所有分区所占据的存储空间大小。
3.根据权利要求2所述的固件升级方法,其特征在于,所述第一次升级的固件升级包为完整包或差异包,当所述虚拟分区标记配置为空时,所述旧分区表设置有预留位置,所述预留位置为非加密可读写用户数据区,所述预留位置的大小不小于所述差异包的大小;
所述旧分区表中设置有引导通信分区,所述引导通信分区用于不同阶段固件间的通信;
所述旧分区表的最后一个分区为用户数据分区;
若所述第一次升级的固件升级包为完整包,则所述第一次升级的固件升级包包括:设备的完整固件,若所述第一次升级的固件升级包为差异包,则所述第一次升级的固件升级包包括:本次固件升级相对设备中已有固件的差异文件,所述本次固件升级相对设备中已有固件的差异文件的内容包括:进入系统后挂载所述预留包分区的指令。
4.根据权利要求1至3中任一项所述的固件升级方法,其特征在于,在执行第一次升级之前,还包括步骤:判断所述第一次升级的固件升级包的大小是否大于设备预留位置的可用大小,若大于,则退出升级流程,若不大于,则根据需要备份当前设备分区表最后一个分区中的用户数据区内容到网络服务器,将所述第一次升级的固件升级包存入当前设备中的预留位置,下发第一次升级指令,将所述第一次升级指令和所述第一次升级的固件升级包路径写入引导通信分区的位置1,进入升级模式。
5.根据权利要求4所述的固件升级方法,其特征在于,执行第一次升级,在当前设备的预设位置增加新分区包括步骤:步骤S1:升级所述第一次升级的固件升级包的新的升级模式完整镜像文件;
步骤S2:读取引导通信分区的位置2的内容,判断是否存在成功标记,存在,则跳转至步骤S3,若不存在,则根据所述第一次升级的固件升级包中的分区表配置文件升级设备的新分区表;分区表升级完成后,创建分区表变更标记文件到所述预留位置的指定路径,并设置成功标记到引导通信分区的位置2,重启设备,重新进入升级模式,重新执行步骤S1和步骤S2,由于此时引导通信分区的位置2存在成功标记,因此直接执行步骤S3;
步骤S3:执行升级包中的其他升级操作,更新系统分区;
步骤S4:在退出升级模式前,执行步骤S1中升级后新的升级模式完整镜像文件的新增指令;
步骤S5:清除引导通信分区的位置1和通信分区的位置2的内容,重启进入第一次升级的固件升级包升级后的系统。
6.根据权利要求5所述的固件升级方法,其特征在于,在执行第二次升级之前,还包括步骤:
挂载新增的预留包分区;
判断所述预留位置的指定路径是否存在预留分区成功标记文件,若不存在,则退出程序,若存在,则获取第二次升级的固件升级包存入至所述预留包分区;
删除所述预留位置指定路径下的分区表变更标记文件和预留分区成功标记文件,在引导通信分区的位置1写入第二次升级指令和第二次升级的固件升级包的路径,进入第二次升级。
7.根据权利要求6所述的固件升级方法,其特征在于,执行第二次升级,读取所述第二次升级的固件升级包并存储至设备Memory,基于所述设备Memory中的第二次升级的固件升级包进行升级操作包括步骤:读取引导通信分区的位置1的内容,并根据所述第二次升级指令触发第二次升级:
挂载预留包分区,判断所述预留包分区中的述第二次升级的固件升级包是否存在,若不存在则退出升级流程,若存在则通过设备分区节点来判断是否存在虚拟分区;
如果不存在虚拟分区,则计算所述第二次升级的固件升级包的大小,判断所述第二次升级的固件升级包的大小是否大于当前设备的可用Memory,如果是则退出,否则在Memory中新建临时文件,并将所述第二次升级的固件升级包的内容拷贝至所述临时文件,最后将第二次升级的固件升级包路径指向Memory中新建的临时文件,根据Memory中的第二次升级的固件升级包的内容,升级设备flash存储介质中的新分区表,根据第二次升级的固件升级包中的固件镜像升级所有新固件,完成设备固件的完全升级;
如果存在虚拟分区,则根据预留包分区中的第二次升级的固件升级包对虚拟分区代表的一部分flash存储介质进行升级,升级过程为:提取第二次升级的固件升级包中的分区表,构建一个待升级的临时分区表,在该临时分区表中将最后一个分区的长度设置为0,升级该临时分区表到虚拟分区所对应的flash存储介质,根据第二次升级的固件升级包中的固件镜像升级所有新固件到虚拟分区所对应的flash存储介质,当所有新固件升级完成之后,再次提取第二次升级的固件升级包中的分区表,对该提取的分区表不做任何修改,直接升级该分区表,完成设备固件的完全升级;
升级完成后,进入第二次升级的固件升级包包含的新系统,客户端根据需要将网络中备份的数据恢复到设备对应的用户数据区。
8.根据权利要求1至3、5至7中任一项所述的固件升级方法,其特征在于,所述第一次升级包括:第一次FOTA升级,所述第二次升级包括:第二次FOTA升级。
9.一种存储设备,其中存储有指令集,其特征在于,所述指令集用于执行:根据权利要求1至8中任一项所述的固件升级方法中的步骤。 说明书 : 一种固件升级方法和存储设备技术领域[0001] 本发明涉及固件升级技术领域,特别涉及一种固件升级方法和存储设备。背景技术[0002] FOTA(FirmwareOver‑the‑Air)固件空中下载技术,即固件在线升级技术,是通过FOTA固件升级引擎以固件升级包作为输入完成固件的升级。[0003] 现有的FOTA固件升级方案,主要可以分为以下几类:[0004] 1、不支持对设备物理分区表进行FOTA升级;[0005] 2、在支持对设备物理分区表进行FOTA升级的技术方案中,又存在如下两类:[0006] a、第一类方案支持部分分区表变更或支持某些特定方式的变更,比如与引导程序相关联的实际物理分区不能变更,或者只能调整已有分区的大小。这类方案绝大多数需要借助外部存储介质(SD/TF卡或U盘),一部分不需要借助外部存储介质的方案只支持特定方式的分区调整,即不会变更固件升级包所在的分区。[0007] b、第二类基本上支持任意分区表的变更。这类方案通常由于需要对整块设备flash存储介质进行升级,从而整块flash存储介质在升级过程中是无效的,不能在设备flash中存放任何形式的固件升级包,因此需要借助外部存储介质来存放固件升级包。[0008] 在某些特定场景下,期望将一个设备中的固件通过FOTA的方式升级到一个全新平台的固件,在这个过程中需要对设备的物理分区表进行任意变更和升级,同时在有些场景下设备也没有配置外置存储。[0009] 随着AIoT(智能物联网)设备的快速发展和演进,设备中搭配的flash存储介质和内存(设备Memory)容量也越来越大,功能越来越强,比如基于Android系统的AIoT设备其设备Memory通常都2GB以上。但是FOTA固件升级引擎通常无法直接利用这些设备Memory来存储固件升级包等数据,因为在FOTA升级过程中,通常需要重启设备进入升级模式(如android的recovery模式)来进行固件升级,在设备的重启过程中正常都会对各类DDR内存(设备Memory)进行初始化,使设备Memory中的数据全部无效。[0010] 同时设备所搭载的flash存储介质的容量也越来越大,通常包括8GB、16GB、32GB、64GB、128GB、512GB及以上,但是在对整块Flash存储介质进行分区表任意变更的FOTA升级过程中,由于整块flash存储介质在升级过程中是无效的,通常不能在设备flash中存放任何形式的固件升级包。[0011] 故此如何在没有配置外置存储的情况下,实现一个设备中的固件通过FOTA的方式升级到一个全新平台的固件,在这个过程中可以对设备的物理分区表进行任意变更和升级则成了亟需解决的问题。发明内容[0012] 为此,需要提供一种固件升级方法,用以解决当需要对整块设备flash存储介质进行任意变更,支持分区表任意变更的FOTA升级过程中,由于整块flash存储介质在升级过程中无效、不能在设备flash中存放任何形式的固件升级包,而导致的需要借助外部存储介质来存放固件升级包的技术问题。具体技术方案如下:[0013] 一种固件升级方法,包括步骤:[0014] 获取用于第一次升级的固件升级包;[0015] 执行第一次升级,在当前设备的预设位置增加新分区,所述新分区包括:预留包分区,所述预留包分区用于:存放第二次升级的固件升级包;[0016] 执行第二次升级,读取所述第二次升级的固件升级包并存储至设备Memory,基于所述设备Memory中的第二次升级的固件升级包进行升级操作。[0017] 进一步的,所述“获取用于第一次升级的固件升级包”前,还包括步骤:[0018] 制作第一次升级的固件升级包,所述第一次升级的固件升级包的内容包括:新的升级模式完整镜像文件和分区表配置文件;[0019] 所述新的升级模式完整镜像文件包括新增指令:在退出升级模式前,检查预留位置是否存在分区表变更标记文件,若存在则重新格式化分区表最后的用户数据分区并重新建立文件系统,同时检查设备分区节点是否有所述预留包分区节点,若有,则对所述预留包分区进行格式化建立可读写的文件系统;[0020] 所述分区表配置文件包括:分区表信息和虚拟分区标记,当所述虚拟分区标记配置为空时,在当前旧固件的分区表中增加预留包分区,所述预留包分区位于当前分区表的所有固件分区之后、最后一个用户数据分区之前,且所述预留包分区的大小大于第二次升级的固件升级包的大小;[0021] 或当所述虚拟分区标记不为空时,所述虚拟分区标记包括:第一参数、第二参数和第三参数,所述第一参数表示虚拟分区模式,所述虚拟分区模式包括但不限于:模式1、模式2,所述第二参数表示第二次升级的固件升级包的大小,所述第三参数表示待升级的新平台固件分区表中最后一个用户数据区之前所有分区所占据的存储空间大小。[0022] 进一步的,当所述虚拟分区标记配置为空时,所述旧分区表设置有预留位置,所述预留位置为非加密可读写用户数据区,所述预留位置的大小不小于所述差异包的大小;[0023] 所述旧分区表中设置有引导通信分区,所述引导通信分区用于不同阶段固件间的通信;[0024] 所述旧分区表的最后一个分区为用户数据分区;[0025] 若所述第一次升级的固件升级包为完整包,则所述第一次升级的固件升级包包括:设备的完整固件,若所述第一次升级的固件升级包为差异包,则所述第一次升级的固件升级包包括:本次固件升级相对设备中已有固件的差异文件,所述本次固件升级相对设备中已有固件的差异文件的内容包括:进入系统后挂载所述预留包分区的指令。[0026] 进一步的,所述“执行第一次升级”前,具体还包括步骤:[0027] 判断所述第一次升级的固件升级包的大小是否大于设备预留位置的可用大小,若大于,则退出升级流程,若不大于,则根据需要备份当前设备分区表最后一个分区中的用户数据区内容到网络服务器,将所述第一次升级的固件升级包存入当前设备中的预留位置,下发第一次升级指令,将所述第一次升级指令和所述第一次升级的固件升级包路径写入引导通信分区的位置1,进入升级模式。[0028] 进一步的,所述“执行第一次升级,在当前设备的预设位置增加新分区,所述新分区包括:预留包分区”,具体还包括步骤:[0029] 步骤S1:升级所述第一次升级的固件升级包的新的升级模式完整镜像文件;[0030] 步骤S2:读取引导通信分区的位置2的内容,判断是否存在成功标记,存在,则跳转至步骤S3,若不存在,则根据所述第一次升级的固件升级包中的分区表配置文件升级设备的新分区表,所述升级设备的新分区表的升级过程如下:[0031] 步骤S201:解析分区表配置文件,查看是否存在虚拟分区标记,如果不存在虚拟分区标记或者虚拟分区标记为空,则根据分区表配置文件中的新分区表更新设备中的旧分区表;[0032] 步骤S202:如果虚拟分区标记不为空,进一步解析出虚拟分区标记中的3个参数,查看第一参数取值是否为模式1或者模式2,若不为模式1也不为模式2,则根据分区表配置文件中的新分区表更新设备中的旧分区表;[0033] 当第一参数为模式1时,检查分区表配置文件中的新分区表是否存在特定的预留包分区,如果存在,直接根据分区表配置文件中的新分区表更新设备中的旧分区表,如果不存在预留包分区,则首先读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,如果该最后一个分区的起始地址与第二参数的大小和大于设备可用的flash空间大小,则退出升级,若该最后一个分区的起始地址与第二参数的大小和不大于设备可用的flash空间大小,则在待升级的分区表的最后一个分区之前插入一个预留包分区,所述预留包分区的起始地址为前面获取到的旧分区表最后一个分区的起始地址,所述预留包分区长度大于第二参数,同时更新最后一个分区的起始地址和长度,新的起始地址为:所述预留包分区的起始地址+所述预留包分区的长度,新的长度为:设备可用的flash空间大小‑(所述预留包分区的起始地址+所述预留包分区的长度);[0034] 当第一参数为模式2时,检查分区表配置文件中的新分区表是否存在特定的虚拟分区和预留包分区,如果这两个分区都存在,直接根据分区表配置文件中的新分区表更新设备中的旧分区表;否则如果第三参数与第二参数的大小和小于设备可用的flash空间大小,首先读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,然后在待升级的分区表的最后一个分区之前,插入两个新分区,分别是虚拟分区和预留包分区,所述虚拟分区的起始地址为0,长度需大于第三参数和前面获取到的旧分区表最后一个分区的起始地址两者之间的最大值;所述预留包分区的起始地址为虚拟分区的起始地址+虚拟分区的长度,所述预留包分区的长度需大于第二参数;同时更新最后一个分区的起始地址和长度,新的起始地址为:预留包分区的起始地址+预留包分区的长度,新的长度为:设备可用的flash空间大小‑该最后一个分区新的起始地址;[0035] 如果“第三参数+第二参数>=设备可用的flash空间大小”,读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,如果该最后一个分区的起始地址+第二参数>设备可用的flash空间大小,退出升级;否则在待升级的分区表的最后一个分区之前,插入一个“预留包分区”,该“预留包分区”的起始地址为前面获取到的旧分区表最后一个分区的起始地址,分区长度需大于第二参数,同时更新最后一个分区的起始地址和长度,新的起始地址为:“预留包分区”的起始地址+“预留包分区”的长度,新的长度为:设备可用的flash空间大小‑(“预留包分区”的起始地址+“预留包分区”的长度);[0036] 步骤S203:分区表升级完成后,创建分区表变更标记文件到所述预留位置的指定路径,并设置成功标记到引导通信分区的位置2,重启设备,重新进入升级模式,重新执行步骤S1和步骤S2,由于此时引导通信分区的位置2存在成功标记,因此直接执行步骤S3;[0037] 步骤S3:执行升级包中的其他升级操作,更新系统分区;[0038] 步骤S4:在退出升级模式前,执行步骤S1中升级后新的升级模式完整镜像文件的新增指令;[0039] 步骤S5:清除引导通信分区的位置1和通信分区的位置2的内容,重启进入第一次升级的固件升级包升级后的系统。[0040] 进一步的,所述“执行第二次升级”前,具体还包括步骤:[0041] 挂载新增的预留包分区;[0042] 判断所述预留位置的指定路径是否存在预留分区成功标记文件,若不存在,则退出程序,若存在,则获取第二次升级的固件升级包存入至所述预留包分区;[0043] 删除所述预留位置指定路径下的分区表变更标记文件和预留分区成功标记文件,在引导通信分区的位置1写入第二次升级指令和第二次升级的固件升级包的路径,进入第二次升级。[0044] 进一步的,所述“执行第二次升级,读取所述第二次升级的固件升级包并存储至设备Memory,基于所述设备Memory中的第二次升级的固件升级包进行升级操作”,具体还包括步骤:[0045] 读取引导通信分区的位置1的内容,并根据所述第二次升级指令触发第二次升级:[0046] 挂载预留包分区,判断所述预留包分区中的述第二次升级的固件升级包是否存在,若不存在则退出升级流程,若存在则计算所述第二次升级的固件升级包的大小,判断所述第二次升级的固件升级包的大小是否大于当前设备的可用Memory,如果是则退出,否则在Memory中新建临时文件,并将所述第二次升级的固件升级包的内容拷贝至所述临时文件,最后将第二次升级的固件升级包路径指向Memory中新建的临时文件,根据Memory中的第二次升级的固件升级包的内容,升级设备flash存储介质中的新分区表,根据第二次升级的固件升级包中的固件镜像升级所有新固件,完成设备固件的完全升级。[0047] 进一步的,所述第一次升级包括:第一次FOTA升级,所述第二次升级包括:第二次FOTA升级。[0048] 为解决上述技术问题,还提供了一种存储设备,具体技术方案如下:[0049] 一种存储设备,其中存储有指令集,所述指令集用于执行:上述所提及的一种固件升级方法中的任意步骤。[0050] 本发明的有益效果是:一种固件升级方法,包括步骤:获取用于第一次升级的固件升级包;执行第一次升级,在当前设备的预设位置增加新分区,所述新分区包括:预留包分区,所述预留包分区用于:存放第二次升级的固件升级包;执行第二次升级,读取所述第二次升级的固件升级包并存储至设备Memory,基于所述设备Memory中的第二次升级的固件升级包进行升级操作。上述方法,通过两次的固件升级使得在不需要借助外部存储介质的情况下,实现对设备整块存储介质进行变更升级,支持分区表任意变更,克服了对外置存储介质的依赖,从而满足某些特殊场景的固件升级需求。附图说明[0051] 图1为具体实施方式所述一种固件升级方法的流程图;[0052] 图2为具体实施方式所述一种固件升级方法整体的具体流程示意图;[0053] 图3为具体实施方式所述根据第一次升级的固件升级包中的分区表配置文件升级设备的新分区表流程示意图;[0054] 图4为具体实施方式所述一种存储设备的模块示意图。[0055] 附图标记说明:[0056] 400、存储设备。具体实施方式[0057] 为详细说明技术方案的技术内容、构造特征、所实现目的及效果,以下结合具体实施例并配合附图详予说明。[0058] 请参阅图1至图3,在本实施方式中,一种固件升级方法可应用在一种存储设备上,所述存储设备包括但不限于智能物联网设备。[0059] 本申请的核心技术思想在于:通过两次FOTA的方式可以支持不需要借助外部存储介质(SD/TF卡或U盘)的情况下,实现对设备整块存储介质进行变更升级,支持分区表任意变更。第一次FOTA在当前设备的分区表的所有固件分区之后、最后一个用户数据分区之前,增加1个(预留包分区),其中预留包分区用于存放第二次FOTA的固件升级包。然后第二次FOTA进入升级模式后,从新分区中读取出固件升级包并存储在设备Memory,然后基于设备Memory中的固件升级包对整个Flash进行任意分区表变更的FOTA升级。以下具体展开说明:[0060] 步骤S101:获取用于第一次升级的固件升级包。[0061] 步骤S102:执行第一次升级,在当前设备的预设位置增加新分区,所述新分区包括:预留包分区,所述预留包分区用于:存放第二次升级的固件升级包。[0062] 步骤S103:执行第二次升级。[0063] 步骤S104:读取所述第二次升级的固件升级包并存储至设备Memory。[0064] 步骤S105:基于所述设备Memory中的第二次升级的固件升级包进行升级操作。[0065] 在本实施方式中,所述第一次升级和所述第二次升级均可特指为FOTA升级。[0066] 在本实施方式中用于第一次升级的固件升级包是自行制作的,以下对如何制作第一次升级的固件升级包(又称为临时固件包)展开说明:[0067] 所述“获取用于第一次升级的固件升级包”前,还包括步骤:[0068] 制作第一次升级的固件升级包,所述第一次升级的固件升级包的内容包括:新的升级模式完整镜像文件和分区表配置文件。其中所述第一次升级的固件升级包可以为完整包,也可以为差异包,若所述第一次升级的固件升级包为完整包,则所述第一次升级的固件升级包包括:设备的完整固件,若所述第一次升级的固件升级包为差异包,则所述第一次升级的固件升级包包括:本次固件升级相对设备中已有固件的差异文件,所述本次固件升级相对设备中已有固件的差异文件的内容包括:进入系统后挂载所述预留包分区的指令。[0069] 所述新的升级模式完整镜像文件包括新增指令:在退出升级模式前,检查预留位置(又称为临时包分区)是否存在分区表变更标记文件(比如last_parameter_update),若存在则重新格式化分区表最后的用户数据分区并重新建立文件系统,同时检查设备分区节点是否有所述预留包分区节点,若有,则对所述预留包分区进行格式化建立可读写的文件系统;[0070] 所述分区表配置文件包括:分区表信息和虚拟分区标记,有两种可能的配置方法,可任选其一。[0071] 配置方法1:虚拟分区标记配置为空。此时存在两种具体的分区方法:[0072] 分区方法1:当所述虚拟分区标记配置为空时,在当前旧固件的分区表中增加预留包分区,所述预留包分区位于当前分区表的所有固件分区之后、最后一个用户数据分区之前,且所述预留包分区的大小需大于第二次升级的固件升级包的大小(也称为最终固件包),并且所述旧分区表设置有预留位置,所述预留位置为非加密可读写用户数据区,如Android的cache分区,所述预留位置的大小不小于所述差异包的大小;所述旧分区表中设置有一个原始分区,称为引导通信分区,所述引导通信分区用于不同阶段固件间的通信,所述旧分区表的最后一个分区为用户数据分区;[0073] 分区方法2:或当所述虚拟分区标记配置为空时,在当前旧固件分区表的最后一个用户数据分区之前增加预留包分区和虚拟分区,所述虚拟分区的长度需大于待升级的新平台固件分区表中最后一个用户数据区之前所有分区所占据的存储空间大小和当前旧固件分区表的最后一个用户数据分区之前的所有分区所占据的存储空间大小两者的最大值,所述预留包分区位于虚拟分区之后,所述预留包分区的起始地址为所述虚拟分区的长度,所述预留包分区的长度大于第二次升级的固件升级包的大小。具体可如下:[0074] 虚拟分区的起始地址为0x0;长度为待升级的新平台固件分区表中最后一个用户数据区之前所有分区所占据的存储空间大小,如果该长度小于当前旧固件分区表的最后一个用户数据分区之前的所有分区所占据的存储空间大小,则该长度设置为当前旧固件分区表的最后一个用户数据分区之前的所有分区所占据的存储空间大小。即虚拟分区的长度需大于如下两者的最大值:待升级的新平台固件分区表中最后一个用户数据区之前所有分区所占据的存储空间大小、当前旧固件分区表的最后一个用户数据分区之前的所有分区所占据的存储空间大小。[0075] 预留包分区位于虚拟分区之后,它的起始地址为虚拟分区的长度,它的长度需第二次升级的固件升级包的大小,即前面提到的最终固件包的大小。[0076] 同分区方法1,这里也要求旧分区表要有一个非加密可读写用户数据区,如Android的cache分区,该分区的可用大小至少需能存入这里第一次FOTA升级的:临时固件包的差异包版本,后面称该分区为临时包分区。同时旧分区表中要有一个原始分区,称为引导通信分区,用于系统不同阶段固件之间的通信,并且旧分区表的最后一个分区是用户数据分区。[0077] 配置方法2:[0078] 或当所述虚拟分区标记不为空时,所述虚拟分区标记包括:第一参数、第二参数和第三参数,所述第一参数表示虚拟分区模式,所述虚拟分区模式包括但不限于:模式1、模式2,所述第二参数表示第二次升级的固件升级包(即最终固件包)的大小,所述第三参数表示待升级的新平台固件分区表中最后一个用户数据区之前所有分区所占据的存储空间大小。[0079] 制作好所述第一次升级的固件升级包后,所述“执行第一次升级”前,具体还包括步骤:[0080] 判断所述第一次升级的固件升级包的大小是否大于设备预留位置的可用大小,若大于,则退出升级流程,若不大于,则根据需要备份当前设备分区表最后一个分区中的用户数据区内容到网络服务器,将所述第一次升级的固件升级包存入当前设备中的预留位置,下发第一次升级指令,将所述第一次升级指令和所述第一次升级的固件升级包路径写入引导通信分区的位置1,进入升级模式。具体可如下:[0081] 升级客户端与升级服务器交互,获取待升级的第一次升级的固件升级包,如果所述第一次升级的固件升级包大小大于设备预留位置的可用大小,则退出升级流程。否则,根据需要备份当前设备分区表最后一个分区中的用户数据区内容到网络服务器,将所述第一次升级的固件升级包存入当前设备中的预留位置,下发普通FOTA升级指令,将该升级指令和第一次升级的固件升级包路径写入引导通信分区的位置1,重启进入升级模式(在Android下是recovery)。[0082] 当满足第一次升级条件时,则执行第一次升级,所述“执行第一次升级,在当前设备的预设位置增加新分区,所述新分区包括:预留包分区”,具体还包括步骤:[0083] 步骤S1:升级所述第一次升级的固件升级包中的新的升级模式完整镜像文件(在Android下是recovery.img);[0084] 步骤S2:读取引导通信分区的位置2的内容,判断是否存在成功标记,存在,则跳转至步骤S3,若不存在,则根据所述第一次升级的固件升级包中的分区表配置文件升级设备的新分区表,所述升级设备的新分区表的升级过程如下:[0085] 步骤S201:解析分区表配置文件,查看是否存在虚拟分区标记,如果不存在虚拟分区标记或者虚拟分区标记为空,则根据分区表配置文件中的新分区表更新设备中的旧分区表;[0086] 步骤S202:如果虚拟分区标记不为空,进一步解析出虚拟分区标记中的3个参数,查看第一参数取值是否为模式1或者模式2,若不为模式1也不为模式2,则根据分区表配置文件中的新分区表更新设备中的旧分区表;[0087] 步骤S2021:当第一参数为模式1时,检查分区表配置文件中的新分区表是否存在特定的预留包分区,如果存在,直接根据分区表配置文件中的新分区表更新设备中的旧分区表,如果不存在预留包分区,则首先读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,如果该最后一个分区的起始地址与第二参数的大小和大于设备可用的flash空间大小,则退出升级,若该最后一个分区的起始地址与第二参数的大小和不大于设备可用的flash空间大小,则在待升级的分区表的最后一个分区之前插入一个预留包分区,所述预留包分区的起始地址为前面获取到的旧分区表最后一个分区的起始地址,所述预留包分区长度大于第二参数,同时更新最后一个分区的起始地址和长度,新的起始地址为:所述预留包分区的起始地址+所述预留包分区的长度,新的长度为:设备可用的flash空间大小‑(所述预留包分区的起始地址+所述预留包分区的长度);[0088] 步骤S2022:当第一参数为模式2时,检查分区表配置文件中的新分区表是否存在特定的虚拟分区和预留包分区,如果这两个分区都存在,直接根据分区表配置文件中的新分区表更新设备中的旧分区表;否则:[0089] 如果第三参数与第二参数的大小和小于设备可用的flash空间大小,首先读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,然后在待升级的分区表的最后一个分区之前,插入两个新分区,分别是虚拟分区和预留包分区,所述虚拟分区的起始地址为0,长度需大于第三参数和前面获取到的旧分区表最后一个分区的起始地址两者之间的最大值;所述预留包分区的起始地址为虚拟分区的起始地址+虚拟分区的长度,所述预留包分区的长度需大于第二参数;同时更新最后一个分区的起始地址和长度,新的起始地址为:预留包分区的起始地址+预留包分区的长度,新的长度为:设备可用的flash空间大小‑该最后一个分区新的起始地址;[0090] 如果“第三参数+第二参数>=设备可用的flash空间大小”,读取当前设备中的旧分区表,获取该旧分区表的最后一个分区的起始地址和长度,如果该最后一个分区的起始地址+第二参数>设备可用的flash空间大小,退出升级;否则在待升级的分区表的最后一个分区之前,插入一个“预留包分区”,该“预留包分区”的起始地址为前面获取到的旧分区表最后一个分区的起始地址,分区长度需大于第二参数。同时更新最后一个分区的起始地址和长度,新的起始地址为:“预留包分区”的起始地址+“预留包分区”的长度,新的长度为:设备可用的flash空间大小‑(“预留包分区”的起始地址+“预留包分区”的长度);[0091] 步骤S203:分区表升级完成后,创建分区表变更标记文件到所述预留位置的指定路径,并设置成功标记到引导通信分区的位置2,重启设备,重新进入升级模式(此时的升级模式运行的是“新的升级模式完整镜像文件”中的指令),重新执行步骤S1和步骤S2,由于此时引导通信分区的位置2存在成功标记,因此直接执行步骤S3;[0092] 步骤S3:执行升级包中的其他升级操作,更新系统分区;[0093] 步骤S4:在退出升级模式前,执行步骤S1中升级后新的升级模式完整镜像文件的新增指令,即检查预留位置的指定路径是否存在“分区表变更标记文件”(比如last_parameter_update),如果存在则重新格式化分区表最后的用户数据分区、重新建立文件系统,同时检查设备分区节点是否有“预留包分区”节点,如果有,则对该“预留包分区”进行格式化,建立可读写的文件系统,最后在“临时包分区”的指定路径创建“预留分区成功标记文件”。[0094] 步骤S5:清除引导通信分区的位置1和通信分区的位置2的内容,重启进入第一次升级的固件升级包升级后的系统。[0095] 在第一升级完后,进入第二次升级前,具体还包括步骤:[0096] 挂载新增的预留包分区;[0097] 判断所述预留位置的指定路径是否存在预留分区成功标记文件,若不存在,则退出程序,若存在,则获取第二次升级的固件升级包存入至所述预留包分区;[0098] 删除所述预留位置指定路径下的分区表变更标记文件和预留分区成功标记文件,在引导通信分区的位置1写入第二次升级指令和第二次升级的固件升级包的路径,进入第二次升级。具体可如下:[0099] 进入“临时固件包”升级后的系统,挂载新增的“预留包分区”。[0100] 升级客户端检查预留位置的指定路径是否存在“预留分区成功标记文件”,如果存在,则与升级服务器交互,获取最终用于升级的待升级新平台固件完整包,即第二次升级的固件升级包,该第二次升级的固件升级包的分区表中的各分区的名字、大小、分区数量等可以与当前设备的分区表完全不同,但要求分区表的最后一个分区需是用户数据分区,并且存在引导通信分区。升级客户端将获取到的第二次升级的固件升级包存入“预留包分区”,然后删除预留位置指定路径下的“分区表变更标记文件”和“预留分区成功标记文件”,最后在“引导通信分区”的位置1写入跨平台完全升级指令和第二次升级的固件升级包的路径,重启进入升级模式。[0101] 第二次升级过程具体如下:[0102] 所述“执行第二次升级,读取所述第二次升级的固件升级包并存储至设备Memory,基于所述设备Memory中的第二次升级的固件升级包进行升级操作”,具体还包括步骤:[0103] 在升级模式下,升级程序读取引导通信分区的位置1的内容,并根据所述第二次升级指令触发第二次升级,即根据其中存储的跨平台完全升级指令,触发跨平台完全升级流程:[0104] 挂载预留包分区,判断所述预留包分区中的述第二次升级的固件升级包是否存在,若不存在则退出升级流程,若存在则通过设备分区节点来判断是否存在虚拟分区;[0105] 若不存在虚拟分区,则计算所述第二次升级的固件升级包的大小,判断所述第二次升级的固件升级包的大小是否大于当前设备的可用Memory,如果是则退出,否则在Memory中新建临时文件,并将所述第二次升级的固件升级包的内容拷贝至所述临时文件,最后将第二次升级的固件升级包路径指向Memory中新建的临时文件,根据Memory中的第二次升级的固件升级包的内容,升级设备flash存储介质中的新分区表,根据第二次升级的固件升级包中的固件镜像升级所有新固件,完成设备固件的完全升级;[0106] 所述“若存在虚拟分区,则将新平台固件升级至所述虚拟分区,并通过所述第二次升级的固件升级包对所述虚拟分区进行升级操作”,具体还包括步骤:[0107] 如果存在虚拟分区,则根据预留包分区中的第二次升级的固件升级包对虚拟分区代表的一部分flash存储介质进行升级,升级过程为:提取第二次升级的固件升级包中的分区表,构建一个待升级的临时分区表,在该临时分区表中将最后一个分区的长度设置为0,升级该临时分区表到虚拟分区所对应的flash存储介质,根据第二次升级的固件升级包中的固件镜像升级所有新固件到虚拟分区所对应的flash存储介质,当所有新固件升级完成之后,再次提取第二次升级的固件升级包中的分区表,对该提取的分区表不做任何修改,直接升级该正式分区表,完成设备固件的完全升级。[0108] 升级完成后,进入第二次升级的固件升级包包含的新系统,客户端根据需要将网络中备份的数据恢复到设备对应的用户数据区。[0109] 以上方法实施的整个流程图如图2所示,其中所述根据第一次升级的固件升级包中的分区表配置文件升级设备的新分区表流程示意图如图3所示。[0110] 以上方法,通过两次FOTA的方式支持不需要借助外部存储介质(SD/TF卡或U盘)的情况下,实现对设备整块存储介质进行变更升级,支持分区表任意变更,克服了对外置存储介质的依赖,从而满足某些特殊场景的FOTA固件升级需求。解决了当需要对整块设备flash存储介质进行任意变更,支持分区表任意变更的FOTA升级过程中,由于整块flash存储介质在升级过程中无效、不能在设备flash中存放任何形式的固件升级包,而导致的需要借助外部存储介质来存放固件升级包的问题。[0111] 请参阅图4,在本实施方式中,一种存储设备400的具体实施方式如下:[0112] 一种存储设备400,其中存储有指令集,所述指令集用于执行:上述所提及的一种固件升级方法中的任意步骤。[0113] 需要说明的是,尽管在本文中已经对上述各实施例进行了描述,但并非因此限制本发明的专利保护范围。因此,基于本发明的创新理念,对本文所述实施例进行的变更和修改,或利用本发明说明书及附图内容所作的等效结构或等效流程变换,直接或间接地将以上技术方案运用在其他相关的技术领域,均包括在本发明的专利保护范围之内。

专利地区:福建

专利申请日期:2021-08-02

专利公开日期:2024-06-18

专利公告号:CN113791812B

电话咨询
读内容
搜本页
回顶部