当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/400439/

相关文章:

  • 3步掌握WireViz:让线束设计效率提升10倍的开源工具
  • 如何顺利安装地理数据处理工具?3种方案实测对比与环境配置指南
  • 解锁AI编程潜能:Superpowers技能库实战指南
  • 开源社区支持:RemoveWindowsAI高效问题解决指南
  • vit-pytorch实战指南:从零构建视觉Transformer模型
  • 数据可视化新范式:零基础上手D3Blocks创建交互式图表
  • 4种时间提取方法解决Google相册Takeout数据整理难题
  • 图书可视化毕业设计中的效率瓶颈与优化实践:从数据加载到渲染性能提升
  • 重塑终端交互体验:OpenCode的组件化设计革命
  • RAG-Anything企业级部署指南:从零搭建生产环境优化方案
  • 提示词优化器完全指南:提升AI交互效率的实用技巧
  • free-llm-api-resources项目安全深度评估:从代码实现到风险防护
  • 解锁Claude HUD:实时会话监控的5个实用维度
  • 智能IPTV源管家:三大核心技术破解播放源不稳定难题
  • 三步掌握跨平台抓包工具ProxyPin:从入门到精通全平台流量分析
  • 如何通过Brave浏览器实现革新性的隐私保护与浏览体验提升
  • fpPS4项目入门指南:探索Free Pascal实现的PS4兼容层
  • Node.js日志架构升级:从morgan到Fluentd的分布式采集实践
  • 4步突破数据可视化边界:AFFiNE多视图管理让团队协作效率倍增
  • 技术领域突破:软体机器人仿真中弹性模型的工程化实现
  • F5-TTS模型部署技术选型与性能优化:TensorRT vs ONNX Runtime深度对比
  • URL签名:imgproxy图片处理服务的安全防护机制解析
  • 多模态RAG部署实战指南:从环境搭建到生产优化的完整路径
  • S905L3B芯片网络机顶盒改造实战:Armbian系统安装与优化指南
  • 游戏模组开发实战指南:从入门到精通的跨引擎解决方案
  • Hunyuan3D-2:AI驱动的高分辨率3D资产生成技术解决方案
  • AI视频生成开源工具高效创作指南:从基础到进阶的全流程实践
  • 探索FactoryBluePrints的隐藏潜力:从新手到专家的效率提升与个性化定制指南
  • 3步激活Unity全版本:UniHacker跨平台破解工具实战指南
  • IPTV播放源检测全攻略:从故障排查到智能监测的开源解决方案