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

相关推荐
左手厨刀右手茼蒿1 小时前
Flutter for OpenHarmony: Flutter 三方库 image_size_getter 零加载极速获取图片尺寸(鸿蒙 UI 布局优化必备)
android·服务器·flutter·ui·华为·harmonyos
钛态1 小时前
Flutter for OpenHarmony:dio_cookie_manager 让 Dio 发挥会话管理能力,像浏览器一样自动处理 Cookie 深度解析与鸿蒙适配指南
android·linux·运维·flutter·ui·华为·harmonyos
飞哥数智坊1 小时前
把模型焊死在芯片上,就能跑出 17,000 tokens/秒?这是一条死路,还是一条新路?
人工智能
王码码20351 小时前
Flutter for OpenHarmony:Flutter 三方库 bluez 玩转 Linux 风格的蓝牙操作(蓝牙底层互操作)
linux·运维·服务器·前端·flutter·云原生·harmonyos
多恩Stone2 小时前
【3D-AICG 系列-11】Trellis 2 的 Shape VAE 训练流程梳理
人工智能·pytorch·算法·3d·aigc
tuotali20262 小时前
氢气压缩机技术规范亲测案例分享
人工智能·python
A.A呐2 小时前
【Linux第七章】进程切换和命令行参数
linux
抓饼先生2 小时前
iceoryx编译和验证
linux·c++·零拷贝·iceoryx
Coder_Boy_2 小时前
Java(Spring AI)传统项目智能化改造——商业化真实案例(含完整核心代码+落地指南)
java·人工智能·spring boot·spring·微服务