Uboot 学习

一. BootLoader简介

应用程序

文件系统

操作系统内核

BootLoader

简单的说bootloader是一段程序,它的作用就是加载操作系统,BootLoader(引导加载程序是系统加电后运行的第一段软件代码。通过这段代码实现硬件的初始化,建立内存空间的映射图,为操作系统内核准备好硬件环境并引导内核的启动。如右图所示的那样在设备的启动过程中bootloader位于最底层,首先被运行来引导操作系统运行,很容易可以看出 bootloader是底层程序所以它的实现严重地依赖于硬件,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可的。尽管如此,一些功能强大、支持硬件环境较多的BootLoader也被广大的使用者和爱好者所支持,从而形成了一些被广泛认可的、较为通用的的bootloader实现。简单的介绍几种:

1.U-BOOT(下载地址http://sourceforge.net/projects/u-boot

uboot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。其代码可以从下载 U-BOOT是由PPCBOOT发展起来的,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案,从官方版本 0.3.2开始全面支持SC系列单板机。u-boot是一个开源的bootloader

2vivi(下载地址http://www.mizi.com/developer

vivi是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这vivi的默认模式。如果修改或更新需要进入下载模式,在下载模式下,vivi为用户提供一个命令行接口通过接口可以使用vivi提供的一些命令,来实现flash的烧写、管理、操作mtd分区信息、启动系统等功能。

其它还有一些bootloader实现如下表所示:

名称说明支持的架构
LILOLinux的磁盘引导加载程序x86
GRUBLILOGNU版本x86
LoadlinDOS引导Linuxx86
RedBooteCos为基础的引导程序x86 ARMPowerPCMIPS
ROLOROM引导Linux,且不需要BIOSx86
Etherboot从以太网卡启动Linux系统的固件x86
LinuxBIOSLinux为基础的BIOS的替代品x86
blob来自LART计划的引导程序ARM

由于u-boot的通用性好,功能全面,适合初学者学习和使用,我们选用u-boot作为基准代码,在此基础上进行修改,完成移植工作。二.移植准备1.目标板:这是进行U-Boot移植首先要明确的。可以根据目标板上CPUFLASHSDRAM的情况,以尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的U-Boot支持板为移植参考板。以上图片是本次移植所用到的开发板实物图一些重要参数如下:CPU处理器Samsung S3C2440AL,主频400MHz,最高533MHzSDRAM内存板载64MB SDRAM32bit数据总线SDRAM时钟频率高达100MHzHynix809EFlash存储器板载64MB Nand Flash,掉电非易失板载2MB Nor FlashK9F1208u00

 

 

下面进行第二阶段:bootloader (2)

U-Boot 启动过程可以分成两个阶段 (stage) 下面是u-boot启动过程的流程图其中左右两部分分别是启动过程的两个阶段
第一阶段 (stage 1) 是依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置 ARM 进入 SVC 模式、禁止 IRQ FIQ 、关闭看门狗、屏蔽所有中断。设置时钟 (FCLK,HCLK,PCLK) 、清空 I/D cache 、清空 TLB 、禁止 MMU cache 、配置内存控制器、为搬运代码做准备、搬移 uboot 映像到 RAM 中(使用 copy_loop 实现)、分配堆栈、清空 bss 段(使用 clbss_l 实现)。 第二阶段 (stage 2) 通常用C语言来实现。 start_armboot(): 一系列初始化( cpu, 板卡,中断,串口,控制台等),开启 I/D cache 。初始化 FLASH ,根据系统配置执行其他初始化操作。打印 LOG ,使能中断,获取环境变量,初始化网卡。最后进入 main_loop() 函数。在 main_loop 函数中会检查 bootdelay bootcmd 环境变量,如果 bootcmd 已经设置过,则在等待 bootdelay 个毫秒后会自动执行 bootcmd 。如果等待过程中被用户中断( ctl+c )或者 bootcmd 没有设置,则会等待用户输入命令。 关键点一: U-Boot 移植参考板 这是进行 U-Boot 移植首先要明确的。可以根据目标板上 CPU FLASH SDRAM 的情况,以尽可能相一致为原则,先找出 一个与所移植目标板为同一个或同一系列处理器的 U-Boot 支持板为移植参考板。对 U-Boot 移植新手,建议依照循序渐进的原则,目标板文件名暂时先用移 植参考板的名称,在逐步熟悉 U-Boot 移植基础上,再考虑给目标板重新命名。在实际移植过程中,可用 Linux 命令查找移植参考板的特定代码,如 grep –r 2410 ./ 可确定出在 U-Boot 中与 smdk2410 板有关的代码,依此对照目标板实际进行屏蔽或修改。同时应不局限于移植参考板中的代码,要广泛借鉴 U-Boot 中已有的代码更好地实现一些具体的功能。 关键点二: U-Boot 烧写地址和 CPU 寄存器参数设置 不同目标板,对 U-Boot FLASH 中存放地址要求不尽相同。事实上,这是由处理器中断复位向量来决定的,与主板硬件相关 。也就是说, U-Boot 烧写具体位置是由硬件决定的,而不是程序设计来选择的。 根据 CPU 处理器系列、类型不同,寄存器名称与作用有一定差别。必须根据目标板的实际,进行合 理配置。一个较为可行和有效的方法,就是借鉴参考移植板的配置,再根据目标板实际,进行合理修改。这是一个较费时间和考验耐力的过程,需要仔细对照处理器 各寄存器定义、参考设置、目标板实际作出选择并不断测试。 关键点三: 串口调试。 能从串口输出信息,即使是乱码,也可以说 U-Boot 移植取得了实质性突破。 依据笔者调试经历,串口是否有输出,除了与串口驱动相关外,还与 FLASH 相关的寄存器设置有关。因为 U-Boot 是从 FLASH 中被引导启动的,如果 FLASH 设置不正确, U-Boot 代码读取和执行就会出现一些问题。因此,还需要就 FLASH 的相关寄存器设置进行一些参数调试。同时,要注意串口收发 芯片相关引脚工作波形。依据笔者调试情况,如果串口无输出,有一种可能就是该芯片损坏或工作不正常。 如果出现乱码,有一种可能就是波特率等参数设置有问题。 三.修改源代码: 1. 添加新开发板信息 1)顶层 Makefile :为了能让u-boot在编译之前根据此规则来获得具体的配置文件和编译规则。 smdk2410_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 之后,添加以下内容:
tq2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t tq2440 NULL s3c24x0
添加交叉编译器路径(根据个人情况):
ifeq ($(ARCH),arm)CROSS_COMPILE= /opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux/bin/arm-softfloat-linux-endif
2 )建立新开发板目录:可以把类似的开发板进行修改 cd board mkdir tq2440 cd tq2440 cp -arf ../smdk2410/* . mv smdk2410.c tq2440.c 3 )修改 board/tq2440/u-boot.lds cpu/arm920t/start.o (.text) 后添加:
board/tq2440/boot_init.o (.text)
并在 tq2440 目录下新建 boot_init.c 文件,内容参考源文件,该代码主要实现了 CopyCode2Ram 函数,该函数功能是拷贝flash代码到sdram中,实现原理如下图。
CopyCode2Ram 函数实现原理 4 )修改 tq2440 目录下的 Makefile
COBJS:= tq2440.o flash.o boot_init.o
5 )修改 tq2440.c 增加宏定义:
#define S3C2440_MPLL_400MHZ ((0x7f<<12)|(0x02<<4)|(0x01))#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值