现在我们的u-boot只能编译通过,但下载到2440中去的时候是没有任何输出的
现在打开u-boot穿件source insight工程
打开arch\arm\lib\vectors.S文件,_start就在这个文件里,u-boot.bin就是从这里开始的,它的第一句话是“b reset“然而reset并不在这个文件里,我们就追踪一下,发现是在u-boot-2016.01\arch\arm\cpu\arm920t\start.S中,一路看下来我发现并没有对MPLL进行初始化也就是设置时钟,而是在board_init_f中board_early_init_f初始化的但是之前是按照100MHz设置的但是现在的2440只工作在12MHz,这样无法正常工作所以把board_early_init_f中
/* to reduce PLL lock time, adjust theLOCKTIME register */
writel(0xFFFFFF,&clk_power->locktime);
/*configure MPLL */
writel((M_MDIV<< 12) + (M_PDIV << 4) + M_SDIV,
&clk_power->mpllcon);
注释掉,并在start.S中关闭看门狗之后加入
#define S3C2440_MPLL_400MHz ((0X5c<<12)|(0x01<<4)|(0x01))
/*
* mask all IRQs by setting all bits in theINTMR - default
*/
/* 设置时钟 */
ldr r0, =0x4c000014
mov r1, #0x05
str r1, [r0]
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 */
ldrr0, =0x4c000004
ldrr1, =S3C2440_MPLL_400MHz
strr1, [r0]
/* 启动Icache */
mrc p15, 0, r0, c1, c0, 0 @ read control reg
orrr0, r0, #(1<<12)
mcr p15, 0, r0, c1, c0, 0 @ write it back
这时再编译会发现串口打印出来一堆乱码,这表示2440工作了,这时候出现乱码应该是串口方面的问题那么我们就继续追踪代码在board_init_f函数中调用了init_sequence_f数组里面有一个串口初始化serial_init,点进去,里面有个get_current函数,再进里面default_serial_console函数,再进,在这个函数所在的c文件(serial_s3c24x0.c)中有个_serial_setbrg函数中里面有个get_PCLK函数进去该函数中有这么一句”#ifdef CONFIG_S3C2440”但是这个宏没有被定义,这个代表定义它就支持了2440,我们就在include\configs\smdk2440.h中定义一下就可以了
然后再重新编译,编译出来的u-boot.bin下载到2440中我们就可以看到串口打印出信息了