Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16779
  • 博文数量: 4
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-10 13:57
文章分类
文章存档

2011年(1)

2009年(3)

我的朋友
最近访客

分类: 嵌入式

2009-08-01 00:17:13

    对于刚开始接触u-boot移植的人来说,拿来u-boot的源代码不知如何下手,下面结合我的移植经验,针对u-boot移植的一般步骤做一个详细的说明。

 

一、Bootloader的基本概念

在开始移植之前,先说一下Bootloader的功能以及作用,以便对整个u-boot移植过程思路更清晰。Bootloader类似与计算机的BIOS,是芯片复位后进入操作系统前执行的代码,主要完成有硬件启动到操作系统启动的过度(即BootLoader功能的组合);完成系统的初始化,加载引导自身和嵌入式操作系统;为操作系统提供基本的运行环境,如初始化话处理器、对战、存储器等。由于Bootloader的实现依赖于处理器的体系结构,因此大多数Bootloader都分为两部分:依赖于处理器体系结构的代码,通常放在第1步,用汇编语言来实现。第2步通常用C语言来实现较为复杂的功能,而且由于C语言的硬件体系结构无关性,使得代码具有很好的可读性和移植性。

 

1步执行的先后顺序:硬件设备初始化,包括中断、看门狗、CPU时钟频率等初始化;为加载Bootloader的第2步准备内存空间,即存储器的初始化;为了加快代码的执行效率,拷贝Bootloader的第2步到SDRAM上执行;堆栈的初始化;跳到第2步的C语言入口点。

 

2步执行的先后顺序:初始化本阶段要使用的硬件设备,包括串口、FlashI/O端口、网络等初始化;检测系统内存映射(Memory Map);将Kernel映像从Flash读到SDRAM中;向内核传递参数以及启动内核。

 

二、u-boot移植步骤详解

 好了,对Bootloader有了了解之后,我们就开始u-boot的移植。

1、在移植之前,先建立好与自己开发板相关的配置文件,这些文件都放在board目录下,该目录下的每个目录都对应一个开发板,例如我们的开发板为utu2440,但board下并没有2440的配置文件,则我们需要新建一个目录,命名为utu2440,因为24402410的区别不大,我们可以以board目录下的smdk2410作为模版建立我们开发板的配置文件,靠配board/smdk2410下的所有文件到我们刚才新建的utu2440目录下,把刚才拷贝的smdk2410.c修改为utu2440.c,并修改board/utu2440/Makefile,把smdk2410.o改名为utu2440.o

 

2、建立头文件,它定义了全局的宏定义等,刚才我们使用了smdk2410作为模版,现在我们也是用smdk2410作为模版建立头文件,拷贝include/configs/smk2410.hinclude/configs/utu2440.h,并针对不同的需要添加或减少宏的定义。

 

3、修改u-boot根目录的Makefile,为utu2440建立编译选项,也是仿照smdk2410

 

4、测试编译,make distcleanmake utu2440make,如果编译成功,则进行下面的代码修改步骤。

 

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[]数组保存着基本的初始化函数指针。这些函数名称和实现的程序文件在下列注释中。

 

init_fnc_t *init_sequence[] = {

       cpu_init, /* 基本的处理器相关配置 -- cpu/arm920t/cpu.c */

       board_init, /* 基本的板级相关配置 -- board/utu2440/utu2440.c */

       interrupt_init, /* 初始化例外处理 -- cpu/arm920t/s3c24x0/interrupt.c */

       env_init, /* 初始化环境变量 -- common/cmd_flash.c */

       init_baudrate, /* 初始化波特率设置 -- lib_arm/board.c */

       serial_init, /* 串口通讯设置 -- cpu/arm920t/s3c24x0/serial.c */

       console_init_f, /* 控制台初始化阶段1 -- common/console.c */

       display_banner, /* 打印u-boot信息 -- lib_arm/board.c */

       dram_init, /* 配置可用的RAM -- board/utu2440/utu2440.c */

       display_dram_config, /* 显示RAM的配置大小 -- lib_arm/board.c */

       NULL,

};

 

在这些函数中,我们通过针对性的对这些函数进行修改就可以。

 

由于刚才我们是用smdk2410来做模版的,我们还需在各文件中添加"CONFIG_S3C2440",使得原来s3c2410的代码可以编译进来。我们可以通过搜索"CONFIG_S3C2410",在搜索到的文件中添加“CONFIG_S3C2440”定义即可。好了,编译后u-boot就可以引导内核了。至于u-boot的扩展功能,如Nand Flash读写,网卡的支持,大家可以按不同需要添加。

阅读(1681) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:JFFS2文件系统在2.6内核上的移植

给主人留下些什么吧!~~