uboot学习笔记1(编译中遇见的问题,以及相关命令)

首先先来记录一下在学习之前遇到的困难,在移植正点原子修改之后的uboot还是恩智浦的官方uboot的时候最后编译那一步总是会出现错误,比如说如下错误:
uboot学习笔记1(编译中遇见的问题,以及相关命令)
最后的发现问题的原因是正点原子使用的Ubuntu是16.04的,我自己用的Ubuntu是18.04,然后正点原子用的gcc是4.9.4,我的gcc版本太高,然后正点原子移植的uboot是2016版本的。重新安装一遍,就问题解决了,今天终于可以开始学习uboot了。

上面是前言

1. uboot简单了解

linux系统要启动就需要一个bootloader程序,也就是说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将linux内核从flash(NAND,NOR FLASH, SD, MMC 等)等拷贝到DDR,最后启动内核。主要工作就是启动内核,这就和windows上的BIOS差不多。现如今有很多的bootloader,最常用的就是uboot

2.uboot相关命令

命令 说明
bdinfo 查看板子信息
printenv 用于输出环境变量信息
version 用于查看uboot版本号
setenv 设置或者修改环境变量
saveenv 保存修改后的环境变量
md 显示内存值
nm 修改指定内存值
mm 修改指定内存值
mw 用指定的数据填充一段内存
cp 内存拷贝
cmp 比较两段内存是否相等

环境变量操作命令

一般环境变量是存放在外部flash中的,uboot启动的时候会将环境变量从flash读取到DRAM中,所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话uboot 下一次重启会继续使用以前的环境变量值。

使用命令printenv可以输出环境变量的信息,用setenv可以设置或者修改环境变量,用saveenv可以报错修改后的环境变量,下面是几个例子。
1.修改bootdelay,也就是uboot启动延时
uboot学习笔记1(编译中遇见的问题,以及相关命令)
这个样子代表成功了,下次启动的时候uboot延时就变成了5s

2.修改像bootcmd这种环境变量的时候,要用单引号括起来
uboot学习笔记1(编译中遇见的问题,以及相关命令)

内存操作命令

内存操作命令就是用于直接对DRAM进行读写操作,常见的内存操作命令有md、nm、mm、mw、cp、cmp

1.md,用于显示内存值
一般是这样子写,举个例子:
md.b 80000000 14
80000000代表的是0x80000000,表示的是开始地址
14就是显示0x80000000开始的20个内存值,14是16进制,1 0100 = 20
主要要有一下三种写法
md.b 80000000 10
md.w 80000000 10
md.l 80000000 10
区别看图
uboot学习笔记1(编译中遇见的问题,以及相关命令)
2.nm用于修改指定地址的内存值
nm命令同样可以用b、w、l来指定操作格式,比如说用l指令将0x80000000地址的数值修改为0x12345678,可以输入下面命令:
nm.l 80000000
操作如图:
uboot学习笔记1(编译中遇见的问题,以及相关命令)
可以用md命令再查看一下

3.mm修改指定地址内存值
mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。比如以.l 格式修改从地址 0x80000000 开始的连续 3 个内存块(3*4=12个字节)的数据为 0X05050505
uboot学习笔记1(编译中遇见的问题,以及相关命令)
4.mw用于使用一个指定的数据填充一段内存
比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A
uboot学习笔记1(编译中遇见的问题,以及相关命令)
5.cp内存拷贝指令
cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中
使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节),命令如下所示:
uboot学习笔记1(编译中遇见的问题,以及相关命令)
6.cmp比较两段内存数据是否相等
我们使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节),命令如下所示:
uboot学习笔记1(编译中遇见的问题,以及相关命令)

网络操作命令

网络相关的环境变量:
uboot学习笔记1(编译中遇见的问题,以及相关命令)
环境变量的修改可以使用相关的环境变量的操作指令,比如说setenv,saveenv等。

1.ping
这个不用说了吧,看网络通不通的问题,看开发板和主机能否通信

2.dhcp
dhcp 用于从路由器获取 IP 地址,前提得开发连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址

3.nfs
nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中

4. tftp 命令
tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议, Ubuntu 主机作为 TFTP 服务器,要先搭建tftp服务器

EMMC和SD卡操作命令

uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,下面的mmc指的就是EMMC和SD卡
uboot学习笔记1(编译中遇见的问题,以及相关命令)

FAT格式文件系统操作命令

需要在uboot中对SD卡或者EMMC中存储的文件进行操作,这时候就要用到文件操作命令,跟文件操作相关的命令:fatinfo 、fatls、fstype、fatload、fatwrite,这些操作指令只支持FAT格式的文件系统。

1.fatinfo命令
fatinfo:用于查询指定MMC设置指定分区的文件系统信息,见图:
uboot学习笔记1(编译中遇见的问题,以及相关命令)
mmc 0:1指的是SD的分区1
mmc 1:1指的是EMMC的分区1

2.fatls
用于查询FAT格式设备的目录和文件信息:
uboot学习笔记1(编译中遇见的问题,以及相关命令)
3.fstype命令
查看MMC设备某个分区的文件系统格式
uboot学习笔记1(编译中遇见的问题,以及相关命令)
从上图可以看出,分区 0 格式未知,因为分区 0 存放的 uboot,并且分区 0 没有格式化,所以文件系统格式未知。分区 1 的格式为 fat,分区 1 用于存放 linux 镜像和设备树。分区 2 的格式为 ext4,用于存放 Linux 的根文件系统(rootfs)

4.fatload命令

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

BOOT操作命令

uboot的本质是引导linux,所以也有跟boot有关的命令:bootz、bootm、boot
1.bootz
要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要将设备树拷贝到 DRAM 中

要从 EMMC 中启动 Linux 系统的话只需要使用命令 fatload 将 zImage 和 imx6ull-alientek-emmc.dtb 从 EMMC 的
分区 1 中拷贝到 DRAM 中,然后使用命令 bootz 启动即可
uboot学习笔记1(编译中遇见的问题,以及相关命令)

2.bootm

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

3.boot
boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统, bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可以修改的。比如我们要想使用 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