问题描述

在对比原理图后,发现打印日志的串口是UART2(GPIO3_A2 & GPIO3_A3),但设备树中只开启了UART0(GPIO1_C2&GPIO1_C3)

/* 以下设备树内容来自多个设备树描述文件*/

&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_xfer &uart0_ctsn>;
status = "okay";
};
uart0: serial@ff560000 {
compatible = "rockchip,rv1126-uart", "snps,dw-apb-uart";
reg = <0xff560000 0x100>;
interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
reg-shift = <2>;
reg-io-width = <4>;
dmas = <&dmac 5>, <&dmac 4>;
clock-frequency = <24000000>;
clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
clock-names = "baudclk", "apb_pclk";
pinctrl-names = "default";
pinctrl-0 = <&uart0_xfer &uart0_ctsn &uart0_rtsn>;
status = "disabled";
};
uart0_xfer: uart0-xfer {
rockchip,pins =
/* uart0_rx */
<1 RK_PC2 1 &pcfg_pull_up>,
/* uart0_tx */
<1 RK_PC3 1 &pcfg_pull_up>;
};
uart2: serial@ff570000 {
compatible = "rockchip,rv1126-uart", "snps,dw-apb-uart";
reg = <0xff570000 0x100>;
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
reg-shift = <2>;
reg-io-width = <4>;
dmas = <&dmac 9>, <&dmac 8>;
clock-frequency = <24000000>;
clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
clock-names = "baudclk", "apb_pclk";
pinctrl-names = "default";
pinctrl-0 = <&uart2m1_xfer>;
status = "disabled";
};
uart2m1_xfer: uart2m1-xfer {
rockchip,pins =
/* uart2_rx_m1 */
<3 RK_PA3 1 &pcfg_pull_up>,
/* uart2_tx_m1 */
<3 RK_PA2 1 &pcfg_pull_up>;
};

问题分析

无论是硬件原理图还是实际结果都表示启动日志是从UART2打印出来的,所以我们就要尽量往UART2去拓展。

由设备树可以得到内核启动参数 bootargs

chosen {
bootargs = "earlycon=uart8250,mmio32,0xff570000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 rootwait snd_aloop.index=7";
};

earlycon阶段(内核初始化早期)

首先可以看到earlycon=uart8250,mmio32,0xff570000earlycon直接在设备树解析前初始化硬件,不依赖设备树中的status属性。在内核初始化早期,直接向地址0xff570000 输出日志,对比之前提到的设备树配置,我们可以看到这个地址就是UART2串口。

标准console阶段(内核初始化后期)

bootargs中设置了console=ttyFIQ0

  • 由于UART2在设备树中被标记为disabled,内核不会注册标准UART驱动(如ttyS2)
  • 后续日志会通过ttyFIQ0输出(通常是 Rockchip 的 FIQ 调试串口)

    就像一个知道结果的解谜游戏,我们现在大可以猜测是不是ttyFIQ0配置了UART2,接过了日志输出的任务并继续向UART2输出(通过FIQ驱动,绕过标准UART状态),接下来我们继续分析设备树:
&fiq_debugger {
status = "okay";
};

fiq_debugger是启用的,我们继续向上层设备树文件找,目前来到了rv1126.dtsi

fiq_debugger: fiq-debugger {
compatible = "rockchip,fiq-debugger";
rockchip,serial-id = <2>; // 绑定到 UART2
rockchip,wake-irq = <0>;
rockchip,irq-mode-enable = <0>;
rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};

出现了!rockchip,serial-id = <2>,我们可以看到fiq_debugger节点绑定到了UART2,由此完成了内核启动早期与后期的日志输出的衔接。

总结

本篇文章是由一个statusdisable但却被作为日志输出的UART2引出,核心是围绕着bootargs中的earlyconconsole参数展开。earlycon直接通过UART2的地址,在设备树解析前输出早期日志;console通过FIQ调试串口,复用了UART2的端口,实际上是使用了FIQ的驱动输出后续日志。完成了整个内核初始化及后续过程中的日志输出不同阶段的衔接。

Linux 内核启动过程中的日志输出阶段分析的更多相关文章

  1. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  2. 使用gdb跟踪Linux内核启动过程(从start_kernel到init进程启动)

    本次实验过程如下: 1. 运行MenuOS系统 在实验楼的虚拟机环境里,打击打开shell,使用下面的命令 cd LinuxKernel/ qemu -kernel linux-/arch/x86/b ...

  3. linux内核启动过程

    作者:严哲璟 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 通过qemu以 ...

  4. Linux内核启动过程start_kernel分析

    虽然题目是start_kernel分析,但是由于我在ubuntu环境下配置实验环境遇到了一些问题,我觉得有必要把这些问题及其解决办法写下来. 首先我使用的是Ubuntu14.04 amx64,以下的步 ...

  5. [置顶] linux内核启动2-setup_arch中的内存初始化(目前分析高端内存)

    上一篇微博留下了这几个函数,现在我们来分析它们         sanity_check_meminfo();         arm_memblock_init(&meminfo, mdes ...

  6. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  7. Linux内核启动及根文件系统载入过程

    上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-bo ...

  8. Linux内核启动分析过程-《Linux内核分析》week3作业

    环境搭建 环境的搭建参考课件,主要就是编译内核源码和生成镜像 start_kernel 从start_kernel开始,才真正进入了Linux内核的启动过程.我们可以把start_kernel看做平时 ...

  9. Linux移植之内核启动过程引导阶段分析

    在Linux移植之make uImage编译过程分析中已经提到了uImage是一个压缩的包并且内含压缩程序,可以进行自解压.自解压完成之后内核代码从物理地址为0x30008000处开始运行.下面分析在 ...

  10. 嵌入式Linux的启动过程

    1.了解 Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展.虽然 Linux 在桌面 PC 机上的 ...

随机推荐

  1. 图扑软件 | 带你体验 Low Poly 卡通三维世界

    在三维场景搭建中,图扑软件提供了多样化的设计风格,以满足不同项目的视觉需求.无论是写实风格的细腻渲染.科幻未来的赛博质感,还是简约现代的几何美学,都能通过灵活的工具体系实现.而今天,我们将重点介绍一种 ...

  2. 详解HarmonyOS NEXT系统中ArkTS和仓颉的混合开发

    连续分享了很多天鸿蒙仓颉语言的开发教程,大家现在应该都知道鸿蒙开发有ArkTs和仓颉两种开发语言,这两种语言有些相似,而且还支持混合开发,今天就分享一下怎么实现ArkTs和仓颉的混合开发,分不清这两种 ...

  3. 微服务架构学习与思考(16):SOA架构与微服务架构对比分析?它们之间区别是什么?

    什么是 SOA 架构 SOA(Service-Oriented Architecture) 架构是面向服务的架构,是一种将单体应用粗粒度的划分为服务的架构,其核心是将业务功能抽象为独立.可重用.松耦合 ...

  4. 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅?

    title: 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅? date: 2025/06/18 10:11:53 updated: 2025/06/18 10:11:53 author: ...

  5. 【前端AI实践】Lingma:使用工具辅助开发让你停不下来

    如果你用过 GitHub Copilot,那你对 AI 编程助手应该不陌生.而 Lingma 是阿里云推出的一款专注于编程场景的智能编码助手. 它深度集成在 VS Code.JetBrains 等主流 ...

  6. VS2022 下载超详细安装教程(附安装包及秘钥):全能开发工具部署指南

    目录 一.VS2022软件核心功能与优势 二.VS2022下载及安装准备 1. 系统要求: 2. VS2022下载: 三.VS2022详细安装步骤 1. 解压VS2022安装包 2. 运行VS2022 ...

  7. 深入理解 Taier:MR on Yarn 的实现原理

    我们今天常说的大数据技术,它的理论基础来自于2003年 Google 发表的三篇论文,<The Google File System>.<MapReduce: Simplified ...

  8. 阿里P7,竟问这么简单的题目?

    今天面试阿里后端开发, ● 面试官提问:谈谈你对 const 理解 ● 我这样回答的: const 仅仅表示变量不能修改,太简答了,我早就知道了. ● 面试官回复:你觉得 这样能面过 P7 ,百万年薪 ...

  9. 花150元,我用 AI 做出了千万播放的爆款视频!保姆级教程+完整提示词

    大家好,我是程序员鱼皮.这两天正在研究 怎么切显卡,只切贵的,不切对的: 我是怎么做到的呢?下面会分享. 这段时间,网上出现了很多利用 AI 制作 ASMR 视频的博主,其中比较有代表性的一位,几天的 ...

  10. JS ES6数组中删除指定元素

    https://www.cnblogs.com/linsx/p/8331623.html arr.splice(arr.findIndex(item => item.id === data.id ...