关键词:NAND闪存编程,ARM926CPU,PEEDI,JTAG
1、简介
NAND FLASH 闪存编程器比他的上一代产品 NOR FLASH 要便宜。NAND 开始抛弃 NOR 里面的设备,现在它可以建立一个不包含 NOR FLASH 的设备,仅用一个 NAND flash 用来支持引导装入和其它的从RAM里面复制和执行的所有执行代码。
DM644x设备是基于TI's TMS320C64x+ DSP 核和一块 ARM926 处理器上的。因为NAND Flash控制器是在板上的,并且可以使用它。很多硬件的设计者都想拥有一个系统只有NAND FLASH的板,而不是NOR-FLASH.
这个说明书将会解释如何通过JTAG内在的ARM926CPU,用PEEDI JTAG 仿真工具和闪存编程器来完成Linux系统(UBL,U-BOOT,Linux核,系统根文件)的编程。为自动编程PEEDI将如何准备。
2. ARM ROM Boot Modes
(从TI's SPRUE14A-March 2007引用过来)
当BOOTSEL[1:0]引脚检查到一个状态的时候,DM644x DMSoC ARM ROM boot loader (RBL)就会执行。而不是传统的ARM EMIF boot (BTSEL[1:0] 1 01)。在这个例子里,控制将会转到ROM启动装置(RBL)里。如果BOOTCFG存储器里BTSEL[1:0]的值是00b,NAND的模式将会执行。NAND 启动模式假设NAND位于 EM_CS2接口上,它的总线宽度已经被EM_WIDTH在复位的时候控制了。RBL用在BOOTCFG存储器里EM_WIDTH管脚状态决定从NAND里面读取数据的大小。
首先,NAND设备的ID 是从设备里面读出来的。任何需要存取的信息(比如区域和页面的大小等等)都是从RBL设备信息表取出来的。然后,URL 在CIS/IDI区(第1区)之后的那个区的第0页寻找UBL的描述符。
如果有效的UBL没有在这里找到,像被读入一个恰当的UBL信号确定,下一个区将会被搜到。搜索可以达到5个区。这个额外的搜索已经做好了,免得一开始的几个连续区域被标记为坏的。(坏的,就是他们有错误了)。检测5个区对于处理发现在所有NAND设备上的错误来说已经很重要了,如果在寻找的时候有用的UBL信号没有发现,RBL将会恢复到UART boot mode。
如果有用的UBL已经发现了,这个UBL描述符被读和处理了。这个描述符给了装载和控制转移到UBL的要求的信息,然后UBL就会读和处理了。RBL将会促使EMIF和I-Cache的连接,I-Cache运行在基于UBL最初的描述符上。另外,无论如何这个描述符给出信息,DMA将会在UBL的拷贝过程中用到。
当user-specified启动条件已一经设定,RBL将会把UBL拷贝到ARM的RAM里。从0000:0020h地址开始启动。
注意:实际上拷贝的UBL是在较低的14KB的TCM数据地址8020到B81Fh。第一个32位的ARM内核ROM是ARM系统的中断向量表/VT(8个向量,每个占4位)。32位/VT后,UBL开始复制了。
NAND RBL 试图在读ARMIRAM里的UBL的时候,通过检测ECC的值来确定正确的读取。如果出现一个读错误,在那个例子里UBL的拷贝立刻停止,但是RBL继续寻找下面的区,在这个区里发现了一个虚数,是另外一个例子的虚数。当一个虚数被发现的时候,这个过程被重复了。用这个重试的过程,这个虚数和UBL将会重复5次。给重要的沉余,错误将会弹回NAND的读错误。
NAND用户的装载描述符格式在下面的表格里:
Table 1:
Offset | 32-Bits | Description |
0 | 0xA1ACEDxx | Magic number |
4 | Entry Point Address of UBL | Entry point address for the user boot-loader (absolute address) |
8 | Number of pages in UBL | Number of pages (size of user boot-loader in number of pages) |
12 | Starting Block # of UBL | Block number where user boot-loader is present |
16 | Starting Page # of UBL | Page number where user boot-loader is present |
20 | Load Address | Application load address, usually 0x20 |
3、PEEDI的概括
PEEDI可以用八位和十六位甚至高达8G位的总线编程NAND。首先要做的事就是设置PEEDI跟目标工作。这一步包含PEEDI概述文件目标部分的设定和FLASH部分的设定。
从我们的例子里可以看davinci.cfg:
http://download.ronetix.info/peedi/cfg_examples
3.1 INIT部分
概述文件的INIT部分一定包含对PLL,DDR和板的选择初始化,因为FLASH编程器没有任何的初始化。
这个有一个通常的TMS320DM6446的INIT部分的初始化:
[INIT_DAVINCI] |
3.3 FLASH部分
FLASH 部分包含如下信息:
1. | The addresses of the DATA, ALE and CLE commands |
2. | Default file image to be programmed, if a short program command is used. PEEDI supports various file sources: |
3. | The kind of OOB info to be used. PEEDI supports several methods to calculate the ECC |
Table2:
Type | Erased marker | Uusage | Description |
JFFS2 | Yes | kernel | The standard ECC used in the Linux JFFS2 driver |
JFFS2_NO_EM | No |
| The standard ECC used in the Linux JFFS2 driver |
RAW | No |
| Data and spare bytes will be loaded from the image file |
YAFFS | No |
| Like RAW, but bad blocks are skipped |
FF | No |
| Only data bytes will be read from the image file, spare bytes will be set to 0xFF |
DAVINCI_ECC | No | UBL, U-BOOT, U-BOOT environment | DaVinci Hardware ECC, 4 bytes per 512 bytes data |
DAVINCI_ECC_HW6_512 | Yes | root file system | DaVinci Hardware ECC, 6 bytes per 512 bytes data |
DAVINCI_ECC_HW6_512_2610 | Yes | root file system | DaVinci Hardware ECC, 6 bytes per 512 bytes data with workaround for a JFFS2 bug in Linux kernel 2.6.10 |
4. | 描述符的虚拟数- 第一个在UBL描述符的32位值(见表1) PEEDI 能够自动产生UBL的描述符,如果参数DAVINCI_UBL_DESCRIPTOR_MAGIC设置成非0的值,然后文件的编程将会被移动一个NAND Flash 页(512或者2048个位)。跳过的页是用来UBL描述符和被PEEDI 充满了。 如果DAVINCI_UBL_DESCRIPTOR_MAGIC参数丢失或者被设置成0.,然后所有的UBL描述符都不被编程,file image 将不会迁移。 |
5. | 描述符的进入点-将会在UBL描述符补偿 0x4被编程(见表1) |
6. | UBL最大的文件尺寸—如果编程的文件大小超过他,PEEDI用来显示警告的用的 |
为了编程方便,5个flash将会被定义:
first flash profile (CORE0_FLASH0)将会编写UBL,UBL一定要包含一个描述符,DAVINCI_ECC将会比用到。
second flash profile (CORE0_FLASH1)将会编写U-BOOT.取决于UBL U-BOOT是否包含一个描述符,DAVINCI_ECC将会被用到。
The third flash profile (CORE0_FLASH2)将会编写U-BOOT环境,DAVINCI_ECC应该要用到。
The fourth flash profile (CORE0_FLASH1)将会编程 Linux核,标准的软件JFFS2 ECC应该会用到。
fifth flash profile (CORE0_FLASH1) 将会编程JFFS2根文件,DAVINCI_ECC_HW6_512 or DAVINCI_ECC_HW6_512_2610应该会用到。
如果用了DAVINCI_ECC_HW6_512,那么PEEDI每512B数据将会计算6位ECC。事实上只有3B里含有ECC的信息。另外3B没有用到。
DAVINCI_ECC_HW6_512_2610跟DAVINCI_ECC_HW6_512是一样的,但是执行一个工作区,因为一个故障在Linux 2.6.10的JFFS2驱动里。 Workaround 是PEEDI不会向ECC写一个空页(仅是充满0xFF)
Flash Profile 0:
Flash Profile 1:
CORE0_FLASH0 = NAND_UBL |
Flash Profile 2:
Flash Profile 3:
; |
Flash Profile 4:
; |
警告:
PEEDI TFTP 的用户用512 字节转移区域的大小,限制图像文件大小在32MB一下。如果你的文件大了,用HTTP或者FTP文件服务器或者用MMC/SD卡来存文件或者把它放到PEEDI里面。
3.3 ACTIONS 部分
声明脚本可以运行面板按钮了,每个声明一定要在新行里。这个声明包含一个数字,这个数字与指定的脚本名有关。如果AUTORUN=N指针式指定的,这里N是脚本的一个数字,当目标连接到PEEDI的时候这个给定的脚本每次将会执行。
例子:
3.4 坏区域的管理
损坏区域的管理
NAND 闪存编程器 会有一些区域变坏之后是不能使用的。
一个不能使用的区域可能包含一个或者多个坏的位,另外坏的区域肯能经常还在用。
这个制造者可能在被数据损坏之前就识别出来,而不是FFh (x8)或 FFFFh (x16)进入第一个空白处的坏区域的第一或第二页
; |
一旦检查出来,这个坏区域将会被保护起来,以至于不会被擦除和编程。
已经要求,PEEDI 将会尝试着强迫擦除现有的坏区域。
它也可以把区域变成坏的。
擦除所有的区域,包括所有的坏区域,下面的指令一定要改了:
; |
PEEDI启动,“flash erase”将会擦除所有的区域。
警告:
如果你去除的区被标记为坏的,这里有一个方法来检查那个是坏区。
确定你已经保存flash query指令的输出,所以你可以再一次对坏的区域进行标记。
把4,27 和1002强制标为坏损区域:
当PEEDI 重新启动 “flash info”指令的时候,将会标记所给的区域为坏区域。
一旦标记上了,这个区域将不会再被标记了。
4、编程
现在所有的都已经设定好了,你可以准备对你的NAND板进行编程了。
Flash 编程用 flash 文件是很简单的:
; |
完成Linux 系统的编程一下子就完成了:
peedi> run $prog ; run the script "prog" defined in [ACTIONS]
更多资料,请联系我们:
广州虹科电子 http://www.hkaco.com
吴工 020-38743030 wj@hkaco.com QQ:534807413
文章评论(0条评论)
登录后参与讨论