本发明涉及固件升级技术领域,具体涉及一种基于闪存微控制器的固件升级方法和系统及闪存微控制器。
背景技术:
随着用户需求的增加,为了增加已出货产品的竞争力和降低产品生产成本等原因,需要对原有产品开放更多的资源给用户,允许用户将原有产品升级。不过,烧写在原有产品中的固件可能满足不了现阶段产品升级的需求。比如:用户在对usb设备进行升级的时候,强制对usb设备进行拔插或断电等意外情况,会造成升级失败,从而会导致整个设备固件受损而无法使用。这就意味着产品的安全性和稳定性功能很差,从而也增加了产品的生产成本。
现有技术急需一种对usb设备进行任意拔插或其他中断升级操作的场景下,仍能在硬件不受损的前提下继续正常升级的技术。
技术实现要素:
本发明实施例提供一种基于闪存微控制器的固件升级方法和系统及闪存微控制器,用于解决usb设备在固件升级过程中遇到无法正常升级的各种意外情况,导致固件受损和产品不能正常使用的问题。
本发明第一方面提供一种基于闪存微控制器的固件升级方法,所述闪存微控制器包括处理器和闪存,所述闪存中存储有应用程序和引导升级程序,所述引导升级程序用于启动或升级所述应用程序;所述方法包括:所述闪存微控制器上电后运行所述引导升级程序,判断是否收到进入升级指令;若没有收到进入升级指令,则进一步判断所述闪存的特定地址是否存储有特定代码;若收到进入升级指令或者所述闪存的特定地址没有存储特定代码,则对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码。
一种可能的实现方式中,所述方法还包括:若没有收到进入升级指令且所述闪存的特定地址中存储有特定代码,则启动所述应用程序。
一种可能的实现方式中,对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码,包括:通过usb端口与上位机通信,获取所述应用程序的更新数据;以页为单位,逐页擦除所述闪存中存储的应用程序并写入更新数据。
一种可能的实现方式中,在逐页擦除所述闪存中存储的应用程序并写入更新数据的步骤中,首先擦除包含所述特定代码的特定页,然后逐页改写其它页,最后写所述特定页,并在写所述特定页时将特定代码写入特定地址。
前文所说的升级即将完成,是指仅余最后一页即特定页尚未写入更新数据,其它页都已写入更新数据。
一种可能的实现方式中,逐页擦除所述闪存中存储的应用程序并写入更新数据包括:执行擦除命令,将当前页的原始数据擦除;执行写入命令,在当前页写入更新数据;执行校验命令,读取当前页写入的更新数据,计算出校验码,将校验码发送给上位机,以便上位机对所述校验码进行验证,若验证失败,会提示用户重新升级。
本发明第二方面提供一种闪存微控制器,包括闪存和处理器,所述闪存中存储有应用程序和引导升级程序,当所述闪存微控制器上电后,所述处理器运行所述引导升级程序,执行以下步骤:判断是否收到进入升级指令;若没有收到进入升级指令,则进一步判断所述闪存的特定地址是否存储有特定代码;若收到进入升级指令或者所述闪存的特定地址没有存储特定代码,则对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码。
一种可能的实现方式中,所述处理器还执行以下步骤:若没有收到进入升级指令且所述闪存的特定地址中存储有特定代码,则启动所述应用程序。
一种可能的实现方式中,所述引导升级程序具体存储在用于实现在线编程isp功能的、含处理器复位地址的几页内存区域,该内存区域的大小根据处理器性能可动态调节,或者,所述引导升级程序的存储空间为闪存微控制器上电后的默认执行空间。
本发明第三方面提供一种基于usb的固件升级系统,包括:闪存微控制器和上位机,所述闪存微控制器通过usb端口与上位机通信;所述闪存微控制器,包括处理器和闪存,所述闪存中存储有应用程序和引导升级程序,所述引导升级程序用于启动或升级所述应用程序;所述闪存微控制器用于:上电后运行所述引导升级程序,判断是否收到进入升级指令;若没有收到进入升级指令,则进一步判断所述闪存的特定地址是否存储有特定代码;若收到进入升级指令或者所述闪存的特定地址没有存储特定代码,则对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码;所述上位机,用于向所述闪存微控制器传送所述应用程序的更新数据,根据升级步骤发出控制指令,控制所述引导升级程序对所述应用程序进行升级。
本发明第四方面提供一种固件升级装置,部署于闪存微控制器中,所述闪存微控制器包括闪存和处理器,所述闪存中存储有应用程序,所述装置包括:判断模块,用于所述闪存微控制器上电后判断是否收到进入升级指令;若没有收到进入升级指令,则进一步判断所述闪存的特定地址是否存储有特定代码;处理模块,用于若收到进入升级指令或者所述闪存的特定地址没有存储特定代码,则对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码。
从以上技术方案可以看出,本发明实施例具有以下优点:
通过升级过程中校验来指示升级的完整性,通过闪存的特定地址存储特定代码来验证应用程序的完整性,即便升级过程中因断电、插拔等意外情况导致升级失败,则重新上电后由于检测不到特定数据从而得知应用程序不完整,也不会启动不完整的应用程序,而是会进入升级过程,继续完成升级,确保闪存微控制器中的应用程序固件的完整性。可见,本发明方案提高了升级稳定性,可有效避免升级中断后无法恢复正常使用的问题,提升了产品的安全性、稳定性和实用性。
附图说明
为了更清楚地说明本发明实施例技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1是本发明的一个实施例提供的一种固件升级方法的流程示意图;
图2是本发明的一个应用场景实施例中固件升级的实现流程图;
图3是本发明的一个实施例提供的一种闪存微控制器的结构示意图;
图4是本发明的一个实施例提供的一种固件升级装置的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。
下面通过具体实施例,分别进行详细的说明。
请参考图1,本发明的一个实施例,提供一种基于闪存微控制器的固件升级方法。该方法可用于升级闪存(flash)微控制器等usb设备中的固件。所述闪存微控制器包括处理器和闪存,所述闪存中存储有固件如应用程序和引导升级程序,所述引导升级程序用于启动或升级所述应用程序。所述方法可包括:
s1、闪存微控制器上电后运行引导升级程序,判断是否收到进入升级指令;若是,进入步骤s3;若否,进入步骤s2;
s2、进一步判断闪存的特定地址是否存储有特定代码;若否,进入步骤s3;若是,进入步骤s4;
s3、对应用程序进行升级,并于升级即将完成时在闪存的特定地址写入特定代码;
s4、启动应用程序。
可选的,对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码,可包括:通过usb端口与上位机通信,获取所述应用程序的更新数据;以页为单位,逐页擦除所述闪存中存储的应用程序并写入更新数据。
其中,逐页擦除所述闪存中存储的应用程序并写入更新数据的步骤,具体可包括:执行擦除命令,将当前页的原始数据擦除;执行写入命令,在当前页写入更新数据;执行校验命令,读取当前页写入的更新数据,计算出校验码,将校验码发送给上位机,以便上位机对所述校验码进行验证。上位机验证通过后,传送下一页的更新数据给闪存微控制器,以闪存微控制器对下一页执行擦除和写入的操作,以此类推,直到所有页的数据都被改写,完成全部升级。
特别的,在逐页擦除所述闪存中存储的应用程序并写入更新数据的步骤中,首先擦除包含所述特定代码的特定页,然后逐页改写其它页,最后写所述特定页,并在写所述特定页时将特定代码写入特定地址。
特定页的特定代码用于指示固件升级完整性,一旦被擦除或者说删除,意味着应用程序不再完整需要升级。这样,一旦升级过程因意外中断,则重新上电后可通过检测是否包含特定数据来判断当前应用程序不完整,需要升级,而不会跳转到应用程序的代码区,启动不完整的应用程序,引发各种错误。唯有整个应用程序完成升级,特定地址才会被写入特定代码,后续上电后检测到该特定代码,就意味着当前的应用程序是完整的,是可以启动的。从而,提高了升级效率,可有效避免升级中断后无法恢复正常使用的问题,提升了产品的安全性、稳定性和实用性。
下面,结合具体的应用场景实施例,对本发明方法做进一步详细的描述:
本实施例在flash微控制器(microcontrollerunit,mcu)中烧录两部分固件或者说程序,一部分为引导升级程序,一部分为应用程序(app),在应用程序出现问题需要升级的时候,切换到引导升级程序,由引导升级程序配合上位机的软件如app对应用程序进行升级或者说更新。上位机例如是个人计算机(pc)或者服务器等。引导升级程序例如是启动装载(bootloader)程序。
如图2所示,总的实现流程包括:把需要升级的应用程序的用户代码放到上位机软件中,mcu上电后首先运行升级引导程序中的引导代码,进行模式选择,即判断是否进入升级,如果不进入升级,则执行正常的应用程序,否则执行升级引导程序中的升级代码。在升级代码中,mcu通过usb端口实现与上位机软件的通信,从而把上位机软件中的用户代码传送到mcu,mcu写入flash,并把校验码发送给上位机软件如上位机app判断校验码的对错,如此逐页执行。
具体实现过程分如下几部分:
1、用户代码和引导代码的内存配置。
对于某些mcu而言,有专门为实现isp(in-systemprogramming,线上编程)功能的内存区域,则把引导代码放到该区域即可。
对于没有isp功能的mcu,则需要为引导代码配置flash空间,如引导代码需4k空间,则引导代码放入flash的前4k空间,用户代码放到从第4k开始的空间。或者说,所述引导升级程序的存储空间为闪存微控制器上电后的默认执行空间。
2、引导代码的跳转选择。
对于引导代码而言,其功能只有一个,就是判断是否进入升级,如果不进入升级,则程序要跳转到用户代码区,否则,执行升级代码,进入升级过程。
其判断条件通常由实际情况而定,一般为是否收到进入升级指令,例如检测到某个按键指令表示要进入升级。
如上述,对于有专门isp内存区域的mcu,如果要进入用户代码区域,需要设置从用户代码启动,然后发出mcu复位指令即可。
对于没有isp功能的mcu,则需要设置手动的跳转指令,如函数指针,其地址设定为用户代码区。
3、usb升级——mcu部分。
上位机和mcu通过usb端口实现数据交换,为了保证数据的完整性和保密性,需要对数据进行加密和校验,用户代码的升级是以页为单位进行,即擦除一页,写入一页,校验一页,确认无误后,再进行下一页。
该过程可通过usb的“setreport”和“getreport”命令实现,为了保证该过程有序进行,可以定义如下协议:
(1)getreport[1]=0xe1,mcu返回版本号等信息。
(2)getreport[1]=0xe2,保留命令。
(3)getreport[1]=0xe3,mcu执行擦除命令。
(4)getreport[1]=0xe4,mcu解码数据,并写入flash。
(5)getreport[1]=0xe5,mcu读取指定页的内容并计算出校验码,返回给上位机app。
(6)getreport[1]=0xe6,升级完成。
其中,getreport[1]指getreport命令收到数据的第1个字节。
4、usb升级——app部分。
app部分通过c++编写,其过程与上述过程类似。区别在于app是作为命令的发起者与mcu沟通,控制mcu执行升级过程。
5、usb升级稳定性。
usb升级过程中会出现这样一个问题,如果还未升级完成,用户不小心断开usb连接或usb连接出错,导致写进flash的用户代码是残缺的,该情况会导致意想不到的后果。
该种情况解决如下:
预先在用户代码flash区域的固定地址/特定地址写入一个例如32位的特定数据,该数据用以指示升级完整,或者说应用程序的完整性。例如,可以在上一次升级时写入。
在app端需做相应处理,进入升级后,app应首先擦除该页,使得该特定数据被擦除;该数据被擦掉,则表示用户代码是不完整的。
接下来,对于特定页以外的其它页,app逐页擦除,逐页写入;
等其它所有页都写完后,最后写入该页的代码,包括将特定代码写入。特定代码的写入,表示升级完成,应用程序已经是完整的。
在mcu的引导升级程序的引导代码中需做处理,判断如果该特定数据不存在则只能进入升级,不能跳到用户代码区。
这样,即便升级过程中因断电等原因导致升级失败,则重新上电后由于检测不到32位特定数据,则只能进入升级,即可继续完成升级;而不能启动不完整的应用程序,避免导致意想不到的后果。
因为,如果升级失败,则应用程序是错误或者是不完整的,这将会导致应用程序发生不可预估的错误。如果没有上述限制,即,数据不完整则只能升级不能进入应用程序;用户会误以为是应用程序的问题,因为数据不完整可能会有大部分功能,而不会再次手动升级,则后续使用时就会发生错误。
以上,对本发明提供的方法进行了说明。
为便于实施本发明,下面还提供相应的装置/系统。
请参考图3,本发明的一个实施例,提供一种闪存微控制器30,包括闪存31和处理器32,所述闪存31中存储有应用程序33和引导升级程序34,当所述闪存微控制器30上电后,所述处理器32运行所述引导升级程序,执行以下步骤:
判断是否收到进入升级指令;若没有收到进入升级指令,则进一步判断所述闪存的特定地址是否存储有特定代码;若收到进入升级指令或者所述闪存的特定地址没有存储特定代码,则对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码。
可选的,所述处理器32还执行以下步骤:若没有收到进入升级指令且所述闪存的特定地址中存储有特定代码,则启动所述应用程序。
可选的,所述引导升级程序具体存储在用于实现isp功能的、的含处理器复位地址的几页内存区域,该内存区域的大小根据处理器性能可动态调节。
可选的,所述引导升级程序的存储空间为闪存微控制器上电后的默认执行空间,即,所述引导升级程序的存储空间位于所述应用程序的存储空间之前。
请参考图4,本发明的一个实施例,还提供一种固件升级装置40,部署于闪存微控制器中,所述闪存微控制器包括闪存和处理器,所述闪存中存储有应用程序,所述装置40包括:
判断模块41,用于所述闪存微控制器上电后判断是否收到进入升级指令;若没有收到进入升级指令,则进一步判断所述闪存的特定地址是否存储有特定代码;
处理模块42,用于若收到进入升级指令或者所述闪存的特定地址没有存储特定代码,则对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码。
本发明的一个实施例,还提供一种基于usb的固件升级系统,包括:闪存微控制器和上位机,所述闪存微控制器通过usb端口与上位机通信;
所述闪存微控制器,包括处理器和闪存,所述闪存中存储有应用程序和引导升级程序,所述引导升级程序用于启动或升级所述应用程序;所述闪存微控制器用于:上电后运行所述引导升级程序,判断是否收到进入升级指令;若没有收到进入升级指令,则进一步判断所述闪存的特定地址是否存储有特定代码;若收到进入升级指令或者所述闪存的特定地址没有存储特定代码,则对所述应用程序进行升级,并于升级即将完成时在所述闪存的特定地址写入特定代码;
所述上位机,用于向所述闪存微控制器传送所述应用程序的更新数据,根据升级步骤发出控制指令,控制所述引导升级程序对所述应用程序进行升级。
本发明实施例提供了一种基于闪存微控制器的固件升级方法、一种固件升级装置、一种闪存微控制器和一种基于usb的固件升级系统,通过采用上述技术方案,取得了以下技术效果:通过在闪存的特定地址存储特定代码来指示升级完整性,即便升级过程中因断电、插拔等意外情况导致升级失败,则重新上电后由于检测不到特定数据,也不会启动不完整的应用程序,而是会进入升级过程,继续完成升级,确保闪存微控制器中的应用程序固件的完整性。可见,本发明方案提高了升级效率,可有效避免升级中断后无法恢复正常使用的问题,提升了产品的安全性、稳定性和实用性。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
上述实施例仅用以说明本发明的技术方案,而非对其限制;本领域的普通技术人员应当理解:其依然可以对上述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。