已经通过load ram方式跑起来的u-boot,现在需要烧写到NAND中去,在这里有一些关键的技术点需要牢记,其中最重要的是所有必要的代码都需要安排在整个代码段的前4KB,因为板子加电后,硬件会将NAND中前4KB的数据LOAD到s3c2410内部的一个SRAM区域。

在之前向NAND烧写U-BOOT的失败经历中总结到,虽然在Makefile中添加了lowlevel_init.o、nand_read.o,但实际上其代码在链接后没有被安排在u-boot.bin的前4KB,因此板子加电后,在SRAM中运行时,遇到bl lowlevel_init或bl nand_read_ll时,就不知道跑到什么地方去了,CPU在定位其代码的时候在SRAM中没有找到。

因此需要修改board/samsung/matrix4/u-boot.lds文件,这是链接器在安排代码、数据时所使用的文件,需要在text部分加入lowlevel_init.o及nand_read.o,如下:
     .text      :
     {
       cpu/arm920t/start.o    (.text)
       board/samsung/matrix4/lowlevel_init.o (.text)
       board/samsung/matrix4/nand_read.o (.text)
       *(.text)
     }
这样,在编译过后,lowlevel_init.o、nand_read.o的代码段就被安排在了u-boot.bin前4KB的代码段中,以保证相关函数或过程的正常调用。


2009-7-9 晚 10:30,u-boot.2009.06已经在nand boot方式下成功运行并加载了nand flash驱动,start.S已经可以成功向串口输出调试信息,调试子过程PrintWord及PrintChar运行良好。

需要注意的是,不可以向串口直接输送字符串"\r\n",否则会让板子跑飞,原因不详,如果调试语句需要输出换行,只能将一个8位的换行符ASCII码输送到串口,即mov r0, #'\r';bl PrintWord,在VIVI中也是这样实现调试语句的换行输出的,VIVI也没有使用已经定义好的STR_CR,即.ascii "\r\n",估计当初也是跑飞了才改用mov r0, #'\r'。

另外,当初copy_my_self在ok_nand_read后跑飞的原因不是内存校验没通过,这一点上确实冤枉了内存校验,增加了调试语句后,发现内存校验成功通过,并跳转到done_nand_read输出"NAND OK!!",之前调试曾经出过跑飞的记录,即输出"NAND OK!!"之后板子跑飞了,当时感觉很奇怪,内存校验通过了应该直接返回了,为何跑飞呢,最终发现是由于向串口输送了"\r\n",注掉后就OK了。

紧接着NAND_FLASH的驱动也成功加载了,2410评估板的nand flash驱动是现成的,在drivers/mtd/nand/下,即s3c2410_nand.c,要添加此模块,需要在matrix4.h中定义CONFIG_NAND_S3C2410宏,之后编译过程中会自动将s3c2410_nand.o一起链接。加载了2410的nand驱动后,就可以在命令行下查看nand信息了,即命令 - nand info。

待续...(添加网卡驱动,并引导linux kernel)