RK3588-kernel BringUp记录(二)

uboot启动过程

  1. 完美的底层基建

DRAM: 16 GiB Relocation Offset: ebb0c000 mmc@fe2c0000: 1, mmc@fe2e0000: 0 MMC0: HS400 Enhanced Strobe, 200Mhz

系统代码成功完成了大搬家(Relocation)。 eMMC 闪存跑在了 HS400 高速模式(200MHz)!这意味着底层驱动彻底打通,硬件性能已经拉满。

  1. 核心致命伤:缺失的"硬件接线图

RESC: 'resource', blk@0x0000e000 RESC: invalid Failed to load DTB, ret=-2 No valid DTB, ret=-22

parameter.txt 里面规定了 0x0000e000resource(资源)分区的地盘。U-Boot 极其聪明地去那个地址找东西,结果发现里面是空的(invalid)。 它要找什么?它要找 DTB (Device Tree Blob,设备树)。没有这份"硬件接线图",U-Boot 根本不敢瞎猜主板上接了什么屏幕、什么网卡,更无法把这些信息传递给 Linux 内核。

  1. 病急乱投医的"搜索大军"

Android image load failed Failed to mount ext2 filesystem... starting USB... No working controllers found Retrieving file: pxelinux.cfg... No ethernet found.

当 U-Boot 在 eMMC 里找不到合法的内核和设备树后,它内部的启动循环(distro_bootcmd)就会触发**"无差别地毯式搜索"**。 它先试着按 Android 系统来启动;失败后,它去搜外接的 USB 接口;USB 没插,它最后竟然去试图启动网卡,企图从局域网的 PXE 服务器上下载系统代码!

补齐 resource.img 拼图

在瑞芯微的生态里,内核的设备树(DTB)和开机的 Logo 图片,会被打包成一个单独的 resource.img 文件

前配置好 ARCH=arm64CROSS_COMPILE 环境变量,就像之前编译内核那样

./scripts/resource_tool arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dtb logo.bmp //设备树文件为rk3588-evb1-v10.dtb

接下来就会uboot启动就会出现如下日志:

🎖️ 架构师的胜利阅兵(硬件苏醒日志分析)

  1. 设备树成功注入(瞎子复明)

    RESC: 'resource', blk@0x0000e000 DTB: rk-kernel.dtb 解读:U-Boot 成功从 eMMC 提取到了设备树!它不再是无头苍蝇了。

  2. 核心电源管理上线(心脏起搏)

    spi2: RK806: 2 vdd_cpu_big0_s0 800000 uV 解读 :这是极其硬核的一步!系统成功通过 SPI 总线联系上了主板上的大管家------RK806 电源管理芯片(PMIC),并精准地给 CPU 大核供上了 0.8V 的电压。主板绝对安全,没有烧毁风险!

  3. 显示引擎点亮(眼睛睁开)

    VOP update mode to: 1080x1920p60, type: MIPI0 for VP3 final DSI-Link bandwidth: 880000 Kbps x 4 解读:设备树里的屏幕参数生效了!RK3588 内部强大的 VOP(视频输出处理器)已经被唤醒,甚至已经向 MIPI 接口发送了 1080P/60帧的信号。(如果你板子上接了 MIPI 屏幕,此时大概率已经亮起背光或者显示出原厂 Logo 了!)

🚨 最后的卡点:为什么没进内核?

硬件全通了,为什么还是倒计时并报错找不到系统? 目光锁定这几行致命日志:

Not AVB images, AVB skip No valid android hdr Android boot failed, error -1.

真相大白:U-Boot 在找一个"带包装盒"的内核,而你之前给它的是"裸奔"的内核。

在瑞芯微的生态里,虽然我们跑的是纯正的 Linux,但它的 U-Boot 依然沿用了 Android Boot Image 的打包标准。 U-Boot 不认识直接放在 Kernel 分区里的原始 Image 文件。它要求你必须把 Image 塞进一个带有 ANDROID! 头部魔数(Magic Header)的盒子里,并且这个盒子要放在 Boot 分区 里。

并没有找到boot.img 只看到了boot.its

你之所以只看到了 .its 而没看到 .img,是因为你的 Ubuntu 编译环境里少了一个装箱工具。我带你解开这个"集装箱"的最后秘密。

📦 揭秘:boot.its 到底是什么?

还记得上一条日志里,U-Boot 绝望地喊出的那句话吗?

## Booting FIT Image FIT: No fit blob

在现代的 ARM 嵌入式系统里,内核不再使用老旧的 Android 包装盒,而是升级成了一种叫 FIT (Flattened Image Tree) 的高级集装箱格式。

而你发现的 boot.its (Image Tree Source) ,就是这个集装箱的**"装箱清单(Blueprint)"**! 它里面用文本写着:"把 Image 放在第一层,把 dtb 放在第二层,用 gzip 压缩,签名加密......"

真相大白: 你执行 make xxx.img 时,瑞芯微的脚本成功编译了内核,也成功帮你写好了这份装箱清单(boot.its)。但是,在最后执行"按清单装箱"的那一瞬间,它发现你的 Ubuntu 系统里没有 mkimage(打包机)这个工具! 于是它悄无声息地罢工了,只留下了这份 .its 图纸。

第一步:安装"打包机" (U-Boot Tools)

你的系统里缺少这个业界标准的制图和打包工具。执行命令安装它:

sudo apt-get update

sudo apt-get install u-boot-tools -y

有了工具后,直接把 boot.its 喂给它,让它吐出我们苦苦追寻的 boot.img

bash 复制代码
mkimage -f boot.its boot.img

使用mkimage命令报错了:

FATAL ERROR: Couldn't open "fdt": No such file or directory

mkimage: Can't open boot.img.tmp: No such file or directory
之前你执行 make rk3588-evb1-v10.img 时,因为系统里没有 mkimage 工具,整个打包脚本在最后一步崩溃中断 了。 这就导致了一个极其尴尬的局面:内核源码里的自动化脚本,还没来得及把编译好的 Imagerk3588-evb1-v10.dtb 复制到 mkimage 期望的指定临时目录(或者没来得及重命名),脚本就死掉了。

所以,你现在强行拿着遗留下来的 .its 清单去打包,它当然会因为缺文件而报错。

安装缺少的 LZ4 压缩机

sudo apt-get update

sudo apt-get install lz4 -y

又报错了:

CALL scripts/checksyscalls.sh

fatal: not a git repository (or any of the parent directories): .git

LZ4C arch/arm64/boot/Image.lz4

/usr/bin/env: 'python': No such file or directory

make1: *** arch/arm64/Makefile:226: rk3588-evb10-v10.img Error 127

make: *** Makefile:234: __sub-make Error 2
/usr/bin/env: 'python': No such file or directory 这个报错在芯片驱动圈子里,堪称"新人第一杀手"。 破案了: 瑞芯微的那个打包脚本(make_fit_atf.py)开头写着去找 python 运行。但是在你使用的 Ubuntu 20.04 或 22.04 系统中,Python2 已经被彻底淘汰,系统默认把 Python 叫作 python3 ,根本没有叫 python 的命令!脚本找不到执行环境,当场"猝死"。

第一步:安装伪装包

sudo apt-get install python-is-python3 -y

编译:

make rk3588-evb10-v10.img

烧录流程:

第一步:提取神器 去你的 Linux 内核源码根目录下,找到刚刚用 Python 脚本和 mkimage 成功合成的 boot.img。把它拷贝到 Windows 上。

第二步:部署 RKDevTool(极其关键的换阵) 回到烧录工具,进行以下终极勾选:

  1. 勾选 1 (Loader)

  2. 勾选 2 (Parameter)

  3. 勾选 3 (Uboot)

  4. 勾选 6 (Resource) (刷入你之前生成的 resource.img,也就是设备树图纸)

  5. 极其重要:取消勾选 7 (Kernel)! (系统不需要裸奔的 Image 了)

  6. 极其重要:勾选 8 (Boot)! (把路径指向你刚拿到的 boot.img 集装箱)

第三步:一击致命 点击【执行】刷入开发板。

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言