1、 u-boot简介
u-boot是由德国的工程师wolfgang denk从8xxrom代码发展而来的,它支持很多处理器,比如powerpc、arm、mips和x86。目前,u-boot源代码在sourceforge网站的社区服务器中,internet上有一群自由开发人员对其进行维护和开发,它的项目主页是http://sourceforge.net/projects/u-boot。u-boot的最新版本源代码可以在sourceforge的cvs服务器中匿名获得。
#cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
#cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot / co -p modulename
1.1 u-boot源代码目录结构
◆ 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是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体系结构相关的代码。
◆ tools:创建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格式,直接从串口下载并执行。
◆ 识别二进制、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内核镜像vmlinux前添加了一个特殊的头,这个头在include/image.h中定义,包括目标操作系统的种类(比如linux,vxworks等)、目标cpu的体系机构(比如arm、powerpc等)、映像文件压缩类型(比如gzip、bzip2等)、加载地址、入口地址、映像名称和映像的生成时间。当系统引导时,u-boot会对这个文件头进行crc校验,如果正确,才会跳到内核执行。如下所示:
◆ 单任务软件运行环境。u-boot可以动态加载和运行独立的应用程序,这些独立的应用程序可以利用u-boot控制台的i/o函数、内存申请和中断服务等。这些应用程序还可以在没有操作系统的情况下运行,是测试硬件系统很好的工具。
◆ 监控(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 serverip 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.15 kb = 0.00 mb
load address: 0x00000000
entry point: 0x00000000
contents:
image 0: 149 bytes = 0 kb = 0 mb
③ 在u-boot中加载并执行这个脚本。
wt-arm9# tftp 100000 /tftpboot/example.img
arp broadcast 1
tftp from server 10.0.0.2; our ip address is 10.0.0.99
filename ‘/tftpboot/tqm860l/example.img’。
load address: 0x100000
loading: #
done
bytes transferred = 221 (dd hex)
wt-arm9# autoscr 100000
## executing script at 00100000
network configuration:
----------------------
target:
ipaddr=10.0.0.99
hostname=arm
server:
serverip=10.0.0.2
rootpath=/nfsroot
wt-arm9#
◆ 支持watchdog、lcd logo和状态指示功能等。如果系统支持splash screen,u-boot启动时,会把这个图像显示到lcd上,给用户更友好的感觉。
◆ 支持mtd和文件系统。u-boot作为一种强大的bootloader,它不仅支持mtd,而且可以在mtd基础上实现多种文件系统,比如cramfs、fat和jffs2等。
◆ 支持中断。由于传统的bootloader都分为stage1和stage2,所以在stage2中添加中断处理服务十分困难,比如blob;而u-boot是把两个部分放到了一起,所以添加中断服务程序就很方便。
◆ 详细的开发文档。由于大多数bootloader都是开源项目,所以文档都不是很充分。u-boot的维护人员意识到了这个问题,充分记录了开发文档,所以它的移植要比blob等缺少文档的bootloader方便。
2 、对u-boot-1.1.0的修改
为了使u-boot-1.1.0支持新的开发板,一种简便的做法是在u-boot已经支持的开发板中选择一种接近的进行修改。由于u-boot-1.10不支持arm-922t内核,所以选择基于arm-920t内核的smdk2400为模板。相关的源代码在board/smdk2400/下。
2.1 支持arm-922t内核的代码修改
修改以下代码,使u-boot支持arm-922t内核。
① 在include/目录下新建文件arm922t.h,内容如下:
#ifndef __arm922t_h__
#define __arm922t_h__
#endif
② 在include/目录下新建文件wt-arm9.h,该文件描述了arm922t中timer、uart等寄存器的结构及若干宏定义。具体内容要参考相关处理器手册。
③ 在cpu/目录下新建目录arm922t,将目录arm920t下的内容复制后,参考手册分别修改cpu.c、interrupts.c和serial.c,其它文件不修改。
2.2 开发板的支持
建立自己开发板的目录和相关文件。
① 在include/configs目录中添加头文件lh7a400.h。这个文件是lh7a400开发板的配置文件,它包括开发板的cpu、系统时钟、ram、flash系统及其它相关的配置信息。其格式可参考include/configs/smdk2400.h。
② 在board/目录下新建wt-arm9目录,创建如下文件:flash.c、lhmemsetup.c、wt- arm9.c、makefile和u-boot.lds。
◆ flash.c。u-boot 读、写和删除flash设备的源代码文件。由于不同开发板中flash存储器的种类各不相同,所以,修改flash.c时需参考相应的flash芯片手册。它包括如下几个函数:
unsigned long flash_init (void ),flash初始化;
void flash_print_info (flash_info_t *info),打印flash信息;
int flash_erase (flash_info_t *info, int s_first, int s_last),flash擦除;
volatile static int write_dword (flash_info_t *info, ulong dest, ulong data),flash写入;
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt),从内存复制数据。
◆ lhmemsetup.c。初始化时钟、smc控制器和sdram控制器。
◆ wt-arm9.c。设置各种总线时钟,打开数据cache和指令cache,并设置相关内存参数。
◆ makefile。直接拷贝board/smdk2400/makefile,作如下修改:
objs := wt-arm9.o flash.o lhmemsetup.o
◆ u-boot.lds。设置u-boot中各个目标文件的连接地址,直接拷贝 board/smdk2400/u-boot.lds,作如下修改:
.text
{
cpu/arm922t/start.o (.text)
*(.text)
}
2.3 添加网口设备控制程序
在drivers/目录中添加网口设备控制程序dm9000.c 和dm9000.h,其中dm9000.c 主要包括以下函数:
int eth_init (bd_t *bd),初始化网络设备;
void eth_halt (void),关闭网络设备;
int eth_send (volatile void *packet,int len),发送数据包;
int eth_rx (void) 接收数据包。
用中断方式处理数据包的收发,因此还定义了另外两个函数:
void initinterrupt (void) ,中断初始化;
void dm9000_irq (void) ,中断处理。
以上两个函数在cpu/arm922t/interrupts.c中被调用,最后在drivers/makefile中加入dm9000.o。
2.4 修改makefile
在u-boot-1.1.0/makefile中加入
lh7a400_config : unconfig
@./mkconfig $(@:_config=) arm arm922t wt-arm9
其中“arm”是cpu的种类, arm922t 是arm cpu对应的代码目录,wt-arm9是自己开发板对应的目录。
交叉编译器安装在/opt/arm/3.3/bin/目录下,所以把cross_compile设置成相应的路径:
export cross_compile = /opt/arm/3.3/bin/arm-elf-
2.5 生成目标文件
先运行make clean,
[zeng@localhost u-boot-1.1.0]$make clean
然后运行make lh7a400_config,
[zeng@localhost u-boot-1.1.0]$ make lh7a400_config
configuring for lh7a400 board.。.
再运行make,
[zeng@localhost u-boot-1.1.0]$make
之后会生成三个文件:
u-boot——elf格式的文件,可以被大多数debug程序识别;
u-boot.bin——二进制bin文件,纯粹的u-boot二进制执行代码,不保存elf格式和调试信息。这个文件一般用于烧录到用户开发板中;
u-boot.srec——motorola s-record格式,可以通过串行口下载到开发板中。
2.6 测 试
通过jtag口将u-boot.bin烧写到flash的零地址,复位后执行u-boot。若运行正常,会从串口返回如下信息:
u-boot 1.1.0 (aug 21 2004 ?18:44:37)
u-boot code: c3f80000 -》 c3fa51a0 bss: -》 c3fa96ec
irq stack: c3f1ff7c
fiq stack: c3f1ef7c
ram configuration:
bank #0: c0000000 8 mb
bank #1: c1000000 8 mb
……
flash: 32 mb
in: serial
out: serial
err: serial
wt-arm9 #
输入help得到所有命令列表,help command 列出该命令的功能。紧接着测试flash和网卡,如果都正常工作的话,表明移植u-boot的工作基本完成,可以接着调试内核和文件系统。
结 语
bootloader是操作系统和硬件的枢纽,它为操作系统内核的启动提供了必要的条件和参数。在移植过程中,开发人员除了要掌握bootloader的结构和工作流程外,还要对相关硬件有一定的了解。目前,移植的u-boot已经能够稳定地运行在开发板上,而且可以通过flash和网络加载内核和文件系统,为后续开发,特别是驱动程序的开发奠定了良好的基础。
基于电力电子变压器并联运行动态仿真
Linux系统具有强大的包管理能力
诺基亚新旗舰,诺基亚7、诺基亚8或将一起来,就问诺粉期待不?
魔视智能MOTOVIS助力创维汽车,L2+超万台量产交付
Stibo Systems思迪博软件参加2021中国服贸会
U-BOOT的特点及利用其构建开发板的引导装载程序
欧司朗智能高天棚照明系统 推动工业4.0发展
multi-anode PMT
再创佳绩!歌尔MEMS厂商排名升至全球第六
iPhone12:为老用户开辟换机的机会
首款去中心化的区块链云存储应用产品DxBox正式发布
加拿大Bryston的分立元件大功率功放电路,High-power amplifier
电源电路图分享 电源防反接电路总结
大众汽车近日宣布向QuantumScape投资约1亿美元
主动出击,Commvault数据保护创新加速网络防御和响应
支付宝有1亿人能够集到敬业福卡,会有9000多万人分到几毛钱
Imagination宣布推出基于RISC-V的CPU产品系列
为打破美国的技术桎梏,欧盟17国决定投资研究半导体技术,拟继续供货华为
全球首个港口全面数字孪生技术底座“津鸿”发布
基于出租车系统中智能交通技术的应用