Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1012028
  • 博文数量: 238
  • 博客积分: 2842
  • 博客等级: 少校
  • 技术积分: 2765
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-16 00:20
个人简介

stdlf

文章分类

全部博文(238)

文章存档

2013年(6)

2012年(13)

2011年(82)

2010年(89)

2009年(48)

我的朋友

分类:

2009-09-04 22:33:32

3.2 第二阶段(建立开发板与主机之间的通信)

进入到C语言的入口函数start_armboot(),也是整个U-boot的主函数,在lib_arm/board.c中定义。

初始化硬件设备

/*初始化函数序列init_sequence[]

init_sequence[]数组保存着基本的初始化函数指针。这些函数名称和实现的程序文件在下列注释中。*/

init_fnc_t *init_sequence[] = {

cpu_init,   /* basic cpu dependent setup 基本的处理器相关配置 -- cpu/s3c44b0/cpu.c */

board_init,   /* basic board dependent setup 基本的板级相关配置             board/hfrk/hfrks3c44b0/hfrks3c44b0.c*/

interrupt_init,   /* set up exceptions 初始化例外处理 -- cpu/s3c44b0/interrupt.c*/

env_init,   /* initialize environment 初始化环境变量 -- common/env_flash.c*/

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

serial_init,   /* serial communications setup 串口通讯设置 -- cpu/s3c44b0/serial.c*/

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

display_banner,   /* say that we are here 打印u-boot信息 -- lib_arm/board.c*/

dram_init,   /* configure available RAM banks 配置可用的RAM -- board/hfrk/hfrks3c44b0/hfrks3c44b0.c*/

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

/* configure available FLASH banks   配置可用的Flash */

size = flash_init ();             //drivers/cfi_flash.c或自定义

display_flash_config (size);

mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); // 初始化堆空间

env_relocate ();//重新初始化环境,重新定位环境变量参数区,它在/common/env_common.c文件中定义

getenv_IPaddr ("ipaddr"); //IP Address 从环境变量中获取IP地址

devices_init (); /* get the devices list going. 设备初始化*/

jumptable_init (); //跳转表初始化

console_init_r (); /* fully init console as a device 完整地初始化控制台设备*/

进入命令循环(进入一个主循环,处理用户输入的命令)

本系统执行一个设置的缺省命令(bootm,启动uclinux操作系统内核)若按任意键则进入命令循环,显示命令模式的交互界面,接受用户从串口输入的命令。

for (;;) {

main_loop ();      //主循环函数处理执行用户命令 -- common/main.c

}

3.3 引导uclinux操作系统

U-boot里的bootm命令是由do_bootm()函数执行的。该函数在U-boot/common/cmd_bootm.c文件中,其作用是从内核中引导应用程序或内核映像。这里简单介绍该函数执行步骤:

读取kernel imageheader

判断魔数,进行CRC效验

执行kernel的准备工作(设置好linux内核的启动参数,它为内核提供内存的起始地址,大小引导命令行,硬件的版本信息等)

搬运kernelh_load指定的地址上去

判断何种操作系统,调用do_bootm_linux()函数,启动uclinux内核

引导的这个linux内核映像是经过U-boot的工具mkimage打包之后的镜像,mkimage工具在tools/目录下,它可以用来制作不压缩或压缩的多种可启动的映像文件。

4 结束语

U-boot是一个功能强大的Bootloader开发软件,适合多种嵌入式CPU以及支持多种嵌入式操作系统。目前对修改后的u-boot代码经编译后生成的U-boot.bin文件,烧写到开发板的FLASH中可稳定运行,并且可以引导uclinux操作系统,使系统的功能更强大,操作更简便。

    

参考文献:

[1].              陈渝,李明等.源码开放的嵌入式系统软件分析与实践.北京航空航天大学出版社,2004.

[2].              詹容开,嵌入式系统Bootloader技术内幕,2003,12

[3].              刘洋 李兰英 u-boot的启动流程分析,2006.

[4].              S3C44B0X Users Mannual [Z], Sumsung

   

阅读(637) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~