目录
一、准备工作
二、调试代码
三、修改代码
由于u-boot2012并没有显性的支持2440。需要手动增加2440目录。还需要增加配置文件2440.h
1、在start.S中,只是设置了时钟比例,有SDRAM的初始化
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
这里存在严重的不足。没有初始化时钟,却用到的60MHZ的时钟
#define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
2、第一个问题解决了,下面运行之后发现有乱码。那应该是串口设置有问题
一路追踪:board_init_f -> init_sequence -> serial_init -> serial_init_dev -> _serial_setbrg -> get_PCLK -> get_HCLK
发现没有打开CONFIG_S3C2440选项
3、第二个问题也解决了,但是程序跑不下去了,flash fail
1、将时钟的初始化工作提前做了
在原本设置时钟分频系数的位置,换成我们自己的代码,并且启动ICache,跑的更快
/* 设置时钟分频系数 */
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
//ldr r0, =CLKDIVN
//mov r1, #3
//str r1, [r0]
/* 2. 设置时钟 */
/* 设置MPLL,FCLK:HCLK:PCLK = 400m : 100m : 50m*/
/* LOCKTIME(0x4C000000) = 0xFFFFFFFF */
ldr r0,=0x4C000000
ldr r1,=0xFFFFFFFF
str r1,[r0]
/* CLKDIVN(0x4C000014) = 0x5 tFCLK:tHCLK:tPCLK = 1:4:8 */
ldr r0, =0x4c000014
ldr r1, =0x5 // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
str r1, [r0]
/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
/* MPLLCON = S3C2440_MPLL_400MHZ */
ldr r0, =0x4c000004
ldr r1,=(92<<12) | (1<<4) | (1<<0)
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
用jtag调试工具,看一下内存是否初始化完成,往0x30000000写入0x12345678,再读出来,一样证明初始化成功
2、解决串口
一般乱码是因为波特率的问题,波特率又跟时钟有关系
在smdk2440.h中修改
#define CONFIG_ARM920T /* This is an ARM920T Core */
#define CONFIG_S3C24X0 /* in a SAMSUNG S3C24x0-type SoC */
//#define CONFIG_S3C2410 /* specifically a SAMSUNG S3C2410 SoC */
#define CONFIG_S3C2440 /* specifically a SAMSUNG S3C2440 SoC */
#define CONFIG_SMDK2410 /* on a SAMSUNG SMDK2410 Board */
3、详解请看下一节
好了, 这一节解决了SDRAM,时钟,串口的问题,使得u-boot能启动了,但是还有点小问题。这个需要根据错误信息搜索,然后再解决。所有改动最终会以补丁形式上传给大家。