UBOOT

1. 简介

       将Linux 系统移植到开发板上去,在移植 Linux之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader有很多,常用的就是 U-Boot。移植好 U-Boot 以后再移植 Linux 内核,移植完 Linux 内核以后Linux 还不能正常启动,还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。
        所以 U-Boot、Linux kernel 和 rootfs 这三者一起构成了一个完整的 Linux 系统。
        uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。

2. 网络命令   

    可以通过网络将编译好的 linux 镜像和设备树文件下载到 DRAM 中,然后就可以直接运行。我们一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务

        nfs 80800000 192.168.1.250:/home/linux/nfs/zImage

下载完成以后查看 0x80800000 地址处的数据,使用命令 md.b 来查看前 0x100 个字节的数据

         tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议,我们现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
         tftp 80800000 zImag

3.  MMC 设备文件系统格式 :fat32
分区 0 存放的 uboot,并且分区 0 没有格式化,所以文件系统格式未知。
分区 1 的格式为 fat,分区 1 用于存放 linux 镜像和设备树。
分区 2 的格式为 ext4,用于存放 Linux 的根文件系统(rootfs)。

将 EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的 0X80800000 地址处,命令如下:
        fatload mmc 1:1 80800000 zImage


4.NAND

        我们可以在 uboot 里面使用“nand write”命令烧写 kernel 和 dtb。先编译出来 NAND版本的 kernel 和 dtb 文件,在烧写之前要先对 NAND 进行分区,也就是规划好 uboot、linuxkernel、设备树和根文件系统的存储区域
NAND 分区如下:
0x000000000000-0x000004000000 : "boot"
0x000004000000-0x000006000000 : "kernel"
0x000006000000-0x000007000000 : "dtb"
0x000007000000-0x000020000000 : "rootfs"
        一共有四个分区,第一个分区存放 uboot,地址范围为 0x0~0x4000000(共 64MB);第二个分区存放 kernel(也就是 linux kernel),地址范围为 0x4000000~0x6000000(共 32MB);第三个分区存放 dtb(设备树),地址范围为 0x6000000~0x7000000(共 16MB);剩下的所有存储空间全部作为最后一个分区,存放 rootfs(根文件系统)。

       可以看出 kernel 是从地址 0x4000000 开始存放的,将 NAND 版本 kernel 对应的 zImage 文件放到 Ubuntu 中的 tftpboot 目录中,然后使用 tftp 命令将其下载到开发板的 0X87800000 地址处,最终使用“nand write”将其烧写到 NAND 中,命令如下:
    tftp 0x87800000 zImage //下载 zImage 到 DRAM 中
    nand erase 0x4000000 0xA00000 //从地址 0x4000000 开始擦除 10MB 的空间
    nand write 0x87800000 0x4000000 0xA00000 //将接收到的 zImage 写到 NAND 中
这里我们擦除了 10MB 的空间,因为一般 zImage 就是 6,7MB 左右,10MB 肯定够了。同理,最后烧写设备树(dtb)文件文件,命令如下:
    tftp 0x87800000 imx6ull-alientek-nand.dtb //下载 dtb 到 DRAM 中
    nand erase 0x6000000 0x100000 //从地址 0x6000000 开始擦除 1MB 的空间
    nand write 0x87800000 0x6000000 0x100000 //将接收到的 dtb 写到 NAND 中
dtb 文件一般只有几十 KB,所以擦除 1M 。

5. uBOOT 启动
    将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要将设备树拷贝到 DRAM 中。可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中.使用 tftp命令将 zImage 下载到 DRAM 的 0X80800000 地址处,然后将设备树 imx6ull-alientek-emmc.dtb
下载到 DRAM 中的 0X83000000 地址处,最后之后命令 bootz 启动,命令如下:
    tftp 80800000 zImage
    tftp 83000000 imx6ull-alientek-emmc.dtb
    bootz 80800000 – 83000000
    要从 EMMC 中启动 Linux 系统的话只需要使用命令 fatload 将 zImage 和 imx6ull-alientek-emmc.dtb 从 EMMC 的分区 1 中拷贝到 DRAM 中,然后使用命令 bootz 启动即可使用命令 fatload 将 zImage 和 imx6ull-alientek-emmc.dtb 文件拷贝到 DRAM 中,地址分别为
0X80800000 和 0X83000000,最后使用 bootz 启动,命令如下:
    fatload mmc 1:1 80800000 zImage
    fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb
    bootz 80800000 - 83000000

    bootm 和 bootz 功能类似,但是 bootm 用于启动 uImage 镜像文件

    boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系 统,bootcmd 是一个很重要的环境变量,比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动 Linux 系统,命令如下:
    setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
    saveenv
    boot
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值