最新Uboot移植步骤 3:UART&SDRAM
- 格式:pdf
- 大小:722.76 KB
- 文档页数:9
最新Uboot移植步骤3:UART&SDRAM
1、阅读代码发现不足:UBOOT里先以60MHz的时钟计算参数来设置内存控制器,但是MPLL还未设置
在cpu_init_crit里设置内存控制器,紧接着就使用栈,即使用了内存,但设置时钟的MPLL是在board_init_f 函数里,所以这里的内存设置是不成功的,要把时钟设置放到其前面才可以。
修改代码,使MPLL设置放在内存控制器设置之前:
先屏蔽系统自己的MPLL设置代码:
替换下面代码为自己的代码:
/* 2. 设置时钟*/
ldr r0, =0x4c000014
// mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
mov r1, #0x05; // FCLK:HCLK:PCLK=1:4:8
str r1, [r0]
/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */ mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器*/
orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */
mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器*/
/* MPLLCON = S3C2440_MPLL_200MHZ */
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))
ldr r0, =0x4c000004
ldr r1, =S3C2440_MPLL_400MHZ
str r1, [r0]
/* 启动ICACHE */
mrc p15, 0, r0, c1, c0, 0 @ read control reg
orr r0, r0, #(1<<12)
mcr p15, 0, r0, c1, c0, 0 @ write it back
内存控制器设置也使用我们自己的代码:
重新配置,make下载bin文件到板子看效果:
重新从norflash启动。
看到输出很多乱码:
说明串口设置有问题,寻找原因,发现CONFIG_S3C2440宏未定义:
在smdk2440.h添加宏即可:
定义后,宏变成红色了:
再配置,编译:
出现错误:
查看错误地方:
再进入:
发现被我们注释掉的宏,导致出错。
我们可以先不使用nand,把makefile文件里编译nand的地方注释掉:
发现只要不定义CONFIG_NAND_S3C2410宏即可。
搜索得到宏在这里:
我们可以直接不用CONFIG_NAND_S3C2410宏即可:
再重新配置编译:
再一次出现这种错误:
我真的很无语,如果版本过低,为何改代码之前可以编译成功???仔细观察,发现nand.c调用了
s3c2410_nand.c文件里的一个board_nand_init函数,而s3c2410_nand.c的链接宏被我注释掉了,所以导致该函数无引用处。
现在我们把nand.c也给屏蔽掉:
发现我们直接把CONFIG_CMD_NAND宏注释掉即可:
再配置编译:
又出现错误:
发现CONFIG_SYS_MAX_NAND_DEVICE宏未定义,我们搜索一下这个宏:
发现前面我们已经把宏CONFIG_CMD_NAND注释掉导致的。
既然要用到,我就把它拿出来,让系统先用着,后面有影响再改:
再配置,编译:
又出现错误:
调用nand的挺多,干脆把yaffs也注释掉好了:
注释掉CONFIG_YAFFS2宏试一下:
配置编译:
终于通过了,下载到板子:
至此,串口和内存设置完毕。