uboot移植

u-boot工程与编译系统

1.BootLoader介绍

  • 对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式Linux系统同样离不开引导程序,这个引导程序就叫作启动加载程序(Bootloader)。
  • Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。对于嵌入式系统,Bootloader是基于特定硬件平台实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader。Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于两块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般都需要修改Bootloader的源程序。

从上述描述,我们可以知道:

  • 在设备上电运行系统之前,需要先运行BootLoader。BootLoader为系统的运行准备好软硬件环境(软硬件初始化)
  • CPU架构、板载硬件资源任意一个不同,BootLoader程序代码都不同。
  • 虽然是这样,BootLoader仍然可以通过类似穷举一样,将各个CPU架构源代码都加入进来,使得整个源代码能支持更多的硬件,uboot就是其中做得比较好的,u-boot就同时支持PowerPC、ARM、MIPS和X86等体系结构,支持的板子有上百种。
  • uboot源码实质就是一个工程,使用Makefile管理,最早是德国的DENX软件公司的CEO:Wolfgang Denk创建,慢慢完善之后,现在u-boot已经支持PowerPC、ARM、X86、MIPS体系结构的上百种开发板,已经成为功能最多、灵活性最强,并且开发最积极的开源Bootloader。目前仍然由DENX的Wolfgang Denk维护。

2.获取uboot源码方式

  • u-boot的源码包可以从其官方网站下载:DENX的u-boot主页:http://www.denx.de/wiki/u-boot。
  • git源码库:git://www.denx.de/git/u-boot.git 。

3.u-boot源码结构

从网站上下载得到u-boot源码包,如本书中使用的u-boot-2009.11.tar.bz2,将其解压就可以得到全部u-boot源程序。在顶层目录下有30多个子目录,分别存放和管理不同的源程序。这些目录中存放的文件有其规则,可以分为3类。

  • 第1类目录与处理器体系结构或开发板硬件直接相关。
  • 第2类目录是一些通用的函数或驱动程序。
  • 第3类目录是u-boot的应用程序、工具或文档。

4.u-boot源码配置

  • u-boot的源码是通过GNU Makefile Makefile完成对开发板的整体配置,然后递归调用各级子目录下的 Makefile,最后把所有编译过的程序链接成u-boot映像。下面将以S3C2410处理器公板smdk2410为例,介绍u-boot的配置编译方法,并简单分析其原理。

(1)基本的配置编译方法

  • 配置编译u-boot的方法十分简单,只需在解压并进入源码包后,在 u-boot顶层目录中执行如下两个命令:
  • make <board_name> config
  • make
  • 第一个命令用来配置u-boot,其中<board_name>要用具体的开发板名称代替。例如,用smdk2410替代后就是“make smdk2410_config”。执行第二个命令后即开始编译过程。

(2)顶层目录下的Makefile

  • 每一种开发板在顶层 Makefile中都需要有自己的配置规制。例如,用smdk2410开发板的规制定义如下:
smdk2410_config	:	unconfig
	@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
  • 执行配置u-boot的命令:make smdk2410_config,将通过u-boot顶层目录下的mkconfig脚本生成配置文件 include/config.mk,内容如下。这些内容正是根据 Makefile对开发板的配置生成的。
ARCH   = arm  
CPU    = arm920t 
BOARD  = smdk2410 
VENDOR = samsung 
SOC    = s3c24x0 
  • 上面的include/config.mk文件定义了ARCH、CPU、 BOARD、 VENDOR、SOC等变量这样硬件平台依赖的目录文件可以根据这些定义来确定。SMDK2410平台相关目录如下:
board/samsung/smdk2410/  
cpu/arm920t/  
cpu/arm920t/s3c24x0/  
lib_arm/  
include/asm-arm/  
include/configs/smdk2410.h 
  • 再回到顶层目录的Makefile文件开始的部分,其中下列几行包含了对前面所述变量的定义。
# load ARCH, BOARD, and CPU configuration  
include $(obj)include/config.mk  
export  ARCH CPU BOARD VENDOR SOC 
  • Makefile的编译选项和规则在顶层目录的config.mk文件中定义。各种体系结构通用的规则直接在该文件中定义。通过ARCH、CPU、BOARD、SOC等变量为不同硬件平台定义不同选项。不同体系结构的规则分别包含在各自的lib_xxx(xxx表示体系架构,如lib_arm)目录下的config.mk文件中。 

(3)开发板配置头文件

  • 除了编译顶层Makefile以外,还要在移植时为开发板定义配置选项或参数。这个头文件是include/configs/<board_name>.h。<board_name>用相应的BOARD定义代替。
  • 这些头文件中定义的选项或参数宏以CONFIG_为前缀,用来选择处理器、设备接口、命令、属性等。例如:
#define   CONFIG_ARM920T         1  
#define   CONFIG_DRIVER_CS8900   1 

(4)编译结果

  • 编译完成后,可以得到u-boot各种格式的映像文件和符号表:

  • u-boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中即可。

5.U-Boot命令详解

  • 帮助命令:help
  • 查看环境变量:printenv
  • 修改环境变量setenv 添加、修改、删除环境变量
  • 保存环境变量:saveenv 保存环境变量将当前定义的所有变量及其值存入flash中
  • 执行程序:bootm {addr} {arg},执行固定格式的2进制程序     范例:#bootm 0xc0008000

       查看、修改内存内容

  • md采用十六进制和ASCII码两种形式来显示存储单元的内容。这条命令还可以采用长度标识符 .l, .w和.b :
  • md [.b, .w, .l] address

       范例:

  • md.w 100000
  • 00100000: 2705 1956 5050 4342 6f6f 7420 312e 312e
  • 00100010: 3520 284d 6172 2032 3120 3230 3032 202d

       mm 修改内存,地址自动递增

  • mm [.b, .w, .l] address
  • mm 提供了一种互动修改存储器内容的方法。它会显示地址和当前值,然后提示用户输入。如果你输入了一个合法的十六进制数,这个新的值将会被写入该地址。然后提示下一个地址。如果你没有输入任何值,只是按了一下回车,那么该地址的内容保持不变。如果想结束输入,则输入空格,然后回车
  • => mm 100000
  • 00100000: 27051956 ? 0
  • 00100004: 50504342 ? AABBCCDD

       擦除nand flash

  • nand erase 起始地址start 长度len
  • 擦除start处开始的,长度为len的区域

       范例:

  • #nand erase 0x400000 0x500000

       写/读nand flash

  • nand write 内存起始地址 flash起始地址 长度len
  • 将内存起始地址处,长度为len的数据,写入flash起始地址处。
  • nand read 内存起始地址 flash起始地址 长度len
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
所有资料来源网上,与朋友分享 u-boot-1.1.6之cpu/arm920t/start.s分析 2 u-boot中.lds连接脚本文件的分析 12 分享一篇我总结的uboot学习笔记(转) 15 U-BOOT内存布局及启动过程浅析 22 u-boot中的命令实现 25 U-BOOT环境变量实现 28 1.相关文件 28 2.数据结构 28 3.ENV 的初始化 30 3.1env_init 30 3.2 env_relocate 30 3.3*env_relocate_spec 31 4. ENV 的保存 31 U-Boot环境变量 32 u-boot代码链接的问题 35 ldr和adr在使用标号表达式作为操作数的区别 40 start_armboot浅析 42 1.全局数据结构的初始化 42 2.调用通用初始化函数 43 3.初始化具体设备 44 4.初始化环境变量 44 5.进入主循环 44 u-boot编译过程 44 mkconfig文件的分析 47 从NAND闪存中启动U-BOOT的设计 50 引言 50 NAND闪存工作原理 51 从NAND闪存启动U-BOOT的设计思路 51 具体设计 51 支持NAND闪存的启动程序设计 51 支持U-BOOT命令设计 52 结语 53 参考文献 53 U-boot给kernel传参数和kernel读取参数—struct tag (以及补充) 53 1 、u-boot 给kernel 传RAM 参数 54 2 、Kernel 读取U-boot 传递的相关参数 56 3 、关于U-boot 中的bd 和gd 59 U-BOOT源码分析及移植 60 一、u-boot工程的总体结构: 61 1、源代码组织 61 2.makefile简要分析 61 3、u-boot的通用目录是怎么做到与平台无关的? 63 4、smkd2410其余重要的文件 : 63 二、u-boot的流程、主要的数据结构、内存分配 64 1、u-boot的启动流程: 64 2、u-boot主要的数据结构 66 3、u-boot重定位后的内存分布: 68 三、u-boot的重要细节 。 68 关于U-boot中命令相关的编程 : 73 四、U-boot在ST2410的移植,基于NOR FLASH和NAND FLASH启动。 76 1、从smdk2410到ST2410: 76 2、移植过程: 76 3、移植要考虑的问题: 77 4、SST39VF1601: 77 5、我实现的flash.c主要部分: 78 6、增加从Nand 启动的代码 : 82 7、添加网络命令。 87

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值