基于OTP的主控芯片的BOOT代码扩展方法
技术领域
本发明涉及一种基于OTP的主控芯片的BOOT代码扩展方法
背景技术
移动存储产品U盘、SD卡等都是由主控芯片和NAND FLASH组成。其中主控芯片存储包括ROM区和RAM区。ROM区中存储着芯片生产时固化的BOOT代码。请参见图1及图2,主控芯片通过固化在ROM区中的Boot loader(引导加载)代码把存储在NAND FLASH中的运行代码(算法管理代码)加载到RAM区中,然后运行代码在RAM区中执行,实现对NAND FLASH的存储管理和上位机(HOST)的数据传输。由于NAND FLASH的更新换代,对应的操作可能会存在差异,所以ROM中固化的BOOT代码可能不能从新型的NAND FLASH中加载运行代码,导致主控芯片无法支持新型NAND FLASH。
现有的方式是采用以下两种方法来解决上述问题:一、通过修改ROM代码解决,此时需要把主控芯片重新投产,生产周期和对新芯片的验证周期都会非常长。二、中国专利申请号CN201710469792公开的一种ROM代码补丁运行方法和系统中,是采用将补丁代码存放在EEPROM等非易失性存储其中,BOOT代码在上电时读取EEPROM,将补丁代码加载到RAM中,当运行到ROM中有需要被替换的代码,则跳转到RAM中运行补丁代码,补丁代码执行完成后跳转会ROM中继续执行。这种方式需要外挂EEPROM,增加额外的成本,同时芯片的面积会大幅增加,不能应用在SD卡等要求芯片面积小的产品。
发明内容
针对上述现有技术的不足,本发明所要解决的技术问题是:提供一种降低成本、减小芯片面积的基于OTP的主控芯片的BOOT代码扩展方法。
为解决上述技术问题,本发明采用的一个技术方案是:提供一种基于OTP的主控芯片的BOOT代码扩展方法,所述主控芯片具有用于存储BOOT代码的ROM区、用于存储BOOT代码的补丁代码的OTP区以及RAM区,所述BOOT代码扩展方法包括以下步骤:
S10、在所述主控芯片上电时,所述BOOT代码将所述OTP区中存储的补丁代码加载至RAM区;
S12、所述BOOT代码将NAND FLASH中存储的运行代码加载至所述RAM区,其中,在加载所述运行代码时,当所述ROM区中相应的BOOT代码函数需要被替换时,根据对应的扩展代码函数的函数指针地址跳转到RAM中执行补丁代码,执行完毕之后跳回ROM区中继续执行BOOT代码。
进一步的,将所述补丁代码存写入至所述OTP中时,先将所述补丁代码中的补丁函数写入到所述OTP区中,然后将所述补丁函数在RAM区中的地址赋值给所述补丁函数对应的地址EXT_Func[],并写入到OTP区中。
进一步的,所述OTP区容量为N个KB,则所述OTP区最多能够存储N份补丁代码。
进一步的,所述补丁代码包括:标记头Flag、校验码ChechSum,函数扩展标记EXT_Func[]:以及代码区,所述标记头Flag用于标识是否为一份补丁代码,所述校验码ChechSum用于对所述函数扩展标记和代码区进行异或运算以得出校验码,从而保证所述补丁代码完整性,所述函数扩展展标记EXT_Func[]:用于表示记录各个补丁函数对应的RAM地址,所述代码区用于存放补丁代码。
进一步的,所述S10的步骤包括以下子步骤:
S101、开始加载OTP区补丁代码;
S102、设置计数器i=0;
S103、i是否小于所述N,若小于则进入S104步骤,若大于或等于,则转入S111步骤;
S104、若i小于所述N,则读出OTP区中i*1KB对齐地址4Byte数据为临时标记头TempFlag;
S105、判断所述临时标记TempFlag是否等于标记头Flag;若等于则进入S106步骤,否则转入S110步骤;
S106、若所述临时标记TempFlag等于所述标记头Flag,则从所述OTP中1*1KB地址处连续读出一份补丁代码,视为当前补丁代码;
S107、通过所述校验码ChechSum校验该段当前补丁代码是否正确,若正确则进入S108步骤,否则转入S110步骤;
S108、若正确,则将所述当前补丁代码中数组EXT_Func[]复制到RAM中;
S109、OTP区中所述当前补丁代码区赋值到RAM中对应位置;
S110、执行i+1后转入S103步骤;
S111、加载OTP区补丁代码完成。
进一步的,在S12步骤中,所述ROM区中相应的BOOT代码函数根据对应的扩展代码函数的函数指针是否为0确定是否需要被替换。
本发明通过在主控芯片中加入OTP的方式,解决BOOT代码不能够支持从新型NANDFLASH中加载运行代码的问题。同时使用在OTP中写入多份补丁的方法,能够克服OTP只允许被编程一次,但补丁代码可能会升级的问题。采用本发明的基于OTP的主控芯片的BOOT代码扩展方法,能够降低成本、减小芯片的面积。
附图说明
图1及图2是现有技术中主控芯片和NAND FLASH的结构图。
图3是本发明基于OTP的主控芯片的BOOT代码扩展方法一实施例的流程图。
图4是本发明基于OTP的主控芯片的BOOT代码扩展方法一实施例中主控芯片的结构图。
图5是OTP区中存储补丁代码的存储结构示意图。
图6是本发明基于OTP的主控芯片的BOOT代码扩展方法加载OTP补丁代码的流程图。
图7是本发明基于OTP的主控芯片的BOOT代码扩展方法一实施例的代码图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参见图1至图7,本发明的基于OTP的主控芯片的BOOT代码扩展方法应用于具有OTP区、ROM区以及RAM区的主控芯片中。所述主控芯片的ROM区用于存储BOOT代码、所述OTP区用于存储BOOT代码的补丁代码。本实施例的基于OTP的主控芯片的BOOT代码扩展方法包括以下步骤:
S10、在所述主控芯片上电时,所述BOOT代码将所述OTP区中存储的补丁代码加载至RAM区;S12、所述BOOT代码将NAND FLASH中存储的运行代码加载至所述RAM区,其中,在加载所述运行代码时,当所述ROM区中相应的BOOT代码函数需要被替换时,根据对应的扩展代码函数的函数指针地址跳转到RAM中执行补丁代码,执行完毕之后跳回ROM区中继续执行BOOT代码。
本实施例中,在将所述补丁代码存写入至所述OTP中时,先将所述补丁代码中的补丁函数写入到所述OTP区中,然后将所述补丁函数在RAM区中的地址赋值给所述补丁函数对应的地址EXT_Func[],并写入到OTP区中。该方案为BOOT代码将补丁代码加载至RAM区中对应位置提供了基础。
上述OTP区容量为N个KB,则所述OTP区最多能够存储N份补丁代码。即,所述OTP被分为N个子区域,每一个子区域容量均为1个KB,当所述补丁代码为1个KB或者小于1个KB时,可以存储N份补丁代码,当所述补丁代码为2个KB时,则占用OTP区的2KB,当所述补丁代码为非整数KB时,则占用靠近该非整数的两个整数中较大的一个整数的子区域的容量,例如当为1.5个KB时,靠近该1.5的整数为1和2,则占用2个子区域的容量,即2K。
具体结合实例,请继续参见图5,由于OTP每一个bit只能被编程一次,而一份补丁代码通常很小,小于1KB,所以本实施例使用一种将OTP分段存储的方法,可以解决OTP只能被编程一次的问题。设定一份补丁代码可以存储在OTP对其1KB的起始位置,设定OTP区总容量为8K,则一份补丁代码可以存放在0KB,1KB,2KB,3KB,4KB,5KB,6KB,7KB对齐的位置。每次只会往OTP中写入一份补丁代码,假设软件需要升级,则可以通过写入下一份补丁代码的方式升级补丁代码。
上述补丁代码包括:标记头Flag、校验码ChechSum,函数扩展标记EXT_Func[]:以及代码区,所述标记头Flag用于标识是否为一份补丁代码,所述校验码ChechSum用于对所述函数扩展标记和代码区进行异或运算以得出校验码,从而保证所述补丁代码完整性,所述函数扩展展标记EXT_Func[]:用于表示记录各个补丁函数对应的RAM地址,所述代码区用于存放补丁代码。
进一步的,请继续参见图6,所述S10的步骤包括以下子步骤:
S101、开始加载OTP区补丁代码;
S102、设置计数器i=0;
S103、i是否小于所述N,若小于则进入S104步骤,若大于或等于,则转入S111步骤;
S104、若i小于所述N,则读出OTP区中i*1KB对齐地址4Byte数据为临时标记头TempFlag;
S105、判断所述临时标记TempFlag是否等于标记头Flag;若等于则进入S106步骤,否则转入S110步骤;
S106、若所述临时标记TempFlag等于所述标记头Flag,则从所述OTP中1*1KB地址处连续读出一份补丁代码,视为当前补丁代码;
S107、通过所述校验码ChechSum校验该段当前补丁代码是否正确,若正确则进入S108步骤,否则转入S110步骤;
S108、若正确,则将所述当前补丁代码中数组EXT_Func[]复制到RAM中;
S109、OTP区中所述当前补丁代码区赋值到RAM中对应位置;
S110、执行i+1后转入S103步骤;
S111、加载OTP区补丁代码完成。
进一步的,在S12步骤中,所述ROM区中相应的BOOT代码函数根据对应的扩展代码函数的函数指针是否为0确定是否需要被替换,当所述函数指针为0时,表示所述BOOT代码函数不需要被替换,当所述函数指针为非0时,表示所述BOOT代码函数需要被替换。
本发明的基于OTP的主控芯片的BOOT代码扩展方法可以应用于移动存储产品例如U盘、SD卡等主要由主控芯片和NAND FLASH两部分组成,其中主控芯片存储包括ROM区、OTP区、RAM区。ROM区中存储着芯片生产时固化的BOOT代码。芯片上电时,MCU通过运行BOOT代码,将补丁代码加载到RAM区中,然后从NAND FLASH中把运行代码加载到RAM区中,在该过程中,若遇到BOOT代码函数需要被替换时,则根据对应的扩展代码函数的函数指针地址跳转到RAM中执行补丁代码,执行完毕之后跳回ROM区中继续执行BOOT代码。每一次NAND FLASH有更新换代时,均可按照上述方式写一次对应的补丁代码至所述OTP中,从而可以使得BOOT代码可以支持更新换代后的NAND FLASH。BOOT代码中,可以通过在重要的函数中预留扩展函数接口方法的方式,在函数需要修改时通过扩展函数跳转到RAM中执行补丁代码,在补丁代码运行完毕后调回到ROM中继续执行。解决了现在技术中所存在的生产周期长、对芯片的验证周期长的问题,由于不需要外挂EEPROM,降低了成本,同时不会增大芯片的面积,可以应用于面积要求小的产品中。
具体结合实例,请继续参见图7,ROM代码区有函数BOOT_Func0(),该函数实现功能是z=x+y,假设现在代码出现了异常,需要扩展替换该函数功能为z=x-y。函数扩展替换方法如下:
将函数Ext_Func0()写入到OTP中,该函数实现功能z=x-y。
将函数Ext_Func0()的地址赋值给EXT_Func[0],并写入到OTP中
BOOT代码通过加载OTP补丁代码流程,将补丁代码中数组EXT_Func[]复制到RAM中,将OTP补丁代码区赋值到RAM中对应位置。
当函数BOOT_Func0()运行到RUN_EXTEND_FUN(EXT_Func[0])时,由于EXT_Func[0]不为0,则发现该函数被扩展替换。代码会跳转到EXT_Func[0]地址处运行,即执行了函数Ext_Func0(),实现了功能z=x-y,然后BOOT_Func0()函数直接退出,不执行z=x+y。
以上仅为本发明的实施方式,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。