第 9 章:Linux 设备树 (DTS) ——屏蔽与独占外设

现在 A35 已经在 M33 的引导下开始启动了。但紧接着你会发现一个严重的冲突:Linux 内核启动时会根据设备树(Device Tree)扫描所有硬件,如果它尝试初始化已经被 M33 占用的 UART7 或 I2C2,轻则导致驱动报错,重则因 RIF 权限冲突引发系统挂起(System Hang)。

本章我们将对 Linux 设备树动一场"外科手术",确保 Linux 能与 M33 和谐共处。


9.1 设备树裁剪的核心逻辑

在异构系统中,设备树不仅要描述硬件,还要描述"所有权"。我们的手术方案分为三步:

  1. 屏蔽(Disable):告诉 Linux 某些硬件已经"不存在"了。

  2. 预留(Reserve):划出内存禁区,防止 Linux 内核把 M33 的代码段当成空闲内存回收。

  3. 引用(Reference):为后续的核间通讯(OpenAMP)定义端点。


9.2 实战:内存禁区------reserved-memory 节点

在 Linux 源码的 .dts.dtsi 文件中,我们必须手动添加保留内存块。地址必须与第 7 章 M33 链接脚本中的地址严格对应。

/ {

reserved-memory {

#address-cells = <2>;

#size-cells = <2>;

ranges;

/* M33 的运行代码区:256KB @ 0x0E000000 */

m33_code_reserved: m33_code@0e000000 {

reg = <0x0 0x0e000000 0x0 0x00040000>;

no-map; // 告诉内核:这块地盘你连看都不要看,不要建立 MMU 映射

};

/* 跨核通讯共享内存:2MB @ 0x90000000 */

vdev0buffer: vdev0buffer@90000000 {

compatible = "shared-dma-pool";

reg = <0x0 0x90000000 0x0 0x00200000>;

no-map;

};

};

};

9.3 实战:硬件"消失术"------修改外设状态

我们在 M33 侧接管了 UART7(调试串口)、I2C2(IMU)和 GPIOZ(LED)。在 Linux 设备树中,必须显式将它们设为 disabled

/* 禁用 UART7,防止 Linux 控制台抢占 */

&uart7 {

status = "disabled";

};

/* 禁用 I2C2,防止 Linux 的 I2C 驱动初始化 LSM6DS3 */

&i2c2 {

status = "disabled";

};

/* 针对 GPIOZ,通常在 MP257 中只需禁用对应的 pinctrl 节点 */

&pinctrl_gpioz {

status = "disabled";

};

9.4 深度实战:定义远程处理器节点 (RemoteProc)

为了让 Linux 识别到 M33 核心并与其进行 OpenAMP 通讯,我们需要在设备树中定义一个 m33_rproc 节点。

m33_rproc: m33@0 {

compatible = "st,stm32mp2-m33";

/* 指向上面定义的保留内存 */

memory-region = <&m33_code_reserved>, <&vdev0buffer>;

st,syscfg-holdboot = <&syscfg 0x0 0x1>; // 握手寄存器

status = "okay";

};

9.5 编译与部署 DTS

  1. 进入 Linux 源码目录

export ARCH=arm64

export CROSS_COMPILE=aarch64-linux-gnu-

make stm32mp257f-dk.dtb

  1. 更新开发板 :将生成的 .dtb 文件拷贝到 SD 卡的 /boot 目录或指定的存储分区。

  2. 验证

    • 启动 Linux 后,运行 ls /dev/ttySTM*。如果你发现没有 ttySTM7(对应 UART7),说明屏蔽成功。

    • 观察 M33 串口:如果 Linux 启动过程中,M33 的 LED 依然正常闪烁且 IMU 数据没有中断,说明 Linux 已经绕开了这些硬件。


9.6 避坑指南 (Debug Tips)

  • 陷阱:引脚冲突 。虽然你禁用了 &uart7 节点,但如果 pinctrl 配置中其他活动的设备(如 SPI 或其他 UART)误用了 UART7 的引脚,依然会导致电气冲突。

    • 检查 :在设备树中全局搜索引脚定义,确保 M33 使用的引脚没有在任何 status = "okay" 的节点中出现。
  • 陷阱:时钟树断电。Linux 内核有一个特性:如果一个时钟没有任何驱动使用,它会自动关闭该时钟以省电。

    • 对策 :在 &rcc 节点中,将 M33 需要的时钟加入 protected-clocks 列表。

章节小结

经过这一章的"外科手术",我们成功地在 A35 和 M33 之间建立了一道逻辑围墙。Linux 运行在它受限的领地内,而 M33 在它的专属领地内稳如泰山。

相关推荐
csdn_aspnet1 天前
如何用 C# 和 Gemma 3 在本地构建一个真正能完成工作的 AI 代理的
人工智能·ai·c#·gemma
啊哈哈哈哈哈啊哈哈1 天前
边缘计算与轮廓检测
人工智能·opencv·计算机视觉
cskywit1 天前
从DFL到无NMS推理:一文拆解YOLO26背后的工程取舍与数学原理
人工智能·机器学习
PPHT-H1 天前
【人工智能笔记】第四十四节:OpenClaw封神工具 openclaw-free-openai-proxy 免费AI模型批量调用,零token费+稳到不翻车!
人工智能·深度学习·openclaw·免费openai·ai服务代理
yiyu07161 天前
3分钟搞懂深度学习AI:实操篇:RNN
人工智能·深度学习
芯联智造1 天前
【stm32简单外设篇】- WS2812单线地址式 RGB 灯带
c语言·stm32·单片机·嵌入式硬件
uzong1 天前
CoPaw是什么?-- 2026年开源的国产个人AI助手
人工智能·后端
海盗儿1 天前
TensorRT-LLM 框架与源码分析
人工智能
无心水1 天前
【任务调度:框架】11、分布式任务调度进阶:高可用、幂等性、性能优化三板斧
人工智能·分布式·后端·性能优化·架构·2025博客之星·分布式调度框架
va学弟1 天前
Java 网络通信编程(6):视频通话
java·服务器·网络·音视频