linux移植u-boot(一)——U-Boot详解+自定义命令实战

linux移植u-boot(一)——U-Boot详解+自定义命令实战

2015-02-07

一、Bootloader

????简单地说:Bootloader主要功能就是 在系统上电时开始执行,初始化硬件和设备,准备好软件环境,最后调用操作系统。

????具体的包含:关闭你看门狗WATCHDOG,改变系统时钟,初始化存储控制器

,将操作系统内核代码复制到内存中去运行。

????为了开发方便,可以增加网络功能,从PC上通过串口或者网络下载文件,烧写文件,将flash上的内核代码解压后运行等。

Bootloader分为两种模式:

(1):启动加载模式:上电后,Bootloader在板子上的某个固态存储设备上将操作系统加载到RAM中运行,没有用户的介入

(2):下载模式:开发人员可以使用各种命令,允许在各种工作模式之间切换,通过串口或者网络来下载内核文件,并将他们直接放在内存中运行,这就是我们我们所说的U-BOOT。

?

嵌入式linux操作系统从软件角度可以分为四个层次:

  1. 引导加载程序bootloader
  2. linux内核
  3. 文件系统
  4. 用户应用程序

?

一般的u-boot分为单阶段,多阶段两种:

多阶段u-boot具有更好的可移植性,可以用两个阶段来概括;

第一阶段:使用汇编来实现,完成一些依赖于CPU体系结构的初始化,包括光比WATCHDOG,关中断,设置CPU的速度和时钟频率,RAM初始化。

????硬件设备初始化 => 为加载Bootloader的第二阶段代码准备RAM空间 => 复制Bootloader的第二阶段代码到RAM空间中 => 设置好栈 => 跳转到第二阶段代码的C入口。

第二阶段:使用C语言来实现,可以实现更为复杂的功能。

????初始化本阶段要使用的硬件设备 => 检测系统内存映射 => 将内核映像和根文件系统映像从Flash上读到RAM空间中 => 为内核设置启动参数 => 调用内核。

?

????Bootlaoder与内核的交互(参数传递的标记方式)

  1. 设置标记ATAG_CORE, 已标记此为开始。
  2. 设置内核标记
  3. 设置命令行标记,就是一个字符串,用来控制内核的一些行为
  4. 设置标记ATAG_NONE,标记列表以其结束

????

常用的bootloader包括LILO, GRUB, loadlin, ROLO, Etherboot, BLOB, U-Boot, RedBoot, Vivi等,此处我们研究U-Boot;

二、U-Boot分析与移植

U-Boot,全称Universal Boot Loader, 遵循GPL条款的开业代码项目。

U-Boot下面有26个子目录:分为四类:

  1. 平台相关的或者开发板相关的 board、cpu、lib_i386类似
  2. 通用的函数 include、lib_generic、common
  3. 通用设备驱动程序 disk、drivers、dtt、fs、nand_spl、net、post、rtc
  4. U-Boot工具,示例程序,文档 doc、examples、tools

?

U-Boot 的配置、编译、链接过程

配置过程:

????配置文件为根目录下的mkconfig,

????例如,执行make smdk2410_config 实际上就是执行如下命令

????????./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0

????结果:

  1. 开发板名称BOARD_NAME 等于 $1
  2. 创建到平台/开发板的相关的头文件的链接
  3. 创建顶层Makefile包含的文件include/config.mk
  4. 创建开发板相关的头文件include/config.h $include <configs/$1.h>

编译、链接

????make all

总结一下U-Boot的编译流程

  1. 首先编译cpu/$(CPU)/start.S ,对不同的CPU,还可能编译cpu/$(CPU)下的其他文件。
  2. 然后,对平台/开发板相关的每个目录,每个通用目录都使用它们各自的Makefile生成的相应的库
  3. 将1、2步骤生成的.0、.a文件按照board/$(BOARDDIR)/config.mk 文件中制定的代码段起始地址,board/$(BOARDDIR)/U-Boot.lds 链接脚本进行链接
  4. 第3步得到的ELF格式的U-Boot,然后Makefile还会将其转化成二进制格式文件,S-Record格式。

?

烧写内核映像文件uImage

将uImage放在主机的上的tftp或nfs目录下,确保已经开启tftp或nfs服务。

然后运行命令下载文件,擦除,烧写NAND Flash

tftp 0x80800000 uImage

nand erase 0x0 0x00200000

nand write.jffs2 0x80800000 0x0 $(filesize)

注:nand write.jffs2不要求文件的长度是页对齐(512字节对齐)

也可以使用nand wirte 但是长度要是512字节对齐

?

烧写文件系统映像

tftp 080800000 yaffs.img

nand erase 0xa00000 0x3600000

nand write.yaffs 0x80800000 0xa00000 $(filesize)

使用U-Boot 来烧写程序

tftp 0x30000000 test.bin

go 0x30000000

?

?

注意:生成适用于EasyARM-iMX257的U-Boot文件需要按如下步骤进行操作:

首先,进入u-boot-2009.08目录,清除原有的编译文件,其对应的终端命令如下:

$ cd u-boot-2009.08

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean

其次,需要配置U-Boot的平台为mx25_3stack_config,对应的终端命令如下:

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- mx25_3stack_config

Configuring for mx25_3stack board...

然后,执行编译,对应的终端命令如下:

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

编译完成后将在u-boot-2009.08目录下得到u-boot.bin文件。

?

?

Loadb 0x80800000 -将uImage从串口发送到davinci的ddr2中0x80800000处。

Protect off all -去掉写保护

Erase 0x200000 0x204ffff -擦除nor flash中uImage占用的空间

Cp.b 0x80800000 0x2050000 0x14b008 -将传送到ddr2中的uImage文件拷贝到flash中

Save -保存flash的内容

补充说明:

如果板卡上已经有u-boot,需要升级为新版的u-boot时,则可以操作如下:

使用超级终端的利用串口发送u-boot到davinci板卡,然后利用在线更新的方式完成u-boot烧写,具体步骤:

1)Protect off all -去掉写保护

2)Erase 0x2000000 0x204ffff -擦除nor flash中u-boot占用的空间

3)Loadb 0x80800000 -将u-boot文件通过串口发送到davinci的ddr2

4)Cp.b 0x80800000 0x2000000 0x17398 -将传送到ddr2中

u-boot文件拷贝到flash中

5)Save -保存flash的内容

?

?

?

三、U-Boot增加自定义命令实例

我们在u-boot下增加我们自定义hello命令。

  1. 首先我们在u-boot的common目录下增加一个cmd_hello.c文件

    参照其他命令的书写方式,代码如下


#include <image.h>

#include <malloc.h>

#include <u-boot/zlib.h>

#include <bzlib.h>

#include <environment.h>

#include <lmb.h>

#include <linux/ctype.h>

#include <asm/byteorder.h>

?

int do_hello (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

{

????int i = 0;

????printf("hello,Lover雪!!!\nthe argcs are \n");

????for(i = 0 ; i<argc ; i++)

????????printf("argv[%d]: %s\n",i,argv[i]);

????return 0;

}

?

U_BOOT_CMD(

????hello,????CONFIG_SYS_MAXARGS,????1,????do_hello,

????"This is a user defined command hello,Lover雪!!!",

????"hello,long help ......\n"

????);

?

  1. 修改common下面的makefile文件,告诉U-Boot编译我们自定义的C文件

参考Makefile中其他文件的定义,加入一句


COBJS-y += cmd_hello.o

?

  1. 重新make编译 u-boot

?

?

时间: 2024-10-07 07:04:11

linux移植u-boot(一)——U-Boot详解+自定义命令实战的相关文章

Spring Boot的启动器Starter详解

Spring Boot的启动器Starter详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2)spring-boot-starter-actuator 帮助监控和管理应用. 3)spring-boot-starter-amqp 通

Linux系统根文件以及命名规则详解

一.Linux系统根文件详解 Linux的重要哲学思想其实就是:将程序的配置文件保存为纯文本格式. 1./boot:系统启动文件,如:内核文件,iniyrd以及gurb(bootloarder) 2./dev:目录下为设备文件,设备文件又分为块设备和字符设备: 块设备:按数据块随机访问,没有顺序. 字符设备:线性访问,按字符为单位进行. 注:其中背景为黑色,字体为***的文件,为特殊文件,"1,   0"分别为文件的主设备号和次设备号 [[email protected] ~]# ls

Linux(centos)系统各个目录的作用详解

Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat.less.more.vi.emacs来察看内容,用mv来改名. 目录文件:包括文件名.子目录名及其指针.它是LINUX储存文件名的唯一地方,可用ls列出目录文件. 连接文件:是指向同一索引节点的那些目录条目.用ls来查看是,连接文件的标志用l开头,

Linux文本处理必杀技之awk应用详解

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯.彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识.awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk) awk是一款强大的报告日志生成处理工具,不同于sed和grep,它的侧重点是如何把文本信息更好的展

Linux内核模块编程与内核模块LICENSE -《详解(第3版)》预读

Linux内核模块简介 Linux内核的整体结构已经非常庞大,而其包含的组件也非常多.我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核.这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核. 有没有一种机制使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中呢?Linux提供了这样的一种机制,这种机制被称为模块(Module).模块具有这样的特点. 模块本

Linux下同步工具inotify+rsync使用详解

Linux下同步工具inotify+rsync使用详解 Posted on 2014-12-12 |  In Linux|  9|  Visitors 438 1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.它使用所谓的"Rsync演算法"来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快.所以通常可以作为备份工具来使用. 运行Rsync serve

linux 之用户和组及权限详解

linux之用户和组及权限详解 权限有三种 r:可读,w:可写,x:可执行 针对文件: r:可读, 表示可使用cat等命令查看 w:可写,  表示可写或删除指定文件 x:可执行,表示在bash下可当作命令使用执行 针对目录: r:可读,可使用ls命令显示内部的所有文件 w:可写, 可以在此目录中创建文件或子目录 x:可执行,可使用cd命令切换此目录,也可使用ls -l查看内部文件 权限的表现形式: 0 000 ---:无权限 1 001 --x: 执行 2 010 -w-: 可写 3 011 -

使用Free命令查看Linux服务器内存使用状况(-/+ buffers/cache详解)

free命令可选参数 -b,-k,-m,-g show output in bytes, KB, MB, or GB -h human readable output (automatic unit scaling) -l show detailed low and high memory statistics -o use old format (no -/+buffers/cache line) -t display total for RAM + swap -s update every

linux Mysql 主从复制 原理介绍和步骤详解

大家好,我是霸王卸甲,今天我给大家带来的是linux数据库中的主从复制的简单介绍和步骤详解. 主从复制 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制--- 用途及条件 mysql主从复制用途 实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务 主从部署必要条件: 主库开启binlog日志(设置log-bin参数) 主从server-id不同 从库服务器能连通主库 主从原理mysql主