你好!这里是风筝的博客,
欢迎和我一起交流。
通过代码分析,我们知道,uboot里先以60MHZ的时钟计算参数来设置内存控制器,但是此时MPLL还未设置,所以我们先修改一下:
a. 进入C函数board_early_init_f(路径:board\samsung\smdk2440.c),把
writel(0xFFFFFF, &clk_power->locktime);
writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,&clk_power->mpllcon);
这两句是关于时钟的,先注释掉
b.将
# if defined(CONFIG_S3C2410)
修改成
# if defined(CONFIG_S3C2440)
因为我们配置的是2440文件
//根据评论里反馈,我添加以下说明,这操作是在start.S 中进行,# if defined(CONFIG_S3C2440)是用来进行条件编译的,因为我们配置的是2440,所以你也可以这么来看,不管是在哪个文件,只要看到2410字样,都可以修改为2440,不管哪里,因为2440和2410架构是一样的,2410可以使用的代码,那2440也是可以的。
c.将start.S里设置时钟比例部分去掉:
/*FCLK:HCLK:PCLK = 1:2:4 */
/*default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
d.在下面添加配置时钟:
/*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/* 写入控制寄存器 */
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))
/* MPLLCON = S3C2440_MPLL_200MHZ */
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
这样就可以了.