任务:让 u-boot 支持从 nand- flash 启动(也就是同时支持 Nor Flash 和 NAND Flash
启动)
1.修改cpu/arm920t/start.S代碼搬移程序,這裡按照TQ2440提供的U-BOOT1.1.6
源碼修改
將堆棧初始華提到前面,因為這裡搬運代碼用的C代碼,需要用到堆棧,然後添加修改如下
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq clear_bss
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
#if 1
bl CopyCode2Ram
#else
add r2, r0, r2 /* r2 <- source end address */
#endif
/*copy_loop:
ldmia r0!, {r3-r10} copy from source address [r0]
stmia r1!, {r3-r10} copy to target address [r1]
cmp r0, r2 until source end addreee [r2]
ble copy_loop
*/
/*#endif CONFIG_SKIP_RELOCATE_UBOOT */
2.現在增加CopyCode2Ram();函數及其支持函數,這裡直接用TQ提供的boot_init.c
這是這個函數拷貝的原理
* 无论是从NOR Flash还是从NAND Flash启动,
* 地址0处为指令"b Reset", 机器码为0xEA00000B,
* 对于从NAND Flash启动的情况,其开始4KB的代码会复制到CPU内部4K内存中,
* 对于从NOR Flash启动的情况,NOR Flash的开始地址即为0。
* 对于NOR Flash,必须通过一定的命令序列才能写数据,
* 所以可以根据这点差别来分辨是从NAND Flash还是NOR Flash启动:
* 向地址0写入一个数据,然后读出来,如果没有改变的话就是NOR Flash
將此文件拷貝到board/samsung/CM2440/目錄下,並在此目錄下的Makefile中添加
COBJS := CM2440.o flash.o boot_init.o
並在u-boot.lds文件中添加,使其在鏈接位置靠前
3.修改s3c2410.h s3c2440.h,由於他們的NAND控制器基地址相同
按照2410的NAND添加
static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
{
return (S3C2440_NAND * const)S3C2410_NAND_BASE;
}
現在make 一下,注意要bl cpu_init_crit 去掉前面的@,如果沒錯下載到
NAND中,從NAND啟動后在串口能看到信息