首页 嵌入式Linux应用程序开发详解-基于ARM

嵌入式Linux应用程序开发详解-基于ARM

举报
开通vip

嵌入式Linux应用程序开发详解-基于ARM 华清远见-嵌入式培训专家(www.farsight.com.cn) 第 6章 Bootloader 本章目标 本章介绍了 Bootloader的概念和类型,重点讲解了 U-Boot的开 发调试和使用。通过学习 U-Boot 软件,可以使读者充分理解 Bootloader的工作原理和代码实现。 Bootloader概况 U-Boot软件开发 U-Boot使用技巧 6.1 Bootloader 对于计算机系统来说,从开机上电到操作系...

嵌入式Linux应用程序开发详解-基于ARM
华清远见-嵌入式 培训 焊锡培训资料ppt免费下载焊接培训教程 ppt 下载特设培训下载班长管理培训下载培训时间表下载 专家(www.farsight.com.cn) 第 6章 Bootloader 本章目标 本章介绍了 Bootloader的概念和类型,重点讲解了 U-Boot的开 发调试和使用。通过学习 U-Boot 软件,可以使读者充分理解 Bootloader的工作原理和代码实现。 Bootloader概况 U-Boot软件开发 U-Boot使用技巧 6.1 Bootloader 对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式 Linux系 统同样离不开引导程序,这个引导程序就叫作 Bootloader。 6.1.1 Bootloader介绍 Bootloader 是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始 化硬件设备、建立内存空间的映射 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf ,从而建立适当的系统软硬件环境,为最终调用操作系 统内核做好准备。 对于嵌入式系统,Bootloader 是基于特定硬件平台来实现的。因此,几乎不可能为所有 的嵌入式系统建立一个通用的 Bootloader,不同的处理器架构都有不同的 Bootloader。 Bootloader不但依赖于 CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于 2块 不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的 Bootloader 程序也能运行在另一块板子上,一般也都需要修改 Bootloader的源程序。 反过来,大部分 Bootloader仍然具有很多共性,某些 Bootloader也能够支持多种体系结 构的嵌入式系统。例如,U-Boot就同时支持 PowerPC、ARM、MIPS和 X86等体系结构,支 持的板子有上百种。通常,它们都能够自动从存储介质上启动,都能够引导操作系统启动, 并且大部分都可以支持串口和以太网接口。 第6 章 Bootloader 109║ 华清远见“嵌入式 Linux系统开发班”培训教材 本章将对各种 Bootloader 总结分类,分析它们的共同特点。以 U-Boot 为例,详细讨论 Bootloader的设计与实现。 6.1.2 Bootloader的启动 Linux系统是通过 Bootloader引导启动的。一上电,就要执行 Bootloader来初始化系统。 可以通过第 4章的 Linux启动过程框图回顾一下。 系统加电或复位后,所有 CPU都会从某个地址开始执行,这是由处理器设计决定的。比 如,X86的复位向量在高地址端,ARM处理器在复位时从地址 0x00000000取第一条指令。 嵌入式系统的开发板都要把板上 ROM 或 Flash 映射到这个地址。因此,必须把 Bootloader 程序存储在相应的 Flash位置。系统加电后,CPU将首先执行它。 主机和目标机之间一般有串口可以连接,Bootloader 软件通常会通过串口来输入输出。 例如:输出出错或者执行结果信息到串口终端,从串口终端读取用户控制命令等。 Bootloader启动过程通常是多阶段的,这样既能提供复杂的功能,又有很好的可移植性。 例如:从 Flash启动的 Bootloader多数是两阶段的启动过程。从后面 U-Boot的内容可以详细 分析这个特性。 大多数 Bootloader 都包含 2 种不同的操作模式:本地加载模式和远程下载模式。这 2 种操作模式的区别仅对于开发人员才有意义,也就是不同启动方式的使用。从最终用户的 角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的本地加载模式与远程 下载模式的区别。 因为 Bootloader的主要功能是引导操作系统启动,所以我们详细讨论一下各种启动方式 的特点。 1.网络启动方式 这种方式开发板不需要配置较大的存储介质,跟无盘工作站有点类似。但是使用这种启 动方式之前,需要把 Bootloader安装到板上的 EPROM或者 Flash中。Bootloader通过以太网 接口远程下载 Linux内核映像或者文件系统。第 4章介绍的交叉开发环境就是以网络启动方 式建立的。这种方式对于嵌入式系统开发来说非常重要。 使用这种方式也有前提条件,就是目标板有串口、以太网接口或者其他连接方式。串口 一般可以作为控制台,同时可以用来下载内核影像和 RAMDISK文件系统。串口通信传输速 率过低,不适合用来挂接 NFS文件系统。所以以太网接口成为通用的互连设备,一般的开发 板都可以配置 10M以太网接口。 对于 PDA等手持设备来说,以太网的 RJ-45接口显得大了些,而 USB接口,特别是 USB 的迷你接口,尺寸非常小。对于开发的嵌入式系统,可以把 USB接口虚拟成以太网接口来通 讯。这种方式在开发主机和开发板两端都需要驱动程序。 另外,还要在服务器上配置启动相关网络服务。Bootloader 下载文件一般都使用 TFTP 网络 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 ,还可以通过 DHCP的方式动态配置 IP地址。 DHCP/BOOTP服务为 Bootloader 分配 IP地址,配置网络参数,然后才能够支持网络传 输功能。如果 Bootloader可以直接设置网络参数,就可以不使用 DHCP。 TFTP服务为 Bootloader客户端提供文件下载功能,把内核映像和其他文件放在/tftpboot ║110 嵌入式 系统开发技术详解——基于 ARM 《嵌入式 Linux系统开发技术详解-基于 ARM》图书样章 目录下。这样 Bootloader可以通过简单的 TFTP协议远程下载内核映像到内存。如图 6.1所示。 HOST TARGET 以太网连接 NFS BIOSBOOTP TFTP 启动内核内核映像 目标板文 件系统 图 6.1 网络启动示意图 大部分引导程序都能够支持网络启动方式。例如:BIOS 的 PXE(Preboot Execution Environment)功能就是网络启动方式;U-Boot也支持网络启动功能。 2.磁盘启动方式 传统的 Linux 系统运行在台式机或者服务器上,这些计算机一般都使用 BIOS 引导,并 且使用磁盘作为存储介质。如果进入 BIOS设置菜单,可以探测处理器、内存、硬盘等设备, 可以设置 BIOS从软盘、光盘或者某块硬盘启动。也就是说,BIOS并不直接引导操作系统。 那么在硬盘的主引导区,还需要一个 Bootloader。这个 Bootloader 可以从磁盘文件系统中把 操作系统引导起来。 Linux传统上是通过 LILO(LInux LOader)引导的,后来又出现了 GNU的软件 GRUB GRand Unified Bootloader)。这 2种 Bootloader广泛应用在 X86的 Linux系统上。你的开发 主机可能就使用了其中一种,熟悉它们有助于配置多种系统引导功能。 LILO软件工程是由Werner Almesberger创建,专门为引导 Linux开发的。现在 LILO的 维护者是 John Coffman,最新版本下载站点:http://lilo.go.dyndns.org。LILO有详细的文档, 例如 LILO套件中附带使用手册和参考手册。此外,还可以在 LDP的“LILO mini-HOWTO” 中找到 LILO的使用指南。 GRUB是 GNU计划的主要 bootloader。GRUB最初是由 Erich Boleyn为 GNU Mach操作 系统撰写的引导程序。后来有 Gordon Matzigkeit和 Okuji Yoshinori接替 Erich的工作,继续 维护和开发 GRUB。GRUB的网站 http://www.gnu.org/software/grub/上有对套件使用的说明文 件,叫作《GRUB manual》。GRUB能够使用 TFTP和 BOOTP或者 DHCP通过网络启动,这 种功能对于系统开发过程很有用。 除了传统的 Linux系统上的引导程序以外,还有其他一些引导程序,也可以支持磁盘引 导启动。例如:LoadLin可以从 DOS下启动 Linux;还有 ROLO、LinuxBIOS,U-Boot也支 持这种功能。 3.Flash启动方式 大多数嵌入式系统上都使用 Flash存储介质。Flash有很多类型,包括 NOR Flash、NAND 第6 章 Bootloader 111║ 华清远见“嵌入式 Linux系统开发班”培训教材 Flash和其他半导体盘。其中,NOR Flash(也就是线性 Flash)使用最为普遍。 NOR Flash可以支持随机访问,所以代码是可以直接在 Flash上执行的。Bootloader一般 是存储在 Flash芯片上的。另外,Linux内核映像和 RAMDISK也可以存储在 Flash上。通常 需要把 Flash分区使用,每个区的大小应该是 Flash擦除块大小的整数倍。图 6.2是 Bootloader 和内核映像以及文件系统的分区表。 内核映像 Bootloader 文件系统 参数 图 6.2 Flash存储示意图 Bootloader 一般放在 Flash 的底端或者顶端,这要根据处理器的复位向量设置。要使 Bootloader的入口位于处理器上电执行第一条指令的位置。 接下来分配参数区,这里可以作为 Bootloader的参数保存区域。 再下来内核映像区。Bootloader 引导 Linux 内核,就是要从这个地方把内核映像解压到 RAM中去,然后跳转到内核映像入口执行。 然后是文件系统区。如果使用 Ramdisk文件系统,则需要 Bootloader把它解压到 RAM中。 如果使用 JFFS2文件系统,将直接挂接为根文件系统。这两种文件系统将在第 12章详细讲解。 最后还可以分出一些数据区,这要根据实际需要和 Flash大小来考虑了。 这些分区是开发者定义的,Bootloader 一般直接读写对应的偏移地址。到了 Linux 内核 空间,可以配置成MTD设备来访问 Flash分区。但是,有的 Bootloader也支持分区的功能, 例如:Redboot可以创建 Flash分区表,并且内核MTD驱动可以解析出 redboot的分区表。 除了 NOR Flash,还有 NAND Flash、Compact Flash、DiskOnChip等。这些 Flash具有芯 片价格低,存储容量大的特点。但是这些芯片一般通过专用控制器的 I/O 方式来访问,不能 随机访问,因此引导方式跟 NOR Flash也不同。在这些芯片上,需要配置专用的引导程序。 通常,这种引导程序起始的一段代码就把整个引导程序复制到 RAM 中运行,从而实现自举 启动,这跟从磁盘上启动有些相似。 6.1.3 Bootloader的种类 嵌入式系统世界已经有各种各样的 Bootloader,种类划分也有多种方式。除了按照处理 器体系结构不同划分以外,还有功能复杂程度的不同。 首先区分一下“Bootloader”和“Monitor”的概念。严格来说,“Bootloader”只是引导 设备并且执行主程序的固件;而“Monitor”还提供了更多的命令行接口,可以进行调试、读 写内存、烧写 Flash、配置环境变量等。“Monitor”在嵌入式系统开发过程中可以提供很好的 调试功能,开发完成以后,就完全设置成了一个“Bootloader”。所以,习惯上大家把它们统 称为 Bootloader。 表 6.1 列出了 Linux 的开放源码引导程序及其支持的体系结构。表中给出了 X86 ARM PowerPC体系结构的常用引导程序,并且注明了每一种引导程序是不是“Monitor”。 ║112 嵌入式 系统开发技术详解——基于 ARM 《嵌入式 Linux系统开发技术详解-基于 ARM》图书样章 表 6.1 开放源码的 Linux 引导程序 Bootloader Monitor 描 述 x86 ARM PowerPC LILO 否 Linux磁盘引导程序 是 否 否 GRUB 否 GNU的 LILO替代程序 是 否 否 Loadlin 否 从 DOS引导 Linux 是 否 否 ROLO 否 从 ROM引导 Linux而不需要 BIOS 是 否 否 Etherboot 否 通过以太网卡启动 Linux系统的固件 是 否 否 LinuxBIOS 否 完全替代 BUIS的 Linux引导程序 是 否 否 BLOB 否 LART等硬件平台的引导程序 否 是 否 U-boot 是 通用引导程序 是 是 是 RedBoot 是 基于 eCos的引导程序 是 是 是 对于每种体系结构,都有一系列开放源码 Bootloader可以选用。 (1)X86 X86 的工作站和服务器上一般使用 LILO 和 GRUB。LILO 是 Linux 发行版主流的 Bootloader。不过 Redhat Linux发行版已经使用了 GRUB,GRUB比 LILO有更有好的显示界 面,使用配置也更加灵活方便。 在某些 X86 嵌入式单板机或者特殊设备上,会采用其他 Bootloader,例如:ROLO。这 些 Bootloader可以取代 BIOS的功能,能够从 FLASH中直接引导 Linux启动。现在 ROLO支 持的开发板已经并入 U-Boot,所以 U-Boot也可以支持 X86平台。 (2)ARM ARM 处理器的芯片商很多,所以每种芯片的开发板都有自己的 Bootloader。结果 ARM bootloader也变得多种多样。最早有为ARM720处理器的开发板的固件,又有了armboot,StrongARM 平台的blob,还有S3C2410处理器开发板上的vivi等。现在armboot已经并入了U-Boot,所以U-Boot 也支持ARM/XSCALE平台。U-Boot已经成为ARM平台事实上的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 Bootloader。 (3)PowerPC PowerPC 平台的处理器有标准的 Bootloader,就是 ppcboot。PPCBOOT 在合并 armboot 等之后,创建了 U-Boot,成为各种体系结构开发板的通用引导程序。U-Boot仍然是 PowerPC 平台的主要 Bootloader。 (4)MIPS MIPS公司开发的 YAMON是标准的 Bootloader,也有许多MIPS芯片商为自己的开发板 写了 Bootloader。现在,U-Boot也已经支持MIPS平台。 (5)SH SH平台的标准 Bootloader是 sh-boot。Redboot在这种平台上也很好用。 (6)M68K M68K平台没有标准的 Bootloader。Redboot能够支持 m68k系列的系统。 值得说明的是 Redboot,它几乎能够支持所有的体系结构,包括MIPS、SH、M68K等体 系结构。Redboot是以 eCos为基础,采用 GPL许可的开源软件工程。现在由 core eCos的开 第6 章 Bootloader 113║ 华清远见“嵌入式 Linux系统开发班”培训教材 发人员维护,源码下载网站是 http://www.ecoscentric.com/snapshots。Redboot的文档也相当完 善,有详细的使用手册《RedBoot User’s Guide》。 6.2 U-Boot编程 U-Boot作为通用的 Bootloader,U-Boot可以方便地移植到其他硬件平台上,其源代码也 值得开发者们研究学习。 6.2.1 U-Boot工程简介 最早,DENX软件工程中心的Wolfgang Denk基于 8xxrom的源码创建了 PPCBOOT工程, 并且不断添加处理器的支持。后来,Sysgo Gmbh 把 ppcboot 移植到 ARM 平台上,创建了 ARMboot工程。然后以 ppcboot工程和 armboot工程为基础,创建了 U-Boot工程。 现在 U-Boot已经能够支持 PowerPC、ARM、X86、MIPS体系结构的上百种开发板,已 经成为功能最多、灵活性最强并且开发最积极的开放源码 Bootloader。目前仍然由 DENX的 Wolfgang Denk维护。 U-Boot 的源码包可以从 sourceforge 网站下载,还可以订阅该网站活跃的 U-Boot Users 邮件论坛,这个邮件论坛对于 U-Boot的开发和使用都很有帮助。 U-Boot软件包下载网站:http://sourceforge.net/project/u-boot。 U-Boot邮件列表网站:http://lists.sourceforge.net/lists/listinfo/u-boot-users/。 DENX相关的网站:http://www.denx.de/re/DPLG.html。 6.2.2 U-Boot源码结构 从网站上下载得到 U-Boot源码包,例如:U-Boot-1.1.2.tar.bz2 解压就可以得到全部 U-Boot源程序。在顶层目录下有 18个子目录,分别存放和管理不 同的源程序。这些目录中所要存放的文件有其规则,可以分为 3类。 · 第 1类目录与处理器体系结构或者开发板硬件直接相关; · 第 2类目录是一些通用的函数或者驱动程序; · 第 3类目录是 U-Boot的应用程序、工具或者文档。 表 6.2列出了 U-Boot顶层目录下各级目录存放原则。 表 6.2 U-Boot的源码顶层目录说明 目 录 特 性 解 释 说 明 board 平台依赖 存放电路板相关的目录文件,例如:RPXlite(mpc8xx)、smdk2410(arm920t)、 sc520_cdp(x86) 等目录 cpu 平台依赖 存放 CPU相关的目录文件,例如:mpc8xx、ppc4xx、arm720t、arm920t、 xscale、i386等目录 lib_ppc 平台依赖 存放对 PowerPC 体系结构通用的文件,主要用于实现 PowerPC 平台通用 的函数 ║114 嵌入式 系统开发技术详解——基于 ARM 《嵌入式 Linux系统开发技术详解-基于 ARM》图书样章 续表 目 录 特 性 解 释 说 明 lib_arm 平台依赖 存放对 ARM体系结构通用的文件,主要用于实现 ARM平台通用的函数 lib_i386 平台依赖 存放对 X86体系结构通用的文件,主要用于实现 X86平台通用的函数 include 通用 头文件和开发板配置文件,所有开发板的配置文件都在 configs目录下 common 通用 通用的多功能函数实现 lib_generic 通用 通用库函数的实现 Net 通用 存放网络的程序 Fs 通用 存放文件系统的程序 Post 通用 存放上电自检程序 drivers 通用 通用的设备驱动程序,主要有以太网接口的驱动 Disk 通用 硬盘接口程序 Rtc 通用 RTC的驱动程序 Dtt 通用 数字温度测量器或者传感器的驱动 examples 应用例程 一些独立运行的应用程序的例子,例如 helloworld tools 工具 存放制作 S-Record 或者 U-Boot 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 的映像等工具,例如 mkimage Doc 文档 开发使用文档 U-Boot的源代码包含对几十种处理器、数百种开发板的支持。可是对于特定的开发板, 配置编译过程只需要其中部分程序。这里具体以 S3C2410 arm920t 处理器为例,具体分析 S3C2410处理器和开发板所依赖的程序,以及 U-Boot的通用函数和工具。 6.2.3 U-Boot的编译 U-Boot的源码是通过 GCC和Makefile组织编译的。顶层目录下的Makefile首先可以设 置开发板的定义,然后递归地调用各级子目录下的 Makefile,最后把编译过的程序链接成 U-Boot映像。 1.顶层目录下的 Makefile 它负责 U-Boot整体配置编译。按照配置的顺序阅读其中关键的几行。 每一种开发板在 Makefile 都需要有板子配置的定义。例如 smdk2410 开发板的定义 如下。 smdk2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 执行配置 U-Boot的命令 make smdk2410_config,通过./mkconfig脚本生成 include/config. mk的配置文件。文件内容正是根据Makefile对开发板的配置生成的。 第6 章 Bootloader 115║ 华清远见“嵌入式 Linux系统开发班”培训教材 ARCH = arm CPU = arm920t BOARD = smdk2410 SOC = s3c24x0 上面的 include/config.mk文件定义了 ARCH、CPU、BOARD、SOC这些变量。这样硬件 平台依赖的目录文件可以根据这些定义来确定。SMDK2410平台相关目录如下。 board/smdk2410/ cpu/arm920t/ cpu/arm920t/s3c24x0/ lib_arm/ include/asm-arm/ include/configs/smdk2410.h 再回到顶层目录的Makefile文件开始的部分,其中下列几行包含了这些变量的定义。 # load ARCH, BOARD, and CPU configuration include include/config.mk export ARCH CPU BOARD VENDOR SOC Makefile的编译选项和规则在顶层目录的 config.mk文件中定义。各种体系结构通用的 规则直接在这个文件中定义。通过 ARCH、CPU、BOARD、SOC 等变量为不同硬件平台定 义不同选项。不同体系结构的规则分别包含在 ppc_config.mk、arm_config.mk、mips_config.mk 等文件中。 顶层目录的Makefile中还要定义交叉编译器,以及编译 U-Boot所依赖的目标文件。 ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- //交叉编译器的前缀 #endif export CROSS_COMPILE … # U-Boot objects....order is important (i.e. start must be first) OBJS = cpu/$(CPU)/start.o //处理器相关的目标文件 … LIBS = lib_generic/libgeneric.a //定义依赖的目录,每个目录下先把目标 文件连接成*.a文件。 LIBS += board/$(BOARDDIR)/lib$(BOARD).a LIBS += cpu/$(CPU)/lib$(CPU).a ifdef SOC LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a endif LIBS += lib_$(ARCH)/lib$(ARCH).a ║116 嵌入式 系统开发技术详解——基于 ARM 《嵌入式 Linux系统开发技术详解-基于 ARM》图书样章 … 然后还有 U-Boot映像编译的依赖关系。 ALL = u-boot.srec u-boot.bin System.map all: $(ALL) u-boot.srec: u-boot $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ u-boot.bin: u-boot $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ …… u-boot: depend $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT) UNDEF_SYM='$(OBJDUMP) -x $(LIBS) \ |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\ $(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) \ --start-group $(LIBS) $(PLATFORM_LIBS) --end-group \ -Map u-boot.map -o u-boot Makefile 缺省的编译目标为 all,包括 u-boot.srec、u-boot.bin、System.map。u-boot.srec 和 u-boot.bin又依赖于 U-Boot。U-Boot就是通过 ld命令按照 u-boot.map地址表把目标文 件组装成 u-boot。 其他Makefile内容就不再详细分析了,上述代码分析应该可以为阅读代码提供了一个线索。 2.开发板配置头文件 除了编译过程Makefile以外,还要在程序中为开发板定义配置选项或者参数。这个头文 件是 include/configs/.h。用相应的 BOARD定义代替。 这个头文件中主要定义了两类变量。 一类是选项,前缀是 CONFIG_,用来选择处理器、设备接口、命令、属性等。例如: #define CONFIG_ARM920T 1 #define CONFIG_DRIVER_CS8900 1 另一类是参数,前缀是 CFG_,用来定义总线频率、串口波特率、Flash 地址等参数。 例如: #define CFG_FLASH_BASE 0x00000000 #define CFG_PROMPT "=>" 3.编译结果 根据对Makefile的分析,编译分为 2步。第 1步配置,例如:make smdk2410_config; 第 2步编译,执行 make就可以了。 编译完成后,可以得到 U-Boot各种格式的映像文件和符号表,如表 6.3所示。 第6 章 Bootloader 117║ 华清远见“嵌入式 Linux系统开发班”培训教材 表 6.3 U-Boot编译生成的映像文件 文 件 名 称 说 明 文 件 名 称 说 明 System.map U-Boot映像的符号表 u-boot.bin U-Boot映像原始的二进制格式 u-boot U-Boot映像的 ELF格式 u-boot.srec U-Boot映像的 S-Record格式 U-Boot的 3种映像格式都可以烧写到 Flash中,但需要看加载器能否识别这些格式。一 般 u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到 Flash中就可以 了。U-Boot和 u-boot.srec格式映像都自带定位信息。 4.U-Boot工具 在 tools目录下还有些 U-Boot的工具。这些工具有的也经常用到。表 6.4说明了几种工 具的用途。 表 6.4 U-Boot的工具 工 具 名 称 说 明 工 具 名 称 说 明 bmp_logo 制作标记的位图结构体 img2srec 转换 SREC格式映像 envcrc 校验 u-boot内部嵌入的环境变量 mkimage 转换 U-Boot格式映像 gen_eth_addr 生成以太网接口MAC地址 updater U-Boot自动更新升级工具 这些工具都有源代码,可以参考改写其他工具。其中mkimage是很常用的一个工具,Linux 内核映像和 ramdisk文件系统映像都可以转换成 U-Boot的格式。 6.2.4 U-Boot的移植 U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为 Bootloader是 完全依赖硬件平台的,所以在新电路板上需要移植 U-Boot程序。 开始移植 U-Boot之前,先要熟悉硬件电路板和处理器。确认 U-Boot是否已经支持新开 发板的处理器和 I/O设备。假如 U-Boot已经支持一块非常相似的电路板,那么移植的过程将 非常简单。 移植 U-Boot工作就是添加开发板硬件相关的文件、配置选项,然后配置编译。 开始移植之前,需要先分析一下 U-Boot 已经支持的开发板,比较出硬件配置最接近的 开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等 外围接口。还要验证一下这个参考开发板的 U-Boot,至少能够配置编译通过。 以 S3C2410处理器的开发板为例,U-Boot-1.1.2版本已经支持 SMDK2410开发板。我们 可以基于 SMDK2410移植,那么先把 SMDK2410编译通过。 我们以S3C2410开发板 fs2410为例说明。移植的过程参考SMDK2410开发板,SMDK2410 在 U-Boot-1.1.2中已经支持。 移植 U-Boot的基本步骤如下。 (1)在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。 smdk2410_config : unconfig ║118 嵌入式 系统开发技术详解——基于 ARM 《嵌入式 Linux系统开发技术详解-基于 ARM》图书样章 @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 参考上面 2行,添加下面 2行。 fs2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t fs2410 NULL s3c24x0 (2)创建一个新目录存放开发板相关的代码,并且添加文件。 board/fs2410/config.mk board/fs2410/flash.c board/fs2410/fs2410.c board/fs2410/Makefile board/fs2410/memsetup.S board/fs2410/u-boot.lds (3)为开发板添加新的配置文件 可以先复制参考开发板的配置文件,再修改。例如: $cp include/configs/smdk2410.h include/configs/fs2410.h 如果是为一颗新的 CPU移植,还要创建一个新的目录存放 CPU相关的代码。 (4)配置开发板 $ make fs2410_config (5)编译 U-Boot 执行 make命令,编译成功可以得到 U-Boot映像。有些错误是跟配置选项是有关系的, 通常打开某些功能选项会带来一些错误,一开始可以尽量跟参考板配置相同。 (6)添加驱动或者功能选项 在能够编译通过的基础上,还要实现 U-Boot的以太网接口、Flash擦写等功能。 对于 FS2410 开发板的以太网驱动和 smdk2410 完全相同,所以可以直接使用。CS8900 驱动程序文件如下。 drivers/cs8900.c drivers/cs8900.h 对于 Flash的选择就麻烦多了,Flash芯片价格或者采购方面的因素都有影响。多数开发 板大小、型号不都相同。所以还需要移植 Flash 的驱动。每种开发板目录下一般都有 flash.c 这个文件,需要根据具体的 Flash类型修改。例如: board/fs2410/flash.c (7)调试 U-Boot源代码,直到 U-Boot在开发板上能够正常启动。 调试的过程可能是很艰难的,需要借助工具,并且有些问题可能困扰很长时间。 6.2.5 添加 U-Boot命令 U-Boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板 需要很特殊的操作,可以添加新的 U-Boot命令。 U-Boot的每一个命令都是通过 U_Boot_CMD宏定义的。这个宏在 include/command.h头 第6 章 Bootloader 119║ 华清远见“嵌入式 Linux系统开发班”培训教材 文件中定义,每一个命令定义一个 cmd_tbl_t结构体。 #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help} 这样每一个 U-Boot 命令有一个结构体来描述。结构体包含的成员变量:命令名称、最 大参数个数、重复数、命令执行函数、用法、帮助。 从控制台输入的命令是由 common/command.c中的程序解释执行的。find_cmd()负责匹配 输入的命令,从列表中找出对应的命令结构体。 基于 U-Boot 命令的基本框架,来分析一下简单的 icache 操作命令,就可以知道添加新 命令的方法。 (1)定义 CACHE命令。在 include/cmd_confdefs.h中定义了所有 U-Boot命令的标志位。 #define CFG_CMD_CACHE 0x00000010ULL /* icache, dcache */ 如果有更多的命令,也要在这里添加定义。 (2)实现 CACHE命令的操作函数。下面是 common/cmd_cache.c文件中 icache命令部分 的代码。 #if (CONFIG_COMMANDS & CFG_CMD_CACHE) static int on_off (const char *s) { //这个函数解析参数,判断是打开 cache,还是关闭 cache if (strcmp(s, "on") == 0) { //参数为“on” return (1); } else if (strcmp(s, "off") == 0) { //参数为“off” return (0); } return (-1); } int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { //对指令 cache的操作函数 switch (argc) { case 2: /* 参数个数为 1,则执行打开或者关闭指令 cache操作 */ switch (on_off(argv[1])) { case 0: icache_disable(); //打开指令 cache break; case 1: icache_enable (); //关闭指令 cache break; } /* FALL TROUGH */ ║120 嵌入式 系统开发技术详解——基于 ARM 《嵌入式 Linux系统开发技术详解-基于 ARM》图书样章 case 1: /* 参数个数为 0,则获取指令 cache状态*/ printf ("Instruction Cache is %s\n", icache_status() ? "ON" : "OFF"); return 0; default: //其他缺省情况下,打印命令使用说明 printf ("Usage:\n%s\n", cmdtp->usage); return 1; } return 0; } …… U_Boot_CMD( //通过宏定义命令 icache, 2, 1, do_icache, //命令为 icache,命令执行函数为 do_icache() "icache - enable or disable instruction cache\n", //帮助信息 "[on, off]\n" " - enable or disable instruction cache\n" ); …… #endif U-Boot的命令都是通过结构体__U_Boot_cmd_##name来描述的。根据 U_Boot_CMD在 include/command.h中的两行定义可以明白。 #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help} 还有,不要忘了在 common/Makefile中添加编译的目标文件。 (3)打开 CONFIG_COMMANDS选项的命令标志位。这个程序文件开头有#if语句需要 预处理是否包含这个命令函数。CONFIG_COMMANDS选项在开发板的配置文件中定义。例 如:SMDK2410平台在 include/configs/smdk2410.h中有如下定义。 /*********************************************************** * Command definition ***********************************************************/ #define CONFIG_COMMANDS \ (CONFIG_CMD_DFL | \ CFG_CMD_CACHE | \ CFG_CMD_REGINFO | \ CFG_CMD_DATE | \ CFG_CMD_ELF) 按照这 3步,就可以添加新的 U-Boot命令。 第6 章 Bootloader 121║ 华清远见“嵌入式 Linux系统开发班”培训教材 6.3 U-Boot的调试 新移植的 U-Boot不能正常工作,这时就需要调试了。调试 U-Boot离不开工具,只有理 解 U-Boot启动过程,才能正确地调试 U-Boot源码。 6.3.1 硬件调试器 硬件电路板制作完成以后,这时上面还没有任何程序,就叫作裸板。首要的工作是把程 序或者固件加载到裸板上,这就要通过硬件工具来完成。习惯上,这种硬件工具叫作仿真器。 仿真器可以通过处理器的 JTAG等接口控制板子,直接把程序下载到目标板内存,或者进行 Flash编程。如果板上的 Flash是可以拔插的,就可以通过专用的 Flash烧写器来完成。在第 4章 介绍过目标板跟主机之间的连接,其中 JTAG等接口就是专门用来连接仿真器的。 仿真器还有一个重要的功能就是在线调试程序,这对于调试 Bootloader和硬件测试程序 很有用。 从最简单的 JTAG电缆,到 ICE仿真器,再到可以调试 Linux内核的仿真器。 复杂的仿真器可以支持与计算机间的以太网或者 USB接口通信。 对于 U-Boot的调试,可以采用 BDI2000。BDI2000完全可以反汇编地跟踪 Flash中的程 序,也可以进行源码级的调试。 使用 BDI2000调试 U-boot的方法如下。 (1)配置 BDI2000和目标板初始化程序,连接目标板。 (2)添加 U-Boot的调试编译选项,重新编译。 U-Boot的程序代码是位置相关的,调试的时候尽量在内存中调试,可以修改连接定位地 址 TEXT_BASE。TEXT_BASE在 board//config.mk中定义。 另外,如果有复位向量也需要先从链接脚本中去掉。链接脚本是 board// -boot.lds。 添加调试选项,在 config.mk文件中查找,DBGFLAGS,加上-g选项。然后重新编译 U-Boot。 (3)下载 U-Boot到目标板内存。 通过 BDI2000的下载命令 LOAD,把程序加载到目标板内存中。然后跳转到U-Boot入口。 (4)启动 GDB调试。 启动 GDB 调试,这里是交叉调试的 GDB。GDB 与 BDI2000 建立链接,然后就可以设 置断点执行了。 $ arm-linux-gdb u-boot (gdb)target remote 192.168.1.100:2001 (gdb)stepi (gdb)b start_armboot (gdb)c 6.3.2 软件跟踪 假如 U-Boot 没有任何串口打印信息,手头又没有硬件调试工具,那样怎么知道 U-Boot ║122 嵌入式 系统开发技术详解——基于 ARM 《嵌入式 Linux系统开发技术详解-基于 ARM》图书样章 执行到什么地方了呢?可以通过开发板上的 LED指示灯判断。 开发板上最好设计安装八段数码管等 LED,可以用来显示数字或者数字位。 U-Boot 可以定义函数 show_boot_progress (int status),用来指示当前启动进度。在 include/common.h头文件中声明这个函数。 #ifdef CONFIG_SHOW_BOOT_PROGRESS void show_boot_progress (int status); #endif CONFIG_SHOW_BOOT_PROGRESS是需要定义的。这个在板子配置的头文件中定义。 CSB226开发板对这项功能有完整实现,可以参考。在头文件 include/configs/csb226.h中,有 下列一行。 #define CONFIG_SHOW_BOOT_PROGRESS 1 函数 show_boot_progress (int status)的实现跟开发板关系密切,所以一般在 board目录下 的文件中实现。看一下 CSB226在 board/csb226/csb226.c中的实现函数。 /** 设置 CSB226板的 0、1、2三个指示灯的开关状态 * csb226_set_led: - switch LEDs on or off * @param led: LED to switch (0,1,2) * @param state: switch on (1) or off (0) */ void csb226_set_led(int led, int state) { switch(led) { case 0: if (state==1) { GPCR0 |= CSB226_USER_LED0; } else if (state==0) { GPSR0 |= CSB226_USER_LED0; } break; case 1: if (state==1) { GPCR0 |= CSB226_USER_LED1; } else if (state==0) { GPSR0 |= CSB226_USER_LED1; } break; case 2: if (state==1) { GPCR0 |= CSB226_USER_LED2; } else if (state==0) { 第6 章 Bootloader 123║ 华清远见“嵌入式 Linux系统开发班”培训教材 GPSR0 |= CSB226_USER_LED2; } break; } return; } /** 显示启动进度函数,在比较重要的阶段,设置三个灯为亮的状态(1, 5, 15)*/ void show_boot_progress (int status) { switch(status) {
本文档为【嵌入式Linux应用程序开发详解-基于ARM】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_995061
暂无简介~
格式:pdf
大小:487KB
软件:PDF阅读器
页数:35
分类:工学
上传时间:2010-12-17
浏览量:30