ImageVerifierCode 换一换
格式:DOCX , 页数:43 ,大小:58.25KB ,
资源ID:7246593      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7246593.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(uboot的启动流程及移植.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

uboot的启动流程及移植.docx

1、uboot的启动流程及移植u-boot的启动流程及移植 摘要:嵌入式系统一般没有通用的bootloader,u-boot是功能强大的bootloader开发软件,但相对也比较复杂。文中对u-boot的启动流程作了介绍,详细给出了u-boot在S3C44B0开发板上的移植方法和步骤。1 .Bootloader及u-boot简介Bootloader 代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。Bootloader 代码与CPU 芯片的内核结构、具体型号、应用系统的配置及使用的操作系

2、统等因素有关,其功能类似于PC机的BIOS程序。由于bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader ,开发时需要用户根据具体情况进行移植。嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot等,其中u-boot是当前比较流行,功能比较强大的bootloader,可以支持多种体系结构,但相对也比较复杂。bootloader的实现依赖于CPU的体系结构,大多数bootloader都分为stage1和stage 2两大部分。Bootloader的基本原理见参考文献。u-boot是Sourceforge网站

3、上的一个开放源代码的项目。它可对 PowerPCMPC5xx、MPC8xx、MPC82xx、MPC7xx、MPC74xx、ARM(ARM7、ARM9、strongARM、XScaLe)、MIPS(4kc、5kc)、X86等处理器提供支持,支持的嵌入式操作系统有Linux、Vx-WorkS、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要用来开发嵌入式系统初始化代码bootloader。软件的主站点是http/S u-boot。u-boot 最初是由www.denx.de的PPC-boot发展而来的,它对PowerPC系列处理器的支持最完善,对Linux 操作系统的支持最好。源

4、代码开放的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必须有一个入口点,并且只能有一个

5、全局入口,通常这个入口放在ROM(flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。(2)设置异常向量(Exception Vector)。(3)设置CPU的速度、时钟频率及中断控制寄存器。(4)初始化内存控制器 。(5)将ROM中的程序复制到RAM中。(6)初始化堆栈 。(7)转到RAM中执行,该工作可使用指令Ldr PC来完成。2.2 stage2C语言代码部分Lib ARM/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成如

6、下操作:(1)调用一系列的初始化函数。(2)初始化Flash设备。(3)初始化系统内存分配函数。(4)如果目标系统拥有NAND设备,则初始化NAND设备。(5)如果目标系统有显示设备,则初始化该类设备。(6)初始化相关网络设备,填写IP、MAC地址等。(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。3 .移植实例本系统开发板主要由S3C44B0X嵌入式微处理器、2MB的Flash (SST39VF160)、8MB的SDRAM(HY57V641620)、4个LED以及ARM JTAG接口组成。3.1 u-boot文件下载u-boot文件的下载有两种方

7、法,第一种是在Linux环境下通过CVS下载最新的文件,方法是:$cVS-dpserVeranonymouscvc.sourceforge. net/cVSroot/u-boot login当要求输入匿名登录的密码时,可直接按回车键$cVS-z6-dpserVeranonyMouscVS.source F/cVSroot/u-bootco.P ModuLenaMe第二种是通过ftp/ftp.denx.de/pub/u-boot/ 下载正式发布的压缩文件。3.2 u-boot文件的结构初次下载的文件有很多,解压后存放在u-boot文件目录下,具体内容已在readMe文件中做了详细的介绍,其中与移

8、植相关的主要文件夹有:(1)CPU它的每个子文件夹里都有如下文件:makefileconfig.mkcpu.c 和处理器相关的代码interrupts.c 中断处理代码serial.c 串口初始化代码start.s 全局开始启动代码(2)BOARD它的每个子文件夹里都有如下文件:makefileconfig.mksmdk2410.c 和板子相关的代码(以smdk2410为例)flash.c flash操作代码memSetup.s 初始化SDRAM代码u-boot.lds 对应的连接文件(3)lib ARM体系结构下的相关实现代码,比如memcpy等的汇编语言的优化实现。3.3 交叉编译环境的建

9、立要得到下载到目标板的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.b

10、z2(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/loc

11、al/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 $path3.4 移植的预先编译移植u-boot到新的开发板上仅需要修改与硬件相关的部分即可。主要包括两个层面的移植,第一层是针对CPU的移植,第二层是针对BOARD的移植。由于u-boot1.1.1里面已经包含S3C44B0

12、的移植,所以笔者对板子myboard的移植主要是针对BOARD的移植。移植之前需要仔细阅读u-boot目录下的readMe文件,其中对如何移植做了简要的介绍。为了减少移植的工作量,可以在include/config目录下选一个和要移植的硬件相似的开发板,笔者选的是b2开发板。具体步骤如下:(1)u-boot1.1.1 下的CPU文件夹里已经包括了S3C44B0的目录,其下已经有start.sinterrupts.c以及 cpu.cserial.c几个文件,因而不需要建立与CPU相关的目录。(2)在board目录下创建myboard目录以及my-board.c、flash.c、memSetup.

13、s和u-boot.lds 等文件。不需要从零开始创建,只需选择一个相似的目录直接复制过来,然后修改文件名及内容即可。笔者在移植u-boot过程中选择的是u-boot1.1.1/board/dave/b2目录。(3)在include/configs目录下添加myboard.h,在这里可放入全局的宏定义等也不需要从头创建,可以在include/configs目录下寻找相似的CPU的头文件进行复制,这里笔者用的是B2.h文件来进行相关的修改。(4) 对u-boot根目录下的makefile文件进行修改,加入myboard_config : unconfig./Mkconfig $(:_config)

14、ARM S3C44B0 myboard(5) 修改u-boot根目录下的makefile文件,加入对板子的申明。然后在makefile 中加入myboard、LIST ARM7B2 ep7312 IMpa7 myboard。(6)运行make clobber,删除错误的depend文件。(7)运行make myboard config。(8)执行到此处即表示整个软件的makefile已建立,这时可修改生成的makefile中的交叉编译选项,然后打开makefile 文件,并找到其中的语句:ifeq($(ARCH),ARM)CROSS_COMPILEARM-Linux-end if接着将其改成i

15、feq($(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的控制寄存器及启动各阶段程序在flashSDRAM中的布局等。笔者在移植过程中先修

16、改/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/c

17、onfig /myboard.h(大部分的宏定义都在这里设置)、/board/myboard/flash.cflash的驱动序、/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 SDRAM1 SIE 0x01000000 /*16 M

18、B */ 改为#define PHYS SDRAM1 SIE 0x00800000 /* 8 MB */;将 #define PHYS FLASH SIE 0x00400000 /* 4 MB*改为#define PHYS FLASH SIE 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 EEPROM1 /* use EEPROM For e

19、nvironment Vars*/改为#define CFG ENV IS IN FLASH1其它(如堆栈的大小等)可根据需要修改。由于flash、SDRAM的容量会发生变化,故应对启动阶段程序在flash、SDRAM中的位置重新作出安排。笔者将flash中的u-boot代码放在0x0开始的地方,而将复制到SDRAM中的u-boot代码安排在0xc700000开始的地方。flash的修改不仅和容量有关,还和具体型号有关,flash存储器的烧写和擦除一般不具有通用性,应查看厂家的使用说明书,针对不同型号的存储器作出相应的修改。修改过程中,需要了解flash擦写特定寄存器的写入地址、数据命令以及扇

20、区的大小和位置,以便进行正确的设置。SDRAM要修改的地方主要是初始化内存控制器部分,由start.s文件中的 cpu InIt crIt完成CPU cache的设置,并由 board/myboard/memSetup.s中的memSetup完成初始化SDRAM。S3C44B0提供有SDRAM控制器,与一些CPU需要UPM表编程相比,它只需进行相关寄存器的设置修改即可,因而降低了开发的难度。串口波特率不需要修改(都是115200bit/S),直接用B2板的串口驱动即可。串口的设置主要包括初始化串口部分,值得注意的是:串口的波特率与时钟MCLK有很大关系,详见CPU用户手册。配置好以后,便可以重

21、新编译u-boot代码。将得到的u-boot.bin通过JTAG口下载到目标板后,如果能从串口输出正确的启动信息,就表明移植基本成功。实际过程中会由于考虑不周而需要多次修改。移植成功后,也可以添加一些其它功能(如LCD驱动等),在此基础上添加功能相对比较容易。5 结束语u-boot是一个功能强大的bootloader开发软件,适用的CPU平台及支持的嵌入式操作系统很多。本文是笔者在实际开发过程中根据相关资料进行摸索,并在成功移植了u-boot的基础上总结出来的。对于不同的CPU和开发板,其基本的方法和步骤是相同的,希望能对相关嵌入式系统的设计人员有所帮助。 u-boot(bootloader)

22、程序的特点功能1 .u-boot简介 u-boot是由德国的工程师Wolfgang Denk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。目前,u-boot源代码在 Sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是http: /S #cvs -d:pserver:anonymous:/cvsroot/u-boot login #cvs -z6 -d:pserver:anonymous:/cvsroot/u-boot co -Pmodulename 1.1 u-boot源代码目录结构

23、board:和一些已有开发板有关的文件,比如makefile和u-boot.ldS等都和具体开发板的硬件和地址分配有关。 common:与体系结构无关的文件,实现各种命令的C文件。 cpu:CPU相关文件,其中的子目录都是以u-boot所支持的CPU为名,比如有子目录arm926ejS、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.s。其中cpu.c初始化CPU、设置指令cache和数据cache等; interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.s

24、是u-boot 启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。 diSk:diSk驱动的分区处理代码。 doc:文档。 drivers:通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。 fs:支持文件系统的文件,u-boot现在支持cramfs、fat、fdos、jffs2和registerfs。 include:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。 net:与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。 lib_arm:与ARM体系结构相关的代码。 t

25、ools:创建S-Record格式文件 和u-boot images的工具。 1.2 u-boot的特点 u-boot支持SCC/FEC以太网、OOTP/TFTP引导、IP和MAC的预置功能,这一点和其它BootLoader(如BLOB和RedBoot等)类似。但u-boot还具有一些特有的功能。 在线读写Flash、DOC、IDE、IIC、EEROM、RTC,其它的BootLoader根本不支持IDE和DOC的在线读写。 支持串行口kermit和S-record下载代码,u-boot本身的工具可以把ELF32格式的可执行文件转换成为 S-record格式,直接从串口下载并执行。 识别二进制、

26、ELF32、uimage格式的image,对Linux引导有特别的支持。u-boot对Linux 内核进一步封装为uimage。封装如下: #CROSS_COMPILE-objcopy O binary -R.note -R.comment -S vmlinux linux.bin #gzip -9 linux.bin #tools/mkimage -A arm -O linux -T kernel -C gzip -a 0xc0008000 -e 0xc0008000 -n “Linux-2.4.20” -d linux.bin.gz /tftpboot/uimage 即在Linux内核镜像

27、vmLinux前添加了一个特殊的头,这个头在include/image.h中定义,包括目标操作系统的种类(比如Linux, VxWorkS等)、目标CPU的体系机构(比如ARM、PowerPC等)、映像文件压缩类型(比如gzip、bzip2等)、加载地址、入口地址、映像名称和映像的生成时间。当系统引导时,u-boot会对这个文件头进行CRC校验,如果正确,才会跳到内核执行。如下所示: WT-ARM9# bootm 0xc1000000 # Checking image at 0xc100000 . image Name: Linux-2.4.20 Created: 2004-07-02 22:

28、10:11 UTC image Type: ARM Linux Kernel image (gzip compresSed) Data size: 550196 Bytes = 537 kB = 0 MB Load AddresS: 0xc0008000 Entry Point: 0xc0008000 Verifying CheckSum . OK Uncompressing Kernel image OK 单任务软件运行环境。u-boot可以动态加载和运行独立的应用程序,这些独立的应用程序可以利用u-boot控制台的I/O函数、内存申请和中断服务等。这些应用程序还可以在没有操作系统的情况下运

29、行,是测试硬件系统很好的工具。 监控(minitor)命令集:读写I/O,内存,寄存器、内存、外设测试功能等 脚本语言支持(类似BASH脚本)。利用u-boot中的autoscr命令,可以在u-boot中运行“脚本”。首先在文本文件中输入需要执行的命令,然后用tools/mkimage封装,然后下载到开发板上,用autoscr执行就可以了。 编辑如下的脚本example.script。 echo echo Network Configuration: echo -echo Target: printenv ipaddr hostname echo echo Server: printenv S

30、erverip rootpath echo 用tools/mkimage对脚本进行封装。 # mkimage -A ARM -O linux -T Script -C none -a 0 -e 0 -n autoscr example Script -d example.script /tftpboot/example.img image Name: autoscr example Script Created: Wes Sep 8 01:15:02 2004 image Type: ARM Linux Script (uncompresSed) Data size:157 Bytes = 0

31、.15 kB = 0.00 MB Load AddresS: 0x00000000 Entry Point: 0x00000000 ContentS: image 0:149 Bytes = 0 kB = 0 MB 在u-boot中加载并执行这个脚本。 WT-ARM9# tftp100000 /tftpboot/example.img ARP broadcast1 TFTP from Server10.0.0.2; our IP addresS iS10.0.0.99 Filename /tftpboot/TQM860L/example.img. Load addresS: 0x100000 Loading: # done Bytes tranSferred = 221 (dd hex) WT-ARM9# autoscr1

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1