原创 DaVinci DM355 Linux核调试和NAND闪存编程

2010-10-11 15:04 1057 6 6 分类: EDA/ IP/ 设计与制造

关键词:DM355 Linux核调试,PEEDI,FTP服务器,CFG文件;



1、概述


这个案例向你演示Linux核调试和用PEEDI来对DM365 EVM板的编程。这种方法可以重建板上的程序,同时终止了继续对它编程,首先演示如何手动操作,然后看如何通过简单的设置PEEDI达到这个效果。


2、硬件要求


-一块PEEDI 


-一块DM365板


- UBL, U-BOOT, KERNEL and 数据输入系统


-一个运行FTP服务器的主机


3、设置PEEDI和放弃YAFFS


首先你需要准备一个CFG的文件,如果你以前的CFG文件比较复杂,可以从这里下载一个http://download.ronetix.info/peedi/cfg_examples/arm9/tms320dm355-DM355EVM.cfg 下面的都是关于FLASH设置的描述。如果你想编写四个不同的模块(UBL, U-BOOT, Linux核 和根文件系统),你需要在CFG里面定义四个FLASH图。你要设定CORE0_PATH参数指向文件的所在目录。这种FLASH的概述或者你需要的指令仅仅是文件的名字,不是整个路径。然后,你想用PEEDI单机模式的时候,你可以拷贝这个文件到MMC/SD卡里,你仅需要该改变CORE0_PATH。现在我设置这个参数直接指向你的TFTP服务器根目录。



[PLATFORM_ARM]

CORE0_FLASH0 = NAND_UBL
CORE0_FLASH1 = NAND_UBOOT
CORE0_FLASH2 = NAND_KERNEL
CORE0_FLASH3 = NAND_ROOTFS

CORE0_PATH = "ftp://user:password@192.168.1.1/"

[NAND_UBL]
CPU = TMS320DM355
CHIP = NAND_FLASH
DATA_BASE = 0x02000000 ; data
CMD_BASE = 0x02000010 ; commands (CLE)
ADDR_BASE = 0x0200000A ; addresses (ALE)
FILE = ubl.bin, BIN, 64*2048
OOB_INFO = DAVINCI_ECC_HW10_512
BURST_MODE = YES
DAVINCI_UBL_DESC_TYPE = 0
DAVINCI_UBL_DESCRIPTOR_MAGIC = 0xA1ACED00
DAVINCI_UBL_DESCRIPTOR_ENTRY_POINT = 0x20
DAVINCI_UBL_DESCRIPTOR_LOAD_ADDR = 0
DAVINCI_UBL_MAX_IMAGE_SIZE = 28*1024

[NAND_UBOOT]
CPU = TMS320DM355
CHIP = NAND_FLASH
DATA_BASE = 0x02000000 ; data
CMD_BASE = 0x02000010 ; commands (CLE)
ADDR_BASE = 0x0200000A ; addresses (ALE)
FILE = u-boot-DM355.bin, BIN, 8*64*2048 ; 64 pages per block
;FILE = u-boot-DM355.bin, BIN, 8*128*2048; 128 pages per block
OOB_INFO = DAVINCI_ECC_HW10_512
BURST_MODE = YES
DAVINCI_UBL_DESC_TYPE = 1
DAVINCI_UBL_DESCRIPTOR_MAGIC = 0xB1ACED22
DAVINCI_UBL_DESCRIPTOR_ENTRY_POINT = 0x81080000
DAVINCI_UBL_DESCRIPTOR_LOAD_ADDR = 0x81080000
DAVINCI_UBL_MAX_IMAGE_SIZE = 1024*1024

[NAND_KERNEL]
CPU = TMS320DM355
CHIP = NAND_FLASH
DATA_BASE = 0x02000000 ; data
CMD_BASE = 0x02000010 ; commands (CLE)
ADDR_BASE = 0x0200000A ; addresses (ALE)
FILE = uImage, BIN, 0x00400000
OOB_INFO = DAVINCI_ECC_HW10_512
BURST_MODE = YES

[NAND_ROOTFS]
CPU = TMS320DM355
CHIP = NAND_FLASH
DATA_BASE = 0x02004000 ; data
CMD_BASE = 0x02004010 ; commands (CLE)
ADDR_BASE = 0x0200400A ; addresses (ALE)
FILE = rootfs.bin, BIN, 0x20800000
OOB_INFO = YAFFS
BURST_MODE = YES 


如果你能够看到前两行的概述——PEEDI可以根据用户给定的信息自动编写程序指令符。我的板是2GBNAND 的集成电路。这个装置实际上是每个集成里有2x1GB NAND的装置,所以从硬件的角度来说它有两个NAND的集成,并且各自有自己的部分。然而这个Linux NAND把这两个部分和在一个2GB的装置里面。但是对于PEEDI来说它仍然是具有2x1GB的装置。在这个例子里,ROOTFS被安排在第二个装置的位置上。对于Linux 来说,地址是0x60800000,但是对于PEEDI来说,它需要从第二块装置的一开始就要计算出地址来,所以你一定要用0x20800000 (0x60800000 – 1GB)。你也可以注意到它用来驱动第二块集成装置,另外的NAND指令,地址和数据地址的时候都要用得到。
“CPU = TMS320DM355”这个参数告诉PEEDI去检测不良块,如果没有发现,让它产生在最近的好的模块。PEEDI同时也产生镜像的BBT。现在需要编写进NAND模块UBL, U-BOOT和KERNEL使系统运行,然后从以太网装载YAFFS。用flash set 指令,你可以选择你想要用的FLASH,然后 flash program 指令对NAND进行编写:



peedi> flash set 0
peedi> flash erase
peedi> flash program
peedi> flash set 1
peedi> flash program
peedi> flash set 2
peedi> flash program 


现在把板从PEEDI分离并且复位它,它会正常运行。请看这个链接如何编写YAFFS的根文件系统:


http://wiki.davincidsp.com/index.php?title=Put_YAFFS_Image_to_Flash


(从里面拷贝:Put_YAFFS_Image_to_Flash.html)


现在重新把板连接到PEEDI上。因为没有好的工具把YAFFS 程序给DM355 CPU(如果用 HW ECC 将会产生很多问题) ,你可以把 YAFFS程序从NAND里面删除,以后用它来做快速修复,或者手工的编程。用flash set 3 和 flash query PEEDI指令检测坏的模块,确定YAFFS NANE区域里没有了坏的模块:


首先你要检测出YAFFS区的结尾在哪里,你可以放弃整个分区,但是如果这个分区没有满,放弃很多FF将没有意义。首先得计算出在tarball里所有文件的大小的和,然后在地址(就是partition里的基地址)里读取NAND (这个分区的基地址)乘于这个文件的大小,用来确定有一个数据在地址里面。在写有YAFFS 数据的分区里找到最好的NAND页,用flash read指令,确定在0x2B900000页的地址全部是FF,即它是空的。



peedi> flash set 3
peedi> flash query 


考虑到系统是从0x20800000开始的,这意味这你将要放弃0xB000000字节。现在你可以放弃这块地址,但是YAFFS程序文件包含OOB数据,这个OOB数据不包括在NAND记忆空间里,事实上你需要放弃更多一点的数据用来纠正从2048到2112的页数。



peedi> flash read 0x2B800000 


确定一切都ok了,你可以核实刚才放弃的程序:


4、对板的编写


你现在准备完成烧写,下次你想修复你的板或者只想对一部分进行编程,你可以跳过这个当前的整个部分,直接指向编程的那个部分:



peedi> flash dump 0x20800000 0xB000000/2048*2112 rootfs.bin 


将板分离,确定它运行正常,跟得上根文件系统。你可以把所有的指令放在一起使它能够自动执行:



peedi> flash verify rootfs.bin 0x20800000 


把这个指令放到[ACTIONS]目录下,用PEEDI的按钮它就会开始运行了:


这个脚本可以通过三个方法启动:


? 通过 PEEDI 的run $prog_all指令


? 通过选择和开始脚本1,用PEEDI的前按钮


? 如果AUTORUN = 1没有描述这个脚本,它将会每次启动这个板连接到PEEDI。
The way 1 is useful for a board restore. Ways 2 and 3 are useful for production programming since non-qualified personnel can easily be instructed on how to work with PEEDI. 


第1种方法是用来复位板的。第2、3种方法,如果人工不能掌握的话,通过production programming很快就可以知道怎么用PEEDI了。


5、Linux核的调试


你想调试Linux核,你需要一个带调试程序和最佳的开关的ELF核。这个板设置成装入和启动这个核,不仅仅是NAND,任何一个都可以。调试的话,最好通过以太网来装载,这个方法你不需要一个一个编写,你一旦把核建立好,找出vmlinux文件(它可能在Linux核的工程目录下)和用nm工具找出start_kernel函数所在目录,像这样:



peedi> flash set 0
peedi> flash erase
peedi> flash program
peedi> flash set 1
peedi> flash program
peedi> flash set 2
peedi> flash program
peedi> flash set 4
peedi> flash erase
peedi> flash program 


用不带INIT部分的CFG,当PEEDI连接到CPU时,它不做任何的初始化,确定断点模式设置为SOFT(我们将在RAM里面调试)。当PEEDI连接后,在 start_kernel地址下用"break add hard ADDRESS"加一个硬件断点。



[prog_all]
flash set 0
flash erase
flash program
flash set 1
flash program
flash set 2
flash program
flash set 4
flash erase
flash program 


在insight console里连接PEEDI :



下一步用“si”指令更新界面,现在开始你可以加breakpoints, step, go, stop等到目标上,要执行的话用c按钮,在insight console用(c)ontinue指令或者在eclipse下按复位按钮。你之前做过这些后,你可以在INIT里面自动完成你的工作:




[ACTIONS] ; user defined scripts
;AUTORUN = 1 ; executed on every target connect
1 = prog_all 


你也可以忽略对象,把si指令放在gdbinit文件夹里,这样的话它在gdb/insight start下也能自动执行。当然你也可以用eclipse调试。


6、结论


第一眼看起来很复杂,但是第一个流程下了它就变得很简单。另外,所有复杂的设置搞定之后,其他的都会变得像推动一个按钮那么简单。


更多资料,请联系我们:


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


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

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条