技术领域
[0001] 本申请涉及计算机技术领域,尤其涉及一种固件升级方法。
相关背景技术
[0002] 为了提高芯片产品的可靠性,有些芯片产品只存在1段启动地址,因此不支持芯片固件升级。比如使用现场可编程门阵列(Field Programmable Gate Array,FPGA)作为主控,CPU提供算力的片上系统,存储在片上系统中的固件不支持更新。
[0003] 但是这些产品在某些用户使用过程中存在固件升级需求,这时会由于系统固件不支持升级影响用户正常使用。
具体实施方式
[0026] 下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0027] 为了提高芯片产品的可靠性,有些芯片产品只设计1段启动地址,也就是说,处理器只能从固定的1段启动地址读取固件启动运行。在这种情况下,如果对该固定的1段启动地址的固件进行升级失败,会导致处理器无法启动运行,因此在这种情况通常不支持芯片固件升级。
[0028] 比如在图1所示的计算机系统结构中,使用现场可编程逻辑门阵列(Field Programmable Gate Array,FPGA)作为主控,CPU提供算力,FLASH片选采用多模冗余结构。
[0029] 具体而言,该系统结构为三模冗余三取二硬件结构,包括CPU、FPGA以及三个FLASH芯片(FLASH_CS1、FLASH_CS2、FLASH_CS3)。在正常工作过程中,会将三份相同的固件代码存放在三块不同的FLASH芯片中。当CPU启动运行时,FPGA工作于三取二的三摸冗余工作模式,在该工作模式下,FPGA通过三取二表决的方式从FLASH_CS1、FLASH_CS2、FLASH_CS3中获取正确的固件代码,并触发CPU基于该正确的固件代码启动运行。
[0030] 在上述的系统结构中,FPGA作为主控,其为CPU选择正确的固件代码供CPU启动运行。在该系统结构中,不支持CPU对固件进行升级,如果升级失败,会导致整个计算机系统无法启动。
[0031] 但是这些产品在某些用户使用过程中存在固件升级需求,这时会由于系统固件不支持升级影响用户正常使用。
[0032] 针对上述技术问题,本申请实施例提出一种新的固件升级方案,该方案可以使得在类似于上述的只存在1段启动地址的系统结构上,实现安全的固件升级。
[0033] 下面,首先对本申请实施例提出的固件升级方案的应用场景进行介绍,该方案可适用于图2所示的应用场景,该应用场景示出了一种固件升级系统,该固件升级系统包括处理器、现场可编程门阵列单元,以及第一存储器,该第一存储器的存储空间被划分为第一存储区和第二存储区,在第一存储区中存储有所述处理器的运行固件。处理器分别与现场可编程门阵列单元和第一存储器相连,现场可编程门阵列单元和第一存储器连接相连。
[0034] 其中,上述的第一存储器,是设置于固件升级系统内部用于存储数据的存储器件,其可以采用任意类型的存储器件。在本申请实施例中,上述的第一存储器为FLASH闪存。
[0035] 上述的第一存储区和第二存储区,可以是通过对第一存储器的全部存储空间进行区域划分得到的,也可以是对第一存储器的部分存储空间进行区域划分得到的,并且,第一存储区和第二存储区的存储空间大小可以相同也可以不同,本申请实施例均不做限定,只要第一存储区和第二存储区均足以容纳处理器的运行固件即可。
[0036] 图3示出了一种更为具体的应用场景,该应用场景基于图1所示的三模冗余三取二硬件结构的计算机系统结构按照图2所示的固件升级系统结构进行改进得到。
[0037] 参见图3所示,在该固件升级系统中,包括处理器CPU、现场可编程门阵列单元FPGA和FLASH芯片。其中,FLASH芯片用作固件升级系统的存储器,FLASH芯片有三个,分别表示为CS1、CS2、CS3,对应构成固件升级系统的三个存储器。每一个FLASH芯片内部设置有第一存储区FLASH1和第二存储区FLASH2。CPU内部包括处理器核以及队列串行外围接口(Queued Serial Peripheral Interface,QSPI),CPU可以通过QSPI与FPGA和FLASH芯片交互。在该固件升级系统中还设置有存储载体,用于存储固件升级数据。该存储载体可以采用任意的片上存储器件,比如可以采用DDR。该存储载体分别与CPU和FPGA相连,从而可以被CPU和FPGA调用。
[0038] 基于上述图2和图3所示的固件升级系统结构,本申请实施例提出一种固件升级方法,使得该固件升级系统能够实现固件升级,并且在升级失败时能够恢复原有固件,从而保证升级安全性。
[0039] 下面,以对上述固件升级系统中的第一存储器中的固件进行升级为例,对本申请实施例提出的固件升级方法进行介绍。其中,上述的第一存储器,可以是图2中的第一存储器,或者也可以是图3中所示的固件升级系统的存储器CS1、CS2、CS3中的任意一个。
[0040] 参见图4所示,该方法包括:
[0041] S101、现场可编程门阵列单元在接收到固件升级数据的情况下,向处理器发送升级指令。
[0042] 具体的,FPGA在正常工作时,处于三取二的三模冗余工作模式,当FPGA接收到固件升级数据时,比如接收到外部机构发起的固件升级指令以及接收到固件升级数据时,退出三取二的三模冗余工作模式,进入升级模式。
[0043] 在进入升级模式时,FPGA向CPU发送升级指令。
[0044] 其中,上述的固件升级数据,可以是对完整固件代码的升级数据,也可以是对部分固件代码的升级数据,可以是全量升级数据,也可以是增量升级数据。
[0045] 在一些实现方式中,将第一存储区中存储的固件划分为多个固件数据块,如图5所示,将FLASH1中存储的固件划分为PLAT1~PLAT6表示的6个固件数据块。上述的固件升级数据,可以是对上述的多个固件数据块中的第一固件数据块的升级数据。该第一固件数据块,可以是上述的多个固件数据块中的任意一个或多个固件数据块。
[0046] S102、处理器在接收到现场可编程门阵列单元发送的升级指令的情况下,通过调用外设驱动,将固件升级数据存储至所述存储载体中。
[0047] 具体的,CPU的处理器核接收到FPGA发送的升级指令时,通过调用外设驱动,将固件升级数据从FPGA中读出,并存储到存储载体中。或者,处理器核通过外部FPGA将固件升级数据存储到存储载体中。
[0048] S103、处理器将第一存储区中存储的固件搬移到所述第二存储区,以及,获取固件升级数据并存储至所述第一存储区。
[0049] 具体的,处理器核通过执行步骤S102将升级固件数据存储到存储载体后,检测处理器核是否空闲,在处理器核空闲时,进入升级模式。此时,处理器核通过QSPI驱动将第一存储器的第一存储区中存储的固件搬移到第二存储区,也就是将第一存储器中的固件,从第一存储区迁移至第二存储区,从而使第一存储区腾出空间用于存储固件升级数据。
[0050] 在一些实现方式中,当固件升级数据为上述的第一固件数据块的升级数据时,处理器核将存储于第一存储区的第一存储地址处的第一固件数据块,搬移到第二存储区。
[0051] 在一些实现方式中,如图6所示,与将FLASH1中存储的固件划分为PLAT1~PLAT6表示的6个固件数据块相对应的,在第二存储区FLASH2中,设置与多个固件数据块对应的存储地址,分别用于对应存储多个固件数据块。在此基础上,当对第一固件数据块进行升级时,将第一存储区中的第一固件数据块搬移到第二存储区中与该第一固件数据块对应的存储地址。
[0052] 然后,处理器核将所述存储载体中的固件升级数据搬移至所述第一存储区。
[0053] 具体是,处理器核从存储载体中读取预先存储的固件升级数据,并将该固件升级数据存储到第一存储区。
[0054] 在一些实现方式中,固件升级数据为对应第一存储区中的第一固件数据块的升级数据,则处理器核从存储载体中读取第一固件数据块的升级数据,并存储到第一存储区的第一存储地址,该第一存储地址,即为上述的用于存储第一固件数据块的存储地址。
[0055] 通过上述处理,将原本存储于第一存储区的原有固件数据,搬移到了第二存储区,以及,在第一存储区存入了升级后的固件数据。在将固件数据划分为多个固件数据块的情况下,也能够将第一存储区中的一个或多个固件数据块迁移到第二存储区,以及,将固件数据块对应的升级数据存储到第一存储区的相应存储地址,从而完成对固件的整体更新。
[0056] S104、处理器对所述第一存储区中存储的所述固件升级数据进行校验。
[0057] 具体的,处理器核对第一存储区中的固件升级数据进行完整性、功能性等方面的验证,确保固件升级数据是正确、可用的升级数据。
[0058] 在校验成功的情况下,处理器执行步骤S105、向所述现场可编程门阵列单元发送校验成功通知消息。
[0059] 具体的,CPU在对固件升级数据校验成功后,即可确认该固件升级数据可以使用,此时向FPGA发送校验成功通知消息,用于告知FPGA可以进行CPU复位,从而触发FPGA发送复位指令。
[0060] S106、现场可编程门阵列单元在接收到处理器发送的校验成功通知消息的情况下,向处理器发送复位指令。
[0061] 具体的,FPGA接收到CPU发送的校验成功通知消息时,确认CPU已做好升级准备,此时向CPU发送复位指令,以触发CPU复位。
[0062] S107、处理器在接收到所述现场可编程门阵列单元发送的复位指令的情况下,运行所述第一存储区的固件进行复位。
[0063] CPU接收到复位指令时,进入复位程序,以第一存储区的固件重新启动。
[0064] 在处理器复位成功的情况下,处理器执行步骤S108、向所述现场可编程门阵列单元发送复位成功通知消息。
[0065] 具体的,若CPU在规定的时间内复位成功,则说明升级后的固件可正常运行,此时CPU向FPGA发送复位成功通知消息。
[0066] S109、现场可编程门阵列单元在接收到处理器发送的复位成功通知消息的情况下,将第一存储区中的固件分别复制到第二存储器和第三存储器。
[0067] 具体的,FPGA接收到CPU发送的复位成功通知消息,则可以确认CPU升级固件成功,此时FPGA将第一存储器的第一存储区中的固件,也就是升级后的固件,分别复制到第二存储器和第三存储器。然后,FPGA退出升级模式,进入正常的三取二的三模冗余工作模式。
[0068] 通过上述处理,可以使各个存储器中的固件都得到升级,从而使得FPGA可以正常执行三取二的三模冗余工作模式。
[0069] 在一些实现方式中,FPGA将第一存储器的第一存储区中的固件分别复制到第二存储器和第三存储器,具体是复制到第二存储器的第一存储区,和第三存储器的第一存储区。
[0070] 如图3所示,FPGA将CS1的FLASH1中的升级后的固件,分别复制到CS2的FLASH1和CS3的FLASH1。
[0071] 在处理器复位失败的情况下,处理器执行步骤S110、向现场可编程门阵列单元发送复位失败通知消息。
[0072] S111、现场可编程门阵列单元在接收到处理器发送的复位失败通知消息的情况下,将第二存储区中存储的固件,搬移到第一存储区。
[0073] 具体的,若CPU复位失败,比如在设定时长内没有成功启动,则CPU确认升级后的固件无法正常运行,此时向FPGA发送复位失败通知消息,以通知FPGA升级失败。
[0074] FPGA接收到复位失败通知消息时,确定本次升级失败。此时,FPGA将第二存储区中存储的固件,搬移到第一存储区,也就是将第一存储区中存储的升级后的固件删除,并将升级前的原有固件,从第二存储区搬移回第一存储区。从而使得CPU再次复位时可以继续以旧版本的固件运行。
[0075] 然后,FPGA退出升级模式,并记录升级失败结果。
[0076] 在一些实现方式中,当上述升级是针对多个固件数据块中的第一固件数据块进行升级时,FPGA在接收到复位失败通知消息的情况下,将第二存储区中存储的第一固件数据块,再搬移回第一存储区中的第一存储地址。该第一存储地址,是该第一固件数据块原本在第一存储区时的存储地址。
[0077] 在校验失败的情况下,处理器执行步骤S112、将所述第二存储区中存储的固件,搬移到所述第一存储区。
[0078] 具体的,如果校验失败,则可以直接确定升级数据是错误的或者是不可用的,因此可以直接放弃本次升级。此时CPU将第一存储区中的升级固件删除,并将之前搬移到第二存储区的固件,再搬移到第一存储区,也就是再将升级前的固件搬移回第一存储区,使得CPU重新以旧版本的固件运行。
[0079] 在一些实现方式中,当上述升级是针对多个固件数据块中的第一固件数据块进行升级时,CPU将第二存储区中存储的第一固件数据块,再搬移回第一存储区中的第一存储地址。该第一存储地址,是该第一固件数据块原本在第一存储区时的存储地址。
[0080] S113、处理器向所述现场可编程门阵列单元发送校验失败通知消息。
[0081] S114、现场可编程门阵列单元在接收到处理器发送的校验失败通知消息的情况下,退出升级模式。
[0082] 具体的,CPU在将旧版本的固件搬移回第一存储区后,向FPGA发送校验失败通知消息。FPGA接收到校验失败通知消息时,退出升级模式,并记录升级失败结果。
[0083] 通过上述介绍可见,本申请实施例提出的固件升级方法,在固件升级系统的存储器中划分出两个存储区,并且由第一存储区存储固件。当存在固件升级需求时,固件升级系统的现场可编程门阵列单元向处理器发送升级指令,处理器接收到升级指令后,将第一存储区中的固件搬移到第二存储区,并将固件升级数据存储到第一存储区,然后处理器运行第一存储区中的固件进行复位。上述方案借助存储器的不同存储区,通过处理器与现场可编程门阵列单元的交互,实现了对存储器中的固件的升级,从而在不改变处理器启动地址的情况下,实现了对系统固件的升级,能够满足用户对于不支持固件升级的芯片系统的固件升级需求。
[0084] 基于上述实施例介绍,本申请实施例提出一种应用于图2或图3所示的固件升级系统的固件升级方法,该方法具体由该固件升级系统的处理器执行,该方法包括:
[0085] 所述处理器在接收到所述现场可编程门阵列单元发送的升级指令的情况下,将所述第一存储区中存储的固件搬移到所述第二存储区,以及,获取固件升级数据并存储至所述第一存储区;
[0086] 所述处理器运行所述第一存储区的固件进行复位。
[0087] 以及,本申请实施例还提出另一种应用于图2或图3所示的固件升级系统的固件升级方法,该方法具体由该固件升级系统的现场可编程门阵列单元执行,该方法包括:
[0088] 所述现场可编程门阵列单元在接收到固件升级数据的情况下,向所述处理器发送升级指令,所述升级指令用于触发所述处理器将所述第一存储区中存储的固件,搬移到所述第二存储区,以及,获取固件升级数据并存储至所述第一存储区,运行所述第一存储区的固件进行复位。
[0089] 具体的,上述的处理器和上述的现场可编程门阵列单元在执行上述的固件升级方法时的具体处理过程,可参见上述图4所示的固件升级方法实施例中的相应介绍,此处不再重复。
[0090] 与上述的固件升级方法相对应的,本申请实施例还提出一种固件升级系统,该固件升级系统的结构如图2所示,包括处理器、现场可编程门阵列单元和第一存储器,所述第一存储器包括第一存储区和第二存储区,所述第一存储区用于存储固件,该固件升级系统的处理器被配置为执行上述任意实施例所述的固件升级方法中由处理器执行的步骤,和/或,该固件升级系统的现场可编程门阵列单元被配置为执行上述任意实施例所述的固件升级方法中由现场可编程门阵列单元执行的步骤。
[0091] 具体的,该固件升级系统的具体结构,以及该固件升级系统中的处理器和现场可编程门阵列单元的具体工作内容,以及这些工作内容所带来的有益效果,可参见上述实施例的介绍,此处不再重复。
[0092] 在本申请实施例中,处理器是一种具有信号的处理能力的电路,在一种实现中,处理器可以是具有指令读取与运行能力的电路,例如CPU、微处理器、GPU、或DSP等;在另一种实现中,处理器可以通过硬件电路的逻辑关系实现一定功能,该硬件电路的逻辑关系是固定的或可以重构的,例如处理器为ASIC或PLD实现的硬件电路,例如FPGA等。在可重构的硬件电路中,处理器加载配置文档,实现硬件电路配置的过程,可以理解为处理器加载指令,以实现以上部分或全部单元的功能的过程。此外,还可以是针对人工智能设计的硬件电路,其可以理解为一种ASIC,例如NPU、TPU、DPU等。
[0093] 本申请另一实施例还提出一种计算机设备,该计算机设备包括上述的固件升级系统,从而使得该计算机设备可以通过上述的固件升级系统实现固件升级。
[0094] 该计算机设备可以是个人计算机、工业计算机、服务器、手持终端、智能终端、可穿戴设备等。
[0095] 除了上述方法和设备以外,本申请的实施例还可以是计算机程序产品,其包括计算机程序指令,所述计算机程序指令在被运行时使得所述运行主体执行本说明书上述任意实施例中描述的固件升级方法中的步骤。
[0096] 所述计算机程序产品可以以一种或多种程序设计语言的任意组合来编写用于执行本申请实施例操作的程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。
[0097] 此外,本申请的实施例还可以是存储介质,其上存储有计算机程序,计算机程序被运行时执行本说明书上述任意实施例中描述的固件升级方法中的步骤。
[0098] 对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
[0099] 需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0100] 本申请各实施例方法中的步骤可以根据实际需要进行顺序调整、合并和删减,各实施例中记载的技术特征可以进行替换或者组合。
[0101] 本申请各实施例种装置及终端中的模块和子模块可以根据实际需要进行合并、划分和删减。
[0102] 本申请所提供的几个实施例中,应该理解到,所揭露的终端,装置和方法,可以通过其它的方式实现。例如,以上所描述的终端实施例仅仅是示意性的,例如,模块或子模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个子模块或模块可以结合或者可以集成到另一个模块,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0103] 作为分离部件说明的模块或子模块可以是或者也可以不是物理上分开的,作为模块或子模块的部件可以是或者也可以不是物理模块或子模块,即可以位于一个地方,或者也可以分布到多个网络模块或子模块上。可以根据实际的需要选择其中的部分或者全部模块或子模块来实现本实施例方案的目的。
[0104] 另外,在本申请各个实施例中的各功能模块或子模块可以集成在一个处理模块中,也可以是各个模块或子模块单独物理存在,也可以两个或两个以上模块或子模块集成在一个模块中。上述集成的模块或子模块既可以采用硬件的形式实现,也可以采用软件功能模块或子模块的形式实现。
[0105] 专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
[0106] 结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件单元,或者二者的结合来实施。软件单元可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD‑ROM、或技术领域内所公知的任意其它形式的存储介质中。
[0107] 最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0108] 对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。