U-boot移植
U-boot移植
编译好u-boot,用串口可以看见板子的硬件信息,可以用命令去调试
修改环境变量
环境变量的操作涉及到两个命令: setenv 和 saveenv,命令 setenv 用于设置或者修改环境变量的值。命令 saveenv 用于保存修改后的环境变量,一般环境变量是存放在外部 flash 中的,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话uboot 下一次重启会继续使用以前的环境变量值
setenv bootdelay 5
saveenv
有时候我们修改的环境变量值可能会有空格, 比如 bootcmd、 bootargs 等, 这个时候环境变量值就得用单引号括起来,比如下面修改环境变量 bootargs 的值:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
上面命令设置 bootargs 的值为“console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw”,其中“console=ttymxc0,115200”、“root=/dev/mmcblk1p2”、“rootwait”和“rw”相当于四组“值”,这四组“值”之间用空格隔开,所以需要使用单引号‘’将其括起来,表示这四组“值”都属于环境变量 bootargs
新建环境变量
命令 setenv 也可以用于新建命令,用法和修改环境变量一样,比如我们新建一个环境变量author, author 的值为我的名字拼音: zuozhongkai,那么就可以使用如下命令:
setenv author zhanglanxiong
saveenv
新建命令 author 完成以后重启 uboot,然后使用命令 printenv 查看当前环境变量
清除环境变量
要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除掉上面新建的 author 这个环境变量,命令如下:
setenv author
saveenv
上面命令中通过 setenv 给 author 赋空值,也就是什么都不写来删除环境变量 author。重启uboot 就会发现环境变量 author 没有了。
内存操作命令
显示指定的单元数(空格分隔为一个单元),每个单元是1/2/4个字节
md
md 命令用于显示内存值,格式如下:
md[.b, .w, .l] address [# of objects]
命令中的[.b .w .l]对应 byte、 word 和 long,也就是分别以 1 个字节、 2 个字节、 4 个字节来显示内存值。
address 就是要查看的内存起始地址, [# of objects]表示要查看的数据长度
数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是204=80 个字节。另外要注意:
uboot 命令中的数字都是十六进制的!不是十进制的!
查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用
如下所示命令:
md.b 80000000 14
而不是:
md.b 80000000 20
上面说了, uboot 命令里面的数字都是十六进制的,所以可以不用写“0x”前缀,十进制
的 20 其十六进制为 0x14,所以命令 md 后面的个数应该是 14,如果写成 20 的话就表示查看
32(十六进制为 0x20)个字节的数据。分析下面三个命令的区别:
md.b 80000000 10
md.w 80000000 10
md.l 80000000 10
上面这三个命令都是查看以 0X80000000 为起始地址的内存数据,第一个命令以.b 格式显
示,长度为 0x10,也就是 16 个字节;第二个命令以.w 格式显示,长度为 0x10,也就是 162=32
个字节;最后一个命令以.l 格式显示,长度也是 0x10,也就是 164=64 个字节。

nm
nm 命令用于修改指定地址的内存值,命令格式如下:
nm [.b, .w, .l] address
网络命令
网络连接见正点原子LINUX网络构建,看到配置完虚拟机和WINDOWS就行,配置板子是进入的内核,不用。u-boot命令行就行
虚拟机配置两个网卡,一个是NAT,一个是桥接;插上网线和板子连接好后windows对应的以太网接口属性设置为桥接,并且IP设置为静态,和虚拟机桥接网卡一个网段,相同网关。
在设置里面打开开启,禁用Windows和虚拟机防火墙
桥接地址才是虚拟机真正的IP地址
虚拟机重启后桥接网卡的IP地址需要重新手动写
防火墙要重新关闭
sudo ufw disable
sudo ufw status

总结:开发板IP,WAINDOWS以太网要和虚拟机桥接网卡一个网段,相同网关
NAT网卡和桥接网卡的网关不能相同
dhcp命令
动态获取IP地址,连接路由器才有用
NFS
创建一个NFS专用的目录(只能在这个目录下传输!!,启用NFS

传输到DRAM

踩坑:u-boot支持的NFS版本是2,Linux内核6.0以上的不支持2,所以要换一个低版本的内核
TFTP
tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议, Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器,需要安装 tftp-hpa 和 tftpd-hpa
难搞
EMMC 和 SD 卡操作命令
MMC 是一种存储技术,包括 可插拔的 MMC 卡 和 焊死的 eMMC芯片
- 直接焊在主板上的存储芯片(不可拆卸)。
- 例如:低端手机、平板、树莓派等设备的“内置存储”(如 32GB eMMC)
uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,本教程统一使用 MMC 来代指 EMMC 和 SD 卡。
uboot 中常用于操作 MMC 设备的命令为“mmc”。
mmc 是一系列的命令,其后可以跟不同的参数,输入“? mmc”即可查看 mmc 有关的命令

从主机可以将数据传输到DRAM里面,DRAM再将数据传输到MMC里面
MMC里面可以用READ将其放入DRAM
MMC可以选择设备,SD或自带的EMMC,还有分区


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

