uboot移植总结

1.uboot的介绍及体系结构

1.1 uboot的介绍

Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,
UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD,
VxWorks, QNX, RTEMS, ARTOS,
LynxOS嵌入式操作系统。UBoot除了支持PowerPC系列的处理器外,还能支持MIPS、
x86、ARM、NIOS、XScale等诸多常用系列的处理器。

1.2 uboot的体系结构

目录树

|--board

|--common

|--cpu

|--disk

|--doc

|--drivers

|--dtt

|--examples

|--fs

|--include

|--lib_arm

|--lib_generic

|--net

|--post

|--rtc

|--tools

2. board:和一些已有开发板有关的文件.
每一个开发板都以一个子目录出现在当前目录中,比如说:
leopard2a子目录中存放与我们开发板相关的配置文件.

3.
common:实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如bootm命令对应就是cmd_bootm.c。

4.
cpu:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm926ejs就是我们开发板上使用的cpu架构目录。

5. disk:对磁盘的支持。

5.
doc:文档目录。Uboot有非常完善的文档,推荐大家参考阅读。

6.
drivers:Uboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。

7. fs:
支持的文件系统,Uboot现在支持cramfs、fat、fdos、jffs2和registerfs。

8.
include:Uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录耤onfigs目录有与开发
板相关的配置头文件,如leopard2a.h。该目录下的asm目录有与CPU体系结构相关的头文件,asm对应的是asmarm.

9. lib_xxxx:
与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。

10.
net:与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。

11. tools:生成Uboot

的工具,如:mkimage, crc等等。

2. uboot的运行过程分析

2.1 启动模式介绍

大多数 Boot Loader
都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot
Loader
的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。

启动加载(Boot
loading)模式:这种模式也称为"自主"(Autonomous)模式。也即 Boot
Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM
中运行,整个过程并没有用户的介入。这种模式是 BootLoader
的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader
显然必须工作在这种模式下。

下载(Downloading)模式:在这种模式下,目标机上的
Boot Loader
将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被
BootLoader 保存到目标机的 RAM 中,然后再被 BootLoader
写到目标机上的FLASH 类固态存储设备中。BootLoader
的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用
BootLoader 的这种工作模式。工作于这种模式下的 Boot Loader
通常都会向它的终端用户提供一个简单的命令行接口。

UBoot这样功能强大的 Boot Loader
同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。

2.2 运行过程

大多数bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,uboot也不例外。依赖于CPU体系结构的代码(如CPU
初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

U - Boot 编译后的代码定义一般不超过100kB ,并且这100
kB 又分成两个阶段来执行. 第一阶段的代码在start . s
中定义,大小不超过10 kB ,它包括从系统上电后在0x00000000
地址开始执行的部分. 这部分代码运行在Flash
中,它包括对arm926ejs的一些寄存器的初始化和将U - Boot
的第二阶段代码从Flash 拷贝到SDRAM 中.
除去第一阶段的代码,剩下的部分都是第二阶段的代码.
第二阶段的起始地址是在第一阶段代码中指定的,被复制到SDRAM后,就从第一阶段跳到这个入口地址开始执行剩余部分代码.
第二阶段主要是进行一些BSS
段设置,堆栈的初始化等工作,最后会跳转到main -loop
函数中,接受命令并进行命令处理. 图1 给出了U - Boot
的详细的运行过程包括对内核的设置、装载及调用过程.

系统复位进入u-boot stage
l的入口点

硬件设备的初始化

为加载uboot stage
2准备ram空间

设置好堆栈

跳转到stage 2的C入口点

初始化本阶段要用到的设备

检查内存映射

将kernel映像和文件映像从flash中读到ram中

为内核设定启动参数

调用内核

2.3 本开发板的地址分布(leopard2a

可以根据变换后的分区结构,设置

uboot_addr,uboot_addr_end,kernel_addr,kernel_addr_end,rootfs_addr,rootfs_addr_end,

config_addr,
config_addr_end
等环境变量,调整bootloader。

SDRAM的调整修改linux-2.4.20_mvl31/drivers/mtd/maps/physmap.c

2.4 运行代码分析

2.4.1 stage
1

uboot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码包括定义入口,设置异常向量,设置cpu的模式和频率,配置内存区控制寄存器,安装uboot的栈空间,关闭看门狗等。由于本人对ram的汇编不太熟悉,所以这一部分不作具体分析。

2.4.2 stage
2

lib_arm/board.c中的start
armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个uboot(armboot)的主函数,该函数主要完成如下操作:

2.4.2.1
调用一系列初始化函数

1. 指定初始函数表:

init_fnc_t *init_sequence[] = {

cpu_init, /* cpu的基本设置 */

board_init, /* 开发板的基本初始化 */

interrupt_init, /* 初始化中断 */

env_init, /* 初始化环境变量 */

init_baudrate, /* 初始化波特率 */

serial_init, /* 串口通讯初始化 */

console_init_f, /* 控制台初始化第一阶段 */

display_banner, /* 通知代码已经运行到该处 */

dram_init, /* 配制可用的内存区 */

display_dram_config,

#if defined(CONFIG_VCMA9) || defined
(CONFIG_CMC_PU2)

checkboard,

#endif

NULL,

};

执行初始化函数的代码如下:

for
(init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

if ((*init_fnc_ptr)() != 0) {

hang ();

}

}

2. 配置可用的Flash区

flash_init ()

3. 初始化内存分配函数

mem_malloc_init()

4. nand flash初始化

#if (CONFIG_COMMANDS & CFG_CMD_NAND)

puts
("NAND:");

nand_init();       
/* go init the NAND */

#endif

5. 初始化环境变量

env_relocate ();

6. 外围设备初始化

devices_init()

7. I2C总线初始化

i2c_init();

8. LCD初始化

drv_lcd_init();

9. VIDEO初始化

drv_video_init();

10. 键盘初始化

drv_keyboard_init();

11. 系统初始化

drv_system_init();

2.4.2.2初始化网络设备

初始化相关网络设备,填写IP、MAC地址等。

1. 设置IP地址

gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

2.
设置mac地址

{

int i;

ulong reg;

char *s, *e;

uchar tmp[64];

i = getenv_r ((uchar*)("ethaddr"), tmp, sizeof (tmp));

s = (i > 0) ? (char*)tmp : NULL;

for (reg = 0; reg < 6; ++reg) {

gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16)
: 0;

if (s)

s = (*e) ? e + 1 : e;

}

}

2.4.2.3进入主UBOOT 命令行

进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

for (;;) {

main_loop ();

}}

3.
uboot
的移植和测试

3.1 移植的过程

① 在宿主机上建立交叉编译开发环境

② 修改cpu/arm926ejst目录中的文件内容,

主要包含cpu.C,start.S,interrupts.C以及seria1.C,speed.C等文件


在board目录下创建自己的目标板(开发板)目录leopard2a

在目录下创建leopard2a.C,flash.C,memsetup.S

以及Makefile,u-bot.1ds,config.mk文件

④在include/configs目录下创建leopard2a.h

⑤ 打开u-bot目录下Makefile文件,加入如下两行:

leopard2a_config
:     
unconfig

@./mkconfig $(@:_config=) arm arm926ejs
leopard2a

⑨ 编译。运行命令:

1. make leopard2a_config

2. make

编译成功.生成基本的u—b00t.

⑦ 烧写.把编译成的u-bot.bin

至此移植u-bot过程结束.

3.2 移植主要修改的文件

移植u—boot到开发板上只需要修改和硬件相关的代码即可。这首先就联想到cpu目录下的启动代码,另外参考u—boot/readme文件可知其他还需要修改的主要文件有:

Makefile文件,和include目录下的目标板.h头文件(leopard2a.h),board目录下的目标板.C文件(leopard2a.c),flash.C文件,u-boot.1ds链接文件,以及cpu目录下的串口驱动文件。

具体修改如下:

①     
cpu/arm926ejst目录下

◆ start.S启动代码。

②   
board/leopard2a


 leopard2a.C文件。这个文件主要是SDRAM
的驱动程

序,主要完成SDRAM 的UPM
表设置,上电初始化。暂时不

改。

◆ 
flash.C文件。Flash的驱动程序就在此文件中。

◆     
memsetup.S文件。

◆ 
config.mk文件.此文件用于设置程序链接的起始地

址.

◆u-boot.Ids文件。


include/configs目录下leopard2a.h文件.此文件是

leopard2a目标板头文件,大多数寄存器参数是在这一文件中

设置完成的.

3.3 uboot网络下载功能的添加和RAM调试

在commom/main.c 中的main_loop函数中添加tftp下载的函数,可以通过按钮触发下载rimage,kimage。

在烧录u-boot.bin之前,需要进行ram调试,保证uboot可以在EVB上正常运行。

先下載U-boot
到SDRAM上, 然後執行SDRAM 上的U-boot 程序, 以確認U-boot可以正常執行,

Command
如下:

1.      
“tftp a00000 u-boot.bin” <=
下載程序到SDRAM

2.      
“go a00000” <= 從SDRAM 執行程序

如果U-boot
可以相容於目前的硬件, 5VT EVB
會重新正常啟動

要是不能正常啟動,表示U-boot 不相容於目前的硬件, 請更換新的u-boot.

再重新測試,
直到被測試的U-boot可以正常啟動。

① 获得发布的最新版本U-Boot源码,与Linux内核源码类似,也是
bzip2的压缩格式。可从U-Boot的官方网站http://sourceforge.net/projects/U-Boot上获得;


阅读相关文档,主要是U-Boot源码根目录下的README文档和U-Boot官方网站的DULG(The
DENX U-Boot and Linux Guide)文档http://www.denx.de/twiki/bin/view/DULG/Manual。尤其是DULG文档,从如何安装建立交叉开发环境和解决U-Boot移植中常见问题都一一给出详尽的说明;

③ 订阅U-Boot用户邮件列表http://lists.sourceforge.net/lists/listinfo/u-boot-users。在移植U-Boot过程中遇有问题,在参考相关文档和搜索U-Boot-User邮件档案库http://sourceforge.net/mailarchive/forum.php?forum_id=12898仍不能解决的情况下,第一时间提交所遇到的这些问题,众多热心的U-Boot开发人员会乐于迅速排查问题,而且很有可能,W.D本人会直接参与指导;


在建立的开发环境下进行移植工作。绝大多数的开发环境是交叉开发环境。在这方面,DENX
和MontaVista均提供了完整的开发工具集;

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

0

上一篇:linux设备驱动归纳总结(八):2.match.probe.remove

下一篇:H323、H248(MGCP)、SIP三协议浅析

相关热门文章

  • linux 常见服务端口
  • xmanager 2.0 for linux配置
  • 【ROOTFS搭建】busybox的httpd...
  • openwrt中luci学习笔记
  • 什么是shell

热门推荐

    -->

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

    评论热议

    uboot移植总结

    时间: 2024-10-27 04:18:38

    uboot移植总结的相关文章

    U-Boot移植之前期分析(上)

    老是看别人移植uboot,用别人移植好的uboot,今天终于下定决心自己移植一个uboot来玩玩,好歹我也是个软件开发人员啊. 第一步:去ftp://ftp.denx.de/pub/u-boot/网站下载个uboot工程源码,为了防止环境出问题,我决定用个老一点的,于是就下了:u-boot-1.1.6.tar.bz2. 第二步:解压源码:tar  jxvf  u-boot-1.1.6.tar.bz2. 第三步:建立source insight工程 好了完成以上三步之后,我们需要的前提条件都准备好

    U-Boot移植之前期分析(下)

    接U-Boot移植之前期分析(上): 2. 顶层目录下mkconfig的分析过程 在上面的分析中知道了语句:"@$(MKCONFIG) $(@:_config=) arm arm920t MY_JZ2440 sumsung s3c24x0"对应于执行顶层目录下的mkconfig文件并传递了六个参数 ($0-$6):100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0.下面分析这句话的到底做了什么事情,具体可以阅读源码,由于比较简单这里直接列出具体

    I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之u-boot移植

    前段时间就开始学习I.MX6Q了,但是最近工作实在是忙,间断了一些时间了.为了提高移植效率,还是考虑移植Freescale维护的3.10版本的内核. 源码获取 Freescale维护的3.10的内核是使用git管理的,但是直接使用git下载代码会比较慢,下面是我下载好的uboot和kernel: I.MX6Q BSP源码(Freescale官方维护) 代码下载好后,先将u-boot解压到工作目录,然后在终端下切换到uboot根目录.由于这个版本的bsp是使用git管理的,因此,需要切换到指定分支

    uboot移植——uboot源码目录分析

    uboot移植(一)--uboot源码目录分析 本文分析的uboot是九鼎官方提供的,是对应s5pv210开发板x210bv3的uboot 一:uboot的概念及移植的原理. uboot就是在内核运行前的一段小程序,用来初始化硬件设备,建立内存空间映射图.从而将系统的软硬件带到合适的状态,主要功能就是为了启动内核,它将内核从flash中拷贝到ddr中,然后跳转到内核入口中,交由内核控制权,uboot严重依赖硬件,因此一个通用的uboot不太可能. 移植原理:uboot中有很多平行代码,各自属于各

    uboot移植(二)——uboot mkconfig脚本分析

    uboot移植(二)--uboot  mkconfig 脚本分析 一:mkconfig脚本的作用 mkconfig是通过传入的参数来脚本用于某个开发板配置uboot,主要是通过判断其输入的参数来创建符号链接文件,使它们指向该开发板对应的配置文件来进行配置. (1)配置CPU架构相关的文件:在include目录下创建asm文件,指向include/asm-arm (2)配置SOC类型相关的文件:include目录下创建regs.h文件,指向include/s5pc110.h include/asm

    u-boot移植随笔(7):u-boot启动流程简图【转】

    转自:http://www.latelee.org/porting-uboot/u-boot-porting-bootstrap.html u-boot移植随笔:u-boot启动流程简图 画上面这张图也花了点时间.虽然很简洁,但对于理解u-boot,从一个较高角度府视u-boot,很有帮助.——其实网上有很多分析教程.资料,相信大多都是大同小异的.因此,山人无谓再写一次了. (小技巧: 如何将上面的图占为已有? 木草山人心地善良,好心地将图片的背景做成白色的,最简单的方法是使用windows系统

    X-007 FriendlyARM tiny4412 u-boot移植之内存初始化

    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  开发环境:

    U-Boot移植_DDR3移植

    疯雨-版权所有,转载请注明[http://blog.csdn.net/u010346967] U-Boot移植_DDR3移植:首先在这里感谢网友fengtian的整理,没有你就没有这篇文章 在系统上电后,CPU并不知道外部的RAM是什么类型的存储器,因此U-Boot需要对CPU进行RAM初始化设置,然后将程序拷贝到RAM中运行. 本系统采用的RAM是DDR3类型存储芯片,容量是4GB,频率是1066KHz:系统从eMMC中启动.采用的是U-Boot-2009版,linux3.0.35系统内核,U

    PowerPC平台 u-boot 移植

    PowerPC功能很强的通信处理器,支持1000M以太网接口,以Freescale的P1010处理器为开发平台,讲述移植linux的整个过程,与大家分享. 1.配置交叉编译链 网上下载交叉编译工具,配置环境变量 sudo gedit /etc/environment 在末尾添加交叉编译链路径 :/home/freescale/work/tools/freescale/bin log out(不需要重启),输入如下,验证交叉编译是否安装成功: [email protected]:~/work/u-

    u-boot移植启动流程详细分析(2)

    学习底层的东西,首要的就是去了解他的架构,整体的思路知道了,就会在出现问题的时候有很清晰的思路,知道哪里出的问题,以及程序是如何执行的,相信做到上面的,所遇到的问题,大都会迎刃而解了吧,高手是有很多的,所谓的高手,不过也就那样吧,努力努力也是可以赶超的. 之前,介绍了u-boot的第一阶段的启动流程,那么接下来就来说说第二阶段的具体执行流程: (1)初始化gloabl data和board data,这里所谓的初始化就是给他们分配一块内存空间. (2)初始化序列(init_sequence) 在