开发板:FL2440
uboot版本:u-boot-2010.09
uboot所有版本下载地址为:ftp://ftp.denx.de/pub/u-boot/
U-boot,全称为Universal Boot Loader ,即通用Bootloader,是遵循GPL条款的开源代码项目。为是德国DENX小组的创建的工程。
一、uboot目录结构
将uboot2010.09解压后,获得以下目录,其目录作用在READEME中有介绍:
.
|--api -->存放uboot提供给外部app的应用程序接口
|--arch -->与体系结构相关的代码,uboot的重头戏
|-- board -->平台依赖,存放电路板相关源文件的目录
|--common --> 通用的多功能函数实现
|--disk --> 硬盘接口驱动程序
|-- doc --> 开发使用文档
|--drivers -->通用设备的驱动程序
|-- examples -->应用例程,一些独立运行的应用程序的例子
|-- fs -->文件系统,支持嵌入式开发板常见的文件系统
|--include -->头文件和开发板配置文件
|--lib -->通用库文件
|--nand_spl -->NAND存储器相关代码
|--net -->存放网络相关的程序
|--onenand_ipl -->一个小boot,放在u-boot.bin之前,用于以onenandflash为mem的系统中
|--post -->存放上电自检的程序
`--tools -->工具,制作 S-Record 或者 U-boot 格式的映像等工具
二、uboot启动过程
2.1 启动的两种模式
启动加载(Boot loading)模式:也称为"自主"(Autonomous)模式。即Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 BootLoader 的正常工作模式,用于嵌入式产品发布的时侯。
下载(Downloading)模式:目标机上的Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 BootLoader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。通常在第一次安装内核与根文件系统时被使用。
2.2 Bootloader的两个阶段
Bootloader的启动过程可以分为单阶段(single stage)、多阶段(multi-stage)两种。对于使用S3c2440的开发板来说,u-boot为多阶段的Bootloader。第一阶段使用汇编来实现,第二阶段通常使用C语言实现。
这两个阶段完成的功能如下:
第一阶段:
-
硬件设备初始化
-
准备RAM空间
-
加载u-boot第二阶段代码到RAM空间
-
设置好栈
-
清除未初始化数据段BSS
硬件初始化包括:关闭看门狗、关中断、设置CPU速度和时钟频率、RAM初始化等。对于S3C2440所用的Uboot来说,其中硬件初始化中的设置CPU速度和时钟频率将放在第二阶段代码中实现。另外对于NOR Flash等存储设备来说,也可以直接在上面运行代码而不用将第二段代码拷贝到RAM空间中,只不过执行效率会大大降低。
第二阶段:
- 初始化本阶段所用到的硬件设备
- 检测系统内存映射
- 将内核映象和根文件系统映象从Flash读到ARM空间中
- 为内核设置启动参数
- 调用内核
三、Uboot编译测试
对于这样一个大的工程,看Makefile应该是不错的选择。另外顶层目录下的README也提供了不少帮助,说明了如何使用uboot。
先编译体验一下:
在/board目录下创建一个自己的开发板目录:mkdir fl2440
以smdk2410为模板将之复制到自己的开发板目录下:cpsamsung/smdk2410/* fl2440/
将smdk2410.c 重命名为 fl2440.c :mvsmdk2410.c fl2440.c
进入fl2440目录下的makefile,将COBJS :=smdk2410.o flash.o改为COBJS := fl2440.o flash.o
回到uboot目录下,复制并重命名include/configs/smdk2410.h为fl2440.h
进入uboot目录下的boards.cfg,在 smdk2410 一行下面仿照其格式添加fl2440 这一行
最后进入uboot目录下的Makefile,添加上我们的交叉编译器,大致位置如下:
......
exportARCH CPU BOARD VENDOR SOC
CROSS_COMPILE= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-
......
这样配置后就差不多了,根据READEME中的说明,要使用开发板/board/<board_name>,就先执行“make <board_name>_config”命令进行配置,然后才执行make。如下:
[@centos6 u-boot-2010.09]$ make fl2440_config
Configuringfor fl2440 board...
[@centos6 u-boot-2010.09]$ make
......
/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-objcopy--gap-fill=0xff -O binary u-boot u-boot.bin
至此整个uboot编译就完成了,编译成功后会生成三个文件,分别为:
-
U-Boot.bin:二进制可执行文件,可以直接烧入ROM、 FLASH的文件
-
U-Boot:ELF格式的可执行文件
-
U-Boot.srec:Motorola S-Record格式的可执行文件
对于S3C2410的开发板,U-Boot.bin可以直接使用。但对于S3C2440的开发板来说,并没有现象。因为U-Boot.bin的代码是基于smdk2410开发板的,并没有对这个代码进行修改,所以要想适用于fl2440,就必须对源代码进行修改。
另外,U-Boot编译成功后会在tools目录下生成一些工具,如mkimage等。将其复制到/usr/local/bin目录下,以后就可以直接使用它们了,比如之后编译内核时会使用mkimage来生成U-Boot格式的内核映象文件uImage。
虽然README中说了要用make <board_name>_config之后才能用make,不过为什么这么用还不清楚,硬件的初始化也是不明白,明天再好好看下这一部分。