文章目录
- 1.uboot
- 1.U-Boot命令之常用命令:
- 7.U-Boot命令之EMMC和SD卡操作命令:一般EMMC和SD卡是同一个东西,没特殊说明,统一MMC来代指EMMC和SD卡
- 8.U-Boot命令之内存操作命令:直接对DRAM进行读写操作,uboot命令中的数字都是十六进制的,不是十进制
- 9.U-Boot命令之boot命令:boot(引导)命令来启动linux
- 10.U-Boot命令之网络操作命令:查看信息(bdinfo/version/bdinfo)
1.uboot
1.U-Boot命令之常用命令:
reset:复位重启
tftp 87800000 printf.bin
go 87800000 执行printf.bin
setenv mybootemmc ‘fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ullalientek-emmc.dtb;bootz 80800000 -83000000’
setenv mybootnand ‘nand read 80800000 4000000 800000;nand read 83000000 6000000100000;bootz 80800000 - 83000000’
setenv mybootnet ‘tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000’
saveenv
run mybootemmc
run mytoobnand
run mybootnet
mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR。测试范围为 0X80000000~0X80001000,已经测试了 6656 次,如果要结束测试就按下键盘上的“Ctrl+C”键。
7.U-Boot命令之EMMC和SD卡操作命令:一般EMMC和SD卡是同一个东西,没特殊说明,统一MMC来代指EMMC和SD卡
1.mmc info
:输出当前选中的设备信息,如下当前选中的 MMC设备是SD卡,版本为 3.0,容量为 14.8GiB(EMMC为 4GB),速度50000000Hz=50MHz, 4 位宽的总线。"? mmc"即可查看 mmc 有关的命令。
2.mmc rescan
:用于扫描当前开发板上所有的MMC设备,包括EMMC和SD卡。
3.mmc list
:用于来查看当前开发板一共有几个MMC设备。 FSL_SDHC:0是 SD卡, FSL_SDHC:1是 EMMC。
4.mmc dev 1
:切换到EMMC。
5.mmc part
:查看分区。此时EMMC有两个分区,扇区20480~ 262144为第一个分区,扇区 282644~14987264为第二个分区。如果EMMC里面烧写了Linux系统的话,第0个分区存放uboot,第1个分区存放Linux镜像文件和设备树,第2个分区存放根文件系统。但是在下图中只有两个分区,那是因为第0个分区没有格式化,所以识别不出来,实际上第0个分区是存在的。一个新的SD卡默认只有一个分区,那就是分区0。
6.mmc read addr blk# cnt
:读取mmc设备数据,addr是数据读取到DRAM中的地址, blk是要读取的块起始地址(十六进制)
,一个块是512字节,这里的块和扇区是一个意思,在MMC设备中通常说扇区,cnt是要读取的块数量(十六进制)
。比如从EMMC的第1536(0x600)个块
开始读16(0x10)个块
的数据到DRAM的0x80800000
地址处。
7.mmc write addr blk# cnt
:将数据写到MMC设备里面,用此命令升级uboot,也就是在uboot中更新uboot。这里要用到nfs或tftp命令将新的u-boot.bin下载到开发板的DRAM中,然后再用此命令将其写入到MMC设备中。更新一下SD中的uboot,先查看一下SD卡中的uboot版本号:
可看出当前SD卡中的 uboot 是 2020 /10/12 14:04:37编译的。重新编译一下uboot并将编译出来的u-boot.imx (u-boot.bin前面加了一些头文件) 拷贝到 Ubuntu 中的tftpboot 目录下。最后使用tftp命令将其下载到0x80800000地址处命令如下:
u-boot.imx大小为379904字节, 379904/512=742
,所以我们要向SD卡中写入742个块,如果有小数的话就要加1个块。从SD卡分区0第2个块开始烧写(不要写SD卡或者EMMC的前2个扇区,因为里面保存着分区表),一共烧写742(0x2E6)个块。烧写成功后重启开发板(从SD卡启动),重启后再输入version来查看版本号。
// 在 uboot 中更新 EMMC 对应的 uboot,可以使用如下所示命令:
mmc dev 1 0 //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 32E //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0 //分区配置, EMMC 需要这一步!
8.mmc erase blk# cnt
:擦除MMC设备的指定块。
8.U-Boot命令之内存操作命令:直接对DRAM进行读写操作,uboot命令中的数字都是十六进制的,不是十进制
md[.b, .w, .l] address [# of objects]
:[.b .w .l]对应byte/word/long即分别以1/2/4个字节显示display内存值,address就是要查看的内存起始地址
,[# of objects]表示要查看的数据长度
(不是字节,和所选的显示格式有关)。比如你设置要查看的内存长度为20即md.b 80000000 14(0X80000000开始,20的十六进制0x14)
,如果显示格式为.b的话那就表示20个字节;如果显示格式为.w的话就表示20个word等。
mm命令也是修改指定地址内存值的,使用mm修改内存值的时候地址会自增,而使用nm地址不会自增。比如以.l 格式修改从地址0x80000000开始的连续3个内存块(3*4=12个字节)的数据为0X05050505。
如下0x10(16,16x4=64个字节)个内存块。
cp [.b, .w, .l] source target count
:用于将DRAM中的数据从一段内存拷贝到另一段内存中,或把NorFlash中的数据拷贝到DRAM中。
9.U-Boot命令之boot命令:boot(引导)命令来启动linux
要启动Linux,需先将Linux镜像文件拷贝到DRAM 中,如果使用到设备树的话也需要将设备树拷贝到DRAM 中。可从EMMC或NAND等存储设备中将Linux镜像和设备树文件拷贝到DRAM,也可通过nfs或tftp将Linux镜像文件和设备树文件下载到DRAM中。
然后用bootz命令来启动,bootz命令用于启动zImage镜像文件,bootz命令格式如下:bootz [addr [initrd[:size]] [fdt]]
(addr
是Linux镜像文件在DRAM中的位置,initrd
是initrd文件在DRAM中的地址,如果不使用initrd的话使用-代替即可,fdt
就是设备树文件在DRAM中的地址)。
boot命令也是用来启动Linux系统的,只是boot会读取环境变量bootcmd来启动Linux系统,bootcmd环境变量保存着引导命令,其实就是启动的命令集合,具体引导命令内容是可修改的。比如我们要想使用tftp命令从网络启动Linux那么就可以设置bootcmd为“tftp80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000”
,然后使用saveenv
将bootcmd保存起来,然后直接输入boot
命令即可从网络启动Linux系统,uboot倒计时结束以后就会启动Linux系统,其实就是执行的bootcmd中的启动命令。只要不修改bootcmd中的内容,以后每次开机uboot倒计时结束以后都会使用tftp命令从网络下载zImage和imx6ull-alientek-emmc.dtb,然后启动Linux。
10.U-Boot命令之网络操作命令:查看信息(bdinfo/version/bdinfo)
一般环境变量是存放在外部flash中的,uboot启动的时候会将环境变量从flash读取到DRAM中。所以使用命令setenv修改的是DRAM中的环境变量值,修改以后要使用saveenv命令将修改后的环境变量保存到flash中,否则uboot下一次重启会继续使用以前的环境变量值。
根据如下提示看出环境变量保存到了MMC(0)中,也就是SD卡中。因为我用的SD卡启动,所以会保存到MMC(0)中。
有时候修改的环境变量值可能会有空格, 如bootcmd、bootargs等, 这个时候环境变量值就得用单引号括起来:setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’。
新建环境变量:setenv author q ,删除环境变量:setenv author 空。
开发板和主机 PC 都连接到同一个路由器上!最后设置下表中所示的几个环境变量
setenv ipaddr 192.168.0.107 # 开发板ip,可不设置,dhcp命令来从路由器获取IP
setenv ethaddr 00:04:9f:04:d2:35 # 开发板MAC地址,一定要设置
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.108 # 服务器IP地址,也就是Ubuntu主机IP地址,用于调试代码
saveenv
设置好网络相关的环境变量以后就可以使用网络相关命令了。
192.168.0.108 这个主机存在,说明 ping 成功, uboot 的网络工作正常。
只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败!
开发板通过 dhcp 获取到的 IP 地址为 192.168.0.102。同时在图中可以看到“warning: no boot file name;”这样的字样。这是因为 DHCP 不单单是获取 IP 地址,其还会通过 TFTP 来启动 linux 内核,输入“? dhcp”即可查看 dhcp 命令详细的信息,如下图 所示:
一般用uboot中的nfs(Network File System)命令将Ubuntu中文件下载到开发板DRAM中,在使用之前需要开启Ubuntu主机NFS服务(/etc/init.d/nfs-kernel-server restart),且新建一个NFS使用的目录,以后通过NFS访问的文件都要放到这目录中。
准备好以后就可以使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
nfs 80800000 192.168.0.108:/home/qiaoqiao/linux/nfs/zImage
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
mkdir /home/qiaoqiao/linux/tftpboot
chmod 777 /home/qiaoqiao/linux/tftpboot
# /etc/xinetd.d/tftp
server tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/qiaoqiao/linux/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
sudo service tftpd-hpa start
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/qiaoqiao/linux/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"
sudo service tftpd-hpa restart
tftp 80800000 zImage