原创 TI DM644x DaVinci NAND闪存编程

2010-10-11 14:58 1235 7 7 分类: EDA/ IP/ 设计与制造

关键词: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 



0xA1ACEDxx 


Magic number 



Entry Point Address of UBL 


Entry point address for the user boot-loader (absolute address) 



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]
; mask all IRQs by setting all bits in the EINT default
mem write 0x01c48018 0x00000000
mem write 0x01C4801C 0x00000000

; Put the GEM in reset
mem and 0x01C41A9C 0xFFFFFEFF 

; Enable the Power Domain Transition Command
mem or 0x01C41120 0x00000002
wait 1

; Enable L1 & L2 Memories in Fast mode
mem write 0x01C4004C 0x00000001
mem write 0x01C42010 0x00444400

; Select the Clock Mode Depending on the Value written in the Boot Table by the run script
mem and 0x01C40D00 0xFFFFFEFF ; PLL2_CTL &= PLL_CLKSRC_MASK
mem and 0x01C40D00 0xFFFFFFDF ; Select the PLLEN source
mem and 0x01C40D00 0xFFFFFFFE ; Bypass the PLL
wait 1

mem and 0x01C40D00 0xFFFFFFF7 ; Reset the PLL
mem and 0x01C40D00 0xFFFFFFFD ; Power up the PLL
mem and 0x01C40D00 0xFFFFFFEF ; Enable the PLL from Disable

mem write 0x01C40D10 0x00000013 ; PLL2_PLLM = 0x13
wait 1
mem or 0x01C40D1C 0x00000001 ; PLL2_DIV1
wait 1
mem write 0x01C40D18 0x00000006 ; PLL2_DIV2
wait 1
mem or 0x01C40D1C 0x00080000 ; PLL2_DIV1 divider enable 
wait 1
mem or 0x01C40D38 0x00000001 ; PLL2_PLLCMD, GOSET=1
wait 1
mem or 0x01C40D18 0x00000001 ; PLL2_DIV2 divider enable
mem or 0x01C40D38 0x00000001 ; PLL2_PLLCMD, GOSET=1
wait 1
mem or 0x01C40D00 0x00000008 ; Bring PLL out of Reset
wait 1
mem or 0x01C40D00 0x00000001 ; Enable the PLL
wait 1

; Shut down the DDR2 LPSC Module
mem and 0x01C41A34 0xFFFFFFE0 ; MDCTL_DDR2_0
mem or 0x01C41A34 0x00000003 ; MDCTL_DDR2_0
; Enable the Power Domain Transition Command
mem or 0x01C41120 0x000000001 ; PTCMD_0
wait 1

; Program DDR2 MMRs for 135MHz Setting
;-------------------------------------

; Program PHY Control Register
mem write 0x200000E4 0x14001905 ; DDRCTL

; Program SDRAM Bank Config Register
mem write 0x20000008 0x00008622 ; SDCFG

; Program SDRAM TIM-0 Config Register
mem write 0x20000010 0x229229C9 ; SDTIM0

; Program SDRAM TIM-1 Config Register
mem write 0x20000014 0x0012C722 ; SDTIM1

; Program the SDRAM Bang Config Control Register
mem write 0x20000008 0x00000622 ; SDCFG

; Program SDRAM TIM-1 Config Register
mem write 0x2000000C 0x0000041D ; SDREF

; dummy DDR2 write/read 
mem write 0x80000000 0xA55AA55A
mem read 0x80000000 

; Shut down the DDR2 LPSC Module
mem and 0x01C41A34 0xFFFFFFE0 ; MDCTL_DDR2_0
mem or 0x01C41A34 0x00000001 ; MDCTL_DDR2_0

; Enable the Power Domain Transition Command 
mem or 0x01C41120 0x00000001 ; PTCMD_0
wait 1

; Turn DDR2 Controller Clocks On

; Enable the DDR2 LPSC Module
mem or 0x01C41A34 0x00000003 ; MDCTL_DDR2_0

; Enable the Power Domain Transition Command 
mem or 0x01C41120 0x00000001 ; PTCMD_0
wait 1

mem write 0x80010000 0x00000001 ; CFGTEST


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: 
- TFTP server
- FTP server
- HTTP server
- MMC/SD card


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
CORE0_FLASH1 = NAND_UBOOT
CORE0_FLASH2 = NAND_UBOOT_ENV
CORE0_FLASH3 = NAND_KERNEL
CORE0_FLASH4 = NAND_ROOTFS


Flash Profile 2: 


Flash Profile 3:



;
; UBL should be programmed with hardware ECC without clean markers
;
[NAND_UBL]
CHIP = NAND_FLASH
DATA_BASE = 0x02000000 ; data
CMD_BASE = 0x02000010 ; commands (CLE)
ADDR_BASE = 0x0200000A ; addreses (ALE)
FILE = "tftp://192.168.3.1/ubl.bin", BIN, 2048*64 ; page 64
; list with bad blocks to be marked as bad
;========================================= 
;BAD_BLOCKS=1633,1881 
;ERASE_BAD_BLOCKS = YES
OOB_INFO = DAVINCI_ECC
DAVINCI_UBL_DESCIPTOR_MAGIC = 0xA1ACED00
DAVINCI_UBL_DESCIPTOR_ENTRY_POINT = 0x20
DAVINCI_UBL_MAX_IMAGE_SIZE = 14*1024


Flash Profile 4:



;
; U-BOOT at page 384

[NAND_UBOOT]
CHIP = NAND_FLASH
DATA_BASE = 0x02000000 
CMD_BASE = 0x02000010 
ADDR_BASE = 0x0200000A 
FILE = "tftp://192.168.3.1/uboot.bin", BIN, 2048*384 ; page 384

; list with bad blocks to be marked as bad
;========================================= 
;BAD_BLOCKS=10,1633,1881 
ERASE_BAD_BLOCKS = NO
OOB_INFO = DAVINCI_ECC
DAVINCI_UBL_DESCIPTOR_MAGIC = 0xA1ACED11
DAVINCI_UBL_DESCIPTOR_ENTRY_POINT = 0x81080000
DAVINCI_UBL_DESCIPTOR_LOAD_ADDR = 0x81080000
DAVINCI_UBL_MAX_IMAGE_SIZE = 512*1024 


警告:


PEEDI TFTP 的用户用512 字节转移区域的大小,限制图像文件大小在32MB一下。如果你的文件大了,用HTTP或者FTP文件服务器或者用MMC/SD卡来存文件或者把它放到PEEDI里面。


3.3 ACTIONS 部分


声明脚本可以运行面板按钮了,每个声明一定要在新行里。这个声明包含一个数字,这个数字与指定的脚本名有关。如果AUTORUN=N指针式指定的,这里N是脚本的一个数字,当目标连接到PEEDI的时候这个给定的脚本每次将会执行。


例子:


3.4 坏区域的管理


损坏区域的管理


NAND 闪存编程器 会有一些区域变坏之后是不能使用的。


一个不能使用的区域可能包含一个或者多个坏的位,另外坏的区域肯能经常还在用。


这个制造者可能在被数据损坏之前就识别出来,而不是FFh (x8)或 FFFFh (x16)进入第一个空白处的坏区域的第一或第二页




;
; U-BOOT environment at page 256
;
[NAND_UBOOT_ENV]
CHIP = NAND_FLASH
DATA_BASE = 0x02000000 
CMD_BASE = 0x02000010 
ADDR_BASE = 0x0200000A 
FILE = "tftp://192.168.3.1/uboot_env.bin", BIN, 2048*256
ERASE_BAD_BLOCKS = NO
OOB_INFO = DAVINCI_ECC 


一旦检查出来,这个坏区域将会被保护起来,以至于不会被擦除和编程。


已经要求,PEEDI 将会尝试着强迫擦除现有的坏区域。


它也可以把区域变成坏的。


擦除所有的区域,包括所有的坏区域,下面的指令一定要改了:



;
; Linux kernel at page 512
;
[NAND_KERNEL]
CHIP = NAND_FLASH
DATA_BASE = 0x02000000 
CMD_BASE = 0x02000010 
ADDR_BASE = 0x0200000A 
FILE = "tftp://192.168.3.1/uimage.bin", BIN, 2048*512
AUTO_ERASE = YES
ERASE_BAD_BLOCKS = NO
OOB_INFO = JFFS2


PEEDI启动,“flash erase”将会擦除所有的区域。


警告:


如果你去除的区被标记为坏的,这里有一个方法来检查那个是坏区。


确定你已经保存flash query指令的输出,所以你可以再一次对坏的区域进行标记。


把4,27 和1002强制标为坏损区域:


当PEEDI 重新启动 “flash info”指令的时候,将会标记所给的区域为坏区域。


一旦标记上了,这个区域将不会再被标记了。


4、编程


现在所有的都已经设定好了,你可以准备对你的NAND板进行编程了。


Flash 编程用 flash 文件是很简单的:



;
; JFFS2 root file system at page 44608
;
[NAND_ROOTFS]
CHIP = NAND_FLASH
DATA_BASE = 0x02000000
CMD_BASE = 0x02000010
ADDR_BASE = 0x0200000A
FILE = "ftp://user:password@192.168.3.1/rootfs.jffs2", BIN, 2048*44608 
;OOB_INFO = DAVINCI_ECC_HW6_512
; Linux kernel 2.6.10 has a bug - to workaround it use:
OOB_INFO = DAVINCI_ECC_HW6_512_2610
AUTO_ERASE = YES 


完成Linux 系统的编程一下子就完成了:


peedi> run $prog ; run the script "prog" defined in [ACTIONS] 


 


更多资料,请联系我们:


广州虹科电子 http://www.hkaco.com 


吴工 020-38743030  wj@hkaco.com  QQ:534807413



PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条