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

【Linux驱动开发】第12天:Linux设备树核心:树形结构+节点+属性 完整全解

目录设备树树形结构概述节点Node全解命名规范标准节点常用设备节点属性Property全解类型核心属性总线专用属性标签与节点引用设备树复用的核心常见错误与注意事项总结驱动开发必背节点与属性1. 设备树树形结构概述设备树采用分层树形结构描述硬件和计算机的文件系统目录结构几乎完全一致。它以根节点为起点向下逐层展开真实反映了计算机系统中硬件的物理连接关系。1.1 树形结构的三大核心元素设备树的所有内容都由这三个基本元素组成根节点(/) ├── 子节点1代表一个硬件设备 │ ├── 属性1 值1描述设备特性 │ ├── 属性2 值2 │ └── 孙子节点1代表子设备 │ └── 属性3 值3 └── 子节点2 └── 属性4 值4根节点所有节点的父节点用/表示每个设备树有且只有一个节点每个硬件设备对应一个节点节点可以包含子节点形成分层结构属性每个节点包含多个键值对形式的属性用于描述设备的具体硬件信息1.2 最简完整设备树示例/dts-v1/; // 设备树版本号必须是第一行 / { // 根节点 compatible myvendor,myboard; model My Custom Development Board; // 片上系统节点包含所有内部外设 soc { compatible simple-bus; #address-cells 1; #size-cells 1; ranges; // UART串口节点 uart12340000 { compatible myvendor,my-uart; reg 0x12340000 0x1000; interrupts 5; status okay; }; // GPIO控制器节点 gpio12341000 { compatible myvendor,my-gpio; reg 0x12341000 0x1000; gpio-controller; #gpio-cells 2; status okay; }; }; // 外接LED节点 leds { compatible gpio-leds; blue-led { label blue:user; gpios gpio 13 GPIO_ACTIVE_HIGH; }; }; };2. 节点Node全解命名规范标准节点常用设备节点节点是设备树的基本单元每个硬件设备对应一个节点。2.1 节点命名规范必须严格遵守不符合规范的节点会导致内核解析失败驱动无法匹配。标准命名格式节点名单元地址各部分含义节点名描述设备的通用类型如cpu、memory、uart、i2c只能使用小写字母、数字和连字符-不能使用下划线_、空格或其他特殊字符尽量使用内核通用的设备类型名不要使用厂商自定义名称单元地址设备的唯一地址标识内存映射设备寄存器基地址十六进制I2C/SPI设备从机地址/片选号CPUCPU编号作用区分同类型的不同设备正确与错误命名对比正确命名错误命名错误原因uart12340000UART12340000使用了大写字母i2c12341000i2c_controller12341000节点名过长应使用通用类型名led1led_1使用了下划线缺少和单元地址cpu0cpu0缺少和单元地址2.2 标准节点每个设备树都必须包含这些节点不对应具体的外设而是提供系统级的全局信息。1. 根节点/作用整个设备树的起点包含系统全局信息必须属性/ { compatible 厂商,板级型号; // 板级兼容属性匹配内核板级支持包 model 开发板全称; // 人类可读的开发板名称 #address-cells 1; // 子节点reg属性中地址部分占几个32位整数 #size-cells 1; // 子节点reg属性中长度部分占几个32位整数 };2./aliases别名节点作用给节点起简短别名方便内核和驱动引用示例aliases { serial0 uart4; // 给uart4节点起别名serial0 i2c1 i2c1; // 给i2c1节点起别名i2c1 led0 blue_led; // 给LED节点起别名led0 };用途内核通过别名快速找到特定设备如consolettySTM0对应serial0别名3./chosen选择节点作用传递内核启动参数和运行时配置最重要属性bootargs内核命令行参数示例chosen { bootargs consolettySTM0,115200 root/dev/mmcblk0p2 rootwait rw; stdout-path uart4; // 指定标准输出设备 };4./memory内存节点作用描述系统物理内存信息必须属性memoryc0000000 { device_type memory; // 固定值标识这是内存节点 reg 0xc0000000 0x20000000; // 基地址0xc0000000长度0x20000000512MB };5./cpusCPU节点作用描述系统中的CPU核心信息结构包含一个或多个cpux子节点示例cpus { #address-cells 1; #size-cells 0; cpu0 { compatible arm,cortex-a7; device_type cpu; reg 0; // CPU编号 clock-frequency 800000000; // CPU主频800MHz }; cpu1 { compatible arm,cortex-a7; device_type cpu; reg 1; clock-frequency 800000000; }; };6./soc片上系统节点作用包含所有片上外设UART、I2C、SPI、GPIO等必须属性soc { compatible simple-bus; // 告诉内核这是一个简单总线 #address-cells 1; #size-cells 1; ranges; // 地址映射空表示子节点地址与父节点地址相同 // 所有片上外设节点都放在这里 uart40010000 { ... }; i2c40012000 { ... }; gpio50002000 { ... }; };2.3 驱动开发最常用的通用设备节点1. 总线类节点1UART串口节点uart4: serial40010000 { compatible st,stm32mp157-uart; reg 0x40010000 0x400; // 寄存器基地址和长度 interrupts 52; // 中断号 clocks rcc UART4_CLK; // 时钟 status okay; // 启用设备 };2I2C总线节点i2c1: i2c40012000 { compatible st,stm32mp157-i2c; reg 0x40012000 0x400; interrupts 31; #address-cells 1; // 子节点reg占1个cellI2C从地址 #size-cells 0; // 子节点reg没有长度部分 clock-frequency 100000; // I2C总线频率100kHz status okay; // I2C从设备节点 eeprom50 { compatible atmel,24c02; reg 0x50; // I2C从机地址0x50 }; };3SPI总线节点spi1: spi40013000 { compatible st,stm32mp157-spi; reg 0x40013000 0x400; interrupts 32; #address-cells 1; // 子节点reg占1个cell片选号 #size-cells 0; status okay; // SPI从设备节点 flash0 { compatible winbond,w25q64; reg 0; // 片选号0 spi-max-frequency 10000000; // 最大SPI频率10MHz }; };4GPIO控制器节点gpioa: gpio50002000 { compatible st,stm32mp157-gpio; reg 0x50002000 0x400; gpio-controller; // 标识这是一个GPIO控制器 #gpio-cells 2; // GPIO引用需要2个参数引脚号极性 status okay; };2. 外设类节点1LED节点leds { compatible gpio-leds; blue_led: led-blue { label blue:user; // LED名称 gpios gpioa 13 GPIO_ACTIVE_HIGH; // 使用GPIOA13高电平点亮 linux,default-trigger heartbeat; // 默认心跳模式 }; };2按键节点keys { compatible gpio-keys; key-user { label user-key; gpios gpioc 13 GPIO_ACTIVE_LOW; // GPIOC13低电平有效 linux,code KEY_ENTER; // 按键码 }; };3. 属性Property全解类型核心属性总线专用属性属性是节点的核心用于描述设备的具体硬件特性采用键值对形式。3.1 属性的5种基本类型类型语法示例用途字符串类型双引号包裹compatible st,stm32-uart;描述名称、兼容属性、状态32位整数类型尖括号包裹reg 0x12340000 0x1000;描述地址、长度、中断号字节数组类型方括号[]包裹mac-address [00 11 22 33 44 55];描述MAC地址、二进制数据布尔类型只有属性名没有值gpio-controller;标识设备具有某种特性字符串数组类型多个字符串用逗号分隔compatible st,stm32-uart, arm,pl011-uart;多个兼容属性3.2 核心属性驱动开发每天都会用到这些属性是所有设备节点通用的也是最重要的属性。1.compatible最重要驱动匹配唯一依据作用设备和驱动之间的配对暗号格式厂商,设备型号匹配规则内核从左到右依次匹配驱动的of_device_id表匹配到第一个就停止示例compatible st,stm32mp157-uart, arm,pl011-uart;注意必须和驱动代码中的字符串完全一致一个字符都不能错否则驱动永远不会执行probe函数2.reg地址资源描述作用描述设备的寄存器地址范围或总线地址格式由父节点的#address-cells和#size-cells决定父节点#address-cells 1#size-cells 1格式为基地址 长度父节点#address-cells 2#size-cells 2格式为addr_high addr_low len_high len_low示例// 内存映射设备 reg 0x40010000 0x400; // 基地址0x40010000长度0x400 // I2C设备父节点#size-cells0 reg 0x50; // I2C从机地址0x50 // SPI设备父节点#size-cells0 reg 0; // SPI片选号03.status设备状态控制作用控制设备是否启用有效值值含义okay设备正常启用disabled设备禁用内核会忽略该节点fail设备存在但工作异常注意父节点status disabled时所有子节点都会被递归忽略.dtsi文件中节点默认状态通常是disabled在.dts文件中显式改为okay启用4.interrupts中断资源描述作用描述设备使用的中断号和触发方式格式中断号 触发方式常用触发方式IRQ_TYPE_EDGE_RISING上升沿触发IRQ_TYPE_EDGE_FALLING下降沿触发IRQ_TYPE_LEVEL_HIGH高电平触发IRQ_TYPE_LEVEL_LOW低电平触发示例interrupts 52 IRQ_TYPE_LEVEL_HIGH; // 中断号52高电平触发5.#address-cells和#size-cells作用定义子节点reg属性的格式#address-cells用来描述子节点reg属性的地址表中用来描述首地址的元素所用字cell的数量而每个字cell是一个无符号32位整形。#size-cells用来描述子节点reg属性的地址表中用来描述地址范围大小的元素所用字cell的数量每个字cell是一个无符号32位整形。示例soc { #address-cells 1; // 子节点地址占1个cell #size-cells 1; // 子节点长度占1个cell // 子节点reg格式addr len uart40010000 { reg 0x40010000 0x400; }; };6.ranges地址映射作用定义子总线地址到父总线地址的映射关系格式子地址 父地址 长度空值ranges;表示子节点地址与父节点地址完全相同示例soc { ranges 0 0x40000000 0x10000000; // 子地址0映射到父地址0x40000000长度0x10000000 };3.3 常用总线专用属性1. I2C总线专用clock-frequencyI2C总线频率单位HzregI2C从机地址2. SPI总线专用spi-max-frequencySPI设备最大工作频率单位HzregSPI片选号spi-cpol时钟极性1表示空闲时时钟为高电平spi-cpha时钟相位1表示在第二个时钟沿采样3. GPIO专用gpio-controller标识这是一个GPIO控制器#gpio-cellsGPIO引用需要的参数个数通常是2引脚号极性gpios引用GPIO引脚格式为gpio_controller 引脚号 极性GPIO_ACTIVE_HIGH高电平有效GPIO_ACTIVE_LOW低电平有效4. 中断控制器专用interrupt-controller标识这是一个中断控制器#interrupt-cells中断引用需要的参数个数通常是2中断号触发方式interrupt-parent指定该设备的中断控制器4. 标签与节点引用设备树复用的核心设备树通过标签和引用实现代码复用这是.dtsi头文件机制的基础。4.1 标签Label在节点名前加标签名:给节点起一个唯一的标识作用方便在其他地方引用该节点示例uart4: serial40010000 { ... };4.2 节点引用使用标签名引用已经定义的节点主要用途在.dts文件中修改.dtsi文件中定义的节点属性示例// 在stm32mp157.dtsi中定义了uart4节点默认状态是disabled uart4: serial40010000 { compatible st,stm32mp157-uart; reg 0x40010000 0x400; interrupts 52; status disabled; }; // 在myboard.dts中引用uart4节点修改为启用状态 uart4 { status okay; };5. 常见错误与注意事项节点名不规范使用大写字母、下划线或特殊字符导致内核解析失败缺少和单元地址同类型的多个设备无法区分驱动匹配混乱属性值类型错误应该用尖括号的用了双引号应该用双引号的用了尖括号compatible属性不匹配设备树和驱动的compatible字符串不一致导致probe不执行忘记以空结尾of_device_id表和数组类型的属性必须以空结尾父节点禁用导致子节点失效父节点status disabled时所有子节点都会被忽略6. 总结驱动开发必背节点与属性必须掌握的节点标准节点/、/aliases、/chosen、/memory、/cpus、/soc常用设备节点uart、i2c、spi、gpio、leds、keys必须掌握的属性核心属性compatible、reg、status、interrupts、#address-cells、#size-cells总线属性ranges、clock-frequency、spi-max-frequencyGPIO属性gpios、gpio-controller、#gpio-cells

相关文章:

【Linux驱动开发】第12天:Linux设备树核心:树形结构+节点+属性 完整全解

目录 设备树树形结构概述节点(Node)全解:命名规范标准节点常用设备节点属性(Property)全解:类型核心属性总线专用属性标签与节点引用:设备树复用的核心常见错误与注意事项总结:驱动…...

2026年亲测AI写作辅助软件指南(高效定稿版)

为解决学术写作中效率与合规两大核心痛点,本文精选8款高适配性AI论文写作工具(按综合优先级排序),围绕中文学术规范适配、真实参考文献生成、格式标准化、高性价比四大核心维度筛选,同时配套分场景精准选型方案与学术合…...

安全打底・能力拉满:我的 OpenClaw 龙虾生态 Skill 清单

2026开年AI圈两大热词:龙虾(OpenClaw)、Skill插件。龙虾是短期流量话题,热度来得快去得快;而Skill插件可一次部署、长期复用,真正落地到日常办公、协作、社交场景。 市面多数Skill推荐内容堆砌命令、实用性…...

HTML应用指南:利用GET请求获取智己汽车门店位置信息

智己汽车作为高端智能电动汽车品牌,深度融合先锋设计美学、纯电驱动技术、高阶智能驾驶与全场景出行服务,依托L7、LS7、LS6、L6等产品矩阵,打造兼具科技感与驾控乐趣的高端出行体验。在营销推广层面,智己摒弃传统4S店模式&#xf…...

2025大厂Java后端面试:RAG高频考点【干货】

根据近期(2025-2026年)牛客网上字节、腾讯、阿里、快手、京东等大厂的Java后端面经,RAG(检索增强生成)已高频结合传统Java八股进行考察。📚 面试问题分类与总结1. 🏗️ RAG 基础概念与理解这是面…...

传统FPM项目怎么渐进式迁移到Swoole/Hyperf?

传统 FPM 项目渐进式迁移到 Swoole / Hyperf 完整方案下面是一份实战派迁移指南,不搞理想化"重写",而是一边赚钱一边换引擎。---一、先讲清楚:为啥要迁?要迁到哪?1.1 FPM 的痛点- 每个请求都要重新加载框架(Laravel 启动 30~80ms,Hyperf 启动后 0ms)- 不能保持长连…...

从Java全栈开发到云原生:一次真实的面试对话与技术剖析

从Java全栈开发到云原生:一次真实的面试对话与技术剖析 面试场景回顾 在一次真实的互联网大厂Java全栈开发岗位的面试中,面试官和应聘者展开了一场围绕技术栈、项目经验和系统设计的深入交流。面试官以专业严谨的态度,逐步引导应聘者展示其技…...

pod创建

Pod 由一个或多个紧密耦合的容器组成,它们之间共享网络、存储等资源,Pod 是 Kubernetes 中最小的工作单元,Pod 中的容器会一起启动和停止。1.创建pod一个pod只有一个业务容器kubectl logs mypod 命令用于查看名为 mypod 的 Pod 中唯一容器的标…...

第 2 篇:Agent 的三种工作模式,选错了事倍功半

系列简介:从零搭建一个多 Agent AI 助手,覆盖原理、实现、部署全链路。不讲空话,每篇都有可运行的代码。 项目地址:https://github.com/CodeMomentYY/LangGraph-Agent 本篇目标:理解 Agent 的三种工作模式,…...

为什么92%的Midjourney水效渲染失败?——解析v6.1+版本流体折射权重、noise scale与--s值的黄金三角关系

更多请点击: https://codechina.net 第一章:为什么92%的Midjourney水效渲染失败?——问题现象与根本归因 大量用户在使用 Midjourney v6 生成「水效渲染」(Water Efficiency Rendering)类提示词时遭遇高频失败——表现…...

Shutter Encoder:构建高效媒体工作流的FFmpeg图形化解决方案

Shutter Encoder:构建高效媒体工作流的FFmpeg图形化解决方案 【免费下载链接】shutter-encoder A professional video compression tool accessible to all, mostly based on FFmpeg. 项目地址: https://gitcode.com/gh_mirrors/sh/shutter-encoder 在数字媒…...

AI正在重构工程师岗位:被替代的不是“人”,而是低维度能力

过去很多人认为,AI更适合写文案、做客服、生成图片,而真正复杂的工程领域——尤其是工业、制造、自动化系统——依然离不开工程师。 但最近一个劳动仲裁案例,让越来越多工程技术人员开始重新思考这个问题: 一位从事测绘工作15年的工程师,因为企业全面导入AI自动化测绘系…...

嵌入式C语言开发中的三大致命陷阱

很多人刚开始学习C语言时,会觉得: 会指针 会结构体 会寄存器操作 能驱动外设 似乎就已经掌握了嵌入式开发。 但真正进入项目后才会发现: 嵌入式开发最难的,从来不是语法,而是“代码与硬件现实世界之间的耦合”。 同样一句代码: 在PC上可能只是运行错误; 在单片机里却可…...

Midjourney V6调色板设置失效的5大隐性原因:从--sref误用到色域压缩陷阱,一文终结色彩失真

更多请点击: https://codechina.net 第一章:Midjourney V6调色板设置失效的全局认知 Midjourney V6 引入了更严格的色彩语义解析机制,导致此前在 V5.x 中广泛使用的 --palette 参数(如 --palette vibrant 或 --palette muted&…...

SQL 数据库从免费到付费选型实战:支撑真实规模产品的能力分析与选择指南

引言:为什么 SQL 数据库选型如此重要? 在当今数据驱动的时代,数据库是任何数字产品的核心基础设施。无论是初创公司的 MVP(最小可行产品),还是日活百万的成熟应用,数据库的选择直接影响着产品的性能、成本、可扩展性和开发效率。 对于技术决策者而言,面对琳琅满目的 …...

【小白快速上手】Windows 系统 OpenClaw v2.7.5 一键部署完整教程(包含安装包)

OpenClaw 一键安装完整教程(2026 最新) 适配系统:Windows10/11 64 位当前版本:v2.7.5(虾壳云版)文件大小:约 58.7MB下载地址:https://xiake.yun/api/download/package/16?promoCod…...

SQL 能包打天下吗?多少比例的产品只需 SQL,何时需要引入其他存储?

引言 在数据驱动的时代,SQL(结构化查询语言)作为关系型数据库的标准查询语言,其地位无可撼动。它以其强大的数据操作能力、清晰的声明式语法和广泛的生态支持,成为绝大多数应用开发者的首选。然而,随着业务场景的日益复杂和数据形态的多样化,一个灵魂拷问随之而来:SQL…...

498元!某国产12代i7云终端小钢炮,仅1.7L迷你主机,可上i7-12700处理器,最大支持双M2+SATA三盘位,可惜还是准系统传家宝!

要说小主机品牌种类规格方面,最为丰富的不是个人家用消费级市场,而是云终端,痩客户机类型产品。奈何如今大环境不景气,再叠加如今处理器性能进步明显,以英特尔12代平台为例,如今依旧还是主流,所…...

实际开发中 SQL 与产品的耦合与互动实践

引言 在产品开发初期,数据库 Schema(表结构)的设计是一个绕不开的核心问题。很多开发者,尤其是新手,常常会陷入一个两难境地:“Schema 需要一开始就完全确定好吗?如果后期要改动怎么办?到底要设计多少个表(Schema 数量)才算合适?” 这些问题背后,反映的是对软件工…...

MDK Middleware网络组件的嵌入式安全防护解析

1. MDK Middleware网络组件的安全特性解析在嵌入式系统开发中,网络安全往往是最容易被忽视却又至关重要的环节。作为Keil MDK开发环境的核心组件,Middleware Network为Cortex-M系列微控制器提供了轻量级TCP/IP协议栈实现。不同于桌面级操作系统自带的网络…...

量子计算中的SWAP门原理与应用解析

1. 量子计算中的SWAP门基础原理量子计算区别于经典计算的核心在于量子比特(qubit)的叠加态和纠缠态特性。在量子线路设计中,SWAP门作为基础量子逻辑门之一,扮演着量子信息交换的关键角色。与经典计算中的位交换不同,量…...

HarmonyOS 鸿蒙PC平台三方库移植:使用 vcpkg 移植 libzen(ZenLib)

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...

Agent大战,赢家暗自在哪下功夫?

(一)日子都不好过OpenAI和Anthropic在release note节奏上,证明了一件事:他们有实力两周抬一次模型能力线。其威力,足以消灭掉一批创业公司。这事不展开,共识。在这一波里,别说小公司&#xff0c…...

Keil C166嵌入式开发中的宽字符实现与优化

1. 宽字符支持问题解析在嵌入式C语言开发中,Unicode支持是一个常见需求。最近我在使用Keil C166开发工具时遇到了一个关于宽字符(wchar_t)定义的有趣问题。打开标准库头文件stdlib.h时,发现其中对wchar_t的定义如下:#ifndef _WCHAR_T_DEFINED…...

原来训大模型,就像开一家小餐馆!

你是不是一直觉得,训练大语言模型是 OpenAI、百度这种大厂才能干的事?要几万张显卡,要花几个亿,普通人想都不敢想? 错了!我用自己开发机上的 8 张 H20 显卡,花了点时间,从零开始训了…...

Windows电脑自带软件全部无法使用?亲测有效的解决办法!

Windows电脑自带软件全部无法使用?亲测有效的解决办法! 最近在使用电脑的时候,我突然遇到了一个非常离谱的问题: Windows 系统自带的软件几乎全部无法正常打开! 包括但不限于: 计算器相机录音机截屏工具画图…...

Meta裁了8000人,员工拖着行李箱抢可乐

昨天凌晨4点,Meta很多员工的邮箱同时响了。是裁员邮件。这一次,Meta裁掉了全球约10%的员工,规模大约8000人。分手大礼包:16周基础薪资 每满1年工龄额外2周薪资 18个月全家医保。真正让硅谷炸锅的,反而是裁员前几天&a…...

Python、BMA-Stacking融合LightGBM、GBDT、KNN多模型电商交易欺诈风险预警研究|附代码数据

全文链接:https://tecdat.cn/?p45916原文出处:拓端数据部落公众号封面:关于分析师在此对 Haoyang Ke 对本文所作的贡献表示诚挚感谢。他在浙江财经大学完成了数理统计专业的学习,专注机器学习、数据采集领域。他擅长 Python、R 语…...

AI赋能 绿色未来 —— 华硕重磅亮相第二十八届海峡两岸经贸交易会

当AI浪潮席卷全球,绿色低碳成为时代共识,一场汇聚两岸智慧、共探产业新机的盛会如约而至。5月21日第二十八届海峡两岸经贸交易会于福州海峡会展中心盛大启幕。这场由国务院台办、福建省人民政府联合主办的国家级盛会,深耕两岸经贸交流多年&am…...

WxJava 微信开发包 - 新手入门指南

WxJava 微信开发包 - 新手入门指南项目概览项目名称Binary Wang/WxJavaStarsGVP ⭐⭐⭐⭐⭐组织Binary Wang语言Java标签GVP, Java, 微信开发, 微信公众号, 微信支付项目简介WxJava 是一个基于 Java 的微信开发工具包,支持微信公众号、微信支付、小程序、企业微信等…...