1.5.3. ldr pc

#if 01
	/* try doing this stuff after the relocation */
	ldr     r0, =pWTCON
	mov     r1, #0x0
	str     r1, [r0]

	/*
	 * mask all IRQs by setting all bits in the INTMR - default
	 */
	mov	r1, #0xffffffff
	ldr	r0, =INTMR
	str	r1, [r0]

	/* FCLK:HCLK:PCLK = 1:2:4 */
	/* default FCLK is 120 MHz ! */
	ldr	r0, =CLKDIVN
	mov	r1, #3
	str	r1, [r0]
	/* END stuff after relocation */
#endif

	ldr	pc, _start_armboot
2
_start_armboot:	.word start_armboot
        

1

此处忽略已经注释掉的代码

2

最后的那两行,意思也很简单,那就是将地址为_start_armboot中的内容,即

start_armboot,赋值给PC,即调用start_armboot函数。

至此,汇编语言的start.S的整个工作,就完成了。

而start_armboot函数,在C文件中:

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\EmbedSky.c

中:

void start_armboot (void)
{
    ......
}
                

这就是传说中的,调用第二层次,即C语言级别的初始化了,去初始化各个设备了。

其中包括了CPU,内存等,以及串口,正常初始化后,就可以从串口看到uboot的打印信息了。