移植uboot 2017-07到S5PV210上
1. 使用uboot源码里面本身有的代码的基础上进行修改
Arch/arm/cpu/arnv7这个目录
Board/samsung/goin 这个目录
2. 代码看了一下,第一阶段不用怎么改,但是我们需要调试知道我们运行到了哪一步,于是我们在Lowlevel_init.S下改了如下地方
在uboot的第一阶段上面加上
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
效验头
3.我们在串口的初始化函数上面加了一句打印,这里就是在串口那里打印出一个G
但是这里应该是输出不出来G的,用LED电灯的方法去调试哪里执行了,哪里没执行
LED点灯代码如下:
Ldr r0,=0x11111111
Ldr r1,=GPJ0CON
Str r0,[r1]
Ldr r0.=((1<<3) | (0<<4) | (1<<5))
Ldr r1,=GPJ0DAT
Str r0,[r1]
Ldr r2,=9000000
Ldr r3,=0x0
Delay2:
Sub r2,r2,#1
Cmp r2,r3
Bne delay2
通过分析发现是b lowlevel_init这句话有问题,但是这句代码只是一个简单的跳转,为什么会出问题呢,问题应该是什么问题呢,这个问题就出在范围超限了,因为我们在烧录Uboot的时候,我们是把Uboot分为两部分,前8KB放在SD卡的前部,依次加载进去作为BL1,然后后面那些东西放在后部的,那么程序在链接的时候你必须保证我们uboot的第一阶段的完整性。我们就需要用链接脚本把我们的代码放到前面,我们就修改链接脚本,在我们arch/arm/cpu/这下面的uboot.lds加上。如下
然后make disclean之后重新编译
但是会报错
这个错误可以看出来是board/samsung/lowlecel_init重复定义了。
怎么解决这个问题,为什么会重复定义,因为我们lowlevel_init.o,这个函数被我们链接的时候,链接了两次,一次是我们board/samsung/goin这个目录下本身的链接,不信你进入这个目录下,会有个obj-y :=lowlevel_init.o
还一次就是我们的链接脚本,最终在链接生成U-boot的时候又链接了一次,所以这里链接了两次导致了重定义。所以重复定义了。
这个错误怎么解决:我们冷静下来想一想,我们想一下,这个start.s肯定也链接了两次,为什么他没报这个重复定义的错误,于是我们打开这个目录下的makefile
发现它用的是extra-y
这个应该是外部引用吧,我猜,所以我们也把我们的lowlevel_init这个也改为这个这个
然后make distclean,然后make,发现编译成功了