尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Linux系统-设备树介绍(四)
什么是设备树三种文件格式设备树工作原理与核心机制设备树数据流架构设备树核心数据结构设备树与驱动匹配机制DTS 语法基础节点定义关键属性详解数据类型引用其他节点Phandle编写一个简单的 LED 驱动设备树编译设备树调试技巧如何查看运行时设备树常用命令查看完整设备树结构‌查看某个属性的值‌查看特定设备节点‌使用 dtc 工具反编译 DTB‌什么是设备树设备树Device Tree是一种描述硬件配置的数据结构它采用树状结构以文本形式描述系统硬件资源包括CPU、内存、总线、外设等。设备树的核心思想是将硬件描述与操作系统内核分离使得同一内核 镜像 能够支持不同的硬件平台。三种文件格式设备树Device Tree主要包含三种文件格式每种格式在开发流程中扮演不同的角色后缀名称说明.dtsDevice Tree Source人类可读的文本源文件采用类似 C 语言的语法结构。每个开发板通常对应一个独立的 .dts 文件用于描述该板卡的硬件配置。.dtsiDevice Tree Source Include设备树头文件用于定义 SoC系统级芯片的通用配置或公共模块。多个 .dts 文件可以引用同一个 .dtsi 文件实现代码复用。.dtbDevice Tree Blob编译后的二进制文件由 .dts 文件通过设备树编译器DTC生成。Bootloader 将其加载到内存中并传递给 Linux 内核使用。这三种文件构成了设备树从源码编写到最终使用的完整流程。设备树工作原理与核心机制设备树数据流架构设备树核心数据结构// 内核中设备树核心数据结构structdevice_node{constchar*name;// 节点名称constchar*type;// 设备类型phandle phandle;// 节点句柄constchar*full_name;// 节点全路径名structproperty*properties;// 属性链表structdevice_node*parent;// 父节点structdevice_node*child;// 子节点structdevice_node*sibling;// 兄弟节点structkobjectkobj;// kobject用于sysfsunsignedlong_flags;// 内部标志位void*data;// 设备私有数据};structproperty{char*name;// 属性名称intlength;// 属性值长度void*value;// 属性值指针structproperty*next;// 下一个属性unsignedlong_flags;// 内部标志位unsignedintunique_id;// 唯一ID};设备树与驱动匹配机制设备树通过compatible属性实现与驱动的匹配// 设备树中的定义mydevice0x10000000{compatiblevendor,device-model,generic-driver;reg0x100000000x1000;interrupts0254;};// 驱动中的匹配表staticconststructof_device_idmy_driver_match[]{{.compatiblevendor,device-model},{.compatiblegeneric-driver},{}};MODULE_DEVICE_TABLE(of,my_driver_match);// 平台驱动结构staticstructplatform_drivermy_driver{.probemy_probe,.removemy_remove,.driver{.namemy-device,.of_match_tablemy_driver_match,},};DTS 语法基础节点定义dts /node-nameaddress{propertyvalue;};node-name节点名称通常反映设备功能如 serial, i2c。address可选表示该设备在父总线上的基地址。{ … }花括号内包含属性和子节点。关键属性详解属性说明示例‌compatible‌驱动匹配标识“rockchip,rk3568-pcie”, “snps,dw-pcie”‌reg‌寄存器地址/大小0x40000000 0x1000 (地址, 长度)‌interrupts‌中断描述GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH‌clocks‌时钟引用clk_core, clk_bus‌gpios‌GPIO 引用gpio1 5 GPIO_ACTIVE_HIGH‌status‌启用状态“okay” (启用), “disabled” (禁用)‌pinctrl-0‌引脚复用配置uart0_pins数据类型单元格Cells‌用 包裹的 32 位整数。reg 0x1000 0x100;字符串‌用 包裹。compatible “my-device”;字节数组‌用 [ ] 包裹十六进制。local-mac-address [00 11 22 33 44 55];字符串列表‌compatible “a,b”, “c,d”;引用其他节点Phandle使用 label 引用其他节点常用于引脚配置pinctrl、时钟、GPIO。pinctrl-0uart0_pins;// 引用名为 uart0_pins 的节点 clocksclk_uart0;// 引用时钟节点编写一个简单的 LED 驱动设备树通常在 arch/arm64/boot/dts/rockchip/rk3568-your-board.dts 中添加/dts-v1/;#include rk3568.dtsi // 包含 SoC 基础定义/{modelMy RK3568 Board;compatiblemyvendor,rk3568-board,rockchip,rk3568;/*1. 定义 GPIO LED 节点 */ gpio-leds{compatiblegpio-leds;// 使用内核自带的 gpio-leds 驱动 led-user{labeluser-led;gpiosgpio3 RK_PD2 GPIO_ACTIVE_HIGH;// 引用 GPIO3 控制器 linux,default-triggerheartbeat;// 默认心跳闪烁};};};/*2. 如果需要自定义引脚复用Pinctrl通常在pinctrl 节点下添加 */pinctrl{vcc3v3_pcie3: vcc3v3-pcie3-regulator{rockchip,pins3RK_PD2 RK_FUNC_GPIOpcfg_pull_none;};};编译设备树在内核源码根目录执行makeARCHarm64CROSS_COMPILEaarch64-linux-gnu- rk3568-your-board.dtb生成的 rk3568-your-board.dtb 即为最终文件。调试技巧如何查看运行时设备树Linux 启动后会将解析后的设备树暴露在 ‌/proc/device-tree/‌ 目录下。这是调试的神器。常用命令查看完整设备树结构‌ls/proc/device-tree/# 你会看到 chosen,memory,soc,aliases 等目录查看某个属性的值‌# 查看内核命令行参数 cat/proc/device-tree/chosen/bootargs # 查看根节点的 compatible cat/proc/device-tree/compatible查看特定设备节点‌# 假设你的 LED 节点路径是/gpio-leds/led-user cat/proc/device-tree/gpio-leds/led-user/gpios # 注意二进制数据直接 cat 可能乱码可用 hexdump hexdump-C/proc/device-tree/gpio-leds/led-user/gpios使用 dtc 工具反编译 DTB‌如果你只有 .dtb 文件想看看里面写了什么dtc-I dtb-O dts-o output.dts input.dtb
RELATED

相关推荐

北斗芯片换代:从基础定位到高精度时空信息服务的核心技术跃迁

北斗芯片换代:从基础定位到高精度时空信息服务的核心技术跃迁

1. 从“能用”到“好用”:北斗芯片换代的深层逻辑最近业内都在讨论一个消息,新一代北斗卫星已经全面换上了新一代的国产芯片。这个消息听起来可能有点技术化,但它的影响其实离我们每个人的生活都很近。简单来说,这就像是给天上的“…

📅 2026/10/11 16:40:53
STM32H743文件系统实战:从FATFS到LittleFS的嵌入式存储方案

STM32H743文件系统实战:从FATFS到LittleFS的嵌入式存储方案

1. 从裸机到“有盘”系统:为什么要在STM32H743上引入文件系统?如果你是从51、STM32F1这类单片机一路玩过来的开发者,第一次看到“在STM32上跑文件系统”这个需求,可能会觉得有点“杀鸡用牛刀”。毕竟,传统单片机开发里…

📅 2026/9/7 6:28:37
基于ESP32的低成本模块化机器人开发平台Pedro Robot设计与实现

基于ESP32的低成本模块化机器人开发平台Pedro Robot设计与实现

1. 项目概述:Pedro Robot是什么? 最近在和一些做智能硬件和机器人开发的朋友聊天时,大家不约而同地提到了一个名字:“Pedro Robot”。这听起来像是一个具体的机器人项目,但网上能找到的公开资料却非常零散,…

📅 2026/9/29 1:26:59
MORE NEWS

更多资讯

📰

AI原生应用API编排层高可用:超时、重试、幂等与降级实战

先说个背景。去年我在维护一个智能客服系统时,发现生产环境的故障有一大半不是模型幻觉,也不是底层模型服务宕机,而是API编排层在压力下先撑不住了。一次简单的多轮对话会依次触发意图识别、知识库检索、工具调用、大模型生成,中间…

📰

Unity相机与刚体物理实战:跟随、碰撞与抖动排查指南

不用从“Unity是什么”讲起,直接进入正题。相机和刚体这两个模块,是Unity项目里最容易“看起来没问题、一跑就翻车”的地方。相机决定了玩家看到什么,刚体决定了物体怎么动,而两者一旦组合起来——比如第三人称角色、物理载具、可…

📰

Unity相机与刚体系统核心要点与实战调优指南

1. 项目概览:为什么相机和刚体是Unity开发的“地基” 这两年我带过不少新人,也帮团队review过好几次项目代码,发现一个有意思的现象:很多朋友能熟练地拖拽预制体、写UI逻辑、调Shader,但一碰到相机跟随抖动、物体碰撞穿…

📰

Mac Agent 实时控制接线指南:laya-mlx 让端侧响应快到没感知

Mac Agent 实时控制接线指南:laya-mlx 让端侧响应快到没感知 【免费下载链接】laya-mlx Native MLX runtime for Laya typed decision models — 7–14 ms short decisions on M3 Max. No text generation, PyTorch, or cloud API. 项目地址: https://gitcode.com…

📰

无服务器MLOps实战:从数据集工程到PyTorch分布式训练

简介:《MLOps工程化实践》是一本面向具备一定机器学习基础的工程师与数据科学家的PDF电子书,聚焦大规模机器学习系统的工程化落地。全书围绕MLOps核心原则与无服务器架构的融合展开,系统讲解从数据准备、模型训练到部署监控的全流程自动化&am…

📰

MQTT在工业物联网中的四大不适场景与选型框架

1. 为什么我要给MQTT泼一盆冷水三年前,我第一次把MQTT协议部署到一条真实的产线环境里。当时团队里几乎所有人都觉得这是“天选方案”——轻量、发布订阅、支持断线重连、社区生态成熟,怎么看都像是为工业物联网量身定做的。那会儿我们刚把一条老旧的装配…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬