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

相关推荐
threelab2 分钟前
Three.js 物理模拟着色器 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器
RSTJ_16255 分钟前
PYTHON+AI LLM DAY SEVENTY-ONE
人工智能
圣殿骑士-Khtangc23 分钟前
单智能体落地实战:从 ReAct 到 Production-Ready AI Agent 全链路解析
人工智能·react.js
云烟成雨TD44 分钟前
Spring AI 1.x 系列【56】用大模型评判大模型:递归顾问实现自动化评估方案
人工智能·spring·自动化
azwsm1 小时前
电路元器件和GPIO控制器
单片机·嵌入式硬件
AI客栈1 小时前
K8s 自定义控制器中 WorkQueue 队列优化实践:基于 IPVS 转发原理的状态变化处理
人工智能
0xR3lativ1ty1 小时前
每周AI工具新动态
人工智能
jerryinwuhan1 小时前
面向产业带与中小企业数字化转型的电商运营人才培养模式
大数据·人工智能
bjzhang751 小时前
CentOS下安装MySQL详解
linux·mysql·centos
Drgfd1 小时前
智造赋能品控:汪进进以精益生产,夯实质量制造底座
人工智能·制造