U-Boot在AT91RM9200上的移植及启动分析

(三)U-Boot在AT91RM9200上的移植及启动分析 1.引 言 U-Boot(Universal Boot Loader)是遵循GPL条款的开放源码项目,他支持多种体系结构的上百种开发板,并且支持多种嵌入式操作系统内核,具有较高的可靠性和稳定性,已经成为功能最多、灵活性最强并且开发最积极的开放源码BootLoader。作为通用的BootLoader,U-Boot可以方便地移植到其他硬件平台上。 本文基于AT91RM9200的嵌入式目标板和U-B 阅读详情

1 引 言

    U-Boot(Universal Boot Loader)是遵循GPL条款的开放源码项目,他支持多种体系结构的上百种开发板,并且支持多种嵌入式操作系统内核,具有较高的可靠性和稳定性,已经成为功能最多、灵活性最强并且开发最积极的开放源码BootLoader。作为通用的BootLoader,U-Boot可以方便地移植到其他硬件平台上。

    本文基于AT91RM9200的嵌入式目标板和U-Boot1.1.2源码资源,分析了U-Boot的启动过程,介绍了U-Boot的移植方法和具体操作,最后讲述如何引导内核启动。

    2 U-Boot启动分析

    在具体移植之前,先来了解一下U-Boot启动过程。U-Boot启动过程可以分成3个阶段。

    (1)在FLASH中运行汇编程序,进行基本硬件初始化,并将FLASH中的启动代码复制到SDRAM中,同时创造环境准备运行C程序。

    汇编程序start.s是U-Boot启动后执行的第一个程序,他位于CPU/AT91RM9200中,链接脚本Board/AT91RM920DK/U-Boot.1ds决定U-Boot的入口函数位于该程序中,上电后,处理器首先执行该程序,具体工作流程如图1所示。

达普IC芯片交易网

    (2)跳转到SDRAM中执行,对硬件进行初始化,并向显示终端输出启动信息。

    start_armboot是U-Boot执行的第一个C语言函数,他位于lib_arm/board.c中,主要完成系统初始化工作,进入主循环,处理用户输入的命令。具体工作流程如图2所示。

    全局变量结构体gd用来保存开发板信息、终端存在标志位、环境变量结构体起始地址、环境变量校验标志位、frame buffer基地址等。他是指向gd_t结构体的指针,gd_t结构体定义在include\asm-asm\global_data.h中。

    硬件初始化中执行函数及各函数作用如下:
    
board_init:基本的板级相关配置,主要包括:设置处理器类型和启动参数地址;
    interrupt_init:中断处理初始化,主要对TC控制器作设置。
    env_init:设置环境变量,初始化环境;
    init_baudrate:指定串口的波特率;
    setial_init:串口初始化设置;选择通讯端口,设置串口波特率和工作方式; 
    console_init_f:设置gd->have_console=1,表示可以使用串口通讯控制台;
    display_banner:在控制台输出U-Boot信息;
    dram_init:设置SDRAM的起始地址和大小;
    display_dram_config:在控制台输出SDRAM信息;
    FLASH_init:设置FLASH芯片ID号、每个扇区起始地址等信息,将信息送到相应的结构体中;对FLASH中U-Boot和环境变量存储扇区做软件写保护;
    display_FLASH_config(size):在上位机终端输出FLASH大小。

    (3)将内核映像和根文件系统映像从FLASH拷贝到SDRAM中,为内核设置启动参数,进入内核的入口函数。 U-Boot作为BootLoader,具备多种引导内核启动的方式,常用bootm命令引导内核映像启动。使用bootm命令时,需要首先使用U-Boot自带的mkimage命令,将内核映像文件转换成U-Boot格式映像。即在内核的前头加上64 B的信息帧头,供建立tag之用。

    bootm命令调用do_bootm函数,这个函数专门用来引导各种操作系统映像,可以支持引导Linux,vxWorks,QNX等操作系统。具体完成的工作有:保存内核引导地址;分析内核帧头;复制内核映像到SDRAM中;调用dobootm_linux()函数。

    do_bootm_linux()函数是专门引导Linux映像的函数,他还可以处理ramdisk文件系统的映像。具体完成的工作有:

    (1)检查是否有根文件系统映像文件,这里只用bootm命令引导内核映像;

    (2)将要传递给Linux的参数存放到标记列表中,内核将会从此处接收参数,完成参数传递;

    (3)调用Linux内核,系统采用下列代码来进入内核函数:

达普IC芯片交易网


    第一行代码将theKernel函数指向内核首地址处;第二行代码调用theKernel()函数,并通过r0,r1,r2将机器编号和参数链表物理地址传递给内核。

    3 嵌入式目标板介绍

    本目标板以AT91RM9200作为微处理器,板上存储系统包括NOR FLASH,NAND FLASH,SDRAM等;外围支持设备有JTAG、串口、USB接口、网络接口、SD Card接口及显示接口等。目标板硬件架构如图3所示,主要硬件资源如表1所示。

达普IC芯片交易网

    4 U-Boot源码修改与编译

    根据目标板的配置,主要考虑修改以下U-Boot源码文件:

    (1)include/configs/AT91RM9200dk.h:该头文件包含了SDRAM的一些设置和定义,主要修改内容包括:定义CONFIG_BOOTBINFUNC宏变量;修改SDRAM大小;修改FLASH大小和扇区数。

    (2)board/AT91RM9200dk/FLASH.c:该程序完成的功能包括FLASH初始化、打印FLASH信息、FLAH擦除和FLASH写入等操作。可在参考已有FLASH驱动的基础上,结合目标板FLASH数据手册,进行适当修改。

    (3)include/FLASH.h:FLASH程序头文件,结合目标板修改FLASH型号和ID定义。

    U-Boot的源码通过GCC和Makefile组织编译。顶层目录下的Makefile设置开发板的定义,递归地调用各级子目录下的Makefile,把编译过的程序链接成U-Boot映像。

    这里上位机操作系统采用Redhat 9.0,交叉工具链采用cross-2.95.3。GCC安装路径为/usr/loacal/arm/2.95.3,在环境变量PATH中添加相应路径,就可以直接使用arm-linux-gcc命令。

    编译U-Boot分两步:第一步配置,执行命令:makeat91rm9200dk_config;第二步编译,执行命令:make。编译完成,生成3个映像文件system.map,U-Boot,U-Boot.bin,和1个符system.map,一般U-Boot.bin最为常用,直接按照二进制格式下载。 使用FLASH烧写程序将U-Boot.bin烧NORFLASH中,目标板重新上电复位后,U-Boot启动成功,在超级终端会显示如下启动信息:

达普IC芯片交易网

    出现Warning的原因是还未设置环境变量,设置环境变量后执行saveenv命令即可去掉Warning。

    5 引导内核

    U-Boot的最终目的是引导内核启动。上述仅仅启动了U-Boot,要引导内核启动还需要设置环境变量、下载内核和根文件系统映像、执行引导内核启动命令。假设内核映像文件为zImage,根文件系统映像文件为myram-disk.gz(生成方法略)。具体方法如下:

    (1)启动目标机,在U-Boot中进行网络参数等环境变量设置:

达普IC芯片交易网

    这里网络环境变量设置的目的是为了能够使用TFTP协议;bootargs用来定义传递给Linux内核的命令行参数;Bootcmd定义自动启动时执行的命令;bootm10100000表示从0x10100000处引导内核程序。

    (2)给内核映像加帧头

达普IC芯片交易网

    在上位机Linux环境下,将U-Boot\tools\mkimage.exe COPY到\bin目录下,输入如下命令:

    这里zImage为原始内核映像文件名;zImage.img为生成的加过帧头的内核映像名。

    (3)加载内核和根文件系统映像到FLASH中

    加载zImage.img到0x10100000,加载myramdisk.gz到0x10300000。

    至此,我们将UBOOT、内核、根文件系统都下载到FLASH中了,并且设置了环境变量。重启目标板,等待延时时间结束自动进入本地装载模式,即可引导内核启动。

    上面讲述的是将内核和根文件系统固化到FLASH中的情况,即使用本地加载模式,当以嵌入式产品发布时,BootLoader必须工作在这种模式下。但实际在初期调试的时候,可以在下载操作模式下直接用TFTP命令将这些映像文件下载到SDRAM中,然后用bootm命令从SDRAM中引导。此时在给内核映像加帧头的时候要注意,bootm XXXX指定的地址XXXX是否与mkImage命令处的-a指定的加载地址相同。如果不同,mkImage命令的写法和上面介绍的一致;如果相同,在使用mkImage命令时,-e参数后的入口地址要比-a参数后的存储地址推后64 B。

    6 结 语

    U-Boot是一个功能强大的BootLoader开源软件,他支持上百种开发板和多种嵌入式操作系统,可方便地移植到各种硬件平台上。目前,笔者移植的U-Boot已成功运行在目标板上,并在此基础上成功地加载了Linux内核和根文件系统,为后续的驱动和应用开发奠定了基础。对于不同的CPU和开发板,U-Boot的启动原理和移植步骤大致相同。希望本文能对学习U-Boot的朋友有所帮助。

AT91RM9200 EK or DK开发参考 Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class 阅读详情

相关推荐

U-boot在AT91RM9200上的全线移植分析

Bootloader移植的基本理论及实例分析

U-BOOT全线移植分析系列之三 ――U-BOOT在AT91RM9200上的移植

【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】U-BOOT全线移植分析系列之三--U-BOOT在AT91RM9200上的移植     U-BOOT全线移植分析系列之三 ――U-BOOT在AT91RM9200上的移植   Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.cs

a746742897的博客 741

U-boot在AT91RM9200上的全线移植分析原始版

U-boot在AT91RM9200上的全线移植分析原始版

U-BOOT全线移植分析系列之三--U-BOOT在AT91RM9200上的移植

U-BOOT全线移植分析系列之三 ――U-BOOT在AT91RM9200上的移植   Sailor_forever  sailing_9806@163.com转载请注明 http://blog.youkuaiyun.com/sailor_8318/archive/2008/08/05/2773307.aspx   【摘要】本节介绍了U-boot在AT91RM9200上移植的详细过程。首先分析AT

flymachine的专栏 1575

学习STM32的流体水位传感器

引言: 流体水位传感器是一种常用于测量液体水位的设备,广泛应用于水位监测、液位控制和流量计量等领域。STM32是一款功能强大的单片机,具有丰富的外设和灵活的编程能力,非常适合用于流体水位传感器的开发。本文将介绍如何使用STM32开发板与流体水位传感器进行连接和通信,并通过编写代码实现水位的测量和显示。五、总结: 通过以上的代码示例,我们可以实现使用STM32开发板与流体水位传感器进行连接和通信的功能。三、编写代码: 以下是使用STM32CubeIDE编写的示例代码,实现了读取流体水位传感器的功能。

xiaoalla的博客 739

win11重装系统简易教程-小白也可以上手!

本文介绍一下win11系统重装的各个步骤,也作为记录供自己后面查看。附上我之前参考的一位知乎大神写的重装win10系统文章的地址本文用到的工具全部是,不需要下载第三方镜像文件(不是说这个不好,只是第三方的软件或镜像文件网上非常多,琳琅满目,小白需要筛选甄别,直接用官方的就比较省心,大神请自便~)

Sddqa的博客 1万+

Atmel at91rm9200的armlinux的bootloader启动代码分析

<!--google_ad_client = "pub-2132256014190581";/* 160x600, 创建于 09-1-4 */google_ad_slot = "4461398019";google_ad_width = 160;google_ad_height = 600;//-->balancesli写著 前阶段做了一次基于at9

嵌入式 Linux ARM ADS ADHOC C C++ PLC 单片机 2379

rk3588 rkaiq_3A_server 无法解析json文件记录

rk3588 rkaiq_3A_server 无法解析json文件记录

neardi_dev的博客 1万+

用U-BOOT构建嵌入式系统的引导装载程序

1 U-BOOT简介  U-BOOT是由德国的工程师Wolfgang Denk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。目前,U-BOOT源代码在sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是http://sourceforge.net/projects/U-BOOT。U-BOOT

menuconfig的专栏 1595

【TM1650】STM8S TM1650芯片控制程序

以下为.h文件: #ifndef __TM1650_I2C_H #define __TM1650_I2C_H #include "stm8s.h" #include "stm8s_gpio.h" #include "tim1.h" #include "usart2.h" #include &lt;iostm8s103f3.h&gt; #include &lt;intrinsics....

cxw312864660的博客 1万+

第一章 千牛实时获取消息之ws服务端搭建

以上就是今天要讲的内容,本文仅仅简单介绍了ws服务端的搭建,后面将介绍ws客户端的搭建和配合ws服务器的测试。

不想说话的树专栏 1827

转载_U-BOOT全线移植(1)

【摘要】本节介绍了bootloader的基本概念。首先分析了为什么要针对特定的CPU和开发板移植bootloader的必要性。然后介绍了两种如何在裸板中烧写bootloader的方法以及如何确定烧写地址。其次介绍了产品发布的启动加载模式和开发使用的下载模式(更新内核文件系统及bootloader自身)。最后介绍了bootloader的两个通用启动阶段的流程及代码特性和运行位置。 【关键词】boo

williamwanglei的专栏 1287

手把手写深度学习(27):如果获得相机位姿态的plücker embedding?以RealEstate10K为例

用plücker embedding表示相机的位姿是一种非常常用的方法,这篇博客以RealEstate10K数据集为例子,详细讲解如何从相机的轨迹坐标中获得plücker embedding,用于下一步模型的学习。

沉迷单车的追风少年 2239

基于Atmel at91rm9200的armlinux的bootloader启动代码分析(转载)

基于Atmel at91rm9200的armlinux的bootloader启动代码分析(转载)screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor=’hand’; this.alt=’Click here to open new window\nCTRL+Mouse wheel t

886

GameFramework框架详解之 DataTable配置表模块

一.前言: DataTable模块是项目的配置表模块,配置表一般是从excel导出csv/json/xml格式的,之所以是excel作为源文件,原因是因为策划同学使用配表最方便。然后一键导出到项目中,除了csv/json/xml配置文件外,一般还会伴随着导出配置的实体类,这样研发同学就可以使用了。GameFramework的DataTable模块也是秉持着这种一贯的策略来实现的。 二.DataRow DataRow在excel数据表中,对应的是一行数据,而在代码中对应的其实就是一条数据对象。 接口IData

TxNet 4724

JMeter 中实现 100 个用户在 3 秒内并发登录

通过以上配置,你可以在 JMeter 中实现 100 个用户在 3 秒内并发登录

南开大学 | 10 年 + 软件研发与测试实战 | 现任企业质控负责人 | 专注端到端交付质量 1680

U-Boot移植

BOOT LOADER(引导装载器),是用于初始化目标板硬件,给嵌入式操作系统提供板上硬件资源信息,并进一步装载、引导嵌入式操作系统运行的固件。在嵌入式系统开发过程中,很多情况都会涉及底层BOOT LOADER的移植问题,即使在有些已有BOOT LOADER的参考开发板上也存在这种可能。概括来说,如下情况会考虑进行BOOT LOADER的移植工作: A. 在自主设计的目标板上,用于引导嵌入式操作

keep moving 946

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

U-BOOT全线移植(1)

<br /><br />【摘要】本节介绍了bootloader的基本概念。首先分析了为什么要针对特定的CPU和开发板移植bootloader的必要性。然后介绍了两 种如何在裸板中烧写bootloader的方法以及如何确定烧写地址。其次介绍了产品发布的启动加载模式和开发使用的下载模式(更新内核文件系统及 bootloader自身)。最后介绍了bootloader的两个通用启动阶段的流程及代码特性和运行位置。<br />【关键词】bootloader,烧写,复位地址,固化loader,启动加载,stage1,位

笨字第1号 988

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

uboot移植大全

BOOT LOADER(引导装载器),是用于初始化目标板硬件,给嵌入式操作系统提供板上硬件资源信息,并进一步装载、引导嵌入式操作系统运行的固件。在嵌入式系统开发过程中,很多情况都会涉及底层BOOT LOADER的移植问题,即使在有些已有BOOT LOADER的参考开发板上也存在这种可能。概括来说,如下情况会考虑进行BOOT LOADER的移植工作: A. 在自主设计的目标板上,用于引导嵌入式操作

1358

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

at91rm9200上u-boot移植

在at91rm9200上移植u-boot================== 准备工作=================1.阅读at91rm9200 官方文档有关“引导程序”的章节对at91rm9200的启动流程有个大概的了解。at91rm9200引导流程图Device Setup||Boot SPI DataFlash Boot --> Download from DataFlash --> r

andyzx的开发日记 4851

【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】U-BOOT全线移植分析系列之三--U-BOOT在AT91RM9200上的移植

  U-BOOT全线移植分析系列之三――U-BOOT在AT91RM9200上的移植 Sailor_forever  sailing_9806@163.com 转载请注明http://blog.youkuaiyun.com/sailor_8318/archive/2008/08/05/2773307.aspx 【摘要】本节介绍了U-boot在AT91RM9200上移植的详细过程。

Sailor_forever 7816

at91rm9200上移植u-boot

 ================== 准备工作=================1.阅读at91rm9200 官方文档有关“引导程序”的章节对at91rm9200的启动流程有个大概的了解。at91rm9200引导流程图Device Setup||Boot SPI DataFlash Boot --> Download from DataFlash --> run||TWI EEPROM Boot

民工甲的专栏 1884
上一篇: 在SourceInsight中加入对.S文件的支持
下一篇: Warning - bad CRC, using default environment问题解决
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值