U-Boot 在ARM开发板上的移植以及代码分析.docVIP

  • 2
  • 0
  • 约1.45万字
  • 约 18页
  • 2017-12-04 发布于江西
  • 举报

U-Boot 在ARM开发板上的移植以及代码分析.doc

U-Boot 在ARM开发板上的移植以及代码分析

U-Boot 在44B0X 开发板上的移植以及代码分析 1. u-boot 介绍 ?????? u-boot 是一个open source 的bootloader,目前版本是1.1.2。u-boot 是在ppcboot 以及armboot 的基础上发展而来,相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。 ?????? 为什么我们需要u-boot?显然可以将uClinux 直接烧入flash,从而不需要额外的引导装载程序(bootloader)。但是从软件升级的角度以及程序修补的来说,软件的自动更新非常重要。事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的自动更新的需要就说明我们的开发是必要的。同时,u-boot 移植的过程也是一个对嵌入式系统包括软硬件以及操作系统加深理解的一个过程。 2. u-boot 移植的框架 移植u-boot 到新的开发板上仅需要修改和硬件相关的部分。在代码结构上: 1) 在board 目录下创建gold44b 目录,创建gold44b.c 以及flash.c,memsetup.S,u-boot.lds等。不需要从零开始,可选择一个相似的目录,直接复制过来,修改文件名以及内容。我在移植u-boot 过程中,选择的是Dave/B2目录。由于u-boot 已经包含基于s3c24b0 的开发板目录,作为参考,也可以复制相应的目录。 2) 在cpu 目录下创建s3c44b0x 目录,主要包含start.S,interrupts.c 以及cpu.c,serial.c几个文件。同样不需要从零开始建立文件,直接从arm720t 复制,然后修改相应内容。 3) 在include/configs 目录下添加gold44b.h,在这里放上全局的宏定义等。 4) 找到u-boot 根目录下Makefile 修改加入 gold44b_config : unconfig @./mkconfig $(@:_config=) arm s3c44b0 gold44b 5) 运行make ev44bii_config,如果没有错误就可以开始硬件相关代码移植的工作 3. u-boot 的体系结构 1) 总体结构 u-boot 是一个层次式结构。做移植工作的软件人员应当提供串口驱动(UART Driver),以太网驱动(Ethernet Driver),Flash 驱动(Flash 驱动),USB 驱动(USB Driver)。目前,通过USB 口下载程序显得不是十分必要,而且开发板上也没有USB接口,所以暂时没有移植USB 驱动。驱动层之上是u-boot 的应用,command 通过串口提供人机界面。我们可以使用一些命令做一些常用的工作,比如内存查看命令md。 Kermit 应用主要用来支持使用串口通过超级终端下载应用程序。TFTP 则是通过网络方式来下载应用程序,例如uClinux 操作系统。 2) 内存分布 gold44b 的flash 大小2M(8bits),现在将0-40000 共256k 作为u-boot 的存储空间。由于u-boot 中有一些环境变量,例如ip 地址,引导文件名等,可在命令行通过setenv 配置好,通过saveenv 保存在40000-50000(共64k)这段空间里。如果存在保存好的环境变量,u-boot 引导将直接使用这些环境变量。正如从代码分析中可以看到,我们会把flash 引导代码搬移到DRAM 中运行。u-boot 的代码在DRAM中的位置在u-boot-1.1.2/board/gold44b/config.mk配置如下:TEXT_BASE = 0x0C700000。这样,引导代码u-boot将从0x0000 0000 处搬移到0x0C700000 处。特别注意的由于gold44b uClinux 中断向量程序地址在0x0c000 0000 处,所以不能将程序下载到0x0c000 0000 出,通常下载到0x0c008 0000 处。 4. start.S 代码结构 1) 定义入口 一个可执行的Image 必须有一个入口点并且只能有一个唯一的全局入口,通常这个入口放在Rom(flash)的0x0 地址。例如start.S 中的 .globl _start _start: 值得注意的是你必须告诉编译器知道这个入口,这个工作主要是修改连接器脚本文件(lds)。 开发板上的u-boot.lds如下: OUTPUT_FORMAT(elf32-littlearm, elf32-littlearm, elf32-littlearm) OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x00

文档评论(0)

1亿VIP精品文档

相关文档