U-BOOT的启动流程及移植

发布者:innovator8最新更新时间:2013-05-07 来源: DZSC关键字:bootloader  u-boot  S3C44B0 手机看文章 扫描二维码
随时随地手机看文章

1 Bootloader及u-boot简介

Bootloader 代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、 堆栈、存储器系统等。Bootloader 代码与CPU 芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。由于bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader ,开发时需要用户根据具体情况进行移植。嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot等,其中u-boot是当前比较流行,功能比较强大的bootloader,可以支持多种体系结构,但相对也比较复杂。bootloader的实现依赖于CPU的体系结构,大多数bootloader都分为stage 1和stage 2两大部分。Bootloader的基本原理见参考文献。

u-boot是sourceforge网站上的一个开放源代码的项目。它可对 PowerPCMPC5xx、MPC8xx、MPC82xx、 MPC7xx、MPC74xx、ARM(ARM7、ARM9、StrongARM、Xscale)、MIPS(4kc、5kc)、X86等处理器提供支持,支持的嵌入式操作系统有Linux、Vx-Works、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要用来开发嵌入式系统初始化代码bootloader。软件的主站点是http//sourceforge.net/projects/ u-boot。u-boot 最初是由denxwww.denx.de的PPC-boot发展而来的,它对PowerPC系列处理器的支持最完善,对Linux 操作系统的支持最好。源代码开放的u-boot软件项目经常更新,是学习硬件底层代码开发的很好样例。

2 u-boot系统启动流程

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

2.1 stage1 (start.s代码结构)

u-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:

(1) 定义入口 。由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。

(2)设置异常向量(Exception Vector)。

(3)设置CPU的速度、时钟频率及中断控制寄存器。

(4)初始化内存控制器 。

(5)将ROM中的程序复制到RAM中。

(6)初始化堆栈 。

(7)转到RAM中执行,该工作可使用指令ldr pc来完成。

2.2 stage2C语言代码部分

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

(1)调用一系列的初始化函数。

(2)初始化Flash设备。

(3)初始化系统内存分配函数。

(4)如果目标系统拥有NAND设备,则初始化NAND设备。

(5)如果目标系统有显示设备,则初始化该类设备。

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

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

3 移植实例

本系统开发板主要由S3C44B0X嵌入式微处理器、2MB的Flash (SST39VF160)、8MB的SDRAM(HY57V641620)、4个LED以及ARM JTAG接口组成。该开发板上与S3C44B0X相关部分的功能框图如图1所示。

3.1 u-boot文件下载

u-boot文件的下载有两种方法,第一种是在Linux环境下通过CVS下载最新的文件,方法是:

$cvs-dpserveranonymous@cvs.sourceforge. net/cvsroot/u-boot login

当要求输入匿名登录的密码时,可直接按回车键

$cvs-z6-dpserveranonymous@cvs.source forge.net/cvsroot/u-boot\co.P modulename

第二种是通过ftp//ftp.denx.de/pub/u-boot/ 下载正式发布的压缩文件。

3.2 u-boot文件的结构

初次下载的文件有很多,解压后存放在u-boot文件目录下,具体内容已在readme文件中做了详细的介绍,其中与移植相关的主要文件夹有:

(1)CPU它的每个子文件夹里都有如下文件:

makefile

config.mk

cpu.c 和处理器相关的代码

interrupts.c 中断处理代码

serial.c 串口初始化代码

start.s 全局开始启动代码

(2)BOARD它的每个子文件夹里都有如下文件:

makefile

config.mk

smdk2410.c 和板子相关的代码(以smdk2410为例)

flash.c Flash操作代码

memsetup.s 初始化SDRAM代码

u-boot.lds 对应的连接文件

(3)lib arm体系结构下的相关实现代码,比如memcpy等的汇编语言的优化实现。

3.3 交叉编译环境的建立

要得到下载到目标板的u-boot二进制启动代码,还需要对下载的u-boot1.1.1进行编译。u-boot的编译一般在Linux系统下进行,可用ARM-LIN-UX-GCC进行编译。一步一步建立交叉编译环境通常比较复杂,最简单的方法是使用别人编译好的交叉编译工具,方法如下:

(1)在http//handhelds.org/download/toolchain下载 arm-Linux-gcc-3.3.2.tar.bz2

(2)以用户名root登录,将arm-linux-gcc-3.3.2.tar.bz2 解压到 /root目录下

# tar jxvf arm-linux-gcc-3.3.2.tar.bz2

(3)在http//handhelds.org/download/toolchain下载 arm-linux-toolchain-post-2.2.13.tar.gz 只是用了它的头文件而已,主要来自内核/linux-x.x/include下

(4)将arm-linux-toolchain-post-2.2. 13.tar.gz 解压到 /skiff/local/ 下

# tar zxvf arm-linux-toolchain-post-2.2.13.tar.gz

(5)拷贝头文件到/root/usr/3.3.2/arm-linux/ 下然后删除 /skiff

# cp -dR /skiff/local/arm-linux/include /root/usr/3.3.2/arm-linux

# rm -fr /skiff

这样就建立了arm linux 交叉编译环境。

(6)增加/root/usr/local/arm/3.3.2/bin到路径环境变量

path=$path:/root/usr/local/arm/3.3.2/bin 可以检查路径变量是否设置正确。# echo $path

3.4 移植的预先编译

移植u-boot到新的开发板上仅需要修改与硬件相关的部分即可。主要包括两个层面的移植,第一层是针对CPU的移植,第二层是针对BOARD的移植。由于u-boot 1.1.1里面已经包含S3C44B0的移植,所以笔者对板子myboard的移植主要是针对BOARD的移植。移植之前需要仔细阅读u-boot目录下的readme文件,其中对如何移植做了简要的介绍。为了减少移植的工作量,可以在include/config目录下选一个和要移植的硬件相似的开发板,笔者选的是b2开发板。具体步骤如下:

(1)u-boot 1.1.1 下的CPU文件夹里已经包括了S3C44B0的目录,其下已经有start.sinterrupts.c以及 cpu.cserial.c几个文件,因而不需要建立与CPU相关的目录。[page]

(2)在board目录下创建myboard目录以及my-board.c、flash.c、memsetup.s和u-boot.lds 等文件。不需要从零开始创建,只需选择一个相似的目录直接复制过来,然后修改文件名及内容即可。笔者在移植u-boot过程中选择的是u-boot 1.1.1/board/dave/B2目录。

(3)在include/configs目录下添加myboard.h,在这里可放入全局的宏定义等也不需要从头创建,可以在include/configs目录下寻找相似的CPU的头文件进行复制,这里笔者用的是B2.h文件来进行相关的修改。

(4) 对u-boot根目录下的makefile文件进行修改,加入

myboard_config : unconfig

@./mkconfig $(@:_config=)arm S3C44B0 myboard

(5) 修改u-boot根目录下的makefile文件,加入对板子的申明。然后在makefile 中加入myboard、LIST ARM7=″B2 ep7312 impa7 myboard″。

(6)运行make clobber,删除错误的depend文件。

(7)运行make myboard config。

(8)执行到此处即表示整个软件的makefile已建立,这时可修改生成的makefile中的交叉编译选项,然后打开makefile 文件,并找到其中的语句:

ifeq($(ARCH),arm)

CROSS_COMPILE=arm-linux-

end if

接着将其改成

ifeq($(ARCH),arm)

CROSS COMPILE=/root/usr/local/3.3.2/bin/arm-linux-

end if

这一步和上面的设置环境变量只要有一个就可以了。

执行make,报告有一个错误,修改myboard/flash.c中的#include ″../common/flash.c"为"u-boot/board/dave/common/flash.c″,重新编译即可通过。

4 移植时的具体修改要点

若预先编译没有错误就可以开始硬件相关代码的移植,首先必须要对移植的硬件有清楚地了解,如CPU、CPU的控制寄存器及启动各阶段程序在FlashSDRAM中的布局等。

笔者在移植过程中先修改/include/config /my-board.h头文件中的大部分参数(大部分的宏定义都在这里设置),然后按照u-boot的启动流程逐步修改。修改时应熟悉ARM汇编语言和C语言,同时也应对u-boot启动流程代码有深入的了解。B2板的CPU频率为75MHz、Flash为4Mbit、SDRAM为16Mbit、串口波特率为115200bit/s、环境变量放在EEPROM中。根据两个开发板的不同,需要修改的有:CPU的频率、Flash和SDRAM容量的大小、环境变量的位置等。由于参考板已经有了大部分的代码,因此只需要针对myboard进行相应的修改就可以了。与之相关的文件有/include/config /myboard.h(大部分的宏定义都在这里设置)、/board/myboard/flash.cFlash的驱动序、/board/myboard /myboard.c(SDRAM的驱动程序)、/CPU/S3C44B0/serial.c(串口的驱动使能部分)等。

/include/config /myboard.h是全局宏定义的地方,主要的修改有:

将#define CONFIG S3C44B0 CLOCK SPEED 75改为

#define CONFIG S3C44B0 CLOCK SPEED 64;

将 #define PHYS SDRAM 1 SIZE 0x01000000 /* 16 MB */ 改为

#define PHYS SDRAM 1 SIZE 0x00800000 /* 8 MB */;

将 #define PHYS FLASH SIZE 0x00400000 /* 4 MB*改为

#define PHYS FLASH SIZE 0x00200000 /* 2 MB */;

将 #define CFG MAX FLASH SECT 256 /* max number of sectors on one chip */改为

#define CFG MAX FLASH SECT 35 ;

将 #define CFG ENV IS IN EEPROM 1 /* use EEPROM for environment vars*/改为

#define CFG ENV IS IN FLASH 1

其它(如堆栈的大小等)可根据需要修改。

由于Flash、SDRAM的容量会发生变化,故应对启动阶段程序在Flash、SDRAM中的位置重新作出安排。笔者将Flash中的u-boot代码放在0x0开始的地方,而将复制到SDRAM中的u-boot代码安排在0xc700000开始的地方。

Flash的修改不仅和容量有关,还和具体型号有关,Flash存储器的烧写和擦除一般不具有通用性,应查看厂家的使用说明书,针对不同型号的存储器作出相应的修改。修改过程中,需要了解Flash擦写特定寄存器的写入地址、数据命令以及扇区的大小和位置,以便进行正确的设置。

SDRAM要修改的地方主要是初始化内存控制器部分,由start.s文件中的 cpu init crit完成CPU cache的设置,并由 board/myboard/memsetup.s中的memsetup完成初始化SDRAM。S3C44B0提供有SDRAM控制器,与一些CPU需要UPM表编程相比,它只需进行相关寄存器的设置修改即可,因而降低了开发的难度。

串口波特率不需要修改(都是115200bit/s),直接用B2板的串口驱动即可。串口的设置主要包括初始化串口部分,值得注意的是:串口的波特率与时钟MCLK有很大关系,详见CPU用户手册。

配置好以后,便可以重新编译u-boot代码。将得到的u-boot.bin通过JTAG口下载到目标板后,如果能从串口输出正确的启动信息,就表明移植基本成功。实际过程中会由于考虑不周而需要多次修改。移植成功后,也可以添加一些其它功能(如LCD驱动等),在此基础上添加功能相对比较容易。

5 结束语

u-boot是一个功能强大的bootloader开发软件,适用的CPU平台及支持的嵌入式操作系统很多。本文是笔者在实际开发过程中根据相关资料进行摸索,并在成功移植了u-boot的基础上总结出来的。对于不同的CPU和开发板,其基本的方法和步骤是相同的,希望能对相关嵌入式系统的设计人员有所帮助。

关键字:bootloader  u-boot  S3C44B0 引用地址:U-BOOT的启动流程及移植

上一篇:基于S3C44B0X的嵌入式Socket通信设计
下一篇:STM32在变频波轮洗衣机上的应用

推荐阅读最新更新时间:2024-03-16 13:23

关于ADS下bootloader之MMU的深入研究
如下是ADS下的boot的MMU.c的MMU初始化代码。在2440init.S中跳入Main,这个Main函数在U2440mom.c中实现,这个Main函数包括了对端口,中断服务,MMU,VGA等的初始化函数的调用。MMU.c中进行了MMU的初始化,其中调用了很多初始化函数,使用汇编写的,确切的说是用协处理指令写的。这些函数的声明部分在2440slib.h,实现在2440slib.c中。在MMU的初始化程序MMU_Init中,首先禁止了Dcache,Icache,清除了Dcache和Icache。禁止了MMU,TLB。然后对存储系统进行了虚拟地址到物理地址的映射。然后设置了转化表的基地址,设置了域,开启了MMU,Icache,Dca
[单片机]
关于ADS下<font color='red'>bootloader</font>之MMU的深入研究
华为:暂时没有计划解除Mate 30系列的bootloader限制
在德国慕尼黑Mate 30系列新品发布会结束之后,华为首席执行官余承东接受了多家媒体的采访。期间他回答了一些与新机相关的问题,其中就包括考虑解除对 Mate 30 Pro 机型的 bootloader 限制。不过随后华为发言人对余的言论进行澄清,表示华为目前“并没有计划”解除Mate 30系列上的bootloader 限制。 目前尚不清楚华为在未来是否会考虑开放bootloader,也不清楚这项决定对于那些想要Sideload 谷歌GMS服务的用户带来多大的影响。在没有GMS服务也没有谷歌应用程序,Mate 30系列在西方国家的销售将会面临严峻的挑战。 对于喜欢 Mate 30 Pro 硬件设计,但又苦于缺少谷歌服务的用户来说
[手机便携]
基于IIS总线的嵌入式音频系统设计
嵌入式音频系统广泛应用于GPS自动导航、PDA、3G手机等嵌入式领域,但目前国内在这方面的研究较少。 音频系统设计包括软件设计和硬件设计两方面,在硬件上使用了基于IIS总线的音频系统体系结构。IIS(Inter-IC Sound bus)又称I2S,是菲利浦公司提出的串行数字音频总线协议。目前很多音频芯片和MCU都提供了对IIS的支持。 在软件上,作为一个功能复杂的嵌入式系统,需要有嵌入式操作系统支撑。Linux是一个源代码开放的类UNIX系统,由于其具有内核可裁剪性,且提供对包括ARM、PPC在内的多种嵌入式处理器的支持,所以广泛应用于嵌入式高端产品中。虽然Linux提供了众多API来降低驱动程序制作的复杂度,但是由于音
[单片机]
基于IIS总线的嵌入式音频系统设计
u-boot-2014.10移植(6)添加mtdparts命令和分区
添加mtdparts命令,改命令可以查看当前分区,在启动参数里面可以以分区名代表地址和长度 grep cmd_mtdpart * -nR 搜索可知,mtdpart在cmd_mtdparts.c里面定义 common/Makefile:147:obj-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o 因此需要定义CONFIG_CMD_MTDPARTS,CONFIG_MTD_DEVICE #define MTDIDS_DEFAULT nand0=smdk2440-0 #define MTDPARTS_DEFAULT mtdparts=smdk2440-0:256k(bootlo
[单片机]
JZ2440--linux下给u-boot打补丁并编译
解压缩 book@book-desktop:~/zhangbing$ tar xjf u-boot-1.1.6.tar.bz2 2.打补丁 进入u-boot-1.1.6并且打补丁 book@book-desktop:~/zhangbing$ cd u-boot-1.1.6/ book@book-desktop:~/zhangbing/u-boot-1.1.6$ patch -p1 ../u-boot-1.1.6_jz2440.patch 3.配置 book@book-desktop:~/zhangbing/u-boot-1.1.6$ make 100ask24x0_config 4.编译 book@boo
[单片机]
u-boot-2009.08在mini2440上的移植(一)---建立mini2440工程环境(3)
根据启动流程修改或添加基本的u-boot源码,使其能够在内存中启动 【1】增加对S3C2440一些寄存器的支持,添加中断禁止部分和时钟设置部分 用gedit打开cpu/arm920t/start.S,定位到134行附近,如下代码 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) /* turn off the watchdog */ 由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可,修改后代码如下: #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) |
[单片机]
u-boot-2009.08在mini2440上的移植(一)---建立mini2440工程环境(3)
stm32f429的u-boot、uclinux内核烧写说明
最近比较忙,针对前面的留言说有怎么download u-boot、uclinux到stm32,我翻了翻以前记录下的笔记,特意贴上来,其实有些步骤我都已经忘记了。。。 一、搭建嵌入式linux开发环境 1. 准备一台Linux系统(Fedora,CentOS,Ubuntu等)的电脑,将BSP压缩包(linux-cortexm-2.0.0.tar.gz)拷贝到一个目录; 2. 解压BSP包: tar -xzvf linux-cortexm-2.0.0.tar.gz 3. 解压arm工具链: cd linux-cortexm-2.0.0/tools tar xvfj arm-2010q1-189-arm-uc
[单片机]
stm32f429的<font color='red'>u-boot</font>、uclinux内核烧写说明
ARM7TDMI-S在嵌入式系统中的Bootloader代码设计
摘要:ARM7TDMI-S是ARM公司设计的一款32位精简指令集处理器内核,LPC210x系列是飞利浦半导体公司生产的基于ARM7TDMI-S内核的芯片。在嵌入式系统设计中,针对嵌入式处理器和操作系统的Bootloader代码的设计是一个难点。本文根据用LPC2106进行嵌入式系统设计的实际经验,总结出基于ARM7TDMI-S内核的嵌入式处理器芯片的Bootloader代码设计的一般流程;给出LPC2106芯片在基于μC/OS-II操作系统的嵌入式应用中,BootLoader程序的详细设计流程及其中的一些关键技术和代码。 关键词:ARM7TDMI-S嵌入式系统 BootLoader代码 LPC2106 μC/OS-II 引言
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved