本文主要探讨基于orangePi的U-boot移植,U-boot的命令等。
u-boot简介
1、uboot是裸机程序,需要编译成bin文件,然后烧写,才能启动系统。
2、uboot是bootloader的一种,作用是启动操作系统和初始化DDR。
3.Linux在DDR运行。Image,设备树放在SD、EMMC、NAND、SPI FLASH等外置存储。
4.uboot初始化ddr,将Image和设备树拷到DDR中,然后启动,uboot程序结束。
u-boot移植
固件设备:orangePi_zero2(h616)
ubuntu:22.04
安装依赖包
apt-get install libgtk2.0-0:i386 libxtst6:i386 gtk2-engines-murrine:i386 lib32stdc++6 libxt6:i386 libdbus-glib-1-2:i386 libasound2:i386 zlib1g-dev libssl-dev pip bison flex swig sunxi-tools make -y
安装交叉编译工具
tar -xvf gcc-linaro-14.0.0-2023.06-x86_64_arm-linux-gnueabihf.tar.xz
添加交叉编译环境
vim ~/.bashrc
export ARCH=arm64
export PATH=/root/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-linux-gnu-
source ~/.bashrc
编译生成bl31.bin
unzip arm-trusted-firmware-master.zip
cd arm-trusted-firmware-master
make PLAT=sun50i_h616 DEBUG=1 bl31
编译uboot
tar -jxvf u-boot-2023.07.tar.bz2
cd u-boot-2023.07
make BL31=/root/arm-trusted-firmware-master/build/sun50i_h616/debug/bl31.bin orangepi_zero2_defconfig
make BL31=/root/arm-trusted-firmware-master/build/sun50i_h616/debug/bl31.bin
烧写
dd if=/root/u-boot-2023.07/u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
远程工具串口连接
uboot命令
基础
bdinfo:查看开发板基础信息
version:查看uboot版本
print/printenv:打印环境变量
set/setenv:设置(删除)环境变量
save/saveenv:保存环境变量
reset:重启
poweroff:关机
内存地址
md:打印内存值
md [.b, .w, .l, .q] address [# of objects]
b:byte(1字节),w:word(2字节),l:long(4字节)
address:起始地址,后跟字节长度
nm:修改指定内存地址的数据
nm [.b, .w, .l, .q] address
mm:递归修改指定内存地址的数据
mm [.b, .w, .l, .q] address
=> md.l 40000000 1
40000000: 12345678
=> nm.l 40000000
40000000: 12345678 ? aa0003f4
40000000: aa0003f4 ? q
=> md.l 40000000 1
40000000: aa0003f4
mw:指定的数据填充内存
mw [.b, .w, .l, .q] address value [count]
value:数据 count:数据的长度
=> md.l 40000000 4
40000000: aa0003f4 aa0103f5 aa0203f6 aa0303f7
=> mw.l 40000000 0123456789 10
=> md.l 40000000 4
40000000: 01234567 01234567 01234567 01234567
cp将原地址数据复制到目标地址
cp [.b, .w, .l, .q] source target count
=> md.l 40000000 1
40000000: 12345678
=> md.l 80000000 1
80000000: aa0003f4
=> cp 40000000 80000000 1
=> md.l 80000000 1
80000000: 12345678
cmp:比较两个地址段数据
cmp [.b, .w, .l, .q] addr1 addr2 count
mmc info 设备的信息
mmc rescan [mode] 扫描开发板上MMC设备,包括EMMC和SD卡
mmc list 查看开发板MMC设备
mmc dev 切换当前MMC设备:mmc dev [dev] [part]
[dev]切换MMC设备号,[part]分区号
mmc part查看分区
mmc read 读取mmc设备数据
网络
ipaddr:地址
serverip:tftp服务器地址
dhcp:自动获取地址
ping:查看网络
启动
boot:读取环境变量bootcmd启动Linux
bootz:启动 zImage
bootm: 启动 uImage
Image为内核映像文件
zImage为映像压缩文件
uImage是uboot映像文件,在zImage前加上64字节头,说明内核的版本、加载位置、生成时间、大小等信息
nand scrub:擦除整个NAND,擦除bad block标记。
nand erase addr1 count:擦除NAND,count擦除字节数
nand write addr offset count:内存数据写入NAND,offset是偏移地址
nand read addr offset count :NAND数据读取到内存
nand bad:测试NAND FLASH坏块