分类: LINUX
2010-04-06 17:08:00
一、Bootloader的基本概念
在开始移植之前,先说一下Bootloader的功能以及作用,以便对整个u-boot移植过程思路更清晰。Bootloader类似与计算机的BIOS,是芯片复位后进入操作系统前执行的代码,主要完成有硬件启动到操作系统启动的过度(即Boot和Loader功能的组合);完成系统的初始化,加载引导自身和嵌入式操作系统;为操作系统提供基本的运行环境,如初始化话处理器、对战、存储器等。由于Bootloader的实现依赖于处理器的体系结构,因此大多数Bootloader都分为两部分:依赖于处理器体系结构的代码,通常放在第1步,用汇编语言来实现。第2步通常用C语言来实现较为复杂的功能,而且由于C语言的硬件体系结构无关性,使得代码具有很好的可读性和移植性。
第1步执行的先后顺序:硬件设备初始化,包括中断、看门狗、CPU时钟频率等初始化;为加载Bootloader的第2步准备内存空间,即存储器的初始化;为了加快代码的执行效率,拷贝Bootloader的第2步到SDRAM上执行;堆栈的初始化;跳到第2步的C语言入口点。
第2步执行的先后顺序:初始化本阶段要使用的硬件设备,包括串口、Flash、I/O端口、网络等初始化;检测系统内存映射(Memory Map);将Kernel映像从Flash读到SDRAM中;向内核传递参数以及启动内核。
二、u-boot移植步骤详解
好了,对Bootloader有了了解之后,我们就开始u-boot的移植。
1、在移植之前,先建立好与自己开发板相关的配置文件,这些文件都放在board目录下,该目录下的每个目录都对应一个开发板,例如我们的开发板为utu2440,但board下并没有2440的配置文件,则我们需要新建一个目录,命名为utu2440,因为2440与2410的区别不大,我们可以以board目录下的smdk2410作为模版建立我们开发板的配置文件,靠配board/smdk2410下的所有文件到我们刚才新建的utu2440目录下,把刚才拷贝的smdk2410.c修改为utu2440.c,并修改board/utu2440/Makefile,把smdk2410.o改名为utu2440.o。
2、建立头文件,它定义了全局的宏定义等,刚才我们使用了smdk2410作为模版,现在我们也是用smdk2410作为模版建立头文件,拷贝include/configs/smk2410.h到include/configs/utu2440.h,并针对不同的需要添加或减少宏的定义。
3、修改u-boot根目录的Makefile,为utu2440建立编译选项,也是仿照smdk2410。
4、测试编译,make distclean、make utu2440、make,如果编译成功,则进行下面的代码修改步骤。
5、移植前的工作已经准备好了,下面我们可以开始代码的修改。u-boot运行后,就跳到start_code:里开始执行指令,而这些指令都在cpu/cpu platform /start.S文件中,很明显,这是一个汇编语言的源代码,前面说过,Bootloader的第1阶段都是用汇编语言写的,而它的作用就是硬件的初始化和拷贝自身。正好start.S就完成了这些功能,所以我们第一个修改的文件就是start.S,这个文件修改的部分不多,要修改的就是中断的初始化和cpu的时钟频率;接着u-boot通过bl cpu_init_crit跳到cpu的初始化代码里,然后在cpu_init_crit:里通过bl lowlevel_init跳到存储器的初始化代码处,该代码位于board/cpu platform/lowlevel_init.S里,在lowlevel_init.S文件里,我们要根据开发板的内存区的配置情况来修改。好了,在正确配置完cpu和内存区后,u-boot就要把自身拷贝到SDRAM里执行,如果是NOR Flash,则直接使用relocate:标号里的代码即可完成代码的重定向。如果是Nand Flash,则需要就该start.S加入Nandboot功能完成代码的重定向。到此,Bootloader的第1阶段就完成了,接着u-boot就通过ldr pc, _start_armboot跳到Bootloader的第2阶段的C代码处执行。该函数在/lib_arm/board.c中定义,该文件就实现了Bootloader的第2阶段的功能,在board.c中开始初始化本阶段需要的硬件,通过顺序执行init_sequence数组中的初始化函数来完成。
init_sequence[]数组保存着基本的初始化函数指针。这些函数名称和实现的程序文件在下列注释中。
|
在这些函数中,我们通过针对性的对这些函数进行修改就可以。
由于刚才我们是用smdk2410来做模版的,我们还需在各文件中添加"CONFIG_S