news 2026/2/1 2:47:24

[Linux外设驱动详解]RK3588 U-Boot到Linux内核参数传递机制详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Linux外设驱动详解]RK3588 U-Boot到Linux内核参数传递机制详解

RK3588 U-Boot到Linux内核参数传递机制详解

目录

  1. 概述
  2. 参数传递方式总览
  3. 设备树(FDT)传递机制
  4. Rockchip ATAGS传递机制
  5. bootm命令执行流程
  6. RK3588平台特定实现
  7. 参数传递完整流程图

概述

在RK3588平台上,U-Boot向Linux内核传递参数是系统启动过程中的关键环节。RK3588作为ARM64架构的SoC,主要使用设备树(Flattened Device Tree, FDT)作为参数传递方式,同时Rockchip自定义了一套ATAGS机制用于内部bootloader阶段间的参数传递。

关键源文件位置

功能模块主要源文件
bootm命令核心common/bootm.c
ARM架构特定arch/arm/lib/bootm.c
FDT处理common/image-fdt.c
FDT支持函数common/fdt_support.c
Rockchip ATAGSarch/arm/mach-rockchip/rk_atags.c
RK3588平台arch/arm/mach-rockchip/rk3588/rk3588.c
参数解析arch/arm/mach-rockchip/param.c

参数传递方式总览

1. 主要参数传递方式

┌─────────────────────────────────────────────────────────────────┐ │ U-Boot 参数传递架构 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ Rockchip │ │ 标准ARM64 │ │ │ │ ATAGS机制 │ │ FDT机制 │ │ │ │ (内部使用) │ │ (传给内核) │ │ │ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────────────────────────┐ │ │ │ 参数数据结构 │ │ │ │ - DDR内存信息 │ │ │ │ - ATF/OPTEE内存区域 │ │ │ │ - 启动设备信息 │ │ │ │ - 串口配置 │ │ │ │ - 固件版本信息 │ │ │ └─────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘

2. ATAGS vs FDT对比

特性Rockchip ATAGS设备树(FDT)
用途Rockchip内部bootloader间通信向Linux内核传递硬件配置
位置DDR基地址 + 2M - 8K内核指定的内存地址
大小最大8KB可扩展,受限于内存
标准Rockchip私有标准ARM官方标准
数据格式Tag列表结构扁平化二进制树结构
内核识别不直接识别完全支持

设备树(FDT)传递机制

1. FDT在bootm命令中的处理流程

// common/bootm.cintdo_bootm_states(cmd_tbl_t*cmdtp,intflag,intargc,char*constargv[],intstates,bootm_headers_t*images,intboot_progress){// 状态机处理bootm的各个阶段if(states&BOOTM_STATE_START)ret=bootm_start(cmdtp,flag,argc,argv);if(!ret&&(states&BOOTM_STATE_FINDOS))ret=bootm_find_os(cmdtp,flag,argc,argv);if(!ret&&(states&BOOTM_STATE_FINDOTHER))ret=bootm_find_other(cmdtp,flag,argc,argv);// ... 其他状态处理}

2. FDT的获取与加载

// common/image-fdt.cintboot_get_fdt(intflag,intargc,char*constargv[],uint8_tarch,bootm_headers_t*images,char**of_flat_tree,ulong*of_size){// 从多个来源获取FDT:// 1. FIT镜像中的fdt节点// 2. 独立的dtb文件// 3. Legacy多组件镜像中的fdt部分switch(genimg_get_format(buf)){caseIMAGE_FORMAT_FIT:// FIT格式处理if(fit_check_format(buf)){fdt_noffset=boot_get_fdt_fit(images,fdt_addr,&fit_uname_fdt,&fit_uname_config,arch,&load,&len);}break;// ... 其他格式}}

3. FDT的重定位

// common/image-fdt.cintboot_relocate_fdt(structlmb*lmb,char**of_flat_tree,ulong*of_size){void*fdt_blob=*of_flat_tree;void*of_start=NULL;char*fdt_high;ulong of_len=0;// 考虑fdt_high环境变量fdt_high=env_get("fdt_high");if(fdt_high){void*desired_addr=(void*)simple_strtoul(fdt_high,NULL,16);if(((ulong)desired_addr)==~0UL){/* 0xFFFFFFFF表示使用原地fdt,不重定位 */of_start=fdt_blob;}elseif(desired_addr){/* 使用指定地址 */of_start=(void*)(ulong)lmb_alloc_base(lmb,of_len,0x1000,(ulong)desired_addr);}}// 使用fdt_open_into进行重定位err=fdt_open_into(fdt_blob,of_start,of_len);*of_flat_tree=of_start;*of_size=of_len;return0;}

4. FDT的内容修复(fdt_fixup)

// common/fdt_support.cintfdt_chosen(void*fdt){intnodeoffset;/* 查找或创建/chosen节点 */nodeoffset=fdt_find_or_add_subnode(fdt,0,"chosen");/* 设置bootargs */str=board_fdt_chosen_bootargs(fdt);if(str){err=fdt_setprop(fdt,nodeoffset,"bootargs",str,strlen(str)+1);}/* 设置stdout路径 */returnfdt_fixup_stdout(fdt,nodeoffset);}intfdt_initrd(void*fdt,ulong initrd_start,ulong initrd_end){intnodeoffset;/* 找到/chosen节点 */nodeoffset=fdt_find_or_add_subnode(fdt,0,"chosen");/* 添加内存保留区域 */fdt_add_mem_rsv(fdt,initrd_start,initrd_end-initrd_start);/* 设置initrd起始和结束地址 */is_u64=(fdt_address_cells(fdt,0)==2);fdt_setprop_uxx(fdt,nodeoffset,"linux,initrd-start",(uint64_t)initrd_start,is_u64);fdt_setprop_uxx(fdt,nodeoffset,"linux,initrd-end",(uint64_t)initrd_end,is_u64);return0;}

5. ARM64架构的内核跳转

// arch/arm/lib/bootm.cstaticvoidboot_jump_linux(bootm_headers_t*images,intflag){#ifdefCONFIG_ARM64void(*kernel_entry)(void
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/26 10:37:19

“协同效应”经济学下,看阿里的AI棋局

文|熔财经作者|文文灵光、千问、阿福……阿里最近各种AI产品出街的频率和深度,无疑在互联网科技领域掀起了一股类似十年前那般的创新热潮。只不过,发展到今天的阿里,其AI产品的市场布局早已不是过去那种单产品“打天下…

作者头像 李华
网站建设 2026/2/1 14:09:16

计算机毕业设计springboot社区养老管理系统 基于 SpringBoot 的社区智慧康养服务平台 面向老龄化社区的 SpringBoot 养老综合服务系统

计算机毕业设计springboot社区养老管理系统o1293rte(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。银发浪潮正以前所未有的速度席卷城市,社区成为绝大多数老人“原居…

作者头像 李华
网站建设 2026/2/1 9:53:58

JDK 21 中的虚拟线程:革新 Java 多线程

JDK 21 中引入的虚拟线程是 Java 并发生态系统的一个重要里程碑。本文将介绍虚拟线程的基础知识和最佳实践。 什么是虚拟线程? 多线程是业界广泛用于开发基于 Java 的应用程序的特性。它允许我们并行运行操作,从而加快任务执行速度。任何 Java 应用程序…

作者头像 李华
网站建设 2026/2/1 6:15:49

Java线程简介

一、什么是线程 现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、栈和局…

作者头像 李华
网站建设 2026/1/30 13:25:37

为什么越来越多企业用YOLO替代Faster R-CNN?

为什么越来越多企业用YOLO替代Faster R-CNN? 在智能制造、无人巡检和智慧交通等工业场景中,目标检测早已不再是实验室里的算法比拼,而是决定产线能否自动停机报警、摄像头能否实时识别违规行为的关键能力。十年前,提到高精度检测&…

作者头像 李华
网站建设 2026/1/31 23:40:27

YOLO目标检测支持Modbus TCP工业控制协议

YOLO目标检测与Modbus TCP的工业融合实践 在现代工厂的自动化产线上,一个看似简单的动作——剔除不合格产品——背后往往涉及复杂的系统协作。摄像头捕捉图像,AI判断缺陷,PLC控制气缸执行剔除。但现实中,这套流程常因“语言不通”…

作者头像 李华