前言
-
开发板型号: 【正点原子】 的 RK3568 开发板
AtomPi-CA1
-
使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot
-
使用 rockchip Linux 内核的设备树 【替换】 u-boot 下的 rk3568 开发板设备树文件,解决 u-boot 下千兆网卡设备能识别但是无法 Ping 通 PC 问题
-
u-boot 下网络可以 ping 通了,u-boot ping 通 PC 主机。
-
本篇记录通过 tfpt 拉取 u-boot 镜像,然后通过 u-boot mmc 命令烧写更新 u-boot 本身
u-boot 网络配置
- 根据当前网络连接,进行 u-boot 下 网络配置(env 设置),注意当前 网段
setenv ipaddr 192.168.10.8
setenv netmask 255.255.255.0
setenv gatewayip 192.168.10.1## 设置后可以作为 tftp 服务器地址 PC 主机 IP : 192.168.10.10
setenv serverip 192.168.10.10
PC 端网络设置
-
这里使用 USB 转 千兆网卡:
-
IPv4 设置: IP 地址:
192.168.10.10
子网掩码:255.255.255.0
默认网关:192.168.10.1
tftp 服务器设置
-
下载安装
Tftpd64
,可以通过网址 https://bitbucket.org/phjounin/tftpd64/src/master/ -
github 上应该有源码:https://github.com/PJO2/tftpd64
-
开启并指定 PC 端的网卡(连接开发板),并设置路径, uboot.img 的路径
- rk3568 开发板 与 PC 网络连接有两种方式:网线直连 与 经过路由器中转两种,当前选择 第一种:网络直连
-【备注】:(1)即使是开发板网线直连 PC网卡,如果网段是 192.168.10.xx
,网关地址依旧都设置为 192.168.10.1
即可。 (2)千兆网络,需要千兆的网线。
- 确认网络是否 ping 通,如果 rk3568 有两个 gmac 网卡,可以切换当前的网卡,用于与 PC 进行网络连接
更新 u-boot 自身
-
通过 tftp 传递 uboot.img 到开发板
-
首先确认 DDR RAM 的地址范围,需要先把 uboot.img 传递到 DDR RAM 的某个地址(不要与使用的内存地址重叠,如设备树、uboot 加载地址等)
-
可以通过 u-boot
bdinfo
命令查看当前系统的基本信息,如 DRAM bank 的地址范围,由于uboot.img 有 4MB 大小,因此加载地址暂时定为没有使用的0x07200000
,当前 DRAM 范围:0x0020000 ~ 0x8220000
-
DRAM bank
范围: 这里有两个 Bank
DRAM bank = 0x00000000
-> start = 0x00200000
-> size = 0x08200000
DRAM bank = 0x00000001
-> start = 0x09400000
-> size = 0xE6C00000
=> bdinfo
arch_number = 0x00000000
boot_params = 0x00000000
DRAM bank = 0x00000000
-> start = 0x00200000
-> size = 0x08200000
DRAM bank = 0x00000001
-> start = 0x09400000
-> size = 0xE6C00000
baudrate = 1500000 bps
TLB addr = 0xEFFF0000
relocaddr = 0xEFEC4000
reloc off = 0xEF4C4000
irq_sp = 0xEDBDBBE0
sp start = 0xEDBDBBE0
Early malloc usage: 780 / 80000
fdt_blob = 00000000edbdbbf8
-
传递 uboot.img 的命令:
tftp 0x07200000 uboot.img
-
注意 默认的 tftp server 的 IP,来自 u-boot env :
setenv serverip 192.168.10.10
=> tftp 0x07200000 uboot.img
Using ethernet@fe010000 device
TFTP from server 192.168.10.10; our IP address is 192.168.10.8
Filename 'uboot.img'.
Load address: 0x7200000
Loading: ##############################################################################################################################################################################################################################################################################################5.1 MiB/s
done
Bytes transferred = 4194304 (400000 hex)
- 当前把 PC 端的 uboot.img 通过 tftp 命令,传递到开发板的
0x07200000
内存地址位置,接下,需要使用mmc
命令进行烧写 uboot.img
mmc part 确认 uboot.img 的分区位置
- 如果 专门给 uboot.img 创建分区,可以通过 u-boot
mmc part
命令查看 分区信息,确认 uboot.img 的存放位置,注意 mmc 的存放地址默认是512
字节为单位。
=> mmc partPartition Map for MMC device 0 -- Partition Type: EFIPart Start LBA End LBA NameAttributesType GUIDPartition GUID1 0x00004000 0x00005fff "uboot"attrs: 0x0000000000000000type: 05660000-0000-4873-8000-5a20000035d8guid: b4250000-0000-4628-8000-7544000002ba2 0x00006000 0x00085fff "boot"attrs: 0x0000000000000000type: 7c180000-0000-4f18-8000-50a800001445guid: 3b690000-0000-4079-8000-2a4a00007a873 0x00086000 0x0733bfbf "rootfs"attrs: 0x0000000000000000type: 0e110000-0000-461a-8000-5c66000022cdguid: 614e0000-0000-4b53-8000-1d28000054a9
-
也就是 uboot 分区: 起始地址
0x00004000
,结束地址0x00005fff
,注意 mmc 地址可以认为是以512
字节作为一个块的块(block)个数的偏移 -
这里
0x00004000
在 rk3568 平台是固定的,mmc 8M 字节
偏移位置,大小是4M 字节
-
擦除 原有的 uboot:uboot 工作时默认已经读取到内存,因此可以直接更新 mmc 中 uboot 分区
-
擦除命令
mmc erase 0x4000 0x2000
-
烧写命令:
mmc write 0x0720000 0x4000 0x2000
-
重启,如果 uboot 更新了(比如修改了,增加一些打印信息),说明操作成功
小结
-
本篇记录 u-boot 下通过 网络的方法更新 u-boot 自身镜像的方法(mmc 存储),需要注意一些细节,便于问题的排查与解决
-
u-boot 网络调通后,除了更新自己外,还可以更新 Linux kerenl、rootfs 根文件系统等,设置可以直接通过
nfs
挂载远程镜像的方式启动