具体实施方式
以下将结合附图所示的具体实施方式对本发明进行详细描述。但这些实施方式并不限制本发明,本领域的普通技术人员根据这些实施方式所做出的结构、方法、或功能上的变换均包括在本发明的保护范围内。
为了解决由NAND闪存特性引出的问题,制定并研发设计了一系列特定的过程和方法,用以保证初始化过程正确进行和正确读取NAND闪存中的数据参数,这些过程和方法是在固化代码中被执行的。
请参照图5所示,在本发明一实施方式中,硬件固化代码的启动和运行包括如下步骤:
S1、启动固化代码以初始化NAND闪存,并为读取NAND闪存中的装载代码做准备,其中,所述固化代码中包括一保存多种型号NAND闪存参数的设备参数表,且固化代码支持设备参数表中保存的各型号NAND闪存;
S2、读取并解析所述NAND闪存中的装载代码。
值得一提的是,所述固化代码支持NAND闪存行业标准ONFI 2.0(Open NAND Flash Interface 2.0)。Open NAND Flash Interface(ONFI)工作组已经于2008-2009年公布了其ONFI 2.0标准。该公司成立于2006年5月,拥有100多个涉及制造、设计以及使用闪存产品的成员,包括海力士、英特尔、镁光、SanDisk以及索尼。ONFI 2.0标准要求NAND闪存能够通过处理特殊指令0xEC提供硬件设备的具体参数。在固化代码的参数获取流程中,能够通过这个命令将支持ONFI 2.0标准的NAND闪存中的参数读取并更新到***参数表中。
其中,如图6所示,步骤S1具体包括:
S11、初始化用于与NAND闪存通信以控制NAND闪存的NAND闪存硬件控制器;
S12、检测当前NAND闪存参数并读取与当前NAND闪存对应的固化代码参数。NAND闪存参数检测,固化代码参数读取过程依据不同类型的闪存包含不同的内容,目前在成熟的方案中可以同时支持SPI闪存以及NAND闪存,这两种闪存中NAND闪存由于固有的硬件特征使得控制更为复杂。
具体地,在本实施方式中的步骤S1中,首先需要进行硬件的启动(***加电),接下来需要通过硬件启动控制器初始化片内存储器(步骤S101),硬件启动控制器分析并解析存储在片内存储器上的特定格式的固化代码(步骤S102),紧接着判断解析是否成功(步骤S103),若不成功,则硬件启动停止;若成功,则进行固化代码的启动(步骤S104),通过启动固化代码来初始化闪存并为读取装载代码做必要准备,并判断是否成功(步骤S106),若成功,便进入读取并解析闪存中的装载代码的步骤,若不成功,则判断是否需要启动下一个闪存(步骤S110),若是,则返回步骤S1、若否,跳转步骤S111:停止固化代码。
在读取并解析闪存的装载代码之后,还需判断该过程是否成功(步骤S108),若是,则启动控制权交给特定的软件来装载代码(步骤S109);若否,同样需要判断是否需要启动下一个闪存(步骤S110)。
在本实施方式中,固化代码最终使用的参数(比如闪存设备参数、设备ID、尺寸信息等等)保存于一***参数表中,所述***参数表的参数获取方式包括搜索固化代码内部NAND闪存设备参数表、或者从支持ONFI 2.0标准的NAND闪存获取、或者读取NAND闪存首页保存的参数表。
具体地,请参图7所示,“搜索固化代码内部NAND闪存设备参数表”的参数获取方式具体为:
内部设备表参数获取开始;
读取NAND闪存设备的ID,其中,设备参数表中为每一个型号的NAND闪存都分别配置了唯一的ID;
判断读取ID是否成功,若是,则读取内部设备参数表;若否,则内部设备表参数获取结束;
读取内部设备参数表结束后,还需判断是否找到闪存信息,若是,则对***参数表进行更新;若否,则内部设备表参数获取结束;
“从支持ONFI 2.0标准的NAND闪存获取”的参数获取方式具体为:
ONFI信息表读取开始;
与NAND闪存通信并获取ONFI读取信息表;
判断是否成功获取,若是,则对***参数表进行更新;若否,则ONFI信息表读取结束;
“读取NAND闪存首页保存的参数表”的参数获取方式具体为:
NAND闪存中的参数表获取开始;
读取NAND闪存中的参数表;
判断是否成功获取,若是,则对***参数表进行更新;若否,则NAND闪存中的参数表获取结束;
表[1]中列举了其中的部分参数:
表[2]列举了这些闪存的具体型号:
在固化代码中,设备参数表中存有目前市场上已经存在的32种以上的不同NAND闪存的信息,这些闪存都是固化代码能够支持的,优选地,所述设备参数表中为每一种型号的NAND分别配置唯一的ID(如表2所示)。
参图8所示,在本发明一实施方式中,一种固化代码参数表的保存及获取方法,包括如下步骤:
将固化代码的参数表保存于NAND闪存的第一个可使用的存储页中,其中,所述固化代码的参数表保存为多个副本,且每个副本内容与原参数表内容一致;
采用ECC(Error Correcting Code ,数据错误检测及数据纠错)方式来读取参数表数据。
优选地,该方法包括采用MD4或MD5校验方式对原参数表及各参数表副本进行校验。
本发明为解决NAND闪存的多样性特点,在NAND闪存的第一个可访问的存储页中设立参数表保存重要的硬件参数以及固化代码运行需要的必要的参数,同时为保证数据的正确性,参数表保存采用多个副本,同时采用国际流行的MD4和MD5校验方式,并采用数据错误检测及数据纠错(ECC)流程。
在本实施方式中,这样的存储结构的三个重要内容是:第一,参数表保存采用多个副本(副本1、副本2、副本3…),且每个副本内容与原参数表内容一致,其中,原参数表和副本参数表均为128字节,其中,参数表包括版本信息、***参数、保留字段以及MD4(5)代码部分,采用此方式可以在一定程度上避免局部数据损坏的问题;第二,采用国际流行的MD4或MD5校验方式,对参数表及每个副本进行MD4或MD5校验,以确保该参数表数据的正确性和安全性;第三,采用数据错误检测及数据纠错(ECC),这个方案针对NAND的数据不可靠性设计的,在数据读取过程中,数据的错误检测以及纠错是通过固化代码控制NAND闪存控制器完成的,目前可以对NAND闪存中保存的参数表以及随后的保留区出现的24位数据错误进行检测纠错。
如图9所示,在本发明一实施方式中,所述“采用ECC读取参数表数据”的步骤具体为:
S201、读取NAND闪存中的参数表开始;
S202、使能硬件ECC,读取参数表数据;
S203、判断ECC是否失败,若是,则关闭硬件ECC,读取参数表数据(步骤S204);若否,则继续S205的操作;
S205、对当前参数表(原参数表及各参数表副本)进行MD4或MD5的数据校验;并判断校验是否成功,若成功,则保存并更新固化代码中***参数表;反之,则判断是否完成所有副本(步骤S207):如果未完成所有副本,则跳转S205;反之,则跳转步骤S208。
值得一提的是,所述固化代码支持NAND闪存行业标准ONFI 2.0(Open NAND Flash Interface 2.0)。
在NAND闪存硬件参数中,访问地址宽度参数至关重要,对NAND闪存的任何硬件访问协议都包含这个部分内容。目前国际市场上存在多种类型访问地址宽度不同的NAND闪存,这就要求固化代码要对这个重要参数实现自动检测。固化代码根据设计方案的执行过程中,首次访问存储数据是在读取NAND闪存中的参数表这个过程,因此在这一过程中采用独特的顺序依次设置不同的访问地址宽度参数是目前采用的有效方式之一。
接下来,请参图10 所示,在本实施方式中,一种NAND闪存硬件访问地址宽度参数的处理方法,具体包括如下步骤:
固化代码对NAND闪存中的访问地址宽度参数进行自动检测;
读取NAND闪存中的参数表;
判断是否完成了对所有参数的设置,若是,访问地址宽度参数检测结束;若否,按照特定顺序更新所述访问地址宽度参数。
具体地,上述步骤可通过如下流程来实现:
S301、地址宽度检测开始;
S302、读取NAND闪存中的参数表(即图9所示的步骤);
S303、判断是否成功读取参数表,若是,则更新***参数表中的参数(S304),然后地址宽度检测结束(S307);
若否,则还需判断是否所有参数都完成了设置(若是,地址宽度检测结束(S307);若否,则按照特定顺序更新新地址宽度参数(S306)。)
参图11所示,在本发明一实施方式,读取装载代码(步骤S2)是固化代码在完成必要的设备初始化以后做的主要工作,这个过程的工作原理可以用图11表示。其中,步骤S2具体为:
S401、必要的***初始化;
S402、读取下一可访问数据区闪存中的装载代码,其中,装载代码的读取按照一定顺序进行逐一读取;
S403、判断装载代码的读取是否成功,若是,则对跳转到:对读取的装载代码进行解析检测(步骤S404)其中,检测的具体方法在下文会介绍;若否,则判断是否已完成了所有数据区的读取(步骤S405),其中,若还有未完成读取的数据区,则跳转到步骤S401再进行一次循环,反之,结束装载代码的读取操作;
S406、判断装载代码是否正确,若是,结束装载代码的读取操作;反之,跳转到步骤S405。
在这个过程中,对闪存可访问的数据区中的装载代码的读取是个重要的内容。
在NAND闪存中,装载代码可以是一个,也可以是多个,它们都具有相同的特定格式。固化代码依据文件格式中的字段从NAND闪存中读取满足条件的数据,然后经过对读取的装载代码进行数据校验来检测是否是正确完整的装载代码。接下来,参图12所示,本发明的一具体实施方式中,装载代码的文件格式按一定次序具体为:包括文件标识(4字节)、文件数据起始标志(4字节)、若干数据段(数据段1、数据段2…数据段n)、文件数据结束标志(4字节)以及文件数据校验码(4字节)。
其中,数据段的格式按次序具体为:数据段长度信息(2字节)、数据段类型信息(2字节)、数据段地址信息(4字节)以及数据内容或数据表单内容。
其中,标有“4字节”的内容为为32比特的二进制数据,标有‘2字节’的内容为16比特的二进制数据。文件标识,数值为 0x??55??55 (??表示16进制00到FF,下同),文件数据起始标识数值为 0xC2C2???? ,文件数据结束标志数值为0xC288C288。数据段类型信息数值为 0xC2?? 。
参图12所示,为了解决NAND闪存中包含坏块的问题,装载代码不保存在有坏块的数据区中。针对在使用过程中可能造成损坏的问题,允许在NAND闪存中保存为具备相同文件格式的一个或多个装载代码,这些装载代码可以是相同的也可以是不同的,当读取过程中某一数据区出现坏块时,忽略对该数据区的访问并跳到下一个数据区进行访问。这些保存在NAND闪存中的装载代码最多占用32个数据块,在本发明一实施方式中,固化代码读取这些装载代码的时候依据图12中箭头所示的方式从后向前逐一访问的。其中,每一个数据区都对应设置有一物理数据区号和一逻辑数据区号,特别的,坏块的逻辑数据区号为空。
固化代码中按照这种访问方式读取装载代码的过程可以用图13来表示。
其中,该过程具体包括:
S501、必要的初始化;
S502、从下一个逻辑数据区块读取数据;
S503、对读取的装载代码进行校验;
S504、判断校验是否成功,若是,装载代码读取结束;若否,判断是否所以数据区的访问结束(步骤S505):若是,结束装载代码的读取;若否,跳转步骤S501进行一次循环。
“从逻辑数据块读取数据“的过程具体为:
S601、计算所要读取的数据的数量;
S602、搜索坏块列表,将逻辑地址转换为物理地址;
S603、判断数据区数据是否保留在缓存中,若是,进入步骤S604:从缓存中读取数据;若否,进入步骤S605:从闪存中读取页数据,并更新缓存数据(S606)。
在步骤S604和步骤S606之后,跳转到步骤S607:判断是否需要读取更多的数据,若是,跳转到步骤S602进行再一次循环;若否,读取数据结束。
针对NAND闪存数据不可靠性特征,数据读取过程中采用数据错误检测及数据纠错流程(ECC),这些纠错过程需要的纠错代码按照特定的格式存储在NAND闪存中。
如图15所示,在NAND闪存的国际标准中数据区(块)内的数据是以数据页为单位存贮的,每个数据页分为尺寸相异的两个段,即数据段和备用段(OOB或Spare area)。为了解决NAND闪存数据的不可靠性的特点,固化代码在进行数据页访问的时候,采用数据错误检测及数据纠错过程(ECC)处理。在所有SoC中,NAND闪存的ECC是通过控制NAND闪存硬件控制器,由控制器硬件完成的,其中需要的ECC码将按照访问区的不同分别存储在数据页的不同位置。
其中,在本实施方式中,固化代码对数据页的访问过程具体为(参照图15中箭头1、2、3、4所示):
按次序逐一访问数据段中某一数据段(数据段0、数据段1);其中,数据段为1024字节。
调用备用段中与当前被访问数据段对应的ECC码(数据段0对应ECC-0、数据段1对应ECC-1.…)对当前访问数据进行处理;
经过使用以上描述的方法和过程,在多种SoC中,***加电以后硬件部分能正确的从闪存将装载代码读取到片内缓存中并将控制权交给软件。
此项技术完全实现了从NAND闪存以及SPI闪存中启动的功能,配合自主研发的闪存烧写软件,这套成熟的技术已经应用到众多的设计项目中。
针对NAND闪存的特点提出的解决方案目前支持国际市场上所有满足硬件控制器ECC要求的NAND闪存。在此项技术固化到成熟的SoC芯片后,由三星(Samsung)为代表的NAND闪存厂商又推出了具有更大容量的27纳米技术产品(如K9GBG08系列),现代(Hynix)则近期推出相同容量的NAND闪存。经测试,虽然这些闪存都采用了最先进的工业技术和具有新的硬件特性,但应用此项技术的SoC却能够非常好的支持它们。
应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包括一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施方式中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。
上文所列出的一系列的详细说明仅仅是针对本发明的可行性实施方式的具体说明,它们并非用以限制本发明的保护范围,凡未脱离本发明技艺精神所作的等效实施方式或变更均应包括在本发明的保护范围之内。