uboot编译-下载-命令

SD卡下载

使用imxdownload软件,先将sd卡挂载在ubuntu中,查出sd在ubuntu的dev文件夹显示的文件。
./imxdownload led.bin /dev/sdd
产生的文件led.imx就是led.bin文件添加了一些数据头以后生成的。设置sd卡启动,烧写即可。

启动方式选择

芯片是根据BOOT_MODE[1:0]的设置来选择 BOOT 方式。

BOOT_MODE[1:0]BOOT类型
00从FUSE启动
01串行下载
10内部BOOT模式
11保留

uboot编译

使用命令解压uboot压缩包

tar -vxjf uboot.tar.bz2

然后依次执行以下命令

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
# 其中的上面相当于以下
# ARCH=arm 指定架构,CROSS_COMPILE=arm-linux-gnueabihf- 指定编译器
# make distclean 清除工程
# make mx6ull_14x14_ddr512_emmc_defconfig 配置uboot
# make -j12 编译uboot

上面的可以编写到一个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

根据自己需求配置uboot,其中mx6ull_14x14_ddr512_emmc_defconfig 是正点原子针对 I.MX6U-ALPHA 的 EMMC 核心板编写的配置文件。存放在uboot/configs文件中。

烧写后使用串口连接,屏幕上显示“Hit any key to stop autoboot: ”倒计时的时候按下键盘上的回车键,默认是 3 秒倒计时,在 3 秒倒计时结束以后如果没有按下回车键的话 uboot 就会使用默认参数来启动 Linux 内核。在这世间段按下回车键,那么就可以进入uboot命令行模式。

uboot烧写

chmod 777 imxdownload    //给予 imxdownload 可执行权限,一次即可
./imxdownload u-boot.bin /dev/sdd //烧写到 SD 卡,不能烧写到/dev/sda 或 sda1 设备里面

uboot命令行

help 或者? --> 显示uboot支持的命令
help bootz或者? bootz --> 查看bootz命令的详细信息

信息查询命令

bdinfo  --> 查看板子信息
printenv --> 输出环境变量信息
version --> 查看uboot版本号

环境变量操作命令

# 修改环境变量
setenv bootdelay 5 --> 设置uboot倒计时5秒
saveenv  --> 保持环境变量设置
修改bootargs、bootcmd的时候需要使用单引号引起来
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' 
saveenv
# 新建环境变量
setenv author dongfang --> 新建环境变量author 对应为dongfang
saveenv
# 删除环境变量
setenv author --> 删除环境变量,也就是设置为空
saveenv

内存操作命令

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

md命令

用于显示内存值

md[.b, .w, .l] address [# of objects]
	[.b .w .l]对应  byte、word 和 long,分别代表1、2、4字节。
	address 就是要查看的内存起始地址。
	[# of objects]表示要查看的数据长度(len * 第一个参数代表长度)
	
md.b 80000000 14  --> 查看80000000地址开始的0x14个字节的内存值
md.w 80000000 14  --> 查看80000000地址开始的0x14 * 2个字节的内存值
md.l 80000000 14  --> 查看80000000地址开始的0x14 * 4个字节的内存值

nm命令

用于修改指定地址的内存值

nm[.b, .w, .l] address
nm.l 80000000 --> 修改以80000000为起始地址的4个字节的内存值
80000000: 00000000 ? 12345678 --> 修改为12345678
80000000: 12345678 ? q   --> 退出

mm命令

用于修改指定地址的内存值,只不过地址会自增

mm.l 80000000 --> 修改以80000000为起始地址的4个字节的内存值
80000000: 00000000 ? 12345678 --> 修改为12345678
80000004: 00000000 ? 12345678 --> 修改以80000004为起始地址的4个字节的内存值为12345678
80000008: 00000000 ? 12345678 --> 修改以80000008为起始地址的4个字节的内存值为12345678
8000000c: 00000000 ? q

nw命令

用于使用一个指定的数据填充一段内存

mw[.b, .w, .l] address value [count]
mw.l 80000000 0A0A0A0A 10  --> 使用0A0A0A0A填充以80000000起始地址的0x10 * 4个字节的内存值

cp命令

用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,
或者把 Nor Flash 中的数据拷贝到 DRAM 中

cp[.b, .w, .l] source target count
source 为源地址,target 为目的地址,count 为拷贝的长度
cp.l 80000000 80000100 10  --> 使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处
							   长度为 0x10个内存块(0x10 * 4=64 个字节)

cmp命令

用于比较两段内存的数据是否相等

cmp[.b, .w, .l] addr1 addr2 count
cmp.l 80000000 80000100 10 --> 使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据
								是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节)

网络操作命令

uboot 支持dhcp、ping、nfs 和 tftpboot等网络相关命令

设置网络相关环境变量

setenv ipaddr 192.168.239.50  --> 开发板ip地址,可以不设置,使用dhcp命令来从路由器获取IP地址
setenv ethaddr b8:ae:1d:01:00:00 --> 开发板的MAC地址,一定要设置
# 如果在同一个网段内有多个开发板的话一定要保证每个开发板的ethaddr是不同的,否则通信会有问题
setenv gatewayip 192.168.239.1  --> 网关地址
setenv netmask 255.255.255.0  --> 子网掩码
setenv serverip 192.168.239.129 --> 服务器IP地址,也就是Ubuntu主机IP地址,用于调试代码。
saveenv

ping命令

查看网络是否可用

ping 192.168.239.129
# 只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping

dhcp命令

用于从路由器获取 IP 地址,前提得开发板连接到路由器上的

dhcp
DHCP client bound to address 192.168.239.100 (7964 ms)
--> 说明动态分配了ip地址为192.168.239.100

nfs命令

通过 nfs 可以在计算机之间通过网络来分享资源。
将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中
的 linux 镜像和设备树下载到开发板的 DRAM 中

首先ubuntu中需要安装好nfs,并且新建nfs使用目录,将所有需要使用nfs访问的文件放到该目录下。

nfs [loadAddress] [[hostIPaddr:]bootfilename]
# loadAddress 是要保存的 DRAM 地址
# [[hostIPaddr:]bootfilename]是要下载的文件地址
nfs 80800000 192.168.239.129:/home/dongfang/linux/nfs/zImage

tftp命令

作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中

首先需要在ubuntu中安装好tftp服务器,并且文件夹和文件都需要设置为777权限。设置tftp文件夹,

将所有需要使用tftp访问的文件放到该目录下。

tftpboot [loadAddress] [[hostIPaddr:]bootfilename
# loadAddress  是文件在   DRAM  中 的 存 放 地 址 , 
# [[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件
tftp 80800000 zImage

emmc和sd卡操作命令

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

在uboot中更新uboot

# SD卡烧写
tftp 80800000 u-boot.imx  // 下载u-boot.imx到DRAM中
mmc dev 0 0 //切换到SD卡(SD卡的mmc设备号是0)的0分区(专门存放uboot的分区)
	mmc write addr blk# cnt //将DRAM的addr地址的数据写入到第blk个块开始的地方
							//一共写cnt个块(块和扇区是一个意思,一个块512字节)
mmc write 80800000 2 346 //下载时发现文件大小是429056个字节,刚好838个块,16进制就是346

# EMMC烧写
mmc dev 1 0   //切换到 EMMC 分区  0
tftp 80800000 u-boot.imx  //下载  u-boot.imx 到 DRAM
mmc write 80800000 2 346  //烧写  u-boot.imx 到 EMMC 中 
mmc partconf 1 1 0 0   //分区配置,EMMC 需要这一步

## 注意
千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!

# 要擦除 MMC 设备的指定块就是用命令“mmc erase”
mmc erase blk# cnt
blk 为要擦除的起始块,cnt 是要擦除的数量。没事不要用 mmc erase 来擦除 MMC 设备!!

文件系统格式命令

FAT格式

跟文件操作相关的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite

  • fatinfo
# 用于查询指定 MMC 设备分区的文件系统信息
fatinfo <interface> [<dev[:part]>]
interface 表示接口,比如  mmc,dev 是查询的设备号,part 是要查询的分区

fatinfo mmc 1:1    --> 查询mmc分区1的文件系统信息
  • fatls
# 用于查询 FAT 格式设备的目录和文件信息
fatls <interface> [<dev[:part]>] [directory]
interface是要查询的接口,比如 mmc,dev 是要查询的设备号,
part 是要查询的分区,directory是要查询的目录

fatls mmc 1:1   --> 查询mmc分区1的FAT格式设备目录和文件信息
  • fstype
# 用于查看 MMC 设备某个分区的文件系统格式
fstype <interface> <dev>:<part>
fstype mmc 1:0 --> 查看 MMC 设备0分区的文件系统格式
  • fatload
# 用于将指定的文件读取到  DRAM 中
fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
interface 为接口,part 是分区,addr 是保存在 DRAM 中的起始 地址,filename 是要读取的文件名字。
bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。
pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。

fatload mmc 1:1 80800000 zImage
--> 将 EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的0X80800000 地址处
  • fatwrite
# 用于将  DRAM 中的数据写入到  MMC 设备中
fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>
可以通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树

fatwrite mmc 1:1 80800000 zImage 6788f8
--> 将DRAM中起始位置80800000处开始写入到 EMMC 的分区 1 中,大小为0x6788f8字节,文件名字为 zImage

EXT格式

uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别为:
ext2load、ext2ls、ext4load、ext4ls 和 ext4write。这些命令的含义和使用与 fatload、fatls 和 fatwrite
一样,只是 ext2 和 ext4 都是针对 ext 文件系统的

ext4ls mmc 1:2  --> 查询 EMMC 的分区 2 中的文件和目录

boot操作命令

bootz

bootz 命令用于启动 zImage 镜像文件

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

- 使用tftp 网络下载zImage和dtb,并启动
tftp 80800000 zImage							#下载zImage
tftp 83000000 imx6ull-alientek-emmc.dtb			#下载设备树
bootz 8080000083000000						#启动
- 从emmc读取zImage和dtb,并启动
fatload mmc 1:1 80800000 zImage   # 将mmc中的ZImage复制到DRAM中
fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb # 将mmc中的设备树复制到DRAM中
bootz 80800000 - 83000000 

bootm

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

- 不使用设备树
bootm addr --> addr是uImage在DRAM中的首地址
- 使用设备树
bootm [addr [initrd[:size]] [fdt]] --> 和bootz是一样的,只不过,addr是uImage在DRAM中的首地址

boot

boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统 ,其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合 ,具体的引导命令内容是可以修改的。

  • 使用 tftp 命令从网络启动 Linux
#设置bootcmd环境变量:tftp网络下在镜像、设备树,并启动
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
saveenv				#保存环境变量
boot				#启动,boot命令会执行bootcmd环境变量
  • 使用 mmc启动 Linux
setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ullalientek_emmc.dtb; bootz 80800000 - 83000000'
savenev
boot

在启动 Linux 内核的时候可能会遇到如下错误:
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
这是因为没有根文件系统造成的

其他常用的命令

  • reset

复位重启

  • go

用于跳到指定的地址处执行应用

go addr [arg ...]

tftp 87800000 printf.bin 
go 87800000  --> 执行printf.bin裸机应用
  • run

用于运行环境变量中定义的命令

setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull- 
14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'
setenv  mybootnand  'nand  read  80800000  4000000  800000;nand  read  83000000  6000000 
100000;bootz 80800000 - 83000000'
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb; 
bootz 80800000 - 83000000'
saveenv

run mybootemmc
run mybootnand
run mybootnet
  • mtest

mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR

mtest [start [end [pattern [iterations]]]]
start 是要测试的 DRAM 开始地址,end 是结束地址,
比如我们测试 0X80000000~0X80001000 这段内存,
输入“mtest 80000000 80001000
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值