基于S3C2440的Bootloader研究.doc_第1页
基于S3C2440的Bootloader研究.doc_第2页
基于S3C2440的Bootloader研究.doc_第3页
基于S3C2440的Bootloader研究.doc_第4页
基于S3C2440的Bootloader研究.doc_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学校代码: 11059 学 号: 0805070326 H He ef fe ei i U Un ni iv ve er rs si it ty y 毕毕业业论论文文(设设计计) BACHELOR DISSERTATION 论文题目: 基于 S3C2440 的 Bootloader 研究 学位类别: 工学学士 年级专业(班级): 08 自动化(3)班 作者姓名: 尹强 导师姓名: 干开峰 完成时间: 2012-05-10 I 基基于于 S3C2440 的的 Bootloader 研研究究 中中文文摘摘要要 Bootloader 是嵌入式系统开发的一个重要环节 ,它在系统上电时开始执行, 完 成相关硬件设备初始化, 准备好软件 运行环境,最后调用操作系统内核。 Bootloader 把操作系统和硬件平台衔接起来 ,对嵌入式系统的后继软件开发十分重 要。 本课题深入研究了 当前嵌入式 系统开发中功能强大、稳定可靠的引导加 载程序 U-Boot 的特征、架构和 运行原理 ,然后以 S3C2440 微处理器为核心的开发板 作为 硬件平台,完成 了 U-Boot 移植。S3C2440 是基于 ARM920T 的 32 位 RISC 嵌入式 处理器, 它是目前市场上应用非常广泛的一款嵌入式处理器,具有通用性 。 本课题在移植过程中 实现了从 SDRAM 运行、Flash 启动、USB 下载、菜单操 作界面、下载 Yaffs2 文件系统 和启动 Linux 内核等功能。最后利用 S3C2440 开发 板进行实际测试, 证实了所 移植 U-Boot 功能的正确性 ,从而完成了基于 U-Boot 的 系统引导加载程序的构建 。 关关键键词词: 嵌嵌入入式式系系统统;S3C2440;Bootloader;U-Boot II Research of Bootloader based on S3C2440 ABSTRACT Bootloader is an important part of embedded system design. When the system is powered on, it will complete the related hardware device initialization, prepare software environment, and finally call the operating system kernel.Bootloader links up the operating system and hardware platform, it is very import to develope the subsequent software of embedded system. This topic studies in-depth the feature, structure and operation principle of U-Boot which is a powerful, stable and reliable bootloader in embedded system development,then completing the transplant of U-Boot using the development board as the hardware platform,whose core is S3C2440 microprocessor. S3C2440 is an embedded processor based on ARM920Ts 32 bits RISC, which is used widly in the market and versatility. The functions of SDRAM running, Flash-start, USB download and the menu operation interface are completed, the function of download Yaffs2 file system, and boot the Linux kernel are also supported. Finally,the S3C2440 development board is used to test, confirming the correctness of U-Boot transplantation function,so the build the system bootloader based on U-Boot is completed. KEY WORD: Embedded system;S3C2440;Bootloader;U-Boot III 目目录录 第一章 前言 .1 1.1 嵌入式系统简介.1 1.1.1 嵌入式系统定义1 1.1.2 嵌入式系统的发展1 1.2 Bootloader 概述2 1.2.1 Bootloader 的引入.2 1.2.2 Bootloader 的种类划分.2 1.2.3 Bootloader 研究意义.3 1.3 本文章节安排.3 第二章 S3C2440 微处理器 5 2.1 S3C2440 主要结构和体系5 2.2 S3C2440 主要片内资源6 第三章 U-Boot 移植实现 .8 3.1 U-Boot 简介8 3.1.1 U-Boot 主要特征.8 3.1.2 U-Boot 源码结构.8 3.2 U-Boot 启动模式和工作原理.9 3.2.1 U-Boot 启动模式.9 3.2.2 U-Boot 工作原理.10 3.3 U-Boot 的环境配置.15 3.3.1 Makefile 配置15 3.3.2 头文件配置17 3.4 支持在 SDRAM 中运行实现17 3.4.1 配置时钟.18 3.4.2 设置时钟初始化18 3.5 Flash 启动实现19 3.5.1 Flash 启动方式判断19 3.5.2 Nor Flash 启动实现.21 3.5.3 Nand Flash 启动实现.21 3.6 USB 下载实现.24 3.7 菜单操作界面实现25 3.7.1 U-Boot 命令.25 3.7.2 菜单操作界面实现26 3.8 支持烧写 Yaffs2 文件系统实现.27 3.9 内核启动实现.29 3.9.1 U-Boot 内核启动方式.29 3.9.2 添加支持启动内核30 第四章 功能测试 31 4.1 在 SDRAM 中运行测试31 IV 4.2 Flash 启动测试31 4.2.1 Nor Flash 启动测试.31 4.2.2 Nand Flash 启动测试.31 4.3 菜单操作界面测试32 4.4 启动内核与下载 Yaffs2 根文件系统测试32 第五章 总结 .33 参考文献 .错错误误!未未定定义义书书签签。 致谢 35 1 第第一一章章 前前言言 1 1. .1 1 嵌嵌入入式式系系统统简简介介 1.1.1 嵌入式系统定义 嵌入式系统是指用于执行独立功能的专用计算机系统。它由微处理器、定时器、 微控制器、存储器、传感器等一系列微电子芯片与器件,以及嵌入在存储器中的微型 操作系统和控制应用软件,共同实现诸如实时控制、监视、管理、移动计算、数据处 理等各种自动化处理任务。嵌入式系统以应用为中心,以微电子技术、控制技术、计 算机技术 和通信技术为基础,强调硬件和软件的协同性与整合性,并且软件与硬件可 剪裁,以满足系统对功能、成本、体积和功耗等的要求 1。 1.1.2 嵌入式系统的 发展 嵌入式技术在 20 世纪 70 年代起源于微型机,从此之后,通用计算机与嵌入式计 算机就走上了两种不同的道路。通用计算机系统的技术要求是高速、海量的数值计算; 技术发展方向是总线技术的无限提升,存储容量的无限扩大。而嵌入式计算机系统的 要求则是对象的智能化控制能力;技术发展方向是与对象系统密切的嵌入性能、控 制能力与控制的可靠性。 嵌入式技术的发展日新月异,经历了单片机(SCM),微控制器 (MCU),系统级 芯片(SoC)3 个阶段。 (1) SCM(Single Chip Microcomputer ) SCM 又称单片微型,简称单片机,随着大规模集成电路的发展,计算机的 CPU、RAM、ROM、定时器和多种 I/O 接口集成在一片芯片上,形成芯片级计算机。 这个阶段主要是 “寻求”单片形态嵌入式系统的最佳体系结构,也是从这个阶段起, 通用计算机与嵌入式计算机就走上了两种不同的道路。 (2) MCU(Micro Controller Unit) MCU 即微控制器阶段的特征是: “满足”各类嵌入式应用,根据对象系统要求 扩展各种外围电路和接口电路,突显其对象的智能控制能力。它所涉及的领域都与对 象系统相关,因此,发展 MCU 的重任不可避免地电气、电子技术厂家身上。 (3)SoC(System on a chip) 2 随着设计与制造技术的发展,集成电路的 设计从晶体管的集成发展到逻辑门的 集成,现在又发展到 IP 的集成,即 SoC 设计技术。 SoC 可以有效地降低电子 /信息 系统的开发成本,缩短开发周期,提高产品的竞争力,是未来工业界将采用的最主要 的产品开发方式。 嵌入式软件随着硬件的发展也发生了很大的变化。在SCM、MCU 阶段,嵌入 式软件的编写通常由相关行业的电气、电子专家编写,计算机专业队伍并没有真正进 入单片机应用领域。因此,电子技术应用工程师以自己习惯性的电子技术应用模式从 事单片机的应用开发。这种应用模式最重要的特点是:软、硬件的底层性和随意性; 对象系统的专业技术的密切相关性;缺少计算机工程设计方法。 随着嵌入式处理器性能的快速提高,网络、通信、多媒体技术得以发展,很多嵌 入式设备 具备收发邮件、编写文档、试听等功能,计算机专业人士开始进入嵌入式领 域。这形成了明显的技术特点:基于操作系统、以网络、通信为主的“非嵌入式底 层应用”除了要完成功能比较特殊、性能比较苛刻外,嵌入式应用软件的开发已经 和普通软件没有区别。实际上,很多基于操作系统的嵌入式应用程序就是在PC 机 上模拟验证,最后才移入嵌入式设备的。 1 1. .2 2 Bootloader 概概述述 1.2.1 Bootloader 的引入 随着各种微处理器功能越来越强大以及软件上对操作系统的支持,使得整个嵌 入式系统拥有了完整构架 。近年来各种嵌 入式操作系统也是层出 不穷以适应各种不 同功能的微处理器 ,然而如何加载操作系统却成了 嵌入式系统遇到的第一个拦路虎。 根据一些处理器的硬件实例可知, 系统上电之后,需要一段程序来进行初始化:关 闭 WATCHDOG、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等 2。能够完成这些功能的程序称为 Bootloader。简单地说, Bootloader 就是这么一 小段程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用 操作系统内核。 它把嵌入式硬件和嵌入式操作系统衔接起来,对于嵌入式系统后续软 件的开发十分重要,在整个开发中也占有相当大的比例 3。 1.2.2 Bootloader 的种类划分 嵌入式世界已经有了各种各样的Bootloader,种类划分也有多种方式,除了按照 处理器体系结构不同划分以外,还有功能复杂程度的不同。首先需要区分一下 3 “Bootloader”和“Monitor”的概念。严格来说, “Bootloader”只是引导设备并且 执行主程序的固件;而 “Monitor”还提供了更多的命令行接口,可以进行调试、读 写内存、烧写 Flash、配置环境变量等。 “Monitor”在嵌入式系统开发过程中可以 提供更好的调试功能,开发完成以后,就完全设置成了一个“Bootloader”。所以 习惯上大家把它们统称为 Bootloader。下面在 表 1 中列出了一些 Bootloader 的种类 的描述和所支持的平台 。 表 1 开放源码 Linux 引导程序 BootloaderMonitor描述X86ARM LILO否Linux 磁盘引导程序是否 GRUB否GNU 的 LILO 替代程序是否 Loadlin否从 DOS 引导 Linux是否 ROLO否从 ROM 引导 Linux 而不要 BIOS是否 Etherboot否通过以太网卡启动 Linux 系统的固件是否 LinuxBIOS否完全替代 BUIS 的 Linux 引导程序是否 BLOB否LART 等硬件平台的引导程序否否 U-Boot是通用引导程序是是 RedBoot是基于 eCos 的引导程序是是 由于本设计 使用的 S3C2440 微处理器属于 ARM 平台,而 U-Boot 作为通用的 引导程序,具有强大的功能,因此选择U-Boot 作为 Bootloader 的研究对象。 本课 题主要针对 U-Boot 进行分析与研究。 1.2.3 Bootloader 研究意义 对于嵌入式系统, Bootloader 是基于特定硬件平台来实现的。 几乎不可能为所 有的嵌入式系统建立一个通用的 Bootloader,不同的处理器架构都有不同的 Bootloader。Bootloader 不但依赖于 CPU 的体系结构,而且依赖于嵌入式系统板级设 备的配置。对于 2 块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运 行在一块板子上的 Bootloader 程序也能运行在另一块板子上,一般也都需要修改 Bootloader 的源程序。 因此我们需要对它进行研究修改来适应不同的开发板平台,最 终达到启动内核的目的,为嵌入式软件以后的开发提供基础 4。 1 1. .3 3 本本文文章章节节安安排排 第一章,前言,介绍了嵌入式和 Bootloader 的相关概念。 第二章,S3C2440 微处理器, 叙述 S3C2440 微处理器的结构体系和片内资源。 第三章,U-Boot 移植实现, 着重讲解 U-Boot 的原理、流程以及针对开发板的 4 具体功能实现方式。 第四章,功能测试, 是对实现的功能进行测试。 第五章,总结,对毕业设计进行 总结。 5 第第二二章章 S S3 3C C2 24 44 40 0 微微处处理理器器 2 2. .1 1 S3C2440 主主要要结结构构和和体体系系 S3C2440 的频率是 400MHz,其 ARM920T 核由 ARM9TDMI、存储管理单元 (MMU)和高速缓存三部分组成。其中, MMU 可以管理虚拟内存,高速缓存由独立 的 16KB 地址和 16KB 数据高速 Cache 组成。ARM920T 有两个内部协处理器: CP14 和 CP15。CP14 用于调试控制, CP15 用于存储系统控制以及测试控制。 S3C2440 处理器为手持设备和通用嵌入式应用提供片上集成系统解决方案,包括: 16/32 位 RISC 体系结构和 ARM920T 内核强大的指令集; 加强的 ARM 体系结构 MMU 用于支持 WinCE,EPOC32 和 Linux;指令高速存储缓存器 (I-Cache),数据 高速存储缓冲器 (D-Cache),写缓冲器和物理地址 TAG RAM 减少主存带宽和响应性 带来的影响; 采用 ARM920T CPU 内核支持 ARM 调试体系结构; 内部高级微控 制总线(AMBA)体系结构 (AMBA2.0,AHB/APB);支持高速总线模式和异步总线模 式,支持外部等待信号延长总线周期 5。ARM920T 的内部结构如图 1 所示。 图 1 ARM920T 的内部结构 2 2. .2 2 S3C2440 主主要要片片内内资资源源 S3C2440 的片内资源非常丰富,主要包括: 6 (1) 1.2V 内核供电, 1.8V/2.5V/ 3.3V 存储器供电, 3.3V 外部 I/O 供电,具备 16KB 的 I-Cache 和 16KB 的 D-Cache/MMU 微处理器。 (2) 外部存储控制器 (SDRAM 控制和片选逻辑 ),提供访问外部存储器所需要的 存储器控制信号,主要具有以下几个特性:支持大/ 小端方式;支持高速总线模式 和异步总线模式; 8 个存储器 bank,寻址空间:每个 bank 128MB,总共 1GB;支 持可编程的每 bank 8/16/32 位数据总线带宽;支持掉电时的SDRAM 自刷新模式; 支持各种种型号的 ROM 引导,支持从 NAND FLASH 存储器启动,采用 4KB 内 部缓冲器进行启动引导,支持启动之后NAND 存储器仍然作为外部存储器使用。 (3) LCD 控制器(最大支持 4K 色 STN 和 256K 色 TFT),主要完成这样的功能: 将视频缓冲中的图像数据发送到外部LCD 中,另外提供一个专业 DMA 通道。 (4) 4 通道 DMA,并有外部请求引脚。 (5) 3 通道 UART(IrDA1.0,64 字节 Tx FIFO,和 64 字节 Rx FIFO),支持 5 位, 6 位,7 位或者 8 位串行数据发送 / 接收,支持外部时钟作为 UART 的运行时钟 , 可编程的波特率 。 (6) 2 通道 SPI,用于发送 和接受的 8 位移位寄存器,兼容 SPI 协议 2.11 版。 (7) 1 通道 IIC-BUS 接口(多主支持 ),可进行串行, 8 位,双向数据传输,标准 模式下数据传输速度可达 100kbit/s ,快速模式下可达到 400kbit/s。 (8) 1 通道 IIS-BUS 音频编解码接口, 串行方式,每通道 8/ 16 位数据传输 ,支 持 IIS 格式和 MSB-justified 数据格式 。 (9) AC97 解码器接口, 兼容 SD 主接口协议 1.0 版和 MMC 卡协议 2.11 兼容版; 所有的通道支持 16 位采样,具有可变采样率的 AC97 编解码接口 。 (10) 2 端口 USB 主机/1 端口 USB 设备(1.1 版);2 个主设备接口的特点是: 兼 容 OHCI ver1.0 规格,两个下向流端口 ,支持低速和全速 USB 设备。 (11) 4 通道 PWM 定时器和 1 通道内部定时器 / 看门狗定时器; PWM 具有可 编程的占空比周期、频率和极性 ,能产生死区支持外部时钟源 。 (12) 8 通道 10 比特 ADC 和触摸屏接口; (13) 具有日历功能的 RTC,全面的时钟特性:秒、分、时、日期、星期、月和 年,具有报警中断 。 (14) 相机接口 (最大 4096 x 4096 像素的输入支持。 2048 x2048 像素输入时,支 持缩放); 7 (15) 130 个通用 I/O 口和 24 通道外部中断源; (16) 具有普通,慢速,空闲和掉电模式; (17) 具有 PLL 片上时钟发生器。 S3C2440 内部资源 分别连接在高速总线和低速总线上, 如图 2 所示。 图 2 片内资源连接图 8 第第三三章章 U U- -B Bo oo ot t 移移植植实实现现 3 3. .1 1 U-Boot 简简介介 U-Boot,全称为 Universal Boot Loader,即通用 Bootloader,是遵循 GPL 条款 的开放源代码项目 6。其前身是由德国 DENX 软件工程中心 Wolfgang Denk 基于 8xxROM 的源码创建的 PPCBOOT 工程。后来整理代码结构使得非常容易增加其他 类型的开发板、其他架构的CPU(原来只支持 PowerPC);增加更多的功能,比如启 动 Linux、下载 S-Record 格式的文件、通过网络启动、通过 PCMCIA/CompactFLash/ATA disk/SCSI 等方式启动。 3.1.1 U-Boot 主要特征 U-Boot 具有以下特征: (1) 开放源码; (2) 支持多种嵌入式操作系统内核,如 Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS; (3) 支持多个处理器系列, 如 PowerPC、ARM、x86、MIPS、XScale; (4) 较高的可靠性和稳定性; (5) 高度灵活的功能设置,适合U-Boot 调试、操作系统不同引导要求、产品发 布等; (6) 丰富的设备驱动源码,如串口、以太网、 SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; (7) 较为丰富的开发调试文档与强大的网络技术支持。 3.1.2 U-Boot 源码结构 本课题是在 U-Boot-1.3.4 的基础上进行分析与研究,从 官网下载 U-Boot- 1.3.4.tar.bz2 后解压即得到全部源码。 U-Boot-1.3.4 根目录下 共有 20 多个子目录, 可以分为 4 类: (1) 平台相关的或开发板相关的; 9 (2) 通用的函数; (3) 通用的设备驱动程序; (4) U-Boot 工具、示例程序、文档。 其中主要子目录的功能与作用如表2 所示。 表 2 U-Boot 顶层目录说明 目录特征解释说明 board开发板相关 对应不同配置的电路板(即使CPU 相同), 比如 smdk2410、sbc2410x cpu 对应不同的 CPU,比如 arm920t、arm925t、i386 等;在它们的子目录 下仍可以进一步细分,比如arm920t 下就有 at91rm9200、s3c24x0 lib_arm 类似 平台相关 某一架构下通用的文件 include 头文件和开发板配置文件,开发板的配置文件 都放在 include/configs 目录下, U-Boot 没有 make menuconfig 类似的莱单来进行可视化配 置, 需要手动地修改配置文件中的宏定义 lib_generic通用的库函数,比如 printf 等 common 通用函数 通用的函数,多是对下一层驱动程序的进一步 封装 drivers 各类具体设备的驱动程序,基本上可以通用, 它们通过宏从外面引入平台 /开发板相关的函 数 fs文件系统 nand_spl U-Boot 一般从 ROM、NOR Flash 等设备启 动,现在开始支持从 NANDFlash 启动,但是 支持的 CPU 种类还不多 post 通用的设备 驱动程序 上电自检程序 doc文档开发、使用文档 examples示例程序一些测试程序,可以使用 U-Boot 下载后运行 tools工具 制作 S-Record、U-Boot 格式映象的工具,比 如 mkimage 10 3 3. .2 2 U-Boot 启启动动模模式式和和工工作作原原理理 3.2.1 U-Boot 启动模式 大多数 Bootloader 都包含两种不同的操作模式: “启动加载 ”模式“下载”模 式7,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Bootloader 的 作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。 启动加载( Boot loading)模式:这种模式也称为 “自主“(Autonomous)模式。 也即 Bootloader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行, 整个过程并没有用户 的介入。这种模式是 Bootloader 的正常工作模式,因此在嵌入式产 品发布的时侯,Bootloader 显然必须工作在这种模式下。 下载(Downloading)模式:在这种模式下,目标机上的 Bootloader 将通过串口连接 或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像 等。从主机下载的文件通常首先被 Bootloader 保存到目标机的 RAM 中,然后再被 Bootloader 写到目标机上的FLASH 类固态存储设备中。BootLoader 的这种模式通常在第 一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Bootloader 的这 种工作模式。工作于这种模式下的 Bootloader 通常都会向它的终端用户提供一个简单的 命令行接口。U-Boot 这样功能强大的Bootloader同时支持这两种工作模式,而且允许用户 在这两种工作模式之间进行切换。 3.2.2 U-Boot 工作原理 大多数 Bootloader 都分为阶段 1(stage1)和阶段 2(stage2)两大部分 8,U-Boot 也 不例外。依赖于 CPU 体系结构的代码(如 CPU 初始化代码等)通常都放在阶段1 中且通常用汇编语言实现,而阶段2 则通常用 C 语言来实现,这样可以实现复杂的 功能,而且有更好的可读性和移 值性。U-Boot 的运行流程 如图 3 所示。 11 系统复位转入u-boot的 stage1入口点 设置异常向量表 关闭看门狗,屏蔽所有 中断,设置CPU的时钟 初始化内存控制器,关 闭MMU、CACHE和 RAM时钟 拷贝u-boot的stage2代码 到RAM空间 设置堆栈,初始化数据 段 跳转到stage2的C函数 入口点 初始化Flash设备 初始化系统内存 初始化NAND、串口、 网络等设备 将内核从flash读到RAM中 设置内核启动参数并调用 内核 图 3 U-Boot 运行流程图 U-Boot 的 stage1 代码通常放在 start.S 文件中,它用汇编语言写成,其主要代码 和作用如下: (1) 定义入口由于一个可执行的Image 必须有一个入口点,并且只能有一个全局 入口,通常这个入口放在 ROM(Flash) 的 0x0 地址,因此,必须 通知编译器以使其 知道这个入口,该工作可通过修改连接器脚本来完成。 .globl _start (2) 设置异常向量 (Exception Vector) _start:b start_code /各个异常向量对应的跳转代码复位0x0 ldrpc, _undefined_instruction /未定义的指令 异常 0x4 ldrpc, _software_interrupt /软件中断异常 0x8 ldrpc, _prefetch_abort /内存操作异常 0xc ldrpc, _data_abort /数据异常 0x10 ldrpc, _not_used /未使用异常 0x14 ldrpc, _irq /慢速中断异常 0x18 ldrpc, _fiq /快速中断异常 0x1c (3) 设置 CPU 为 SVC 模式,清看门狗,关所有中断 mrs r0,cpsr /读 cpsr 寄存器状态 bic r0,r0,#0x1f /位清除,清除 0x1f 对应的位 orr r0,r0,#0xd3 /设置 M=10011,superviser 模式 msr cpsr,r0 /写 cpsr 寄存器 12 ldr r0, =pWTCON /读看门狗寄存器 mov r1, #0x0 str r1, r0 /根据 S3C2440 手册,写 0 关看门狗 ldr r1, =0x3ff ldr r0, =INTSUBMSK /读中断寄存器 str r1, r0 (4) 设置 CPU 的速度、时钟频率 /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN movr1, #3 str r1, r0 (5) 初始化内存控制器 bl lowlevel_init (6) 将 FLASH 中的程序复制到 RAM 中 relocate: /* relocate U-Boot to RAM*/ adr r0, _start /* r0 fb_base) addr = (_bss_end + (PAGE_SIZE - 1) size = lcd_setmem (addr); gd-fb_base = addr; #endif /* CONFIG_LCD */ (6) 初始化相关网络设备,填写IP、MAC 地址等 #ifdef CONFIG_DRIVER_CS8900 cs8900_get_enetaddr (gd-bd-bi_enetaddr); #endif (7) 进入命令循环 (即整个 boot 的工作循环 ),接受用户从串口输入的命令,然 后进行: for (;) main_loop (); /common/main.c 3 3. .3 3 U-Boot 的的环环境境配配置置 3.3.1 Makefile 配置 U-Boot 的源码是通过 GCC 和 Makefile 组织编译的。顶层目录下的 Makefile 首先可以设置开发板的定义,然后递归地调用各级子目录下的 Makefile,最后把 编译过的程序链接成 U-Boot 映像。 顶层目录下的 Makefile 负责 U-Boot 整体配置编译,按照配置的顺序阅读其中关 键的几行。对于 每一种开发板在 Makefile 都需要有板子配置的定义。 例如 smdk2410 开发板的定义如下: smdk2410_config : unconfig $(MKCONFIG) $(:_config=) arm arm920t smdk2410 NULL s3c24x0 执行配置 U-Boot 的命令 make smdk2410_config,通过./mkconfig 脚本生成 16 include/config.mk 的配置文件。文件内容正是根据Makefile 对开发板的配置生成的 : ARCH= arm CPU= arm920t BOARD= smdk2410 SOC = s3c24x0 上面的 include/config.mk 文件定义了 ARCH、CPU、BOARD、SOC 这些变量, 这样硬件平台依赖的目录文件可以根据这些定义来确定。SMDK2410 平台相关目录 如下。 board/smdk2410/ :库文件 board/smdk2410/libsmdk2410.a cpu/arm920t/ :库文件 cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/ :库文件 cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/ :库文件 lib_arm/libarm.a include/asm-arm/ :下面两个是头文件 include/configs/smdk2410.h 可以根据上述规则定义自己的开发板 (本课题使用的是 GT2440 开发板): GT2440_config :unconfig $(MKCONFIG) $(:_config=) arm arm920t GT2440 NULL s3c24x0 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 # U-Boot objectsorder is important (i.e. start must be first) OBJS = cpu/$(CPU)/start.o /处理器相关的目标文件 ,start.o 必须放在第一 位 LIBS = lib_generic/libgeneric.a LIBS += cpu/$(CPU)/lib$(CPU).a ifdef SOC LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a Endif LIBS += lib_$(ARCH)/lib$(ARCH).a /定义依赖的目录,每个目录下先把目标文 件连接成 *.a 文件,然后说明 U-Boot 映像编 译的依赖关系 。 all: $(ALL) $(obj)u-boot.srec: $(obj)u-boot 17 $(OBJCOPY) $OBJCFLAGS -O srec $.h。 用相应的 BOARD 定义代替。 这 个头文件中主要定义了两类变量 : 一类是选项,前缀是 CONFIG_,用来选择处理器、设备接口、命令、属性等。 例如: #define CONFIG_ARM920T 1 #define CONFIG_DRIVER_CS8900 1 另一类是参数,前缀是 CFG_,用来定义总线频率、串口波特率、 Flash 地址等 参数。例如 : #define CFG_FLASH_BASE 0x00000000 #define CFG_LOAD_ADDR 0x30008000 配置完成,执行 make smdk2410_config 配置开发板,再 执行 make 就可以得到 18 U-Boot 各种格式的映像文件和符号表 9,如表 3 所示。 表 3 U-Boot 编译生成的映像文件 文件名称说明 System.mapU-Boot 映像的符号表 u-boot.binU-Boot 映像原始的二进制格式 u-bootU-Boot 映像的 ELF 格式 u-boot.srecU-Boot 映像的 S-Record 格式 U-Boot 的 3 种映像格式都可以烧写 Flash 中,但需要看加载器能否识别这些格 式。一般 u-boot.bin 最为常用,直接按照二进制格式下载,并且按照绝对地址烧写 到 Flash 中就可以了。 U-Boot 和 u-boot.srec 格式映像都自带定位信息。 3 3. .4 4 支支持持在在 S SD DR RA AM M 中中运运行行实实现现 U-Boot 直接下载到 SDRAM 中运行,不需要再初始化内存控制器,但 需要修改 系统时钟和配置开发板的头文件来支持在SDRAM 中运行 10,实现流程 如图 5 所 示。 开始 修改时钟分频系数 设置时钟初始化 获取时钟计算公式 添加运行的宏 图 5 支持 SDRAM 实现流程 3.4.1 配置时钟 首先需要修改时钟分频系数,在board/GT2440/GT2440 中,设置以下参数分别 为: #define M_MDIV 0x7F #define M_PDIV 0x2 #define M_SDIV 0x1 19 这是根据 s3c2440 芯片手册的电源与时钟管理中的参数修改的,意思是使CPU 的运行频率为 405M。这样设置 FCLK:HCLK:PCLK = 1:4:8,分别是 FCLK=400M,HCLK=100M,PCLK=50M。这样设置的目的是由于 S3C2440 的主频为 405MHz,让它以最大速度运行。 下面修改 SDRAM 的刷新频率 ,根据 SDRAM 手册中的值,在 board/GT2440/lowlevel_init.S 中设置 REFCNT 寄存器为: #define REFCNT0x4f4 3.4.2 设置时钟初始化 在 U-Boot 启动的第一阶段中,设置了CPU 的时钟,但不符合 S3C2440 的时钟 频率,因此将它注释掉,重新添加 : #define MPLLCON 0x4C000004 #define UPLLCON 0x4c000008 #define LOCKTIME 0x4C000000 #define CAMDIVN 0x4C000018 ldr r0,=LOCKTIME ldr r1,=0xffffffff str r1,r0 /手册说 HDIVN 不为 0,加这个 改为为异步总线模式 mrc p15, 0, r1, c1, c0, 0 /read ctrl register orr r1, r1, #0xc0000000 /Asynchronous mcr p15, 0, r1, c1, c0, 0 /write ctrl register ldr r0, =UPLLCON /同时修改 UPLLCON 和 MPLLCON 需要先修 ldr r1, =0x00038022 /改 UPLLCON,且之间要间隔至少 7 个 nop str r1,r0 nop nop nop nop nop nop nop nop ldr r0, =MPLLCON ldr r1, =0x0007f021 /具体值参照手册 中的设定值 str r1,r0 为了获得时钟计算公式 ,根据 S3C2440 手册中的计算公式, 在 cpu/arm920t/s3c24x0/speed.c 中做如下修改: 20 return(CONFIG_SYS_CLK_FREQ * m * 2) / (p IO_ADDR_R = (void *) chip-IO_ADDR_W = (void *) chip-hwcontrol = s3c2440_nand_hwcontrol; chip-dev_ready = s3c2440_nand_devready; chip-select_chip = s3c2440_nand_select_chip; chip-options = 0; 2实现代码搬移 23 对于 S3C2440 开发板,系统上电后会自动将Nand Flash 中的前 4K 代码放入片 内 4K 的 SRAM 中运行,在这部分代码执行过程中,需要将U-Boot 复制到 SDRAM 中运行。 在第一阶段的 start.S 中添加相关代码 12: nand_boot: #ifdef CONFIG_S3C2440_NAND_BOOT 1 mov r1,#NAND_CTL_BASE ldr r2,=(7skipfirstblk; if (skipfirstblk) mtdoffset += erasesize_blockalign; skipfirstblk = 0; continue; 3 3. .9 9 内内核核启启动动实实现现 3.9.1 U-Boot 内核启动方式 在启动内核之前,需要设置一些启动参数,然后再启动内核,设置启动参数就 是在某个地址按某种格式保存数据,然后由内核读出。这种格式称为TAG,在 do_bootm_linux 函数中设置 : setup_start_tag (bd); setup_serial_tag ( setup_revision_tag ( setup_memory_tags (bd); 30 setup_commandline_tag (bd, commandline); setup_initrd_tag (bd, initrd_start, initrd_end); setup_videolfb_tag (gd_t *) gd); setup_end_tag (bd); 这些环境变量最先设置的是, start_tag,params = (struct tag *) bd- bi_boot_params;将环境变量放在 bi_boot_params,地址为 0x30000100,从这个地 址开始存放环境变量 。 在 U-Boot 的第二阶段最后进入死循环,等待用户输入相关命令,然后U-Boot 通过解析这个命令 ,执行相应功能,对于启动内核的命令为: nand read 0x30007FC0 0x240000 0x200000;bootm 0x30007FC0 其中,nand read 0x30007FC0 0x240000 0x200000 的意思是将内核从 Nand Flash 的 0x240000 地址开始读 0x200000 的内容大小到 SDRAM 的 0x30007FC0 地址处。 bootm 0x30007FC0 就是从该地址启动。 在 common/cmd_bootm.c 中定义了 do_bootm();里面需要调用 image_header 这 个结构体,这个结构体有两个主要参数: uint32_tih_load; uint32_tih_ep; ih_load 表示加载地址, ih_ep 表示入口地址。在 Flash 中存储的内核是 uImage,它是 64K 的头部加上真正的内核组成,首先需要读出头部,然后移动。 memmove ( memmove (void *) ntohl(hdr-ih_load), (uchar *)data, len); 将真正的内核 data 移到 in_load 这个加载地址上去,如果 data 刚好处于 in_load 这个地址上,就不需要在移动,这样可以节省很多时间,由于在程序中定义 了加载地址: #define CFG_LOAD_ADDR0x30008000,减去 64K 正好是 0x30007FC0,此地址为入口地址,所以可以不用移动。然后启动内核: do_bootm_linux (cmdtp, flag, argc, argv, 在这个函数中启动内核 ,主要指两条代码 theKernel = (void (*)(int, int, uint)ep; theKernel (0, machid, bd-bi_boot_params); theKernel 指向内核的入口地址,然后跳到入口地址去执行。machid 为机器码, 为了让内核判断是否支持所用的单板, bi_boot_params 环境变量的存放地址。这样 就可以启动内核, U-Boot 将控制权交给内核。 31 3.9.2 添加支持启动内核 根据上述分析在 include/configs/GT2440.h 中定义: #define CONFIG_SETUP_MEMORY_TAGS 1 #define CONFIG_INITRD_TAG 1 #define CONFIG_CMDLINE_TAG 1 #define CONFIG_BOOTARGS“noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200“ 其中:mtdblock2 表示根文件系统在 mtd 第二分区 ,/linuxrc 表示根目录下 linuxrc,console=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论