首页 核心课程 师资团队 企业培训 在职工程师培训 就业实训 技术文章 在线学习 我要报名 “顶嵌杯”专题 关于我们
分类导航
课件下载 
模拟试卷 
视频下载 
动手做一个嵌入式产品活动之:第二部分
文件名称: 动手做一个嵌入式产品活动之:第二部分
文件大小:
文件类型: rar
上传时间: 2009-09-05 07:32:00
更新时间: 2009-09-05 07:32:00
下载次数: 511
适用年级:
作者姓名:
文件简介
动手做一个嵌入式产品活动之:第二部分
详细介绍
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
第二阶段:bootloader 的移植
一. BootLoader 简介
简单的说bootloader 是一段程序,它的作用就是加载操作
系统,BootLoader(引导加载程序)是系统加电后运行的第
一段软件代码。通过这段代码实现硬件的初始化,建立内存空
间的映射图,为操作系统内核准备好硬件环境并引导内核的启
动。如右图所示的那样在设备的启动过程中bootloader 位于
最底层,首先被运行来引导操作系统运行,很容易可以看出
bootloader 是底层程序所以它的实现严重地依赖于硬件,特
别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader 几乎是不可
能的。尽管如此,一些功能强大、支持硬件环境较多的BootLoader 也被广大的使用
者和爱好者所支持,从而形成了一些被广泛认可的、较为通用的的bootloader 实现。
简单的介绍几种:
1.U-BOOT
uboot 是一个庞大的公开源码的软件。他支持一些系列的arm 体系,包含常见的
外设的驱动,是一个功能强大的板极支持包。其代码可以从下载U-BOOT 是由PPCBOO
T 发展起来的,是PowerPC、ARM9、Xscale、X86 等系统通用的Boot 方案,从官方版
本0.3.2 开始全面支持SC 系列单板机。u-boot 是一个开源的bootloader。
2.vivi
vivi 是韩国mizi 公司开发的bootloader, 适用于ARM9 处理器。Vivi 有两种
工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可
更改)自行启动linux 内核,这是vivi 的默认模式。如果修改或更新需要进入下载
模式,在下载模式下,vivi 为用户提供一个命令行接口通过接口可以使用vivi 提供
的一些命令,来实现flash 的烧写、管理、操作mtd 分区信息、启动系统等功能。
其它还有一些bootloader 实现如下表所示:
名称说明支持的架构
LILO Linux 的磁盘引导加载程序x86
GRUB LILO 的GNU 版本x86
Loadlin 从DOS 引导Linux x86
RedBoot 以eCos 为基础的引导程序x86 、ARM 、PowerPC 、
MIPS 等
ROLO 从ROM 引导Linux,且不需要BIOS x86
Etherboot 从以太网卡启动Linux 系统的固件x86
LinuxBIOS 以Linux 为基础的BIOS 的替代品x86
应用程序
文件系统
操作系统内核
BootLoader
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
由于u-boot 的通用性好,功能全面,适合初学者学习和使用,我们选用u-boot 作为基准代
码,在此基础上进行修改,完成移植工作。
二.移植准备
1.目标板:
这是进行U-Boot 移植首先要明确的。可以根据目标板上CPU、FLASH、SDRAM 的情况,以
尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的U-Boot
支持板为移植参考板。
以上图片是本次移植所用到的开发板实物图
一些重要参数如下:
CPU 处理器
– Samsung S3C2440AL,主频400MHz,最高533MHz。
SDRAM 内存
– 板载64MB SDRAM
– 32bit 数据总线
– SDRAM 时钟频率高达100MHz
– Hynix809E
Flash 存储器
– 板载64MB Nand Flash,掉电非易失
blob 来自LART 计划的引导程序ARM
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
– 板载2MB Nor Flash
– K9F1208u00
网卡
– DM9000EP
2.源文件:
选择一标准的u-boot 代码:u-boot-1.1.6
3.烧写工具:
u-boot 的烧写使用JTAG 线进行下载,用SJF2440.exe 软件进行烧写,使用DNW 终端进行串
口调试。用串口线相连。
4.知识储备:
u-boot 的目录结构:
u-boot 代码:
由于代码比较庞大,只简单分析启动部分。网络和书很多书中有详细的分析,如果想详细了
解查阅相关资料, 或着提出讨论, 还可以登陆顶嵌公司网站技术文档里查看。网
址:http://www.top-e.org/jiaoshi/html/?320.html
U-Boot 启动过程可以分成两个阶段(stage)
下面是u-boot 启动过程的流程图其中左右两部分分别是启动过程的两个阶段
目录说明
board 和一些已有开发板有关的文件,比如makefile 和U-Boot.ldS 等都和
具体开发板的硬件和地址分配有关。
common 与体系结构无关的文件,实现各种命令的C 文件
cpu CPU 相关文件,其中的子目录都是以U-Boot 所支持的CPU 为名,比如
子目录arm926ejS、mips 等,每个特定的子目录都包括cpu.c 和
interrupt.c,start.s。其中cpu.c 初始化CPU、设置指令cache 和数
据cache 等。Interruput.c 设置系统的各种中断和异常;start.s 是UBoot
自动执行时的第一个文件,它主要是设置系统堆栈和工作方式,
为进入C 程序奠定基础。
disk Disk 驱动的分区处理代码
doc 文档
drivers 通用设备驱动程序,例如各种网卡、支持CFI 的Flash、串口、USB 等
fs 支持文件系统的文件,目前支持cramfs、fat、fdos、jffs2 和registerfs
include 头文件,还有对各种硬件平台支持的汇编文件,系统配置文件等
net 与网络有关的代码,BOOTP 协议、TFTP 协议、RARP 和NFS 等
lib_arm 与ARM 体系结构相关的代码
tools 创建S-Record 格式文件和U-Boot images 的工具
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
第一阶段(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 寄存器参数设置
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
不同目标板,对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
之后,添加以下内容:
添加交叉编译器路径(根据个人情况):
(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)后添加:
并在tq2440 目录下新建boot_init.c 文件,内容参考源文件,该代码主要实现了
CopyCode2Ram 函数,该函数功能是拷贝flash 代码到sdram 中,实现原理如下图。
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-softfloatlinuxendif
board/tq2440/boot_init.o (.text)
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
CopyCode2Ram 函数实现原理
(4)修改tq2440 目录下的Makefile
(5)修改tq2440.c
增加宏定义:
S3C2440 的主时钟源来自外部晶振(XTIPLL)或外部时钟(EXTCLK)。S3C2440 有两个PLL
(phase locked loop)一个是MPLL,一个是UPLL。MPLL 用于CPU 及其他外围器件,UPLL
用于USB。
【1】MPLL, 用于产生FCLK, HCLK, PCLK 三种频率, 这三种频率分别有不同的
用途:
FCLK 是CPU 提供的时钟信号。
HCLK 是为AHB 总线提供的时钟信号, Advanced High-performance Bus,主要用于高速
外设,比如内存控制器,中断控制器,LCD 控制器, DMA 等。
从S3C2440 的DataSheet 里可以看到,S3C2440 最大支持400MHz 的主频,但是这并不意味
着一定工作在400MHz 下面,可以通过设定MPLL, UPLL 寄存器来设定CPU 的工作频率。
PCLK 是为APB 总线提供的时钟信号,Advanced Peripherals Bus,主要用于低速外设,
比如看门狗,UART 控制器, IIS, I2C, SDI/MMC, GPIO,RTC and SPI 等。
COBJS := tq2440.o flash.o boot_init.o
#define S3C2440_MPLL_400MHZ ((0x7f<<12)|(0x02<<4)|(0x01))
#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
【2】UPLL,专门用于驱动USB host/Device。并且驱动USB host/Device 的频率必须为
48MHz。
如果要设置MPLL 和UPLL,要注意它们的先后顺序,MPLL 和UPLL 的设定是有前后顺
序的,必须先设定UPLL,然后才能设定MPLL,而且中间需要大约7 个空指令(NOP)的
间隔。
定义MPLL/UPLL/CLKDIV,参考S3C2440 芯片用户手册,参考255 页内容如下:
#define S3C2440_CLKDIV 0x05 /* FCLK:HCLK:PCLK = 1:4:8 */
 

嵌入式培训 | 在线报名 | 合作企业 | 关于顶嵌 | 联系我们 | 加入顶嵌 | 友情链接 

联系电话:010-62642993、62264198
传真:010-62631735-8900
地址:北京市海淀区成府路文津国际酒店
全国免费咨询电话:400-661-5264
Copyright © 2009 北京顶嵌(TOP-E)开源科技有限公司 - 嵌入式Linux专业培训机构 All Rights Reserved
京ICP06031998