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

make[1]: *** [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 集装箱)

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

相关推荐
-ONLY-¥2 小时前
HAProxy+Nginx高可用集群实战指南
linux
花间相见2 小时前
【AI私人家庭医生day01】—— 项目介绍
大数据·linux·人工智能·python·flask·conda·ai编程
Cyber4K2 小时前
【Nginx专项】基础入门篇-访问限制及访问控制
linux·运维·服务器·nginx
涛声依旧393162 小时前
创建新的虚拟主机
linux·服务器·网络
高斯的手稿08013 小时前
树莓派上更换镜像源的方法
linux·运维·windows
想拿大厂offer3 小时前
【Linux】常用指令
linux
うちは止水3 小时前
linux yocto bitbake构建系统生成SDK包
linux·sdk·yocto·bitbake
四禾子3 小时前
ubuntu的使用心得体会
linux·运维·ubuntu
学Linux的语莫3 小时前
vscode连接linux服务器,linux环境编程开发。
linux·vscode·ubuntu·编辑器