uboot整体介绍

1、什么是uboot

  U-boot,全称Universal Boot Loader,是由DENX小组的开发的遵循GPL条款的开放源码项目,它的主要功能是完成硬件设备初始化、操作系统代码搬运,并提供一个控制台及一个指令集在操作系统运行前操控硬件设备。U-boot之所以这么通用,原因是他具有很多特点:开放源代码、支持多种嵌入式操作系统内核、支持多种处理器系列、较高的稳定性、高度灵活的功能设置、丰富的设备驱动源码以及较为丰富的开发调试文档与强大的网络技术支持。另外u-boot对操作系统和产品研发提供了灵活丰富的支持,主要表现在:可以引导压缩或非压缩系统内核,可以灵活设置/传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,支持多种文件系统,支持多种目标板环境参数存储介质,采用CRC32校验,可校验内核及镜像文件是否完好,提供多种控制台接口,使用户可以在不需要ICE的情况下通过串口/以太网/USB等接口下载数据并烧录到存储设备中去(这个功能在实际的产品中是很实用的,尤其是在软件现场升级的时候),以及提供丰富的设备驱动等。

2、uboot的目录结构

1、board中存放于开发板相关的配置文件,每一个开发板都以子文件夹的形式出现。
2、commom文件夹实现u-boot行下支持的命令,每一个命令对应一个文件。
3、cpu中存放特定cpu架构相关的目录,每一款cpu架构都对应了一个子目录。
4、Doc是文档目录,有u-boot非常完善的文档。
5、drivers中是u-boot支持的各种设备的驱动程序。
6、Fs是支持的文件系统,其中最常用的是JFFS2文件系统。
7、Include文件夹是u-boot使用的头文件,还有各种硬件平台支持的汇编文件,系统配置文件和文件系统支持的文件。
8、Net是与网络协议相关的代码,bootp协议、TFTP协议、NFS文件系统得实现。
9、tools是生成U-boot的工具。

3、分区表配置

  u-boot与kernel的flash分区配置表要保持一致,否则,可能会出现异常!在没有设备树的内核中配置(以mini2440开发板为例)和有设备树的内核中配置分区表如下。

3.1 无设备树内核情况

1、内核分区表配置
  在kernel源码的arch/arm/mach-s3c2440/mach-mini2440.c里有如下flash分区配置表:
这里写图片描述
2、uboot分区表配置
  为了与kernel的flash分区配置表保持一致。对u-boot代码修改如下:
  a、修改include/configs/mini2440.h文件
  这里写图片描述
  b、修改cpu/arm920t/start.S文件
  #define LENGTH_UBOOT 0x40000 //修改u-boot的大小,把0x60000改为0x40000

3.2 有设备树内核情况

  后来内核引入了设备树,因此就不用向上面这么麻烦了,在相应的设备树文件中,添加如下配置:

/* NAND */
nand@05400000 {
    status = "okay";
    compatible = "dspg,nfc-rev1";

    #address-cells = <1>;
    #size-cells = <1>;
    partition@0x100000 {
        label = "image";
        reg = <0x100000 0x3200000>;
    };
    partition@0x3300000 {
        label = "image-bak"; 
        reg = <0x3300000 0x1000000>;
    };
    partition@0x4300000 {
        label = "persistent";       
        reg = <0x4300000 0x3D000000>;
    };
};

  若分区没有成功,可能导致内核启动失败。这可能是内核中的相应驱动没有去解析这个设备树的分区
导致的。
  原来的代码

mtd_device_parse_register(mtd, NULL, 0, NULL, 0);

  修改后的代码

static const char *part_probe_types[]
    = { "cmdlinepart", "ofpart", "ofoldpart", NULL };
struct mtd_part_parser_data ppdata;
if (pdev->dev.of_node) 
    ppdata.of_node = pdev->dev.of_node;
mtd_device_parse_register(mtd, part_probe_types, &ppdata, NULL, 0);

4、uboot的编译

1、修改Makefile,指定交叉编译环境
 CROSS_COMPILE = arm-linux-
2、清除生成的文件(可选)
 make distclean
3、生成配置文件
 make mini2440_config
4、在源码根目录下生成u-boot映像文件u-boot.bin
 make

说明:
  在执行make之前要先执行make $(board)_config对工程进行配置以确定特定于目标板的各个子目录和头文件。$(board)_config是makefile中的一个伪目标,它传入指定的CPU、ARCH、BOARD、SOC参数去执行mkconfig脚本。
  这个脚本的主要功能在于连接目标板平台相关的头文件夹,生成config.h文件包含板子的配置头文件,使得makefile能够根据目标板的这些参数去编译正确的平台相关的子目录。
这里写图片描述

5、uboot引导内核启动

以下的操作使用的存储介质是nandflash,文件系统是yaffs2。
1、烧写kernel
 tftp 0x30008000 uImage //使用tftp下载内核到内存地址 0x30008000处
 nand erase 0x60000 0x500000 //清0 nandflash上的0x80000~0x580000共5M的存储
 nand write 0x30008000 0x60000 0x300000 //把uImage从外部sdram拷贝到nandflash指定地址0上,拷贝的长度是0x300000 (这个长度值与uImage的实际大小有关)。
2、烧写rootfs.img
 tftp 0x30008000 rootfs.img //将文件系统下载到内存地址0x30008000处
 nand erase 0x560000 0xd00000 //清0 nandflash上的0x560000~0x560000+0xd00000共13M
 nand write.yaffs 0x30008000 0x560000 0xd00000 //把rootfs.img从外部sdram拷贝到nandflash指定地址0上,拷贝的长度是0xd00000 (这个长度值与rootfs.img的实际大小有关)。
3、挂载rootfs
  可以通过如下方式,由u-boot传参给kernel,让kernel在启动的最后阶段,从/dev/mtdblock3上挂载真实的根文件系统rootfs.img

# setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M
# saveenv

4、启动系统

setenv bootcmd 'nand read 0x30008000 0x60000 0x300000;bootm 0x30008000‘
saveenv
run bootcmd

a、当uboot启动起来后,会在最后执行bootcmd命令。即把nanflash上的uImage(0x60000与之前uImage烧写到nandflash位置有关,0x300000与uImage的大小有关)拷贝到外部sdram上的0x30008000地址上;然后调用bootm加载启动uImage。
b、bootm从内存、ROM、NOR Flash中启动内核;bootp则通过网络来启动;nboot从NAND Flash启动内核。它们都是先将内核映像从各种媒介中读出,存放在指定的位置,然后设置标记列表以给内核传递参数;最后跳到内核的入口点去执行。(具体的细节可以阅读common/cmd_boot.c、common/cmd_net.c、common/cmd_nand.c)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值