基于OMAP-L138电路板的U-boot移植


最近参加了一个项目,主板采用的是TI的OMAP-L138,为了引导linux内核,准备采用u-boot作为bootloader。在搜集资料的过程中发现关于移植u-boot到基于OMAP-L138电路板的资料非常少,而且TI的OMAP-L138采用三级boot,比其他单arm9核的 SOC要复杂的多,因此纠结了很长时间。好不容易参照hawkboard的配置把u-boot-2011.03移植到我们的板子(gcboard)上,在此记录下我的一点经验,希望能对后来者有所帮助。

step 1.移植准备
u-boot-2011.03 已经包含了对hawkboard开发板的完整支持,这是一款基于OMAP-L138的开发板,它的外设主要有:
1)128MB DDR2 SDRAM
2)128MB NAND Flash
3)一个标准RS232串口
4)一个10M/100M高速网卡
而我们的项目所用的开发板与hawkboard主要的区别在于没有nand flash,多了一块SPI flash(采用STMicro公司的M25P128,)
移植u-boot主要是为了在开发初期调试内核,文件系统,后期一般他只需要做适当的初始化,再引导内核就可以了,所以移植需要关注的基本就是这些。
为了熟悉程序结构,首先使用hawkboard的默认配置对uboot进行编译:
make hawkboard_config
make
编译完成后可以看到在主目录下生成了uboot.bin文件,为了方便分析,使用如下命令将其反汇编:
arm-linux-objdump -D -m arm u-boot > u-boot.asm
利用u-boot.asm 和 system.map,u-boot.lds这三个文件,再配合源代码,我们可以很容易的分析程序流程:
首先看u-boot.lds文件,它指定了程序链接顺序,在最初几行我们可以看到:init_sequence

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
arch/arm/cpu/arm926ejs/start.o (.text)
*(.text)
}
...
}

可知程序是从arch/arm/cpu/arm926ejs/start.s开始的(这是老生常谈了,百度一下,几乎任何一篇介绍uboot的文章都会介绍这一点),打开这个文件我们可以看到程序的54行:

.globl _start
_start:
b reset

首先跳到reset 标号处执行,在第108行:

reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0

/*
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif

这里是否会执行 bl cpu_init_crit这一句指令呢?需要到配置文件中去找答案,打开include/configs/hawkboard.h文件我们可以看到,由于定义了宏CONFIG_SKIP_LOWLEVEL_INIT,这一句被跳过,这是由OMAP-L138 的启动方式决定的。接下来看第179行:

call_board_init_f:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,=0x00000000
bl board_init_f

  • 1
  • 2
  • 下一页

相关内容