0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

U-BOOT的特点及利用其构建开发板的引导装载程序

电子设计 来源:单片机与嵌入式系统应用 作者:曾宏安;齐尧;焦 2020-03-03 07:57 次阅读

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和网络加载内核和文件系统,为后续开发,特别是驱动程序的开发奠定了良好的基础。

责任编辑:gt


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1384

    浏览量

    40460
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10922

    浏览量

    213292
  • 操作系统
    +关注

    关注

    37

    文章

    6905

    浏览量

    123872
收藏 人收藏

    评论

    相关推荐

    基于开发板U-Boot移植

    在飞凌S5PV210开发板上移植U-Boot 的过程主要包括以下四个步骤:1.下载U-Boot源码2.修改相应的文件代码3.编译U-Boot4.烧写到
    发表于 01-14 14:31

    u-boot详解

    。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它
    发表于 07-04 04:56

    如何用U-BOOT构建引导装载程序

    本文以U-BOOT为例,介绍了如何在ARM9开发板上移植BootLoader的过程。
    发表于 09-27 06:22

    基于U-BOOT的S3C44B0引导装载程序的设计与实现

    Bootloader(引导装载程序)是嵌入式系统开发的一个重要环节,它把操作系统和硬件平台衔接起来,对嵌入式系统后继软件开发十分重要。Das
    发表于 08-15 10:36 25次下载

    U-Boot的启动及移植分析

    bootloader 开发是嵌入式系统必不可少而且十分重要的部分,U-Boot 为功能强大的bootloader 开发软件。本文详细分析了U-Boot 的启动流程,并结合
    发表于 09-01 16:34 27次下载

    NIOS软核处理器的Linux引导程序U-boot设计

    摘要: 针对将uClinux向Nios处理器移植过程中的启动加载程序U-boot bootloader进行研究。首先介绍移植的步骤,然后利用bootloader的设计思想,着重讨论U-boot
    发表于 06-20 15:27 996次阅读
    NIOS软核处理器的Linux<b class='flag-5'>引导</b><b class='flag-5'>程序</b><b class='flag-5'>U-boot</b>设计

    嵌入式U-BOOT的启动流程及移植

    S3C44B0开发板上的移植方法和步骤。 u-boot是一个功能强大的bootloader开发软件,适用的CPU平台及
    发表于 02-25 16:00 59次下载

    使用U-boot运行测试程序

    本内容介绍了使用U-boot运行测试程序
    发表于 06-16 16:12 49次下载
    使用<b class='flag-5'>U-boot</b>运行测试<b class='flag-5'>程序</b>

    u-boot学习指南

    到自己的开发板上,这个过程主要是修改主芯片相关代码以及开发板硬件相关代码,包括启动文件 Start.s、NAND 读写程序、USB 通信程序、相应的 IO 口配置等
    发表于 11-17 15:54 2次下载

    u-boot简介

    演化而来。源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从
    发表于 10-14 11:17 3606次阅读

    U-Boot到OMAP5912开发板的移植

    U-Boot到OMAP5912开发板的移植
    发表于 10-27 10:23 8次下载
    <b class='flag-5'>U-Boot</b>到OMAP5912<b class='flag-5'>开发板</b>的移植

    详解U-Boot引导内核分析

    bootm命令是用来引导经过U-Boot的工具mkimage打包后的kernel image的。U-Boot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。
    的头像 发表于 04-13 15:22 5327次阅读
    详解<b class='flag-5'>U-Boot</b><b class='flag-5'>引导</b>内核分析

    u-boot】在stm32h7开发板体验u-boot

    u-boot在2017版本中加入了对Cortex-M系列内核的支持,正好手上有个h7的开发板,所以拿来试试,学习一下uboot。一 u-boot版本选择其实开始选用最早支持的版本比较好,因为新版本
    发表于 12-01 15:06 11次下载
    【<b class='flag-5'>u-boot</b>】在stm32h7<b class='flag-5'>开发板</b>体验<b class='flag-5'>u-boot</b>

    tiny4412编译与移植U-Boot

    U-Boot 是一个主要用于嵌入式系统的引导加载程序, U-Boot本质是一个裸机程序,是一种普遍用于嵌入式系统中的开源的Bootload
    的头像 发表于 08-31 08:59 1911次阅读
    tiny4412编译与移植<b class='flag-5'>U-Boot</b>

    Linux U-Boot开发指南

    介绍 U-Boot 的编译打包、基本配置、常用命令的使用、基本调试方法等, 为 U-BOOT 的移植及应用开发提供了基础。
    的头像 发表于 03-06 10:28 1396次阅读
    Linux <b class='flag-5'>U-Boot</b><b class='flag-5'>开发</b>指南