一种固件升级方法及装置与流程

文档序号:12362705阅读:198来源:国知局
一种固件升级方法及装置与流程

本发明涉及通信领域,尤其涉及一种固件升级方法及装置。



背景技术:

固件升级技术是对存放在终端设备内部非易失性存储区中的固件进行无线升级的技术。

目前固件升级的通用处理方式为终端设备检测到升级信息后,将要升级的数据包或者新固件程序下载到终端设备中,此时有如下两种处理方式:处理方式一为终端设备将所有数据包接收完成之后,写入到终端设备的非易失性存储区中;处理方式二为终端设备每接收到一包数据,便将其写入到终端设备的非易失性存储区中。

在固件升级过程中必不可少的操作便是进行数据包或者固件程序的完整性检测(否则会导致固件不完整而无法启动的后果),其最简单的方式就是按照上述处理方式一,将所有数据包接收完成之后,进行完整性检测,并在检测成功后写入到终端设备的非易失性存储区中;但该方式对于终端设备易失性存储区非常小,尤其是在一些单片机中却无法使用。而按照上述处理方式二,目前的办法是在所有数据包都写入到终端设备的非易失性存储区之后,在轮询各非易失性存储区块或非易失性存储区页内容进行完整性检测,该方式非常耗时,且由于非易失性存储区是以块或页为单位进行存储数据,因此存在同一块或者同一页进行多次擦写的情况,造成非易失性存储区寿命降低。



技术实现要素:

本发明的目的是为了克服现有技术的不足,提供一种固件升级方法及装置。

一方面,本发明提供了一种固件升级方法,包括:

步骤S1:终端设备接收上位机发送来的升级数据包,将其作为当前升级数据包,并判断所述当前升级数据包是否为最后一包,是则执行步骤S3,否则执行步骤S2;

步骤S2:所述终端设备将所述当前升级数据包中的升级数据保存到易失性存储区中,并更新所述易失性存储区中缓存数据的长度,判断所述缓存数据的长度是否小于预设长度,是则返回步骤S1,否则顺序读取长度为所述预设长度整数倍的缓存数据,根据读取到的缓存数据更新所述易失性存储区中的第一校验值,并将所述读取到的缓存数据保存到非易失性存储区中,更新所述缓存数据的长度,返回步骤S1;

步骤S3:所述终端设备判断当前升级数据包中是否含有升级数据,是则将所述当前升级数据包中的升级数据保存到易失性存储区中,根据所述易失性存储区中的缓存数据更新第一校验值,并将所述缓存数据保存到非易失性存储区中,执行步骤S4,否则根据所述易失性存储区中的缓存数据更新第一校验值,并将所述缓存数据保存到所述非易失性存储区中,执行步骤S4;

步骤S4:所述终端设备解析所述当前升级数据包得到第二校验值,判断所述第一校验值与所述第二校验值是否相同,是则根据所述非易失性存储区中的升级数据执行升级操作,否则返回错误码给所述上位机,结束。

可选地,所述步骤S1中,所述判断当前升级数据包是否为最后一包,具体为:所述终端设备判断所述当前升级数据包中预设字节上的数据是否为第一预设数据,是则确认所述当前升级数据包是最后一包,否则确认所述当前升级数据包不是最后一包。

可选地,所述步骤S2中,所述更新所述易失性存储区中缓存数据的长度,具体为:

所述终端设备解析所述当前升级数据包,得到当前升级数据长度,将所述当前升级数据长度与所述缓存数据的长度相加求和,将所述缓存数据的长度更新为相加求得的和。

可选地,所述步骤S2中,所述根据读取到的缓存数据更新所述易失性存储区中的第一校验值,具体为:所述终端设备将读取到的缓存数据与所述第一校验值做预设哈希运算得到哈希结果,将所述第一校验值更新为所述哈希结果;

可选地,所述步骤S3中,根据所述易失性存储区中的缓存数据更新第一校验值,具体为:所述终端设备将所述易失性存储区中的所有缓存数据与所述第一校验值做预设哈希运算得到哈希结果,将所述第一校验值更新为所述哈希结果。

可选地,所述步骤S2中,当首次判断出所述缓存数据的长度不小于所述预设长度时,所述根据读取到的缓存数据更新所述易失性存储区中的第一校验值,具体为:

所述终端设备将读取到的缓存数据与初始校验值做所述预设哈希运算得到哈希结果,将所述哈希结果作为第一校验值。

可选地,所述步骤S2判断为否时,更新所述缓存数据的长度,具体为:

所述终端设备将所述缓存数据的长度更新为所述缓存数据的长度与所述预设长度做取余运算得到的余数;

或者,

所述终端设备将所述缓存数据的长度更新为所述缓存数据的长度与所述预设长度做除运算得到的余数。

可选地,所述步骤S3中,所述终端设备判断当前升级数据包中是否含有升级数据,具体为:所述终端设备解析所述当前升级数据包,判断其第二个字节上的数据是否为第二预设数据,如果是,则确认所述当前升级数据包中不含有升级数据,否则确认所述当前升级数据包中含有升级数据。

可选地,所述步骤S3中判断为否时,根据所述易失性存储区中的缓存数据更新第一校验值之前,还包括:所述终端设备判断所述易失性存储区中是否含有缓存数据,是则根据所述易失性存储区中的缓存数据更新第一校验值,否则执行步骤S4。

可选地,所述步骤S2判断为否,返回步骤S1之前,还包括:

步骤A:所述终端设备根据预定方式更新所述非易失性存储区中的存储编号;

所述步骤S3中,执行步骤S4之前,还包括:

步骤B:所述终端设备将所述存储编号更新为第三预设数据;

当所述终端设备重新启动时,还包括:

步骤D:所述终端设备判断升级数据是否全部接收完成,是则根据所述非易失性存储区中的升级数据执行升级操作,否则返回所述存储编号给所述上位机,返回步骤S1。

相应地,由所述步骤D返回步骤S1之后,在所述步骤S1中,所述终端设备接收到上位机发送来的升级数据包之后,还包括:

步骤E1:所述终端设备判断接收到的升级数据包中是否含有存储编号,是则执行步骤E2,否则确认上位机重新发送升级数据;

步骤E2:所述终端设备判断所述接收到的升级数据包中的存储编号与其返回给上位机的存储编号是否相同,是则确认上位机续传升级数据,否则返回错误码给上位机。

可选地,由所述步骤D返回步骤S1之后,

在所述步骤S1中执行步骤S2时,所述步骤S2中,所述将所述读取到的缓存数据保存到非易失性存储区中,具体为:

当所述上位机续传升级数据时,所述终端设备根据所述返回给上位机的存储编号,将所述读取到的缓存数据顺序保存到非易失性存储区中;

当所述上位机重新发送升级数据时,所述终端设备从所述非易失性存储区的第一页或者第一块开始将所述读取到的缓存数据保存;

在所述步骤S1中执行步骤S3时,所述步骤S3中,所述将所述缓存数据保存到所述非易失性存储区中,具体为:

当所述上位机续传升级数据时,所述终端设备根据所述返回给上位机的存储编号,将所述缓存数据顺序保存到所述非易失性存储区中;

当所述上位机重新发送升级数据时,所述终端设备从所述非易失性存储区的第一页或者第一块开始将所述缓存数据保存。

进一步地,所述步骤A和所述步骤B,还包括:所述终端设备将所述非易失性存储区中的备份校验值更新为所述第一校验值,更新掉电标识。

具体地,所述存储编号包括:第一存储编号和第二存储编号,所述备份校验值包括第一备份校验值和第二备份校验值,所述掉电标识包括第一掉电标识和第二掉电标识;所述第一存储编号、第一备份校验值和第一掉电标识保存在所述非易失性存储区中的第一存储区中,所述第二存储编号、第二备份校验值和第二掉电标识保存在所述非易失性存储区中的第二存储区中;

所述步骤A和所述步骤B之前,还包括:

步骤C:所述终端设备读取所述第一掉电标识和所述第二掉电标识并判断是否相同,是则确定随机选择一个存储区作为更新存储区,更新所述更新存储区中的数据,将另一个存储区作为备份存储区,更新所述备份存储区中的掉电标识;否则确定取值在前的掉电标识对应的存储区为更新存储区,更新所述更新存储区中的数据,将另一个存储区作为备份存储区,更新所述备份存储区中的掉电标识。

可选地,所述步骤A,具体为:

所述终端设备读取所述备份存储区中的存储编号,根据读取到的存储编号和所述预定方式更新所述更新存储区中的存储编号。

可选地,所述步骤D,具体为:

所述终端设备读取所述第一掉电标识和所述第二掉电标识并判断是否相同,是则确认升级数据未接收完成,返回初始编号给上位机;否则读取取值在后的掉电标识对应的存储区中的存储编号,判断读取到的存储编号是否为所述第三预设数据,是则确认升级数据全部接收完成,根据所述非易失性存储区中的升级数据执行升级操作,否则确认升级数据未全部接收完成,返回所述读取到的存储编号给所述上位机。

可选地,由所述步骤D返回步骤S1之后,

在步骤S1中执行步骤S2时,所述根据读取到的缓存数据更新所述易失性存储区中的第一校验值,具体为:所述终端设备读取返回给上位机的存储编号对应的存储区中的备份校验值,将读取到的备份校验值与所述读取到的缓存数据做预设哈希运算得到哈希结果,将所述哈希结果作为第一校验值;

在所述步骤S1中执行步骤S3时,所述根据所述易失性存储区中的缓存数据更新第一校验值,具体为:所述终端设备读取返回给上位机的存储编号对应的存储区中的备份校验值,将读取到的备份校验值与所述易失性存储区中的缓存数据做预设哈希运算得到哈希结果,将所述哈希结果作为第一校验值。

可选地,所述步骤D中,返回所述存储编号给所述上位机之后,还包括:所述上位机接收所述终端设备返回的所述存储编号,根据所述存储编号计算所述终端设备接收到的升级数据的长度,并根据得到升级数据的长度,顺序下发后续的升级数据给所述终端设备。

可选地,所述根据所述存储编号计算所述终端设备接收到的升级数据的长度,具体为:将所述存储编号与所述预设长度相乘得到所述终端设备接收到的升级数据的长度。

可选地,所述根据得到升级数据的长度,顺序下发后续的升级数据给所述终端设备,具体为:所述上位机判断得到的升级数据长度中最后一个字节上的数据是否为一个升级数据包的结束字节上的数据,是则从该升级数据包的下一个升级数据包开始下发给所述终端设备,否则从该升级数据包开始下发给所述终端设备。

可选地,所述步骤S2中,返回步骤S1之前,还包括:所述终端设备返回应答数据给所述上位机。

可选地,所述根据所述非易失性存储区中的升级数据执行升级操作之前,还包括:

步骤F:所述终端设备将所述升级数据从所述非易失性存储区中拷贝的应用区;

或者,

步骤G:所述终端设备将应用区的地址修改为所述非易失性存储区的地址。

可选地,所述步骤S1之前,还包括:所述终端设备判断升级标识是否置位,是则执行步骤S1,否则与上位机进行数据通讯;

所述步骤D之前,还包括:所述终端设备判断升级标识是否置位,是则执行步骤D,否则与上位机进行数据通讯;

所述步骤F或者所述步骤G之后,还包括:所述终端设备将所述升级标识复位。

可选地,所述步骤F或者所述步骤G之后,还包括:所述终端设备将所述备份校验值设置为初始校验值,将所述存储编号设置为初始编号,将所述掉电标识设置为初始数据。

另一方面,本发明还提供了一种固件升级装置,包括:

接收模块,用于接收上位机发送来的升级数据包,将其作为当前升级数据包;

第一判断模块,用于判断所述接收模块接收到的当前升级数据包是否为最后一包;

第一保存模块,用于当所述第一判断模块判断出所述接收模块接收到的当前升级数据包不是最后一包时,将所述当前升级数据包中的升级数据保存到易失性存储区中;

第一更新模块,用于当所述第一保存模块将所述当前升级数据包中的升级数据保存到易失性存储区中后,更新所述易失性存储区中缓存数据的长度;

第二判断模块,用于所述第一更新模块更新所述缓存数据的长度之后,判断所述缓存数据的长度是否小于预设长度;

读取模块,用于当所述第二判断模块判断出所述缓存数据的长度不小于预设长度时,顺序读取长度为所述预设长度整数倍的缓存数据;

第二更新模块,用于根据所述读取模块读取到的缓存数据更新所述易失性存储区中的第一校验值;

第二保存模块,用于将所述读取模块读取到的缓存数据保存到非易失性存储区中;

第三更新模块,用于所述第二保存模块将所述读取模块读取到的缓存数据保存到非易失性存储区中之后,更新所述缓存数据的长度;

所述接收模块,还用于当所述第二判断模块判断出所述缓存数据的长度小于预设长度时,接收上位机发送来的升级数据包,将其作为当前升级数据包;还用于当所述第三更新模块更新所述缓存数据的长度之后,接收上位机发送来的升级数据包,将其作为当前升级数据包;

第三判断模块,用于当所述第一判断模块判断出所述当前升级数据包是最后一包时,判断当前升级数据包中是否含有升级数据;

第三保存模块,用于当所述第三判断模块判断出当前升级数据包中含有升级数据时,将所述当前升级数据包中的升级数据保存到非易失性存储区中;

第四更新模块,用于所述第三保存模块将所述当前升级数据包中的升级数据保存到易失性存储区中之后,根据所述易失性存储区中的缓存数据更新第一校验值;还用于当所述第三判断模块判断出当前升级数据包不含有升级数据时,根据所述易失性存储区中的缓存数据更新第一校验值;

第四保存模块,用于当所述第四更新模块根据所述易失性存储区中的缓存数据更新第一校验值之后,将所述缓存数据保存到所述非易失性存储区中;

解析模块,用于当所述第四保存模块将所述缓存数据保存到所述非易失性存储区中之后,解析所述当前升级数据包得到第二校验值;

第四判断模块,用于判断所述解析模块得到的第二校验值与所述第一校验值是否相同;

执行模块,用于当所述第四判断模块判断出所述解析模块得到的第二校验值与所述第一校验值相同时,根据所述非易失性存储区中的升级数据执行升级操作;

发送模块,用于当所述第四判断模块判断出所述解析模块得到的第二校验值与所述第一校验值不同时,返回错误码给所述上位机,结束。

可选地,所述第一判断模块,具体用于:判断所述接收模块接收到的当前升级数据包中预设字节上的数据是否为第一预设数据,是则确认所述当前升级数据包是最后一包,否则确认所述当前升级数据包不是最后一包。

可选地,所述第一更新模块,具体用于:解析所述当前升级数据包,得到当前升级数据长度,将所述当前升级数据长度与所述缓存数据的长度相加求和,将所述缓存数据的长度更新为相加求得的和。

可选地,所述第二更新模块,具体用于:将所述读取模块读取到的缓存数据与所述第一校验值做预设哈希运算得到哈希结果,将所述第一校验值更新为所述哈希结果;

所述第四更新模块,具体用于:将所述易失性存储区中的所有缓存数据与所述第一校验值做预设哈希运算得到哈希结果,将所述第一校验值更新为所述哈希结果。

可选地,所述第二更新模块,还用于:当所述第二判断模块首次判断出所述缓存数据的长度不小于所述预设长度时,将所述读取模块读取到的缓存数据与初始校验值做所述预设哈希运算得到哈希结果,将所述哈希结果作为第一校验值。

可选地,所述第三更新模块,具体用于:

将所述缓存数据的长度更新为所述缓存数据的长度与所述预设长度做减运算得到的差;

或者,

将所述缓存数据的长度更新为所述缓存数据长度与所述预设长度做取余运算得到的余数。

可选地,所述第三判断模块,具体用于:解析所述当前升级数据包,判断其第二个字节上的数据是否为第二预设数据,如果是,则确认所述当前升级数据包中不含有升级数据,否则确认所述当前升级数据包中含有升级数据。

可选地,本发明中的装置还包括:第五判断模块;

所述第五判断模块,用于当所述第三判断模块判断出当前升级数据包中不含有升级数据时,触发所述第四更新模块之前,判断所述易失性存储区中是否含有缓存数据;

所述第四更新模块,具体用于当所述第五判断模块判断出所述易失性存储区中含有缓存数据时,根据所述易失性存储区中的缓存数据更新第一校验值;

所述解析模块,还用于当所述第五判断模块判断出所述易失性存储区中不有缓存数据时,解析所述当前升级数据包得到第二校验值。

可选地,本发明中的装置还包括:第五更新模块、第六更新模块和第六判断模块;

所述第五更新模块,用于当所述第二判断模块判断出所述缓存数据的长度不小于预设长度时,触发所述接收模块之前,根据预定方式更新所述非易失性存储区中的存储编号;

所述第六更新模块,用于所述解析模块解析所述当前升级数据包得到第二校验值之前,将所述存储编号更新为第三预设数据;

所述第六判断模块,用于所述终端设备重新启动时,判断升级数据是否全部接收完成;

所述执行模块,还用于当所述第六判断模块判断出升级数据全部接收完成时,根据所述非易失性存储区中的升级数据执行升级操作;

所述发送模块,还用于当所述第六判断模块判断出升级数据未全部接收完成时,返回所述存储编号给所述上位机;

所述接收模块,还用于所述发送模块返回所述存储编号给所述上位机之后,接收所述上位机发送来的升级数据包,将其作为当前升级数据包。

可选地,本发明中的装置还包括:第七判断模块和第八判断模块;

所述第七判断模块,用于当所述第六判断模块判断出升级数据未全部接受完成时,触发所述接收模块之后,判断所述接收模块接收到的升级数据包中是否含有存储编号,是则触发第八判断模块,否则确认上位机重新发送升级数据;

所述第八判断模块,用于当所述第七判断模块判断出所述接收模块接收到的升级数据包中含有存储编号时,判断所述接收到的升级数据包中的存储编号与所述发送模块返回给上位机的存储编号是否相同,是则确认上位机续传升级数据;

所述发送模块,还用于当所述第八判断模块判断出所述接收到的升级数据包中的存储编号与所述发送模块返回给上位机的存储编号不相同时,返回错误码给上位机。

可选地,所述第二保存模块,还用于:当所述第七判断模块判断出上位机重新发送升级数据,且第一判断模块判断出当前升级数据包不是最后一包时,根据所述发送模块返回给上位机的存储编号,将所述读取模块读取到的缓存数据顺序保存到非易失性存储区中;还用于当所述第八判断模块判断出上位机续传升级数据,且第一判断模块判断出当前升级数据包不是最后一包时,从所述非易失性存储区的第一页或者第一块开始将所述读取模块读取到的缓存数据保存;

所述第三保存模块,具体用于:当所述第七判断模块判断出上位机重新发送升级数据,且第一判断模块判断出当前升级数据包是最后一包时,根据所述发送模块返回给上位机的存储编号,将所述缓存数据顺序保存到所述非易失性存储区中;还用于当所述第八判断模块判断出上位机续传升级数据,且第一判断模块判断出当前升级数据包是最后一包时,从所述非易失性存储区的第一页或者第一块开始将所述缓存数据保存。

可选地,本发明中的装置还包括:

第七更新模块,用于将所述非易失性存储区中的备份校验值更新为所述第一校验值,更新掉电标识。

可选地,本发明中的装置还包括:第九判断模块;

所述存储编号包括:第一存储编号和第二存储编号,所述备份校验值包括第一备份校验值和第二备份校验值,所述掉电标识包括第一掉电标识和第二掉电标识;所述第一存储编号、第一备份校验值和第一掉电标识保存在所述非易失性存储区中的第一存储区中,所述第二存储编号、第二备份校验值和第二掉电标识保存在所述非易失性存储区中的第二存储区中;

所述第九判断模块,具体用于:所述第五更新模块根据预定方式更新所述非易失性存储区中的存储编号之前,和所述第六更新模块将所述存储编号更新为第三预设数据之前,读取所述第一掉电标识和所述第二掉电标识并判断是否相同,是则确定随机选择一个存储区作为更新存储区,更新所述更新存储区中的数据,将另一个存储区作为备份存储区,更新所述备份存储区中的掉电标识;否则确定取值在前的掉电标识对应的存储区为更新存储区,更新所述更新存储区中的数据,将另一个存储区作为备份存储区,更新所述备份存储区中的掉电标识。

可选地,所述第五更新模块,具体用于:读取所述备份存储区中的存储编号,根据读取到的存储编号和所述预定方式更新所述更新存储区中的存储编号。

可选地,所述第六判断模块,具体包括:

第一判断子模块,用于读取所述第一掉电标识和所述第二掉电标识并判断是否相同;

所述发送模块,具体用于当所述第一判断子模块判断出所述第一掉电标识和所述第二掉电标识相同时,确认升级数据未接收完成,返回初始编号给上位机;

第二判断子模块,用于当所述第一判断子模块判断出所述第一掉电标识和所述第二掉电标识不同时,读取取值在后的掉电标识对应的存储区中的存储编号,判断读取到的存储编号是否为所述第三预设数据;

所述执行模块,具体用于当所述第二判断子模块判断出读取到的存储编号是所述第三预设数据时,确认升级数据全部接收完成,根据所述非易失性存储区中的升级数据执行升级操作;

所述发送模块,还用于当所述第二判断子模块判断出读取到的存储编号不是所述第三预设数据时,确认升级数据未全部接收完成,返回所述第二判断子模块读取到的存储编号给所述上位机;

所述接收模块,还用于所述发送模块返回所述第二判断子模块读取到的存储编号给所述上位机之后,接收所述上位机发送来的升级数据,将其作为当前升级数据包。

可选地,所述第二更新模块,还用于:当所述第六判断模块判断出升级数据未全部接收完成,触发所述接收模块之后,在所述接收模块触发所述第二更新模块时,读取返回给上位机的存储编号对应的存储区中的备份校验值,将读取到的备份校验值与所述读取到的缓存数据做预设哈希运算得到哈希结果,将所述哈希结果作为第一校验值;

所述第四更新模块,还用于当所述第六判断模块判断出升级数据未全部接收完成,触发所述接收模块之后,在所述接收模块触发所述第四更新模块时,读取返回给上位机的存储编号对应的存储区中的备份校验值,将读取到的备份校验值与所述易失性存储区中的缓存数据做预设哈希运算得到哈希结果,将所述哈希结果作为第一校验值。

可选地,所述发送模块,还用于所述第二判断模块触发所述接收模块之前,及所述第三更新模块触发所述接收模块之前,返回应答数据给所述上位机。

可选地,本发明中的装置还包括:

拷贝模块,用于所述执行模块根据所述非易失性存储区中的升级数据执行升级操作之前,将所述升级数据从所述非易失性存储区中拷贝的应用区;

或者,

修改模块,用于所述执行模块根据所述非易失性存储区中的升级数据执行升级操作之前,将应用区的地址修改为所述非易失性存储区的地址。

可选地,本发明中的装置还包括:第九判断模块、通讯模块和第一设置模块;

所述第九判断模块,用于当所述接收模块接收上位机发送来的升级数据包作为当前升级数据包之前,判断升级标识是否置位;

所述接收模块,具体用于:当所述第九判断模块判断出升级标识置位时,接收上位机发送来的升级数据包作为当前升级数据包;

所述通讯模块,用于当所述第九判断模块判断出升级标识未置位时,与上位机进行数据通讯;

所述第九判断模块,还用于所述第六判断模块判断升级数据是否全部接收完成之前,判断升级标识是否置位;

所述第六判断模块,具体用于:当所述第九判断模块判断出升级标识置位时,判断升级数据是否全部接收完成;

所述第一设置模块,用于当所述拷贝模块将所述升级数据从所述非易失性存储区中拷贝的应用区之后,或者所述修改模块将应用区的地址修改为所述非易失性存储区的地址之后,将所述升级标识复位。

可选地,本发明中的装置还包括:

第二设置模块,用于当所述拷贝模块将所述升级数据从所述非易失性存储区中拷贝的应用区之后,或者所述修改模块将应用区的地址修改为所述非易失性存储区的地址之后,将所述第三校验值设置为初始校验值,将所述存储编号设置为初始编号,将所述掉电标识设置为初始数据。

本发明与现有技术相比,具有以下有点:在终端设备固件升级的过程中,不需要终端设备拥有很大的易失性存储区,即能进行高效的数据包或者固件程序的完整性检测操作,并且减少了重复擦写非易失性存储区的操作,延长了非易失性存储区的寿命;同时本发明还提供了防掉电功能,大大提高了固件升级的性能。

附图说明

为了更清楚的说明本发明实施例的技术方案,下面将对实施例中所需使用的附图做简单的介绍,显而易见地,下面描述的附图仅仅是本发明的一部分实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,可以根据这些附图获得其他的附图。

图1为本发明实施例一提供的一种固件升级方法流程图;

图2为本发明实施例二提供的一种固件升级方法流程图;

图3为本发明实施例三提供的一种固件升级装置图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一

本发明实施例一提供一种固件升级方法,如图1所示,包括:

步骤101:终端设备接收上位机发送来的升级数据包,将其作为当前升级数据包,并判断当前升级数据包是否为最后一包,是则执行步骤103,否则执行步骤102;

在本实施例中,判断当前升级数据包是否为最后一包,具体为:终端设备判断当前升级数据包中预设字节上的数据是否为第一预设数据,是则确认当前升级数据包是最后一包,否则确认当前升级数据包不是最后一包;

优选地,终端设备判断当前升级数据包中第六个字节上的数据是否为0x03,如果是则确认当前升级数据包是最后一包,否则确认当前升级数据包不是最后一包。

步骤102:终端设备将当前升级数据包中的升级数据保存到易失性存储区中,并更新易失性存储区中缓存数据的长度,判断缓存数据的长度是否小于预设长度,是则返回步骤101,否则顺序读取长度为预设长度整数倍的缓存数据,根据读取到的缓存数据更新易失性存储区中的第一校验值,并将读取到的缓存数据保存到非易失性存储区中,更新缓存数据的长度,返回步骤101;

在本实施例中,非易失性存储区以块为单位或者以页为单位进行存储数据,并且每块或者每页中存储数据的长度预先设定,例如,预设长度为8字节;

在本实施例中,更新易失性存储区中缓存数据的长度,具体为:终端设备解析当前升级数据包,得到当前升级数据长度,将当前升级数据长度与缓存数据的长度相加求和,并将缓存数据的长度更新为相加求得的和;

更加具体地,当当前升级数据包为第一包升级数据时,更新易失性存储区中缓存数据的长度,具体为:终端设备将当前升级数据的长度作为缓存数据的长度;

在本实施例中,根据读取到的缓存数据更新易失性存储区中的第一校验值,具体为:终端设备将读取到的缓存数据与第一校验值做预设哈希运算得到哈希结果,将第一校验值更新为计算得到的哈希结果;

更加具体地,当首次判断出缓存数据的长度不小于所述预设长度时,根据读取到的缓存数据更新易失性存储区中的第一校验值,具体为:终端设备将读取到的缓存数据与初始校验值做预设哈希运算得到哈希结果,将哈希结果作为第一校验值;

进一步地,在本实施例中,当步骤102中判断为否时,更新缓存数据的长度,具体为:

终端设备将缓存数据的长度更新为将缓存数据的长度与预设长度做除运算得到的余数;

或者,

终端设备将缓存数据的长度更新为将缓存数据的长度与预设长度做取余运算得到的余数。

更进一步地,在本实施例中,返回步骤101之前,还包括:终端设备返回应答数据给上位机。

步骤103:终端设备判断当前升级数据包中是否含有升级数据,是则将当前升级数据包中的升级数据保存到易失性存储区中,根据易失性存储区中的缓存数据更新第一校验值,并将缓存数据保存到非易失性存储区中,执行步骤104,否则根据易失性存储区中的缓存数据更新第一校验值,并将缓存数据保存到非易失性存储区中,执行步骤104;

在本实施例中,判断当前升级数据包中是否含有升级数据,具体为:终端设备解析当前升级数据包,判断其第二个字节上的数据是否为第二预设数据,如果是,则确认当前升级数据包中不含有升级数据,否则确认当前升级数据包中含有升级数据;

优选地,在本实施例中,第二预设数据为0x14;

进一步地,在本实施例中,根据易失性存储区中的缓存数据更新第一校验值,具体为:终端设备将易失性存储区中的所有缓存数据与第一校验值做预设哈希运算得到哈希结果,将第一校验值更新为运算得到的哈希结果;

更进一步地,在本实施例中,步骤103中判断为否时,根据易失性存储区中的缓存数据更新第一校验值之前,还包括:终端设备判断易失性存储区中是否含有缓存数据,是则根据易失性存储区中的缓存数据更新第一校验值,否则执行步骤104。

步骤104:终端设备解析当前升级数据包得到第二校验值,判断第二校验值与第一校验值是否相同,是则根据非易失性存储区中的升级数据执行升级操作,否则返回错误码给上位机,结束。

在本实施例中,步骤102判断为否,返回步骤101之前,还包括:

步骤A:终端设备根据预定方式更新非易失性存储区中的存储编号;

相应地,步骤103中,执行步骤104之前,还包括:

步骤B:终端设备将存储编号更新为第三预设数据;

当终端设备重新启动时,还包括:

步骤D:终端设备判断升级数据是否全部接收完成,是则根据非易失性存储区中的升级数据执行升级操作,否则返回存储编号给上位机,返回步骤101。

在本实施例中,由步骤D返回步骤101之后,在步骤101中,终端设备接收到上位机发送来的升级数据包之后,还包括:

步骤E1:终端设备判断接收到的升级数据包中是否含有存储编号,是则执行步骤E2,否则确认上位机重新发送升级数据;

步骤E2:终端设备判断接收到的升级数据包中的存储编号与其返回给上位机的存储编号是否相同,是则确认上位机续传升级数据,否则返回错误码给上位机。

相应地,由步骤D返回步骤101之后,

在步骤101中执行步骤102时,步骤102中将读取到的缓存数据保存到非易失性存储区中,具体为:

当上位机续传升级数据时,终端设备根据返回给上位机的存储编号,将读取到的缓存数据顺序保存到非易失性存储区中;

当上位机重新发送升级数据时,终端设备从非易失性存储区的第一页或者第一块开始将读取到的缓存数据保存;

在步骤101中执行步骤103时,步骤103中将缓存数据保存到非易失性存储区中,具体为:

当上位机续传升级数据时,终端设备根据返回给上位机的存储编号,将缓存数据顺序保存到非易失性存储区中;

当上位机重新发送升级数据时,终端设备从非易失性存储区的第一页或者第一块开始将缓存数据保存。

进一步地,在本实施例中,步骤A和步骤B中,还包括:终端设备将非易失性存储区中的备份校验值更新为第一校验值,更新掉电标识;

在本实施例中,存储编号包括:第一存储编号和第二存储编号,备份校验值包括第一备份校验值和第二备份校验值,掉电标识包括第一掉电标识和第二掉电标识;其中,第一存储编号、第一备份校验值和第一掉电标识保存在非易失性存储区中的第一存储区中,第二存储编号、第二备份校验值和第二掉电标识保存在非易失性存储区中的第二存储区中;

步骤A和步骤B之前,还包括:

步骤C:终端设备读取第一掉电标识和第二掉电标识并判断是否相同,是则确定随机选择一个存储区作为更新存储区,更新更新存储区中的数据,将另一个存储区作为备份存储区,更新备份存储区中的掉电标识;否则确定取值在前的掉电标识对应的存储区为更新存储区,更新更新存储区中的数据,将另一个存储区作为备份存储区,更新备份存储区中的掉电标识。

相应地,步骤A,具体为:终端设备读取备份存储区中的存储编号,根据读取到的存储编号和预定方式更新更新存储区中的存储编号;

步骤D,具体为:终端设备读取第一掉电标识和第二掉电标识并判断是否相同,是则确认升级数据未接收完成,返回初始编号给上位机;否则读取取值在后的掉电标识对应的存储区中的存储编号,判断读取到的存储编号是否为第三预设数据,是则确认升级数据全部接收完成,根据非易失性存储区中的升级数据执行升级操作,否则确认升级数据未全部接收完成,返回读取到的存储编号给上位机。

进一步地,由步骤D返回步骤101之后,

在步骤101中执行步骤102时,根据读取到的缓存数据更新易失性存储区中的第一校验值,具体为:终端设备读取返回给上位机的存储编号对应的存储区中的备份校验值,将读取到的备份校验值与读取到的缓存数据做预设哈希运算得到哈希结果,将哈希结果作为第一校验值;

在步骤101中执行步骤103时,根据易失性存储区中的缓存数据更新第一校验值,具体为:终端设备读取返回给上位机的存储编号对应的存储区中的备份校验值,将读取到的备份校验值与易失性存储区中的缓存数据做预设哈希运算得到哈希结果,将哈希结果作为第一校验值。

更进一步地,步骤D中,返回存储编号给所述上位机之后,还包括:上位机接收终端设备返回的存储编号,根据存储编号计算终端设备接收到的升级数据的长度,并根据得到升级数据的长度,顺序下发后续的升级数据给终端设备。

其中,根据存储编号计算终端设备接收到的升级数据的长度,具体为:将存储编号与预设长度相乘得到终端设备接收到的升级数据的长度;

根据得到升级数据的长度,顺序下发后续的升级数据给终端设备,具体为:上位机判断得到的升级数据长度中最后一个字节上的数据是否为一个升级数据包的结束字节上的数据,是则从该升级数据包的下一个升级数据包开始下发给终端设备,否则从该升级数据包开始下发给终端设备。

在本实施例中,上述根据非易失性存储区中的升级数据执行升级操作之前,还包括:

步骤F:终端设备将升级数据从非易失性存储区中拷贝的应用区;

或者,

步骤G:终端设备将应用区的地址修改为非易失性存储区的地址。

在本实施例中,步骤F或者步骤G之后,还包括:终端设备将备份校验值设置为初始校验值,将存储编号设置为初始编号,将掉电标识设置为初始数据。

再进一步地,步骤101之前,还包括:终端设备判断升级标识是否置位,是则执行步骤S101,否则与上位机进行数据通讯;

步骤D之前,还包括:终端设备判断升级标识是否置位,是则执行步骤D,否则与上位机进行数据通讯;

相应地,步骤F或者步骤G之后,还包括:终端设备将所述升级标识复位。

实施例二

本发明实施例二提供一种固件升级的方法,如图2所示,包括:

步骤201:终端设备芯片复位,启动加载器;

步骤202:终端设备判断升级标识是否置位,是则执行步骤203,否则执行步骤222;

优选地,终端设备判断升级标识是否为1,是则确认升级标识置位,否则确认升级标识未置位。

步骤203:终端设备判断升级数据是否全部接收完成,是则执行步骤204,否则执行步骤206;

需要说明地,在本实施例中,非易失性存储区可以以块为单位或者以页为单位进行存储数据,优选地,在本实施例中,非易失性存储区以块为单位进行存储数据,且每块中存储的数据长度固定,以下简称为预设长度;并且终端设备在非易失性存储区中分配一部分空间,即专用存储区,所述专用存储区分为第一存储区和第二存储区,均用来记录接收到的升级数据的信息及掉电标识,其中接收到的升级数据的信息包括已保存升级数据的非易失性存储区的编号和已保存到非易失性存储区中的升级数据的校验值,在本实施例中简称为存储编号和备份校验值;

其中,存储编号包括第一存储编号和第二存储编号,备份校验值包括第一备份校验值和第二备份校验值,掉电标识包括第一掉电标识和第二掉电标识;并且第一存储编号、第一备份校验值和第一掉电标识保存在专用存储区的第一存储区中,第二存储编号、第二备份校验值和第二掉电标识保存在专用存储区的第二存储区中;

在本实施例中,步骤203具体为:

终端设备读取第一掉电标识和第二掉电标识并判断是否相同,是则确认升级数据未接收完成;否则读取取值在后的掉电标识对应的存储区中的存储编号,判断读取到的存储编号是否为第三预设数据,是则确认升级数据全部接收完成,否则确认升级数据未全部接收完成;

更加具体地,终端设备读取第一掉电标识和第二掉电标识并比对,

当第一掉电标识和第二掉电标识均为初始数据时,确认升级数据未全部接收完成;

当第一掉电标识为初始数据,第二掉电标识不为初始数据时,终端设备读取第二存储编号,判断其是否为第三预设数据,是则确认升级数据全部接收完成,否则确认升级数据未全部接收完成;反之,同理;

当第一掉电标识为第一数据,第二掉电标识为第二数据时,终端设备读取第二存储编号,判断其是否为第三预设数据,是则确认升级数据全部接收完成,否则确认升级数据未全部接收完成;反之,同理;

当第一掉电标识为第二数据,第二掉电标识为第三数据时,终端设备读取第二存储编号,判断其是否为第三预设数据,是则确认升级数据全部接收完成,否则确认升级数据未全部接收完成;反之,同理;

当第一掉电标识为第三数据,第二掉电标识为第一数据时,终端设备读取第二存储编号,判断其是否为第三预设数据,是则确认升级数据全部接收完成,否则确认升级数据未全部接收完成;反之,同理。

优选地,在本实施例中,初始数据为0xFF,第一数据为0x00,第二数据为0x80,第三数据为0xC0,第三预设数据为0xfe。

步骤204:终端设备将保存的升级数据从交换区拷贝到应用区;

在本实施例中,步骤204还可以为:终端设备将应用区的地址修改为交换区的地址;

具体地,终端设备芯片再次复位,启动加载器时,根据应用区的地址进入到应用区,执行固件升级操作。

步骤205:终端设备清除专用存储区中保存的信息,将升级标识复位,返回步骤201;

具体地,终端设备将专用存储区中第一存储编号和第二存储编号设置为初始编号0x00,将第一备份校验值和第二备份校验值设置为初始校验值,将第一掉电标识和第二掉电标识设置为初始数据0xFF,将固件升级标识设置为0。

步骤206:终端设备与上位机进行蓝牙连接,等待并接收上位机发送的升级初始化指令;

优选地,接收到的升级初始化指令为:6B 00 00 00 00 01。

步骤207:终端设备将保存的存储编号返回给上位机;

具体地,终端设备读取专用存储区中第一掉电标识和第二掉电标识并判断是否相同,是则返回初始编号给上位机;否则读取取值在后的掉电标识对应的存储区中的存储编号,并返回给上位机;

更加具体地,终端设备读取专用存储区中的第一掉电标识和第二掉电标识并比对,

当第一掉电标识和第二掉电标识均为初始数据时,终端设备返回初始编号给上位机;

当第一掉电标识为初始数据,第二掉电标识不为初始数据时,确认前一次更新过程中没有发生掉电,或者更新过程中发生掉电且数据未全部更新完成,则将第二存储编号返回给上位机;

当第一掉电标识和第二掉电标识均不为初始数据时,确认前一次更新过程中发生掉电,但是存储编号和备份校验值已更新完成,具体地:当第一掉电标识为第一数据,第二掉电标识为第二数据时,确认前一次更新的是第二存储区中的数据,则将第二存储编号返回给上位机,反之,同理;当第一掉电标识为第二数据,第二掉电标识为第三数据时,确认前一次更新的是第二存储区中的数据,则将第二存储编号返回给上位机,反之,同理;当第一掉电标识为第三数据,第二掉电标识为第一数据时,确认前一次更新的是第二存储区,则将第二存储编号返回给上位机,反之,同理;

更进一步地,在本实施例中,终端设备返回存储编号给上位机之后,还包括:上位机接收终端设备返回的存储编号,根据接收到的存储编号计算终端设备接收到的升级数据长度,并根据得到升级数据长度,顺序下发后续的升级数据给终端设备;

优选地,在本实施例中,上位机将升级数据按照顺序下发给终端设备;

在本实施例中,上位机计算终端设备已接收到的升级数据的长度,具体为:将存储编号与预设长度相乘得到终端设备接收到的升级数据长度;

例如,终端设备返回的存储编号为2,预设长度为8字节,则计算可得终端设备已接收到的升级数据的长度为2*8=16字节;

更加具体地,在本实施例中,上位机根据得到的升级数据长度,顺序下发后续的升级数据给终端设备,具体为:上位机判断得到的升级数据长度中最后一个字节上的数据是否为一个升级数据包的结束字节上的数据,是则从该升级数据包的下一个升级数据包开始下发给终端设备,否则从该升级数据包开始下发给终端设备;并且将接收到的存储编号同升级数据一同下发给终端设备;

在本实施例中,当固件再次有了更新时,上位机还可以重新下发新的升级新数据包给终端设备,此时不在将接收到的存储编号同升级数据一同下发给终端设备。

步骤208:终端设备接收上位机发送来的升级数据包,将其作为当前升级数据包,判断当前升级数据包中的存储编号与其返回给上位机的存储编号是否相同,是则执行步骤209,否则返回错误码给上位机,将升级标识复位,执行步骤224;

具体地,终端设备读取当前升级数据包中最后一个字节上的数据得到存储编号;

进一步地,在本实施例中,当终端设备接收到的升级数据包中不含有存储编号时,确认上位机重新发送升级数据;

相应地,当首次将易失性存储区中的缓存数据保存到非易失性存储区时,终端设备从非易失性存储区的第一块开始将缓存数据保存,否则,将缓存数据顺序保存到非易失性存储区中;

更进一步地,当上位机重新发送升级数据时,若非易失性存储区中含有升级数据,则将已有的升级数据覆盖。

步骤209:终端设备判断当前升级数据包是否为最后一包,是则执行步骤217,否则执行步骤210;

具体地,终端设备解析当前升级数据包,判断其第六字节上的数据是否为第一预设数据,是则确认当前升级数据包为最后一包,否则确认当前升级数据包不是最后一包;优选地,在本实施例中,第一预设数据具体为0x03;

更加具体地,当升级数据包中第六个字节上的数据为0x02时,表示该升级数据包为中间包;

进一步地,在本实施例中,上位机每次下发的升级数据的长度可以是固定的,也可以是不固定的。

步骤210:终端设备解析当前升级数据包,得到当前升级数据长度,根据当前升级数据长度读取当前升级数据,并将当前升级数据保存到易失性存储区中;

具体地,终端设备读取当前升级数据包中第2个字节至第5个字节上的数据,得到当前升级数据长度;根据得到的当前升级数据长度读取第七个字节(含第七个字节)之后的相应数据得到当前升级数据,将读取到的当前升级数据顺序保存到易失性存储区中已有缓存数据之后;

例如,终端设备读取到的当前升级数据长度为10字节,读取到的当前升级数据为44 55 66 77 88 C0 4C 09 40 58,易失性存储区中的缓存数据为11 22 33,则将当前升级数据保存到易失性存储区中之后,易失性存储区中当前缓存数据为11 22 33 44 55 66 77 88 C0 4C 09 40 58。

步骤211:终端设备更新易失性存储区中缓存数据的长度,并判断缓存数据的长度是否小于预设长度,是则继续接受上位机发送的升级数据包,将其作为当前升级数据包,返回步骤209,否则执行步骤212;

具体地,终端设备将当前升级数据长度与易失性存储区中缓存数据的长度相加求和,将缓存数据的长度更新为相加求得的和;

例如,在本实施例中,易失性存储区中缓存数据的长度为3字节,则相加求得的和为:3+10=13字节,更新3字节为13字节。

进一步地,在本实施例中,步骤211判断为是时,还包括:终端设备返回应答数据给上位机;

具体地,当当前升级数据包为中间包,并且终端设备对当前升级数据包处理成功时,则返回应答数据83 01 00 00 00 02 01,其中第六个字节上的数据02表示当前升级数据包为中间包,第七个字节上的数据01表示当前升级数据包处理成功;

更加具体地,当第六个字节上的数据为0x01是,表示当前升级数据包为第一包,当第六个字节上的数据为0x03时,表示当前升级数据包为最后一包,当第七个字节上的数据为0x00时,表示当前数据包处理失败。

步骤212:终端设备顺序读取长度为预设长度整数倍的缓存数据,根据读取到的缓存数据更新易失性存储区中的第一校验值;

在本实施例中,步骤212之前,还包括:终端设备将缓存数据的长度与预设长度做取模运算得到所述整数倍,并读取长度为预设长度整数倍的缓存数据;

例如,在本实施例中,将缓存数据的长度13字节与预设长度8字节做取模运算得到的整数倍为1倍,则读取长度为8字节的1倍的缓存数据,即读取8字节的缓存数据。

具体地,终端设备根据易失性存储区中缓存数据接收的先后顺序,从前至后顺序读取长度为预设长度整数倍的缓存数据;

例如,在本实施例中,读取到的缓存数据为11 22 33 44 55 66 77 88;

进一步地,在本实施例中,优选地,通过预设哈希算法根据读取到的缓存数据更新易失性存储区中的第一校验值;

具体地,终端设备将读取到的缓存数据与易失性存储区中保存的第一校验值做Update哈希运算,得到哈希结果,并将第一校验值更新为运算得到的哈希结果;

更进一步地,当步骤211中首次判断出缓存数据的长度不小于预设长度时,根据读取到的缓存数据更新易失性存储区中的第一校验值,具体为:将读取到的缓存数据与初始校验值做Update哈希运算得到哈希结果,并将运算得到的哈希结果保存到易失性存储区中,作为第一校验值;

例如:易失性存储区中保存的第一校验值为:BD C0 4C 09 92 F3 7F 1E 38 89 F2 74 D0 54 9C C0 40 58 11 D5,与上述读取到的缓存数据11 22 33 44 55 66 77 88做Update哈希运算得到的哈希结果为:32 5E EC 4F 52 AA 29 42 BE 1A D7 58 66 6D 96 5F 9A EE 4F B7;将BD C0 4C 09 92 F3 7F 1E 38 89 F2 74D0 54 9C C0 40 58 11 D5更新为32 5E EC 4F 52 AA 29 42 BE 1A D7 58 66 6D 96 5F 9A EE 4F B7;

在本实施例中,更新第一校验值还可以通过MAC运算。

步骤213:终端设备将读取到的缓存数据保存到非易失性存储区中,并更新易失性存储区中缓存数据的长度;

在本实施例中,更新易失性存储区中缓存数据的长度,具体为:

终端设备将缓存数据的长度更新为缓存数据的长度与预设长度做取余运算得到的余数;

或者,

终端设备将缓存数据的长度更新为缓存数据的长度与预设长度做除运算得到的余数;

例如,在本实施例中,将缓存数据的长度13字节与预设长度8字节做取余运算得到的余数为5字节,则将缓存数据的长度更新为5字节。

步骤214:终端设备更新保存的存储编号;

优选地,在本实施例中,终端设备将保存的存储编号与求得的整数倍相加求和,将保存的存储编号更新为相加求得的和;

具体地,终端设备读取专用存储区中的第一掉电标识和第二掉电标识并比对,

当第一掉电标识和第二掉电标识均为初始数据时,终端设备随机选取其中一个存储编号更新为求得的整数倍;

当第一掉电标识为初始数据,第二掉电标识不为初始数据时,确认前一次更新过程中没有发生掉电,或者更新过程中发生掉电且数据未全部更新完成,本次更新第一存储区中的数据,终端设备读取第二存储区中的第二存储编号,将其与求得的整数倍相加求和,并将第一存储编号更新为计算求得的和,反之,同理;

当第一掉电标识和第二掉电标识均不为初始数据时,确认前一次更新过程中发生掉电,但存储编号和备份校验值已更新完成;具体地,当第一掉电标识为第一数据,第二掉电标识为第二数据时,确认前一次更新的是第二存储区中的数据,本次更新第一存储区中的数据,则读取第二存储编号,将其与求得的整数倍相加求和,并将第一存储编号更新为计算求得的和,反之,同理;当第一掉电标识为第二数据,第二掉电标识为第三数据时,确认前一次更新的是第二存储区中的数据,本次更新第一存储区中的数据,则读取第二存储编号,将与求得的整数倍相加求和,并将第一存储编号更新为计算求得的和,反之,同理;当第一掉电标识为第三数据,第二掉电标识为第一数据时,确认前一次更新的是第二存储区中的数据,本次更新第一存储区中的数据,则读取第二存储编号,将其与求得的整数倍相加求和,并将第一存储编号更新为计算求得的和,反之,同理;

例如,在本实施例中,第一掉电标识为第二数据0x80,第一存储编号为3,第二掉电标识为第三数据0xC0,第二存储编号为4,则终端设备读取第二存储编号4加1求和为5,将第一存储编号3更新为5。

进一步地,在本实施例中,终端设备更新保存的存储编号还可以通过移位来实现。

步骤215:终端设备将备份校验值更新为第一校验值;

具体地,终端设备将更新的存储编号对应的存储区中的备份校验值更新为第一校验值。

步骤216:终端设备更新掉电标识,并继续接收上位机发送的升级数据包,作为当前升级数据包,返回步骤209;

具体地,终端设备读取专用存储区中第一掉电标识和第二掉电标识并比对;

更加具体地,当第一掉电标识和第二掉电标识均为初始数据时,终端设备将更新的存储编号对应的存储区中的掉电标识更新为第一数据;

当第一掉电标识为初始数据时,若第二掉电标识为第一数据,则将第一掉电标识更新为第二数据,将第二掉电标识更新为初始数据;若第二掉电标识为第二数据,则将第一掉电标识更新为第三数据,将第二掉电标识更新为初始数据;若第二掉电标识为第三数据,则将第一掉电标识更新为第一数据,将第二掉电标识更新为初始数据;反之,同理;

当第一掉电标识和第二掉电标识均不为初始数据时,具体地:当一个掉电标识为第一数据,第二掉电标识为第二数据时,将第一掉电标识更新为第三数据,将第二掉电标识更新为初始数据,反之,同理;当第一掉电标识为第二数据,第二掉电标识为第三数据时,将第一掉电标识更新为第一数据,将第二掉电标识更新为初始数据,反之,同理;当第一掉电标识为第三数据,第二掉电标识为第一数据时,将第一掉电标更新为第二数据,将第二掉电标识更新为初始数据,反之,同理;

在本实施例中,终端设备更新掉电标识之后,还包括:终端设备返回应答数据给上位机。

步骤217:终端设备解析当前升级数据包,判断其是否含有升级数据,是则执行步骤218,否则执行步骤219;

具体地,终端设备解析当前升级数据包,判断第二个字节上的数据是否为第二预设数据,如果是,则确认当前升级数据包中不含有当前升级数据,否则确认当前升级数据包中含有当前升级数据;优选地,在本实施例中,第二预设数据具体为0x14。

步骤218:终端设备将当前升级数据包中的升级数据保存到易失性存储区中,根据易失性存储区中的缓存数据更新第一校验值,并将缓存数据保存到非易失性存储区中,执行步骤220;

在本实施例中,根据易失性存储区中的缓存数据更新第一校验值,具体为:终端设备将易失性存储区中的所有缓存数据与第一校验值做Update哈希运算得到哈希结果,将第一校验值更新为运算得到的哈希结果。

步骤219:终端设备判断易失性存储区中是否含有缓存数据,是则根据易失性存储区中的缓存数据更新第一校验,并将缓存数据保存到非易失性存储区中,执行步骤220,否则执行步骤220;

步骤220:终端设备解析当前升级数据包得到第二校验值,判断第二校验值与第一校验值是否相等,是则执行步骤221,否则返回错误码给上位机,将升级标识复位,执行步骤224;

在本实施例中,终端设备解析当前升级数据包得到第二校验值,具体为:

当当前升级数据包中不含有升级数据时,读取当前升级数据包中第二个字节至第五个字节上的数据,得到第二校验值的长度,根据第二校验值的长度读取当前升级数据包中第七个字节(含第七个字节)之后的相应数据据得到第二校验值;

例如:当前升级数据包为6B 14 00 00 00 03 32 5E EC 4F 52 AA 29 42 BE 1A D7 58 66 6D 96 5F 9A EE 4F B7;

在上述升级数据包中,第二字节上的数据为0x14,确认当前升级数据包中不含有当前升级数据,则得到的第二校验值为32 5E EC 4F 52 AA 29 42 BE 1A D7 58 66 6D 96 5F 9A EE 4F B7。

当当前升级数据包中含有升级数据时,读取前升级数据包中第二个字节至第五个字节上的数据得到当前升级数据及第二校验值的总长度,此时,当前升级数据的长度=总长度-预设第二校验值的长度,终端设备根据当前升级数据的长度读取当前升级数据,并读取当前升级数据之后的数据得到第二校验值;

例如,预设第二校验值的长度为20个字节,当前升级数据包为6B 17 00 00 00 03 11 22 33 32 5E EC 4F 52 AA 29 42 BE 1A D7 58 66 6D 96 5F 9A EE 4F B7;

在上述升级数据包中,第二个字节上的数据不为0x14,则确认当前升级数据含有当前升级数据,计算得到当前升级数据的长度为3个字节,则读取当前升级数据为11 22 33,当前升级数据后面的数据32 5E EC 4F 52 AA 29 42 BE 1A D7 58 66 6D 96 5F 9A EE 4F B7为第二校验值。

优选地,在本实施例中,返回的错误码为:83 01 00 00 00 03 00;

进一步地,在本实施例中,步骤220判断为否时,还可以为:终端设备返回错误应答给上位机,并等待接收上位机发送的数据;

当上位机重新发送升级数据包时,将其作为当前升级数据包,返回步骤209;

当终端设备等待接收上位机发送数据的时长超过预设时长时,终端设备掉电关机,结束。

步骤221:终端设备更新存储编号、备份校验值和掉电标识,返回步骤204;

具体地,终端设备更新保存的存储编号为第三预设数据,所述第三预设数据具体为0xfe;

本步骤中,更新备份校验值和掉电标识的方法同步骤215和步骤216中所述的方法相同,在此不再赘述。

步骤222:终端设备进行初始化;

步骤223:终端设备与上位机进行蓝牙连接;

步骤224:终端设备判断是否检测到固件升级操作,是则执行步骤226,否则执行步骤225;

具体地,终端设备判断是否检测到确认键被长按,是则确认检测到固件升级操作的触发,否则确认未检测到固件升级操作的触发;

进一步地,在本实施例中,终端设备判断是否检测到固件升级操作的触发,还可以为,终端设备判断是否接收到上位机发送的固件升级指令,是则确认检测到固件升级操作的触发,否则确认未检测到固件升级操作的触发。

步骤225:终端设备与上位机进行数据通讯,执行功能操作;

例如,终端设备与上位机进行数据通讯,执行签名操作;具体地,终端设备接收上位机发送来的签名指令,根据预设签名算法对签名指令中的待签名报文进行签名操作,得到签名结果,根据得到的签名结果生成签名响应并返回给上位机。

步骤226:终端设备将升级标识置位,返回步骤201。

具体地,终端设备将升级标识设置为1。

实施例三

本发明实施例三提供一种固件升级装置,如图3所示,包括:

接收模块301,用于接收上位机发送来的升级数据包,将其作为当前升级数据包;

第一判断模块302,用于判断接收模块301接收到的当前升级数据包是否为最后一包;

第一保存模块303,用于当第一判断模块302判断出接收模块301接收到的当前升级数据包不是最后一包时,将当前升级数据包中的升级数据保存到易失性存储区中;

第一更新模块304,用于当第一保存模块303将当前升级数据包中的升级数据保存到易失性存储区中后,更新易失性存储区中缓存数据的长度;

第二判断模块305,用于第一更新模块304更新缓存数据的长度之后,判断缓存数据的长度是否小于预设长度;

读取模块306,用于当第二判断模块305判断出缓存数据的长度不小于预设长度时,顺序读取长度为预设长度整数倍的缓存数据;

第二更新模块307,用于根据读取模块306读取到的缓存数据更新易失性存储区中的第一校验值;

第二保存模块308,用于将读取模块306读取到的缓存数据保存到非易失性存储区中;

第三更新模块309,用于第二保存模块308将读取模块306读取到的缓存数据保存到非易失性存储区中之后,更新缓存数据的长度;

接收模块301,还用于当第二判断模块305判断出缓存数据的长度小于预设长度时,接收上位机发送来的升级数据包,将其作为当前升级数据包;还用于当第三更新模块309更新缓存数据的长度之后,接收上位机发送来的升级数据包,将其作为当前升级数据包;

第三判断模块310,用于当第一判断模块302判断出当前升级数据包是最后一包时,判断当前升级数据包中是否含有升级数据;

第三保存模块311,用于当第三判断模块310判断出当前升级数据包中含有升级数据时,将当前升级数据包中的升级数据保存到非易失性存储区中;

第四更新模块312,用于第三保存模块311将当前升级数据包中的升级数据保存到易失性存储区中之后,根据易失性存储区中的缓存数据更新第一校验值;还用于当第三判断模块310判断出当前升级数据包不含有升级数据时,根据易失性存储区中的缓存数据更新第一校验值;

第四保存模块313,用于当第四更新模块312根据易失性存储区中的缓存数据更新第一校验值之后,将缓存数据保存到非易失性存储区中;

解析模块314,用于当第四保存模块313将缓存数据保存到非易失性存储区中之后,解析当前升级数据包得到第二校验值;

第四判断模块315,用于判断解析模块314得到的第二校验值与第一校验值是否相同;

执行模块316,用于当第四判断模块315判断出解析模块314得到的第二校验值与第一校验值相同时,根据非易失性存储区中的升级数据执行升级操作;

发送模块317,用于当第四判断模块315判断出解析模块314得到的第二校验值与第一校验值不同时,返回错误码给上位机,结束。

在本实施例中,第一判断模块302,具体用于:判断接收模块301接收到的当前升级数据包中预设字节上的数据是否为第一预设数据,是则确认当前升级数据包是最后一包,否则确认当前升级数据包不是最后一包。

第一更新模块304,具体用于:解析当前升级数据包,得到当前升级数据长度,将当前升级数据长度与缓存数据的长度相加求和,将缓存数据的长度更新为相加求得的和。

第二更新模块307,具体用于:将读取模块306读取到的缓存数据与第一校验值做预设哈希运算得到哈希结果,将第一校验值更新为哈希结果;

第四更新模块312,具体用于:将易失性存储区中的所有缓存数据与第一校验值做预设哈希运算得到哈希结果,将第一校验值更新为哈希结果。

在本实施例中,第二更新模块307,还用于:当第二判断模块305首次判断出缓存数据的长度不小于所述预设长度时,将读取模块306读取到的缓存数据与初始校验值做预设哈希运算得到哈希结果,将哈希结果作为第一校验值。

在本实施例中,第三更新模块309,具体用于:

将缓存数据的长度更新为缓存数据的长度与预设长度做减运算得到的差;

或者,

将缓存数据的长度更新为缓存数据长度与预设长度做取余运算得到的余数。

在本实施例中,第三判断模块310,具体用于:解析当前升级数据包,判断其第二个字节上的数据是否为第二预设数据,如果是,则确认当前升级数据包中不含有升级数据,否则确认当前升级数据包中含有升级数据。

本实施例中的装置,还包括:第五判断模块;

第五判断模块,用于当第三判断模块310判断出当前升级数据包中不含有升级数据时,触发第四更新模块312之前,判断易失性存储区中是否含有缓存数据;

第四更新模块312,具体用于::第五判断模块判断出易失性存储区中含有缓存数据时,根据易失性存储区中的缓存数据更新第一校验值;

解析模块314,还用于当第五判断模块判断出易失性存储区中不有缓存数据时,解析当前升级数据包得到第二校验值。

本实施例中的装置,还包括:第五更新模块、第六更新模块和第六判断模块;

其中,第五更新模块,用于当第二判断模块305判断出缓存数据的长度不小于预设长度时,触发接收模块301之前,根据预定方式更新非易失性存储区中的存储编号;

第六更新模块,用于解析模块314解析当前升级数据包得到第二校验值之前,将存储编号更新为第三预设数据;

第六判断模块,用于终端设备重新启动时,判断升级数据是否全部接收完成;

执行模块316,还用于当第六判断模块判断出升级数据全部接收完成时,根据非易失性存储区中的升级数据执行升级操作;

发送模块317,还用于当第六判断模块判断出升级数据未全部接收完成时,返回存储编号给上位机;

接收模块301,还用于发送模块317返回存储编号给上位机之后,接收上位机发送来的升级数据包,将其作为当前升级数据包。

本实施例中的装置,还包括:第七判断模块和第八判断模块;

其中,第七判断模块,用于当第六判断模块判断出升级数据未全部接收完成时,触发接收模块301之后,判断接收模块接收到的升级数据包中是否含有存储编号,是则触发第八判断模块,否则确认上位机重新发送升级数据;

第八判断模块,用于当第七判断模块判断出接收模块301接收到的升级数据包中含有存储编号时,判断接收到的升级数据包中的存储编号与发送模块317返回给上位机的存储编号是否相同,是则确认上位机续传升级数据;

发送模块317,还用于当第八判断模块判断出接收到的升级数据包中的存储编号与发送模块317返回给上位机的存储编号不相同时,返回错误码给上位机。

相应地,第二保存模块308,还用于:当第七判断模块判断出上位机重新发送升级数据,且第一判断模块302判断出当前升级数据包不是最后一包时,根据发送模块317返回给上位机的存储编号,将读取模块306读取到的缓存数据顺序保存到非易失性存储区中;还用于当第八判断模块判断出上位机续传升级数据,且第一判断模块判断出当前升级数据包不是最后一包时,从非易失性存储区的第一页或者第一块开始将读取模块306读取到的缓存数据保存;

第三保存模块311,还用于:当第七判断模块判断出上位机重新发送升级数据,且第一判断模块302判断出当前升级数据包是最后一包时,根据发送模块317返回给上位机的存储编号,将缓存数据顺序保存到非易失性存储区中;还用于当第八判断模块判断出上位机续传升级数据,且第一判断模块判断出当前升级数据包是最后一包时,从非易失性存储区的第一页或者第一块开始将缓存数据保存。

本实施例中的装置,还包括:

第七更新模块,用于将非易失性存储区中的备份校验值更新为第一校验值,更新掉电标识。

本实施例中的装置,还包括:第九判断模块;

在本实施例中,存储编号包括:第一存储编号和第二存储编号,备份校验值包括第一备份校验值和第二备份校验值,掉电标识包括第一掉电标识和第二掉电标识;第一存储编号、第一备份校验值和第一掉电标识保存在非易失性存储区中的第一存储区中,第二存储编号、第二备份校验值和第二掉电标识保存在非易失性存储区中的第二存储区中;

第九判断模块,具体用于:第五更新模块根据预定方式更新非易失性存储区中的存储编号之前,和第六更新模块将存储编号更新为第三预设数据之前,读取第一掉电标识和第二掉电标识并判断是否相同,是则确定随机选择一个存储区作为更新存储区,更新更新存储区中的数据,将另一个存储区作为备份存储区,更新备份存储区中的掉电标识;否则确定取值在前的掉电标识对应的存储区为更新存储区,更新更新存储区中的数据,将另一个存储区作为备份存储区,更新备份存储区中的掉电标识。

相应地,第五更新模块,具体用于:读取备份存储区中的存储编号,根据读取到的存储编号和预定方式更新更新存储区中的存储编号。

在本实施例中,第六判断模块,具体包括:第一判断子模块和第二判断子模块;

其中,第一判断子模块,用于读取第一掉电标识和第二掉电标识并判断是否相同;

发送模块317,具体用于当第一判断子模块判断出第一掉电标识和所述第二掉电标识相同时,确认升级数据未接收完成,返回初始编号给上位机;

第二判断子模块,用于当第一判断子模块判断出第一掉电标识和第二掉电标识不同时,读取取值在后的掉电标识对应的存储区中的存储编号,判断读取到的存储编号是否为第三预设数据;

执行模块316,具体用于当第二判断子模块判断出读取到的存储编号是第三预设数据时,确认升级数据全部接收完成,根据非易失性存储区中的升级数据执行升级操作;

发送模块317,还用于当第二判断子模块判断出读取到的存储编号不是第三预设数据时,确认升级数据未全部接收完成,返回第二判断子模块读取到的存储编号给上位机;

接收模块301,还用于发送模块317返回第二判断子模块读取到的存储编号给上位机之后,接收上位机发送来的升级数据,将其作为当前升级数据包。

在本实施例中,第二更新模块307,还用于:当第六判断模块判断出升级数据未全部接收完成,触发接收模块301之后,在接收模块301触发第二更新模块307时,读取返回给上位机的存储编号对应的存储区中的备份校验值,将读取到的备份校验值与读取到的缓存数据做预设哈希运算得到哈希结果,将哈希结果作为第一校验值;

第四更新模块312,还用于当第六判断模块判断出升级数据未全部接收完成,触发接收模块301之后,在接收模块301触发第四更新模块312时,读取返回给上位机的存储编号对应的存储区中的备份校验值,将读取到的备份校验值与易失性存储区中的缓存数据做预设哈希运算得到哈希结果,将哈希结果作为第一校验值。

在本实施例中,发送模块317,还用于第二判断模块305触发接收模块301之前,及第三更新模块309触发接收模块301之前,返回应答数据给上位机。

本实施例中的装置,还包括:

拷贝模块,用于执行模块316根据非易失性存储区中的升级数据执行升级操作之前,将升级数据从非易失性存储区中拷贝的应用区;

或者,

修改模块,用于执行模块316根据非易失性存储区中的升级数据执行升级操作之前,将应用区的地址修改为非易失性存储区的地址。

本实施例中的装置,还包括:第九判断模块、通讯模块和第一设置模块;

其中,第九判断模块,用于当接收模块301接收上位机发送来的升级数据包作为当前升级数据包之前,判断升级标识是否置位;

接收模块301,具体用于:当第九判断模块判断出升级标识置位时,接收上位机发送来的升级数据包作为当前升级数据包;

通讯模块,用于当第九判断模块判断出升级标识未置位时,与上位机进行数据通讯;

在本实施例中,第九判断模块,还用于第六判断模块判断升级数据是否全部接收完成之前,判断升级标识是否置位;

相应地,第六判断模块,具体用于:当第九判断模块判断出升级标识置位时,判断升级数据是否全部接收完成;

第一设置模块,用于当拷贝模块将升级数据从非易失性存储区中拷贝的应用区之后,或者修改模块将应用区的地址修改为非易失性存储区的地址之后,将升级标识复位。

本实施例中的装置,还包括:

第二设置模块,用于当拷贝模块将升级数据从非易失性存储区中拷贝的应用区之后,或者修改模块将应用区的地址修改为非易失性存储区的地址之后,将第三校验值设置为初始校验值,将存储编号设置为初始编号,将掉电标识设置为初始数据。

通过本发明中的技术方案,在进行终端设备固件升级的过程中,不需要终端设备拥有很大的易失性存储区,即能进行高效的数据包或者固件程序的完整性检测操作,并且减少了重复擦写非易失性存储区的操作,延长了非易失性存储区的寿命;同时本发明还提供了防掉电功能,大大提高了终端设备固件升级的性能。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1