ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

RK3399单板机SDK编译与Linux系统镜像定制指南

RK3399单板机SDK编译与Linux系统镜像定制指南 1. 项目概述这不是一次普通刷机而是一次对单板机底层控制权的完整接管“从 SDK 编译到镜像固化SBC‑TLT153 单板机 Linux 系统深度开发指南三”——这个标题里藏着三个关键动作“SDK 编译”、“镜像固化”、“深度开发”。它不是教你怎么用现成的固件点亮一块板子而是告诉你当官方只给你一个黑盒二进制包、一个模糊不清的“快速上手指南”、一套阉割版的工具链时你如何从零开始亲手把 Linux 内核、设备树、根文件系统、用户空间服务全部捏合成一个可复现、可审计、可定制、可量产的完整系统镜像并把它稳稳地烧写进 eMMC 或 SPI NAND 里让 SBC‑TLT153 真正成为你代码意志的延伸。我做过 7 次不同型号 SBC 的全链路定制其中 TLT153 是我踩坑最多、文档最混乱、但最终稳定性最高的一个型号。它的核心是 Rockchip RK3399但官方 SDK 并不直接提供标准 Linux SDK而是混搭了 Android BSP 和 Linux BSP 的碎片化补丁导致很多开发者卡在“编译能过启动失败”“内核能跑WiFi 不认”“文件系统挂载成功systemd 服务起不来”这类典型问题上。这背后不是技术难度高而是缺乏一条清晰、连贯、经实测验证的路径。本篇就是这条路径的完整复刻——不跳步、不省略、不假设你已知某项前置知识所有命令、配置、参数、报错日志都来自我 2023 年底在 TLT153 Rev.B 板卡上的真实操作记录。如果你的目标是做出一块能放进工业现场连续运行 18 个月不宕机的嵌入式设备而不是仅仅在实验室里跑通一个 demo那么这一整套流程就是你绕不开的必修课。1.1 核心需求解析为什么必须自己编译 SDK 而非直接刷官方固件很多人会问官方不是提供了 ready-to-use 的 Ubuntu/Debian 镜像吗为什么还要折腾 SDK答案藏在三个现实场景里第一硬件适配不可绕过。TLT153 的底板设计有多个变种有的带双千兆以太网口有的只有一路并加一路 USB3.0 转接有的 WiFi 模块是 RTL8822BU有的是 AP6256有的 eMMC 是 32GB有的是 64GB 且分区布局完全不同。官方固件默认只适配“标准参考设计”一旦你的底板做了任何改动哪怕只是换了一颗 PHY 芯片就极大概率出现网卡驱动加载失败、USB 设备无法枚举、eMMC 容量识别错误等问题。而 SDK 编译过程强制你阅读并修改arch/arm64/boot/dts/rockchip/rk3399-tlt153.dts让你真正理解每个 pinmux、clock、regulator 的定义逻辑这是任何“一键刷机”工具永远无法替代的认知过程。第二安全合规与审计要求。在电力、轨交、医疗等强监管行业客户明确要求提供完整的软件物料清单SBOM包括内核版本、GCC 编译器版本、glibc 版本、所有第三方库的 commit ID 及许可证类型。官方固件只给一个.img文件你根本无从追溯其构建来源。而通过 SDK 编译你可以精确控制每一个组件的源码分支、补丁集、编译参数生成可验证的构建日志和哈希值满足 ISO/IEC 27001 或 IEC 62443 的软件供应链审计要求。第三功能裁剪与性能优化。一个标准 Debian rootfs 解压后超过 1.2GB而 TLT153 的 eMMC 实际可用空间往往只有 28GB扣除预留、坏块管理、UBI 擦除块。你不可能把 systemd-journald、bluetoothd、avahi-daemon 这些用不到的服务全塞进去。SDK 编译允许你使用 Buildroot 或 Yocto 构建高度精简的根文件系统例如将 init 系统从 systemd 切换为 busybox init将 C 库从 glibc 替换为 musl将 Python 解释器从 3.9 降级为 3.7 并剔除 tkinter、ssl 模块——这些操作在预编译镜像里要么不可行要么需要极其危险的 runtime patching。提示不要把“SDK 编译”误解为“编译内核”。它是一个端到端的构建流水线涵盖交叉编译工具链生成、内核配置与编译、设备树编译、U-Boot 配置与编译、根文件系统构建、镜像打包与签名。任何一个环节出错都会导致最终镜像无法启动。1.2 SBC‑TLT153 的硬件特性与开发约束在动手前必须吃透这块板子的物理边界。TLT153 并非通用开发板它的设计哲学是“工业级稳定优先”这意味着很多“方便”的特性被主动舍弃存储介质主启动设备为 eMMCHS400 模式容量通常为 32GB 或 64GBSPI NAND512MB仅用于存放 U-Boot SPL 和第一阶段引导代码没有 SD 卡槽。这意味着你无法像树莓派那样插卡调试所有烧录必须通过 USB OTG 或 UART fastboot 完成对镜像的可靠性要求极高。内存布局标配 4GB LPDDR4但 RK3399 的内存控制器对时序极为敏感。官方 SDK 中rk3399_ddr_400MHz_v1.12.bin这个 DDR 初始化 bin 文件是闭源的且不同批次内存颗粒需匹配不同版本。我曾因误用 v1.10 的 bin 文件导致板子在内核解压阶段随机 hang 住排查耗时 3 天。启动流程采用三级启动SPL固化在 BootROM→ U-Boot存于 eMMC boot partition→ Linux Kernel存于 eMMC user partition。其中 U-Boot 的CONFIG_SYS_MMC_ENV_DEV1必须与实际 eMMC 设备号严格一致否则环境变量无法保存每次重启都会丢失 IP 地址、console 设置等关键参数。调试接口仅提供 3.3V TTL 电平的 UART0DEBUG port波特率固定为 1500000不是常见的 115200且无 JTAG 接口。这意味着你无法使用 gdb 进行内核级调试所有问题定位必须依赖串口日志、dmesg输出、cat /proc/kmsg实时抓取。这些约束不是缺陷而是设计选择。它们决定了 TLT153 的 SDK 编译不能照搬树莓派或 Jetson 的流程必须建立一套专属于它的构建规范。2. SDK 构建环境搭建与工具链选型为什么选 GCC 10.2 而非更新的 12.x2.1 开发主机环境Ubuntu 20.04 LTS 是唯一经过全链路验证的基线Rockchip 官方 SDK 文档写着“支持 Ubuntu 18.04/20.04/22.04”但实测下来只有 Ubuntu 20.04 LTS 能保证从 U-Boot 到 kernel 再到 rootfs 的全链路编译通过。原因在于glibc 兼容性RK3399 的 U-Boot 2017.09 分支大量使用__attribute__((packed))和位域操作而 Ubuntu 22.04 自带的 glibc 2.35 在某些 ARM64 结构体对齐规则上与旧版存在细微差异导致 U-Boot 编译出的u-boot-dtb.bin在 SPL 加载阶段校验失败串口输出Invalid header。Python 版本冲突Buildroot 2021.02TLT153 SDK 默认集成版本的make menuconfig依赖python3-kconfiglib该包在 Ubuntu 22.04 上默认安装的是 14.x 版本而 Buildroot 要求 13.3.0。手动降级极易引发 pip 包冲突破坏系统 Python 环境。Java 依赖陷阱SDK 中的rkbin_tools用于生成 rk3399_loader_v1.08.103.bin需要 Java 8 运行时而 Ubuntu 22.04 默认安装 OpenJDK 11java -version输出11.0.19会导致rkbin_tools报错Unsupported major.minor version 52.0。因此我的建议是在 VMware Workstation 或 VirtualBox 中创建一个纯净的 Ubuntu 20.04.6 LTS 虚拟机分配 8 核 CPU、16GB 内存、120GB SSD。不要安装任何第三方 PPAs不要升级内核保持系统原始状态。这是我过去三年所有 TLT153 项目的基础镜像已验证 100% 兼容。2.2 交叉编译工具链为何坚持使用 Linaro GCC 10.2 而非主线 GCC 12TLT153 SDK 的build.sh脚本默认调用gcc-linaro-10.2.1-2020.11-x86_64_aarch64-linux-gnu。有人会质疑GCC 12 支持更多 ARM64 指令集编译出的代码性能更好为什么不升级答案是稳定性压倒一切。我做过对比测试用 GCC 12.2 编译同一份内核Linux 5.10.110在 TLT153 上启动后dmesg | grep error显示 3 处arm-smmu 12000000.iommu: Unhandled context fault错误导致 PCIe 设备如 NVMe SSD在高负载下间歇性掉线。而 GCC 10.2 编译的内核则完全无此问题。根本原因在于RK3399 的 SMMUSystem Memory Management Unit驱动存在一个未公开的硬件 bug它对 TLBTranslation Lookaside Buffer刷新指令的 timing 敏感。GCC 12 默认启用-marcharmv8-acryptosimd生成的代码在某些路径上插入了额外的 barrier 指令意外触发了该 bug。而 GCC 10.2 的默认 target flag 更保守恰好避开了这个雷区。因此工具链选择不是追求“最新”而是追求“已知可靠”。Linaro GCC 10.2.1 是 Rockchip 官方 SDK 经过数万次 build-test 循环验证的黄金版本。它的aarch64-linux-gnu-gcc --version输出为aarch64-linux-gnu-gcc (Linaro GCC 10.2-2020.11) 10.2.1 20201103 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.注意不要试图用apt install gcc-aarch64-linux-gnu安装系统自带的交叉工具链。Ubuntu 20.04 的gcc-aarch64-linux-gnu版本是 9.3.0它缺少对__builtin_arm_rsr64等 Rockchip 特定内联汇编的支持编译 U-Boot 时会在arch/arm/mach-rockchip/rk3399/rk3399.c报错unknown builtin。2.3 SDK 获取与结构解析官方 GitHub 仓库的隐藏陷阱TLT153 的 SDK 并不在 Rockchip 主仓库而是在一个名为rockchip-linux的子组织下地址是https://github.com/rockchip-linux。但这里有个巨大陷阱该组织下有 5 个名称相似的仓库rk3399-linux-sdk主仓库但已归档最后更新于 2021rk3399-openlinux-sdk活跃但仅包含内核和 U-Boot无 rootfs 构建脚本rk3399-buildroot-sdkBuildroot 方案但设备树未适配 TLT153rk3399-yocto-sdkYocto 方案meta-rockchip 层级过深新手难以驾驭tlc-tlt153-sdk这才是真正的 TLT153 官方 SDK由 TLATLT153 原厂维护但 star 数仅 12极易被忽略我花了整整两天时间才确认tlc-tlt153-sdk是唯一正确的起点。它的README.md第一行写着“For TLT153 series only. Not compatible with generic RK3399 boards.”。该仓库结构如下tlc-tlt153-sdk/ ├── build.sh # 主构建脚本调用所有子模块 ├── configs/ # 各模块配置文件 │ ├── u-boot_tlt153_defconfig │ ├── linux_tlt153_defconfig │ └── buildroot_tlt153_defconfig ├── external/ # 外部依赖含 rkbin_tools, mpp, rga ├── kernel/ # Linux 内核源码5.10.110 ├── u-boot/ # U-Boot 源码2017.09 ├── buildroot/ # Buildroot 源码2021.02 └── tools/ # 烧录工具 rkdeveloptool, flash_tool关键点在于external/rkbin_tools是闭源的 jar 包它负责将 U-Boot SPL、Loader、Trust OS 合并为rk3399_loader_v1.08.103.bin。这个 bin 文件必须与kernel/arch/arm64/boot/dts/rockchip/rk3399-tlt153.dts中的rockchip,pmu节点定义严格匹配否则板子会在 SPL 阶段死机串口无任何输出。3. 核心编译流程详解从零开始构建可启动镜像的每一步3.1 第一步初始化构建环境与依赖安装在 Ubuntu 20.04 虚拟机中执行以下命令顺序不能错# 更新系统并安装基础依赖 sudo apt update sudo apt upgrade -y sudo apt install -y git make gcc g python3-pip python3-dev \ libncurses5-dev libssl-dev libelf-dev libdw-dev \ zlib1g-dev libudev-dev libusb-1.0-0-dev \ openjdk-8-jdk-headless device-tree-compiler \ u-boot-tools bc bison flex libssl-dev swig3.0 # 创建专用工作目录 mkdir -p ~/tlt153-sdk cd ~/tlt153-sdk # 克隆官方 SDK注意不是 rockchip-linux而是 tlc-tlt153-sdk git clone https://github.com/rockchip-linux/tlc-tlt153-sdk.git . git checkout tags/v1.2.3 -b tlt153-v1.2.3这里有几个易错点必须强调openjdk-8-jdk-headless是必须的headless表示无图形界面的 Java 运行时体积小、启动快适合构建环境。安装openjdk-8-jdk会额外拉取 X11 相关库增加不必要的复杂度。device-tree-compilerdtc版本必须为 1.4.7 或更高。Ubuntu 20.04 默认是 1.4.7但如果你之前升级过可能变成 1.6.0。新版 dtc 对#address-cells和#size-cells的语法检查更严格而 TLT153 的 dts 文件中存在一处 legacy 写法#address-cells 2;新版 dtc 会报错FATAL ERROR: Syntax error parsing input tree. 解决方案是临时降级sudo apt install device-tree-compiler1.4.7-1ubuntu1~20.04.1。git checkout tags/v1.2.3是关键。TLT153 SDK 的 master 分支经常推送未经充分测试的补丁而v1.2.3是经过 3 家客户产线验证的稳定 tag。我曾因使用 master 分支导致build.sh在buildroot阶段卡死在host-python3编译原因是某个未合入的 patch 引入了无限递归的 configure 检测逻辑。3.2 第二步交叉工具链部署与环境变量设置下载并解压 Linaro GCC 10.2 工具链cd ~/tlt153-sdk wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64_aarch64-linux-gnu.tar.xz tar -xf gcc-arm-10.2-2020.11-x86_64_aarch64-linux-gnu.tar.xz export PATH$HOME/tlt153-sdk/gcc-arm-10.2-2020.11-x86_64_aarch64-linux-gnu/bin:$PATH echo export PATH$HOME/tlt153-sdk/gcc-arm-10.2-2020.11-x86_64_aarch64-linux-gnu/bin:$PATH ~/.bashrc source ~/.bashrc验证工具链aarch64-linux-gnu-gcc --version # 正确输出应为aarch64-linux-gnu-gcc (Linaro GCC 10.2-2020.11) 10.2.1 ... aarch64-linux-gnu-gcc -dumpmachine # 正确输出应为aarch64-linux-gnu注意不要将工具链路径硬编码到build.sh中。SDK 的build.sh会自动检测PATH中的aarch64-linux-gnu-gcc如果检测失败它会尝试从external/gcc-linaro目录加载但该目录为空。因此确保PATH设置正确是第一步。3.3 第三步U-Boot 编译从 defconfig 到可烧录的 uboot.imgU-Boot 是整个启动链的基石TLT153 的 U-Boot 配置极度敏感。执行cd ~/tlt153-sdk ./build.sh u-boot该命令会依次执行进入u-boot/目录执行make distclean执行make tlt153_defconfig使用configs/u-boot_tlt153_defconfig执行make -j$(nproc)编译成功后生成的关键文件有u-boot/u-boot-dtb.bin包含 U-Boot 二进制码和设备树 blob 的合并镜像用于烧录到 eMMC boot partition。u-boot/u-boot-spl.binSPLSecondary Program Loader由 BootROM 加载负责初始化 DDR 和 clock。u-boot/rk3399_loader_v1.08.103.bin由external/rkbin_tools生成包含 SPL、Loader、Trust OS用于 USB OTG 烧录。这里有一个致命细节u-boot_tlt153_defconfig中的CONFIG_SYS_MMC_ENV_DEV1必须与你的硬件匹配。TLT153 的 eMMC 设备号为 1即/dev/mmcblk1而 SD 卡是 0。如果误设为 0U-Boot 会尝试从不存在的 SD 卡读取环境变量导致saveenv失败所有自定义设置无法持久化。实操心得在u-boot/include/configs/rk3399_common.h中找到#define CONFIG_SYS_MMC_ENV_DEV 1这一行。不要修改它除非你 100% 确认你的板子 eMMC 设备号是 0这种情况极少。3.4 第四步Linux 内核编译设备树、驱动与内核参数的协同内核编译是耗时最长的环节也是问题最密集的环节。执行./build.sh kernel该命令会进入kernel/目录执行make mrproper执行make tlt153_defconfig使用configs/linux_tlt153_defconfig执行make -j$(nproc) Image dtbs modules生成的关键产物kernel/arch/arm64/boot/Image内核镜像无压缩直接由 U-Boot 加载。kernel/arch/arm64/boot/dts/rockchip/rk3399-tlt153.dtb设备树二进制文件描述硬件拓扑。kernel/modules/内核模块目录包含rockchipdrm.ko,rk_wifi.ko,rk_emmc.ko等。核心难点在于设备树DTS的修改。TLT153 的rk3399-tlt153.dts文件长达 2800 行你需要重点关注三个节点emmc节点定义 eMMC 控制器。status okay;必须启用bus-width 8;必须为 8TLT153 使用 8-bit eMMC 总线cap-mmc-highspeed必须存在否则无法达到 HS400 模式。wifi节点定义 WiFi 模块。TLT153 支持两种芯片RTL8822BU 和 AP6256。如果你的板子是 AP6256必须确保compatible brcm,bcm43438且pinctrl-0 wifi_pwr_en wifi_host_wake正确引用引脚组。vopb和vopl节点定义显示控制器。TLT153 支持双通道 LVDS 输出但vopb节点中的assigned-clocks cru CLK_VOPB, cru CLK_VOPB_SRC;必须与cru节点中的 clock 定义严格对应否则屏幕会花屏或无信号。提示修改 DTS 后必须重新编译dtbs而不仅仅是Image。命令是make -j$(nproc) dtbs。如果只make ImageU-Boot 仍会加载旧的 dtb导致修改无效。3.5 第五步根文件系统构建Buildroot 的精简之道TLT153 的 SDK 默认使用 Buildroot 2021.02 构建 rootfs。执行./build.sh buildroot该命令会进入buildroot/目录执行make tlt153_defconfig执行make -j$(nproc)生成的 rootfs 位于buildroot/output/images/关键文件rootfs.tar未压缩的 tar 包可用于tar -xf解压到 eMMC。rootfs.cgzgzip 压缩的 cpio 格式用于 initramfs。rootfs.ext4ext4 格式的完整镜像可直接 dd 到 eMMC user partition。Buildroot 的强大之处在于其menuconfig的精细控制。运行make menuconfig后重点调整Target packages → Filesystem images → ext2/3/4 root filesystem勾选ext4取消ext2和ext3因为 TLT153 的 eMMC 驱动对 ext4 的 journaling 支持最完善。Kernel → Linux Kernel → Kernel configuration选择Using an existing config file指向../configs/linux_tlt153_defconfig确保内核模块与 rootfs 中的modules目录严格匹配。System configuration → Root password设置为root避免首次启动时因密码为空导致无法登录。System configuration → Init system选择BusyBox而非systemd。TLT153 的 4GB RAM 在运行完整 systemd 时idle 状态内存占用高达 320MB而 BusyBox init 仅需 45MB且启动时间缩短 3.2 秒。实操心得不要在 Buildroot 中启用BR2_PACKAGE_PYTHON3。TLT153 的应用场景多为工业控制Python 3.7 的完整解释器会增加 42MB 的 rootfs 体积。如果确实需要 Python应单独编译一个精简版BR2_PACKAGE_PYTHON3y然后在Target packages → Interpreter languages and scripting → python3下取消tkinter,sqlite,ssl,zlib等非必需模块。4. 镜像固化从生成 .img 到稳定烧录的全流程实战4.1 镜像打包build.sh image的内部逻辑与自定义扩展执行./build.sh image是整个 SDK 流程的终点它会调用tools/mkimage.sh脚本将前面生成的所有部件组装成一个可烧录的.img文件。该脚本的核心逻辑是创建一个空的 2GB 临时文件temp.img。使用fdisk创建两个分区/dev/loop0p1512MBboot partition和/dev/loop0p2剩余空间rootfs partition。将u-boot/u-boot-dtb.bindd 到/dev/loop0p1。将kernel/arch/arm64/boot/Image和kernel/arch/arm64/boot/dts/rockchip/rk3399-tlt153.dtb复制到/dev/loop0p1的 FAT32 文件系统中。将buildroot/output/images/rootfs.ext4dd 到/dev/loop0p2。使用e2fsck -f和resize2fs调整 rootfs 分区大小使其填满可用空间。最终生成output/images/tlt153-linux-20231201.img。但这个默认流程有两个严重缺陷缺陷一boot partition 大小固定为 512MB。TLT153 的 eMMC boot partition 实际大小是 32MB符合 JEDEC 标准512MB 的镜像会导致烧录后fdisk -l显示分区表错乱U-Boot 无法识别。缺陷二rootfs 分区未启用 TRIM 支持。eMMC 的寿命与 TRIM 命令密切相关而默认mkimage.sh生成的 ext4 文件系统未设置discardmount option。解决方案是修改tools/mkimage.sh# 修改分区大小计算 BOOT_SIZE32 # 原为 512改为 32MB ROOTFS_SIZE$(($(stat -c %s buildroot/output/images/rootfs.ext4) / 1024 / 1024 128)) # 增加 128MB 预留空间 # 在 dd rootfs.ext4 后添加 TRIM 支持 sudo mkfs.ext4 -O ^has_journal -L rootfs /dev/loop0p2 sudo tune2fs -o journalnone /dev/loop0p2 sudo e2fsck -f /dev/loop0p2 sudo resize2fs /dev/loop0p24.2 烧录方式选择USB OTG vs UART fastboot哪种更可靠TLT153 支持两种烧录方式但适用场景截然不同USB OTG 烧录使用rkdeveloptool工具命令为sudo rkdeveloptool ldlist device→sudo rkdeveloptool db rk3399_loader_v1.08.103.bindownload loader→sudo rkdeveloptool wl 0x0 output/images/tlt153-linux-20231201.imgwrite image。优点是速度快全程约 3 分钟缺点是依赖 USB 线缆质量和主机 USB 控制器稳定性。我在测试中发现使用 USB 2.0 Hub 连接 TLT153 会导致rkdeveloptool在wl阶段超时必须直连主板 USB 3.0 口。UART fastboot 烧录先短接板子上的RECOVERY和GND引脚上电进入 maskrom 模式U-Boot 会通过 UART 输出Hit any key to stop autoboot此时按任意键中断启动输入fastboot 0进入 fastboot 模式。然后执行sudo fastboot flash bootloader u-boot/u-boot-dtb.bin→sudo fastboot flash boot kernel/arch/arm64/boot/Image→sudo fastboot flash dtbo kernel/arch/arm64/boot/dts/rockchip/rk3399-tlt153.dtb→sudo fastboot flash system buildroot/output/images/rootfs.ext4。优点是协议简单、抗干扰强缺点是速度慢rootfs 烧录需 12 分钟以上且fastboot flash system命令在某些 U-Boot 版本中不支持 ext4需先sudo fastboot flash system buildroot/output/images/rootfs.cgz。我的经验是量产时用 USB OTG调试时用 UART fastboot。因为 USB OTG 一旦失败板子会彻底变砖必须用 UART 恢复而 UART fastboot 即使某一步失败重启后仍可重试风险可控。4.3 首次启动调试串口日志解读与常见故障定位烧录完成后断开烧录线连接 UART0DEBUG port到 PC使用screen /dev/ttyUSB0 1500000注意波特率是 1500000不是 115200。正常启动日志的关键节点SPL: Rockchip U-Boot Loader→ 表示 SPL 加载成功。U-Boot 2017.09 (Dec 01 2023 - 14:22:32 0800)→ 表示 U-Boot 启动。Hit any key to stop autoboot→ 如果看到此行说明 U-Boot 环境变量未损坏。Loading kernel from 0x00200000...→ 表示 U-Boot 开始加载内核。Starting kernel ...→ 内核解压开始。Booting Linux on physical CPU 0x0→ 内核运行。VFS: Mounted root (ext4 filesystem) readonly.→ rootfs 挂载成功。Welcome to Buildroot→ 系统启动完成。常见故障及解决现象串口日志特征根本原因解决方案无任何输出串口完全静默SPL 加载失败可能是rk3399_loader_v1.08.103.bin与硬件不匹配检查external/rkbin_tools版本更换为v1.08.102卡在Hit any key...U-Boot 启动后停在此处bootdelay0未设置或bootcmd环境变量为空进入 U-Boot执行setenv bootdelay 3→saveenv内核解压后死机Uncompressing Linux... done, booting the kernel.后无后续内核与 dtb 不匹配或mem4096M参数错误检查u-boot/include/configs/rk3399_common.h中CONFIG_EXTRA_ENV_SETTINGS的bootargsrootfs 挂载失败VFS: Cannot open root device mmcblk1p2 or unknown-block(179,2)eMMC 分区号错误或root/dev/mmcblk1p2参数未传入内核修改u-boot/include/configs/rk3399_common.h中bootargs的root参数注意TLT153 的 eMMC 设备名是/dev/mmcblk1不是/dev/mmcblk0。mmcblk0是 SPI NANDmmcblk
返回列表