第 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 在它的专属领地内稳如泰山。

相关推荐
灵晔君4 分钟前
【Linux】进程控制(一)——进程创建、进程终止与进程等待
linux·c语言·算法
sali-tec5 分钟前
C# 基于OpenCv的视觉工作流-章103-空车位识别
人工智能·opencv·计算机视觉
hyf3266338 分钟前
低成本站群泛程序部署:单服务器托管百站稳定运行教程
运维·服务器·前端·搜索引擎·蜘蛛池
迷迭香yy10 分钟前
大宗交易折溢价因子怎么挖掘本地化Python全流程实战
开发语言·人工智能·python
也非非也11 分钟前
DeepSeek 又开源了一个新东西——DeepSeek Harness
人工智能·开源·agi·deepseek·harness·dsh
wsad053213 分钟前
CentOS 10 上使用 Docker Compose 部署 Discuz X5.0 论坛完整教程
linux·docker·centos·discuz
张宇Joaquin18 分钟前
openEuler编译和更换内核的方法
java·linux·服务器
海兰18 分钟前
【AI工具】腾讯云开源自研 AI 助手 Octop介绍及安装使用指南
人工智能·云计算·腾讯云
小此方19 分钟前
Re:Linux系统篇(五十六)线程篇 · 九:基于阻塞队列的生产者消费者模型与条件变量
linux·运维·服务器
Yweir19 分钟前
AI大模型开发-Python介绍、版本说明
开发语言·人工智能·python