ARM Linux 设备树

news2025/5/9 19:05:25

Linux 设备驱动开发详解:基于最新的Linux 4.0内核, 机械工业出版社, 宋宝华, 2015

1. 设备树的起源
• 背景: ARM架构中大量板级代码冗余,硬编码在mach-xxx目录,设备树(Device Tree)引入结构化描述硬件。

• 目的: 减少内核冗余代码,通过设备树文件(.dts)传递硬件信息,由Bootloader加载至内核。

• 核心思想: 设备树以节点和属性形式描述硬件拓扑,如CPU、内存、外设、中断等。


2. 设备树的组成与结构
2.1 核心文件
• DTS (Device Tree Source): 文本格式描述硬件,支持.dtsi包含(类似C头文件)。

• DTC (Device Tree Compiler): 编译工具,将DTS转换为DTB。

• DTB (Device Tree Blob): 二进制文件,由内核解析。

• 绑定文档(Binding): 说明节点属性规范(如Documentation/devicetree/bindings)。

2.2 设备树结构
• 节点(Node): 表示设备或总线,如根节点/,子节点cpu@0

• 属性(Property): 键值对描述硬件特性,如reg = <地址 长度>interrupts

• 标签(Label)与Phandle: 通过&label引用节点,如&gpio0表示GPIO控制器。

2.3 设备树示例

/ {
    compatible = "acme,coyotes-revenge"; // 根节点兼容性
    #address-cells = <1>; // 地址占1个cell
    #size-cells = <1>;    // 长度占1个cell

    cpus {
        cpu@0 { compatible = "arm,cortex-a9"; reg = <0>; };
        cpu@1 { compatible = "arm,cortex-a9"; reg = <1>; };
    };

    serial@101f0000 {
        compatible = "arm,pl011";
        reg = <0x101f0000 0x1000>; // 寄存器地址和长度
        interrupts = <1 0>;        // 中断号及触发方式
    };
};

3. 关键概念解析
3.1 兼容性(Compatible)
• 根节点兼容性: 匹配机器类型,如vexpress-v2p-ca9

// 内核中匹配设备
if (of_machine_is_compatible("arm,vexpress")) { ... }

• 设备节点兼容性: 驱动匹配依据,如compatible = "arm,pl011"

3.2 地址编码
• reg属性: 格式reg = <地址1 长度1 地址2 长度2 ...>

• #address-cells和#size-cells: 定义子节点地址/长度的cell数量。

external-bus {
    #address-cells = <2>; // 地址占2个cell(片选+偏移)
    #size-cells = <1>;     // 长度占1个cell
    ethernet@0,0 { reg = <0 0 0x1000>; };
};

3.3 中断连接
• 中断控制器: 声明interrupt-controller#interrupt-cells

• 中断属性: 使用interrupt-parentinterrupts指定中断号和触发方式。

intc: interrupt-controller@10140000 {
    compatible = "arm,pl190";
    #interrupt-cells = <2>; // 2个cell(中断号+标志)
};
serial@101f0000 {
    interrupts = <1 0>; // 中断号1,触发方式0
};

3.4 GPIO、时钟、Pinmux
• GPIO控制器: 声明gpio-controller#gpio-cells

• GPIO使用: 通过gpios属性引用控制器。

gpio@101f3000 {
    gpio-controller;
    #gpio-cells = <2>; // GPIO号+极性
};
button {
    gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
};

4. BSP和驱动的变更
4.1 平台设备的替代
• 旧方式: 手动注册platform_device,硬编码资源。

• 新方式: 设备树自动展开platform_device,资源来自.dts

4.2 驱动匹配机制
• OF匹配表: 驱动通过.of_match_table匹配设备节点。

static const struct of_device_id my_drv_of_match[] = {
    { .compatible = "vendor,device" },
    {},
};
MODULE_DEVICE_TABLE(of, my_drv_of_match);

4.3 平台数据的属性化
• 旧方式: 通过platform_data结构传递数据。

• 新方式: 从设备树属性读取,如of_property_read_u32()

// 读取属性值示例
of_property_read_u32(np, "clock-frequency", &clk_freq);

4.4 实例:GPIO按键驱动

gpio-keys {
    compatible = "gpio-keys";
    button {
        label = "Up";
        gpios = <&gpio0 1 0>;
        linux,code = <KEY_UP>;
    };
};

驱动通过OF API解析属性:

of_get_gpio_flags(pp, 0, &flags); // 获取GPIO号和极性
of_property_read_u32(pp, "linux-code", &key_code); // 读取键值

5. 常用OF API
• 节点操作:

of_find_compatible_node(): 查找兼容节点。

of_get_child_count(): 获取子节点数量。

• 属性读取:

of_property_read_u32_array(): 读取32位数组。

of_property_read_string(): 读取字符串。

• 资源解析:

of_get_named_gpio(): 获取GPIO号。

of_irq_get(): 获取中断号。


6. 总结
• 设备树优势:解耦硬件描述与内核代码,提升可维护性。

• 核心元素:节点、属性、兼容性、地址编码、中断连接。

• 驱动适配:通过OF匹配表和API解析设备树数据。

通过设备树,ARM Linux实现了硬件描述的标准化,降低了BSP开发复杂度,成为嵌入式开发的必备知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2371716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp-商城-43-shop 后台管理 页面

后台管理较为简单&#xff0c;主要用于后台数据的管理&#xff0c;包含商品类别和商品信息&#xff0c;其实还可以扩展到管理用户等等 1、后台首页 包含 分类管理 商品管理 关于商家等几个栏目 主要代码&#xff1a; <template><view class"manage">…

vue2 结合后端预览pdf 跨域的话就得需要后端来返回 然后前端呈现

<el-button :loading"pdfIslock" v-if"isPDFFile(form.pic)" type"primary" style"margin: 15px 0" click"previewPDF(form.pic)"> 预览pdf </el-button>//npm install pdfjs-dist //如果没有就得先安装import …

什么是 HSQLDB?

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; Java开发人员学习Java数据库连接&#xff08;JDBC&#xff09;的最简单方法是试验HyperSQL数据库&#xff08;又名HSQLDB&#xff09;。 …

多语言爬虫实现网站价格监控

最近突发奇想想用多种代码来爬取数据做价格监控。常见的比如Python、JavaScript(Node.js)、或者Go&#xff1f;不过通常来说&#xff0c;Python应该是首选&#xff0c;因为它的库比较丰富&#xff0c;比如requests和BeautifulSoup&#xff0c;或者Scrapy。不过客户要求多种代码…

16.Three.js 中的 RectAreaLight 全面详解 + Vue 3 实战案例

&#x1f60e; 本文将带你从零了解 THREE.RectAreaLight 的工作原理、使用方式、注意事项&#xff0c;并在最后用 Vue 3 的 Composition API 封装一个完整的光源演示组件&#xff0c;一站式搞懂矩形区域光的魅力 &#x1f4a1;&#xff01; &#x1f5bc;️ 一、展示图效果示意…

excel 批量导出图片并指定命名

一、开发环境 打开excel文件中的宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区&#xff0c;当打开多个excel时会有多个&#xff0c;要注意不要把代码写到其他工作簿去了 右边是代码区 二、编写代码 宏是js语言&#xff0c;因此变量或者方法可以网上搜…

Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

通过DeepSeek大语言模型控制panda机械臂,听懂人话,拟人性回答。智能机械臂助手又进一步啦

文章目录 前言环境配置运行测试报错 前言 通过使用智能化的工作流控制系统来精确操控机械臂&#xff0c;不仅能够基于预设算法可靠地规划每个动作步骤的执行顺序和力度&#xff0c;确保作业流程的标准化和可重复性&#xff0c;还能通过模块化的程序设计思路灵活地在原有工作流中…

如何添加或删除极狐GitLab 项目成员?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目成员 (BASIC ALL) 成员是有权访问您的项目的用户和群组。 每个成员都有一个角色&#xff0c;这决定了他们在项目中可以…

计算机网络-LDP标签发布与管理

前面学习了LDP建立邻居&#xff0c;建立会话&#xff0c;今天来学习在MPLS中的标签发布与管理。 在MPLS网络中&#xff0c;下游LSR决定标签和FEC的绑定关系&#xff0c;并将这种绑定关系发布给上游LSR。LDP通过发送标签请求和标签映射消息&#xff0c;在LDP对等体之间通告FEC和…

云境天合水陆安全漏电监测仪—迅速确定是否存在漏电现象

云境天合水陆安全漏电监测仪是一种专为水下及潮湿环境设计的电气安全检测设备&#xff0c;通过高灵敏度电磁传感器探测漏电电流产生的交变磁场&#xff0c;基于法拉第电磁感应定律&#xff0c;自动区分高灵敏度信号和低灵敏度信号&#xff0c;精准定位泄漏电源的具体位置。一旦…

软考 系统架构设计师系列知识点之杂项集萃(54)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;53&#xff09; 第87题 某银行系统采用Factory Method方法描述其不同账户之间的关系&#xff0c;设计出的类图如下所示。其中与Factory Method的“Creator”角色对应的类是&#xff08;&#xff…

Nginx +Nginx-http-flv-module 推流拉流

这两天为了利用云服务器实现 Nginx 进行OBS Rtmp推流&#xff0c;Flv拉流时发生了诸多情况&#xff0c;记录实现过程。 环境 OS&#xff1a;阿里云CentOS 7.9 64位Nginx&#xff1a;nginx-1.28.0Nginx-http-flv-module&#xff1a;nginx-http-flv-module-1.2.12 安装Nginx编…

KeyPresser 一款自动化按键工具

1. 简介 KeyPresser 是一款自动化按键工具,它可以与窗口交互,并支持后台运行, 无需保持被控窗口在前台运行。用户可以选择要操作的目标窗口,并通过勾选复选框来控制要发送哪些按键消息。可以从组合框中选择所需的按键,并在编辑框中输入时间间隔以控制按键发送之间的延迟。程…

DVWA靶场保姆级通关教程--03CSRF跨站请求伪造

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、low级别的源码分析 二、medium级别源码分析 安全性分析 增加了一层 Referer 验证&#xff1a; 关键点是&#xff1a;在真实的网络环境中&a…

架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案

文章目录 引言一、升级读服务架构&#xff0c;为什么需要自动化测试&#xff1f;二、自动化回归测试系统&#xff1a;整体架构概览三、日志收集1. 拦截方式2. 存储与优化策略3. 架构进化 四、数据回放技术实现关键能力 五、差异对比对比方式灵活配置 六、三种回放模式详解1. 离…

Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!

本文主要介绍项目&#xff0c;项目的结构&#xff0c;项目如何配置&#xff0c;项目如何打包。这篇文章如果对你有帮助请点赞和收藏&#xff0c;谢谢&#xff01;源代码仅供学习使用&#xff0c;如果转载文章请标明出处&#xff01;&#xff08;免费下载源代码&#xff09;&…

【PostgreSQL】超简单的主从节点部署

1. 启动数据库 启动主节点 docker run --name postgres-master -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres启动从节点 docker run --name postgres-slave -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres需要配置挂载的存储卷 2. 数据…

zotero pdf中英翻译插件使用

最近发现一个pdf中英翻译的神器zotero-pdf2zh&#xff0c;按照官方安装教程走一遍的时候&#xff0c;发现一些流程不清楚的问题&#xff0c; 此文就是整理一些安装需要的文件以及遇到的问题&#xff1a; 相关文件下载地址 Zotero 是一款免费的、开源的文献管理工具&#xff0…

WSL(Windows Subsystem for Linux)入门

目录 1.简介2.安装与配置3.常用命令4.进阶使用4.1 文件系统交互4.2 网络互通4.3 配置代理4.4 运行 GUI 程序4.5 Docker 集成 1.简介 WSL 是 Windows 系统内置的 Linux 兼容层&#xff0c;允许直接在 Windows 中运行 Linux 命令行工具和应用程序&#xff0c;无需虚拟机或双系统…