【嵌入式LINUX学习笔记】U-BOOT简述及常用命令

前提引入

BootLoader:
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行(芯片上电以后)。可以初始化硬件设备、建立内存空间映射图(比如初始化DDR等外设,将Linux内核从flash等拷贝到DDR,启动Linux等等),从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。(就如同windos上的BIOS一样)

现在常用的BootLoader软件有很多,比如Redboot、ARMboot、U-Boot、Blob等,这里选用较为常用的U-Boot。

BootLoader 详情链接

简介

U-Boot全称: Universal Boot Loadert,是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。

U-Boot 官网链接

编译和烧录

  1. 在Linux中安装ncurses库

  2. 将源码进行解压

  3. 创建shell脚本文件,准备编译

#!/bin/bash
 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

第一行是shell脚本格式
第二行 ARCH是指定框架 CROSS_COMPILE 用于指定编译器 distclean 清除工程
第三行是 指定配置源码文件
第四行 V=1 用于设置编译过程的信息输出级别 -j 用于设置主机使用多少线程编译

  1. 赋予shell文件可执行权限,并编译uboot
  2. 采用imxdownload工具进行下载,从SD卡启动
  3. 查看串口输出内容是否正常

uboot输出信息

在这里插入图片描述

  1. uboot 版本号和编译时间
  2. CPU信息
  3. 当前的复位原因是 POR
  4. 当前开发板的名字
  5. I2C 准备就绪
  6. DRAM(内存)为512MB
  7. 当前有两个MMC/SD 卡控制器: FSL_SDHC(0)和 FSL_SDHC(1)
  8. 显示器型号
  9. 标准输入、标准输出和标准错误所使用的终端,都使用串口(serial)作为终端
  10. 切换到emmc的第0个分区,当前uboot是总emmc启动的(之前烧写在sd只是为了方便,现在还是从emmc启动)
  11. 网口信息,现在还没有连接网线
  12. 提示正常启动,也就是说 uboot 要从 emmc 里面读取环境变量和参数信息启动内核
  13. 倒计时提示,默认倒计时 3 秒,按下回车进入Linux命令行,未按回车,倒计时结束后启动内核

对于出现的
Warning - bad CRC, using default environment问题。

是因为flash扇区或者ERPROM含有的环境变量还没有被初始化,使用saveenv命令(如下)保存环境变量就可以了


U-Boot命令

输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令

信息查询命令

  • bdinfo 查看板子信息
  • printenv 输出环境变量信息
  • version 查看u-boot版本号

环境变量命令

修改环境变量

  • setenv 设置或者修改环境量的值
  • saveenv 保存修改后的环境变量

eg:

setenv bootdelay 5
saveenv

将倒计时改为5秒

一般环境变量是存放在外部flash中的,u-boot启动时会将环境变量从flash读取到DRAM中,使用命令setenv修改的是DRAM中的环境变量,修改以后使用saveenv命令将修改后的环境变量保存到flash中(否则下次重启怀惠使用以前的变量)

新建环境变量

  • setenv 可用于新建命令

eg:

setenv AAA aaa
saveenv

删除环境变量

  • setenv 可用于删除环境变量,只要将变量赋空值即可

eg:

setenv AAA
saveenv

内存操作命令

显示内存值

名称:md
格式:md[.b, .w, .l] address [# of objects]
说明:

  • [.b.w.l]是以byte(1个字节)、word(2个字节)和long(4个字节)显示内存值
  • adress 查看内存的起始地址
  • [# of objects]表示要查看的数据长度(不是字节,与选择的格式有关)

uboot命令中的数字都是十六进制,不是十进制,所以可以不用写“0x”前缀。

eg:
在这里插入图片描述

修改指定地址的内存值

名称:nm
格式:nm [.b, .w, .l] address
说明:关键字意义同上

修改指定地址的内存值(地址自增)

名称:**mm **
格式:mm [.b, .w, .l] address
说明:关键字意义同上。使用 mm 修改内存值的时候地址会自增用,使用nm不会自增。

将指定数据填充一段内存

名称:mw
格式:mw [.b, .w, .l] address value [count]
说明:

  • value:要填充的数据
  • count:填充长度

数据拷贝命令

名称:cp
格式:cp [.b, .w, .l] source target count
说明:

  • source:源地址
  • target:目的地址
  • count:拷贝长度

比较两段内存的数据

名称:cmp
格式:cmp [.b, .w, .l] addr1 addr2 count
说明:

  • addr1:第一段内存首地址
  • addr2:第二段内存首地址
  • count:比较长度

网络操作命令

使用前要保证开发板和PC在同一局域网下

ping 命令

功能:网路是否能用
格式:ping 192.168.xxx.xxx

dhcp 命令

功能:获取IP地址
格式:chcp

nfs命令

功能:nfs(Network File System)网络文件系统,通过nfs实现通过网络来分享资源
格式:nfs [loadAddress] [[hostIPaddr:]bootfilename]

该命令十分重要!
可以在uboot中使用nfs命令将Ubuntu中文件下载到开发板中,这种方式也叫做网络调试


在此期间通过nfs下载遇到了如图问题:
在这里插入图片描述

解决方法:

  • 在host文件中将开发板的IP地址添加进去,如图

在这里插入图片描述

前面是开发板地址,后面是nfs的位置。

保存退出,并且重启

  • 兼容性问题
    uboot 的版本过低,于Ubuntu中的NFS版本不兼容。

办法:让Ubuntu的NFS兼容V2,修改/etc/default/nfs-kernel-server文件

在这里插入图片描述

重启NFS sudo service nfs-kernel-server restart

tftp命令

功能:同nfs一样,将通过网络下载东西到DRAM中
格式:tftpboot[loadAddress][[hostIPaddr:]bootfilename]
(tftp命令可不用输入路径,秩序输入文件名即可)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xAYZcoWF-1615380928381)(D8F7211B227843CC88A5E3F86AC68604)]

EMMC和SD卡操作命令

EMMC和SD可以看作为MMC设备。

mmc一系列命令可以操作MMC设备。

命令描述
mmc info输出 MMC 设备信息
mmc read读取 MMC 中的数据
mmc wirte向 MMC 设备写入数据
mmc rescan扫描 MMC 设备
mmc part列出 MMC 设备的分区
mmc dev切换 MMC 设备
mmc list列出当前有效的所有 MMC 设备
mmc hwpartition设置 MMC 设备的分区
mmc bootbus [dev] [part]设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值
mmc bootpart [dev] [part]设置指定 MMC 设备的 boot 和 RPMB 分区的大小
mmc partconf [dev] [part]设置指定 MMC 设备的 PARTITION_CONFG 域的值
mmc rst复位 MMC 设备
mmc setdsr设置 DSR 寄存器的值

FAT格式文件操作命令

命令参数描述
fatinfo [<dev[:part]>]interface 表示接口,interface 表示接口,part 是要查询的分区查询指定 MMC 设置指定分区的文件系统信息
fatls [<dev[:part]>] [directory]part 是要查询的分区查询 FAT 格式设备的目录和文件信息
fstype :同上查看 MMC 设备某个分区的文件系统格式
fatload [<dev[:part]> [ [ [bytes [pos]]]]]addr是保存在DRAM中的起始地址,filename 是要读取的文件名字,bytes 表示读取多少字节的数据,pos 是要读的文件相对于文件首地址的偏移将指定的文件读取到 DRAM 中
fatwrite <dev[:part]> 备注:使用该命令需要修改配置文件将 DRAM 中的数据写入到 MMC 设备中

EXT格式文件系统操作命令

命令描述
ext2load同上fatload
ext2ls同fatls
ext4load同fatload
ext4ls同fatls
ext4writefatwrit

BOOT操作命令

bootz命令

功能:启动linux镜像文件
格式:bootz [addr [initrd[:size]] [fdt]]

  • addr: Linux 镜像文件在 DRAM 中的位置
  • initrd:initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可
  • fdt:设备树文件在 DRAM 中的地址

如果要启动Linux,首先Linux镜像(和设备树文件)要在DRAM中

bootm命令

功能:启动 uImage 镜像文件
格式:bootm addr(不使用设备树) bootm [addr [initrd[:size]] [fdt]](使用设备树)

  • addr: Linux 镜像文件在 DRAM 中的位置
  • initrd:initrd 文件在DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可
  • fdt:设备树文件在 DRAM 中的地址

boot命令

功能:启动Linux系统

boot会读取环境变量 bootcmd 来启动 Linux 系统。bootcmd 环境变量保存着引导命令,是启动的命令集合,可以修改。

eg:

setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-emmc.dtb; bootz80800000 - 83000000'
saveenv
boot

其他命令

reset命令

功能:复位

go命令

功能:跳转到指定的地址处执行应用
格式:go addr [arg...]

  • addr:应用在DRAM中的首地址
  • arg…:应用名称

run命令

功能:运行环境变量中定义的命令

主要用于运行自定义环境变量,可以通过不同的环境变量来实现不同的启动方式。

eg:

setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-emmc.dtb;bootz 80800000 - 83000000'
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz
80800000 - 83000000'
saveenv

run mybootemmc
run mybootnet

miest命令

功能:内存读写命令
格式:mtest [start [end [pattern [iterations]]]]

  • start:测试的DRAM 开始地址
  • end: 结束地址
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ORI2333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值