基于MPC8349控制计算机的U-Boot移植
扫描二维码
随时随地手机看文章
0 引言
U-Boot (Universal Boot Loader),是在PPC Boot 的基础上,集成了ARM, XScale, x86,MIPS 等结构发展来的。作为Boot loader,其主要安装在嵌入式系统板上的ROM 中。 它主要用来初始化、检测系统硬件,以及下载、运行有关的应用代码。 在这篇论文中,采用的是开源的最新版本U-Boot 1.1.3。U-Boot 1.1.3 支持的CPU包括, MPC8xx, MPC5xx, MPC824x,MPC82xx, MPC83xx, MPC85xx, MPC74xx 等。
U-Boot 之所以主要是因其支持很多文件类型。
(1) 独立的应用程序:该程序直接在U-Boot 环境下执行,并且执行完毕后重新返回U-Boot 环境。
(2) “Linux 操作系统Kernel 文件”: U-Boot 可以引导Linux 操作系统Kernel 文件在系统板上执行。在完成该引导过程后,必须通过重新启动CPU 才能再次进入U-Boot 环境。
(3) “操作系统Ramdisk 文件”: U-Boot 可以引导加载Linux 操作系统Ramdisk 文件。该文件主要是作为系统板,启动时需要加载的文件系统。
(4)“综合文件”: 该文件可以包括一种或几种U-Boot 所支持的文件。比如包括Linux 操作系统内核和启动时需要加载的ramdisk 文件系统。
(5) “可执行文件”: 该文件主要由U-Boot 将其烧录到系统板的Flash 中。比如,uboot.bin。
(6) “脚本文件”: 该文件主要用在U-Boot 启动时利用脚本文件来设置具体的环境变量。
1 U-Boot 工作原理
U-Boot启动过程可以分成三个阶段。
(1)执行start.S(cpu/mpc83xx/start.S)汇编程序,见图1.
(2)执行U-Boot启动过程中的第一个C语言函数board.(lib_ppc/board.c),见图2。
(3)系统进入主循环main_loop(common/main.c)延时等待处理用户命令或自动执行启动,见图3。
3 U-Boot 的文件结构
在U-boot 包含board, common, cpu, disk,doc, drivers, dtt, examples, fs, include 等文件。但是,针对具体的应用,只需要修改设定的与我们系统有关的代码。当我们的U-boot 编译成功后,必要的二进制文件将成为在u-boot-1.1.3 文件夹中。这些文件中,最重要的是。
config.mk:定义基地址和CFLAGS。
MAKEALL:用来定义所有支持的系统板以及U-Boot 源码。
Makefile: U-Boot 编译时要用到的文件。
Mkconfig:用来创建头文件并链接生成针对系统板的U-Boot的脚本。
u-boot.bin:U-Boot 编译成功后形成的二进制文件,可以烧录到系统板的flash 中。
除了以上四个重要文件之后,在u-boot-1.1.3 目录下面还有一些重要的文件。
(1)在u-boot-1.1.3/board/下,重要的文件包括。
flash.c::定义针对flash 的命令。
init.S:用来定义 TLBs 和LAWs。
mpc8349.c: 针对mpc8349 的特殊代码。
u-boot.lds:: 系统板的链接文件。
(2)在u-boot-1.1.3/cpu/下, 主要的文件包括。
start.c::U-Boot 启动时所要执行的第一个程序。
spd_sdram.c:初始化和配置系统板的DDR。
(3)在u-boot-1.1.3/include/configs/下, 主要的文件包括。
MPC8349.h:针对系统板的具体局宏定义。
flash.h: 包含各种Flash 芯片的具体资料数据的定义。
(4)在u-boot-1.1.3/include/lib_ppc/下, 重要的文件包括。
board.c: 系统板的初始化函数。
(5)在u-boot-1.1.3/common/下, 重要的文件包括。
main.c: 整个U-Boot 启动时的主循环函数。
4 为MPC8349 制作合适的U-Boot
A 针对系统板的 U-Boot 修改
在控制计算机的硬件系统包括两片8M Flash, 128M SDRAM, 6 GBE 和 2 FCC 等。为了让U-Boot 在该系统上正确的运行 ,应该针对该系统设置一些特殊的结构参数选择。
(1)编辑 “Makefile” and “MAKEALL”
(2)添加新的代码到针对系统板的文件夹中。
在此过程中,我们应该创建一个新的目录用来存放系统的特殊代码。我们可以添加系统板需要的任何文件。在系统板的目录,有些文件是必须有的。
u-boot-1.1.3/board/mpc8349/mpc8349.c,
u-boot-1.1.3/board/mpc8349/flash.c,
u-boot-1.1.3/board/mpc8349/init.S,
u-boot-1.1.3/board/mpc8349/u-boot.lds,
u-boot-1.1.3/include/configs/MPC8349.h,
u-boot-1.1.3/lib_ppc/board.c,
u-boot-1.1.3/Makefile,
u-boot-1.1.3/MAKEALL.
B. U-Boot 的交叉编译环境的建立
开发系统主机的系统是FC6.0。用到的源码有gcc-3.4.3/glibc-2.3.2、Linux 2.6.13.4 和U-boot-1.1.3。
C. U-Boot 交叉编译的结果
首先,我们需要添加交叉编译器(powerpc-Linux-)到u-boot/Makefile 中。在开发主机上,编译器存在的路径为/embedded/mpc_85xx/bin/powerpc-Linux。在添加、修改完Makefile 后,我们就需要进行U-boot 的交叉编译了。应该输入以下命令:
# make distclean
# make MPC8349_config
# make
如果编译成功,会出现以下三个应用文件。
“u-boot/u-boot.bin” : raw binary image
“u-boot/u-boot “ : ELF binary image
“u-boot/u-boot.srec“ : Motorola S-Record image
5 安装 U-Boot
在把交叉编译好的U-Boot 文件安装到系统板上时,我们可以针对不同情况进行安装。如果系统板上以前没有U-Boot 型,我们可以使用的CodeWarrior 把U-Boot 烧录到系统板中。如果系统板已存在可以运行的U-Boot,我们可以利用U-Boot 可以直接下载新制作的U-Boot文件,从而实现U-Boot 的更新。
当使用U - Boot 在更新U-Boot 时,我们首先需要在U-Boot 的环境变量中设置各种参数。这些参数包括启动频率、系统板的ip 和TFTP 服务器的ip。为了查看U-Boot 的环境变量的设置情况,我们可以利用printenv 命令 ,从而确保所有的环境变量设置是否正确。然后,我们应该插入以太网电缆向TSEC1 端口。然后,我们应该按照下面的步骤。
(1) 通过TFTP 下载u-boot.bin 文件到系统板中的 RAM。需要用的命令是“tftp 1000000u-boot.bin”。
(2) 我们需要把u-boot.bin 文件拷贝到Flash 中。这里,我们需要取消Flash 的写保护。需要用到的命令是 “protect off fff80000 ffffffff”。
(3) 擦出Flash 上的数据。需要用到的命令是 “erase fff80000 ffffffff”。
(4) 把u-boot.bin 文件拷贝到Flash 中。需要用到的命令是 “cp.b 1000000 fff80000 80000”。至此,最新的U-Boot 已被安装到了MPC8349 控制计算机系统板上。
6 U-Boot 的使用
A 信息查看命令
Bdinfo:将在终端显示诸如内存地址和大小、时钟频率、MAC 地址等信息。这些信息在传递给Linux 内核一些参数时会用到。
Coninfo:显示控制台设备和信息。
Flinfo: 打印全部Flash 组的信息。
Iminfo:打印程序映像的开头信息,包含了映像内容的校验(序列号、头和校验和)。
Help:help 命令还能够查看每个命令的参数说明。
B. 内存管理命令
Base:显示或者设置一个“基地址”作为所有存储类命令的地址偏移值。
crc32:可以计算存储数据的校验和。
cmp:比较两块内存中的内容。
cp:可以在内存中复制数据块,包括对Flash 的读写操作memory copy。
md:显示内存区的内容。
mm:修改内存,地址自动递增。
mtest:提供一个简单地存储器测试。
mw:可以按照字节、字、长字写内存。
nm:可以修改内存,可以按照字节、字、长字操作。
loop:非常快速地读某个存储范围。因为这个命令力图最快速地读取存储单元,所以被用作一种特殊的存储器测试。
C. Flash 控制命令
cp:可以在内存中复制数据块,包括对Flash 的读写操作。
flinfo: 打印全部Flash 组的信息,也可以只打印其中某个组。一般嵌入式系统的Flash 只有一个组;
erase:可以擦Flash。
protect:对Flash 写保护的操作,可以使能和解除写保护。
D. 执行控制命令
autoscr:autoscr 命令,可以在U-BOOT 中运行“脚本”。
bootm:引导启动存储在内存(RAM 和可以永久保存的Flash)中的程序映像。
go:可以执行应用程序。
E. 下载命令
bootp:通过bootp 请求,要求DHCP 服务器分配IP 地址,然后通过TFTP 协议下载指定的文件到内存。
loadb:可以通过串口线下载二进制格式文件。
loads:可以通过串口线下载S-Record 格式文件。
rarpboot :可以使用TFTP 协议通过网络启动映像。也就是把指定的文件下载到指定地址,然后执行。
tftpboot : 可以使用TFTP 协议通过网络下载文件。按照二进制文件格式下载。
F. 环境变量命令
printenv :打印环境变量。
saveenv :保存变量。
setenv :可以设置环境变量。
run :可以执行环境变量中的命令,后面参数可以跟几个环境变量名。
bootd :运行 “bootcmd”的配置。
G.特殊命令
i2c:I2C 底层文件系统。
ide:IDE 底层文件系统 。
diskboot :从IDE 上启动。
H. 其他的命令
date:时钟设置与读取命令。
echo:回显参数。
reset:执行CPU 的复位。
sleep:可以延迟N 秒钟执行,N 为十进制数。
version:print monitor version。
? :得到所有命令列表。
baudrate :定义串口控制台的波特率。
bootargs :定义传递给Linux 内核的命令行参。
bootcmd :保留的环境变量,也是一种脚本。如果定义了该变量,在autoboot 模式下,将会执行该脚本的内容。
bootdelay : 定义执行自动启动的等候秒数。
bootfile :定义缺省的下载文件。
ethaddr :定义以太网接口0 的MAC 地址。
eth1addr:定义以太网接口1 的MAC 地址。
eth2addr :定义以太网接口2 的MAC 地址。
filesize : 定义通过TFTP 下载文件的大小。
gatewayip: 定义IP 地址的网关。
ipaddr :定义本地的IP 地址。
loadaddr : 定义通过TFTP 下载的默认地址 。
netmask :定义以太网接口的掩码。
serverip : 定义tftp 服务器端的IP 地址
7 结论
研究表明,在移植后U-Boot 可以运行安全、稳定地运行在MPC8349 控制计算机系统上面。然后,在U-Boot 可以用来初始化,测试的硬件或下载和运行程序代码。U-Boot 在以后给系统加载Linux 操作系统和应用程序,都表现出很好的稳定性,高效性。总之,在U-Boot-1.1.3 作为最新版本的U-Boot,具有很强的功能,我们把其移植到MPC8349 控制计算机系统上面,从而使该嵌入式系统顺利启动、稳定运行、便于开发。鉴于这些情况,MPC8349控制计算机系统的应用领域将会十分的广泛。
本文作者创新点:本文详细介绍了向MPC8349 控制计算机移植U-Boot 的方案。MPC8349控制计算机以其优越的网络功能,在很多领域有着广泛的应用。本方案把最新版本的U-Boot成功移植到硬件系统中,可以是MPC 控制计算机在嵌入式领域的开发更加便捷。