因为自己又不会汇编,又不会写Makefile,也不懂编译器的参数设置,也不会写.lds文件,所以还是决定直接在u-boot-samsung-dev源码上慢慢调试bl1,顺便将u-boot弄熟。
建议先将u-boot-samsung-dev备份好,再另外修改。
将cpu/s5pc11x/start.S删除,将cpu/s5pc11x/start.S.sdboot重命名为:cpu/s5pc11x/start.S。
将include/configs/smdkv210single.h删除,将include/configs/smdkv210single.h.nand_restore.sdboot重命名为:include/configs/smdkv210single.h。
每次都是编译smdkv210single_config这个配置。不过貌似另外几个配置在Makefile看到的都是一样的……
使用点灯大法,发现执行到“ldr pc, _start_armboot”之前的代码执行顺序都是对的,这一句应该就是调用lib_arm/board.c文件里面的“void start_armboot (void)”函数了,但在这个函数里面点灯,灯就是不亮,说明根本没有执行到这个函数里面。
后来才突然发现,这一句有别于之前看到的跳转,比如“bl movi_bl2_copy”这句,在movi.c文件里面的“void movi_bl2_copy(void)”函数中点灯正常。
“bl movi_bl2_copy”相对跳转,“ldr pc, _start_armboot”这个就直接对pc寄存器赋值了,所以这个应该是跳转到u-boot复制到内存后,在内存中的地址了。
查看u-boot.dis文件:
c3e001e8 <_start_armboot>:
c3e001e8: c3e02730 .word 0xc3e02730
c3e02730 <start_armboot>:
c3e02730: e59f3010 ldr r3, [pc, #16] ; c3e02748 <start_armboot+0x18>
c3e02734: e59f0010 ldr r0, [pc, #16] ; c3e0274c <start_armboot+0x1c>
c3e02738: e3a0200f mov r2, #15
c3e0273c: e5830c00 str r0, [r3, #3072] ; 0xc00
c3e02740: e5832c04 str r2, [r3, #3076] ; 0xc04
c3e02744: eafffffe b c3e02744 <start_armboot+0x14>
c3e02748: e0200000 .word 0xe0200000
c3e0274c: 00001111 .word 0x00001111
……
那么,应该是,“void movi_bl2_copy(void)”函数应该将u-boot.bin复制到0xc3e00000开始的位置,那么,使用“ldr
pc, _start_armboot”就刚好能够跳转到在内存中的“void start_armboot (void)”函数了,而现在还没有烧写u-boot.bin,所以不能点灯……
将u-boot.bin也烧写进sd卡,启动后,灯亮!说明前面已经将u-boot.bin文件拷贝到了正确的位置!
这里也能说明为什么之前使用SD-bl1-8k.bin,再使用自己编译的u-boot.bin就一点反应也没有了,它跳至“void start_armboot (void)”函数,可是这个函数的地址并不在它跳至的位置,因为两者代码不一样,刚好“void start_armboot (void)”函数函数的开始位置也不一样。
但现在只有一个串口能输出“OK”,没有看到有u-boot的启动信息。可能是"include/config/smdkv210single.h"定义的串口号不一样,改串口号试试了。(后发现是自己在“void start_armboot (void)”函数里面加了个while(1)造成串口没有信息的,罪过……后来将while(1)去掉后,串口就能正常输出信息了)
查看cpu/s5pc11x/serial.c文件:
int serial_init(void)
{
serial_setbrg();
return (0);
}
void serial_setbrg(void)
{
DECLARE_GLOBAL_DATA_PTR;
int i;
for (i = 0; i < 100; i++);
}
include/asm-arm/global_data.h文件中:
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")
感觉像是什么都没做……也可能是因为BL0已经将串口初始化好了吧?
点灯发现,根本没有进入到cpu/s5pc11x/serial.c文件中的void serial_setbrg(void)函数……
后发现是自己在“void start_armboot (void)”函数里面加了个while(1)造成串口没有信息的,罪过……后来将while(1)去掉后,串口就能正常输出信息了。
那下一部就是移植u-boot-2012.07……对照u-boot-samsung-dev来一步一步移植最新版的u-boot!