Linux 总线、设备、驱动模型的探究,以及设备树的由来(2/2)

Linux Driver | 设备树开发之初识设备树 开发固件设备树可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况。设备树信息被保存在一个ASCII文本文件中,适合人类的阅读习惯,类似于xml文件,在ARM Linux中,一个.dts文件对应一个ARM的machine放置在内核的目录设备树是一种数据结构,用于描述设备信息的语言,具体而言,是用于操作系统中描述硬件,使得不需要对设备的信息进行硬编码由一系列被命名的结点(node。 阅读详情

Linux 设备树(DTS)的深入理解

设备树的出现

上一节说过设备树的出现是为了解决内核中大量的板级文件代码,通过 DTS 可以像应用程序里的 XML 语言一样很方便的对硬件信息进行配置。关于设备树的出现其实在 2005 年时候就已经在 PowerPC Linux 里出现了,由于 DTS 的方便性,慢慢地被广泛应用到 ARM、MIPS、X86 等架构上。为了理解设备树的出现的好处,先来看下在使用设备树之前是采用什么方式的。

关于硬件的描述信息之前一般放在一个个类似 arch/xxx/mach-xxx/board-xxx.c 的文件中,如:

static struct resource gitchat_resource[] = {
    {
        .start = 0x20100000 ,
        .end = 0x20100000 +1,
        .flags = IORESOURCE_MEM 
        …
        .start = IRQ_PF IRQ_PF 15 ,
        .end = IRQ_PF IRQ_PF 15 ,
        .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE
    }
};

static struct platform_device gitchat_device = {
    .name name ="gitchat",
    .id = 0,
    .num_resources num_resources = ARRAY_SIZE(gitchat_resource),
    .resource = gitchat_resource,
};

static struct platform_device *ip0x_devices[] __initdata ={
    &gitchat_device,
};

static int __init ip0x_init(void)
{
    platform_add_devices(ip0x_devices, ARRAY_SIZE(ip0x_devices)); 
}

一个很少的地址获取,我们就要写大量的类似代码,当年 Linus 看到内核里有大量的类似代码,很是生气并且在 Linux 邮件列表里发了份邮件,才有了现在的设备树概念,至于设备树的出现到底带来了哪些好处,先看一下设备树的文件:

eth:eth@ 4,c00000 {
    compatible ="csdn, gitchat";
    reg =<
        4 0x00c00000 0x2
        4 0x00c00002 0x2
    >;
    interrupt-parent =<&gpio 2>;
    interrupts=<14 IRQ_TYPE_LEVEL_LOW>;
    …
};

从代码中可看到对于 GITCHAT 这个网卡驱动、一些寄存器、中断号和上一层 gpio 节点都很清晰的被描述。比上一图的代码优化了很多,也容易维护了很多。这样就形成了设备在脚本,驱动在 c 文件里的关系图:

从图中可以看出 A、B、C 三个板子里都含有 GITCHAT 设备树文件,这样对于 GITCHAT 驱动写一份就可以在 A、B、C 三个板子里共用。从上幅图里不难看出,其实设备树的出现在软件模型上相对于之前并没有太大的改变,设备树的出现主要在设备维护上有了更上一层楼的提高,此外在内核编译上使内核更精简,镜像更小。

 

设备树的文件结构和剖析

设备树和设备树之间到底是什么关系,有着哪些依赖和联系,先看下设备树之间的关系图:

除了设备树(DTS)外,还存有 dtsi 文件,就像代码里的头文件一样,是不同设备树共有的设备文件,这不难理解,但是值得注意的是如果 dts 和 dtsi 里都对某个属性进行定义的话,底层覆盖上层的属性定义。这样的好处是什么呢?假如你要做一块电路板,电路板里有很多模块是已经存在的,这样就可以直接像包含头文件一样把共性的 dtsi 文件包含进来,大大减少工作量,后期也可以对类似模块再次利用。

设备树文件的格式是 dts,包含的头文件格式是 dtsi,dts 文件是一种程序员可以看懂的格式,但是 Uboot 和 Linux 只能识别二进制文件,不能直接识别。所以就需要把 dts 文件编译成 dtb 文件。把 dts 编译成 dtb 文件的工具是 dtc,位于内核目录下 scripts/dtc,也可以手动安装:sudo apt-get install device-tree-compiler 工具。具体 dts 是如何转换成机器码并在内存里供 kernel 识别的,请看下图:

 

设备树的应用

有了理论,在具体的工程里如何做设备树呢?这里介绍三大法宝:文档、脚本、代码。文档是对各种 node 的描述,位于内核 documentation/devicetree/bingdings/arm/ 下,脚本就是设备树 dts,代码就是你要写的设备代码,一般位于 arch/arm/ 下,以后在写设备的时候可以用这种方法,绝对的事半功倍。很多上层应用开发者没有做过内核开发的经验,对内核一直觉得很神秘,其实可以换一种思路来看内核,相信上层应用开发者最熟悉的就是各种 API,工作中可以说就是和 API 打交道,对于内核也可以想象是各种 API,只不过是内核态的 API。这里设备文件就是根据各种内核态的 API 来调用设备树里的板级信息:

  • struct device_node *of_find_node_by_phandle(phandle handle);

  • struct device_node *of_get_parent(const struct device_node_ *node);

  • of_get_child_count()

  • of_property_read_u32_array()

  • of_property_read_u64()

  • of_property_read_string()

  • of_property_read_string_array()

  • of_property_read_bool()

具体的用法这里不做进一步的解释,大家可以查询资料或者看官网解释。

这里对设备树做个总结,设备树可以总结为三大作用:一是平台标识,所谓平台标识就是板级识别,让内核知道当前使用的是哪个开发板,这里识别的方式是根据 root 节点下的 compatible 字段来匹配。二是运行时配置,就是在内核启动的时候 ramdisk 的配置,比如 bootargs 的配置,ramdisk 的起始和结束地址。三是设备信息集合,这也是最重要的信息,集合了各种设备控制器,接下来的实践课会对这一作用重点应用。这里有张图对大家理解设备树作用有一定的帮助:

 

本文转自https://mp.weixin.qq.com/s/BIWfHTg2VbGj7jJBPQaQUg

韦东山嵌入式linux系列-驱动进化之路:总线设备驱动模型 应用程序调用open等函数最简单的方法是驱动层也提供对应的drv_open,应用程序调用read,驱动层也提供对应的drv_read等等。需要写出驱动层的函数,为了便于管理,将这些函数放到file_operations结构体中,即第一步定义对应的file_operations结构体,并实现对应的open等程序(第一步);实现完成之后,将file_operations结构体通过register_chrdev注册到内核(第二步);然后通过入口函数调用注册函数(chrdev),安装驱动程序的时候,内核会调用入口函 阅读详情

相关推荐

Python + Google AI 自动修复 Sonar Bug 实践

在工作中总会遇到种种不期而至的需求,比如前段时间突然要修复所有 Sonar Bug,涉及各种琐碎的代码风格问题,包括但不限于语法不规范、废弃注释等问题。这些项目都已经持续开发几年了,Sonar 上的问题层出不穷,各种问题已经累积到了上万个,手动修复不但费时费力,而且过程异常枯燥。

子洋 Blog 2416

Linux DTS介绍

在linux内核源码的3.1版本之前,linux内核都是通过大量的platfrom-device文件来描述板级配置信息,这使得内核人员维护很困难,因此设备树(Device Tree)被采用

QQ135102692的博客 6624

2024年上市公司ESG评级全解析:六大权威数据源横向对比与应用指南

本文深度解析2024年国内主流ESG评级数据源,包括华证、商道融绿、Wind、富时罗素和彭博,横向对比其覆盖范围、评分逻辑与应用侧重点。文章提供实战指南,帮助投资者与企业根据投资决策、风险管理和学术研究等不同场景,精准选择并有效应用ESG数据,实现从概念到实用分析工具的转变。

weixin_29229055的博客 312

[linux] Linux dts、dtsi、dtc、dtb整理

dts文件是一种ASCII文本格式的设备树描述文件,此文件适合人类阅读主要是给用户看的。一个dts文件对应一个ARM的设备,一般放置在arch/arm/boot/dts/中。

wgl307293845的博客 1838

CTF密码学奇技淫巧:当Base64遇到ROT13与Atbash

本文深入解析CTF竞赛中Base64、ROT13与Atbash的复合编码技术,提供Python实现与CyberChef可视化处理方案,帮助选手掌握密码学题目的解题技巧。通过NewStarCTF2025实战案例,对比脚本化与可视化工具的优劣,提升Web安全竞赛中的编码处理能力。

weixin_29001683的博客 509

记录思科cisco交换机升级iso步骤

Cisco Nexus 93180交换机版本升级

a635161812的博客 4378

linux设备树dts文件详解

1)注释用/**/,注意#开头的不是注释(2)分号是段落块之间的分隔符,{}和[]和是段落块的封装符号,和C语言语言类似(3)/dts-v1/节点,表示dts的版本号,目前都是v1(4)/{}是根节点rootnode,理论上只应该有一个根节点,有说法dtc会合并所有rootnode为同一个(5)dts是树状的多节点组织,基本单元是node,除root外其他node都有parent,还可以有child[label......};chosen{115200n8";};.........

weixin_42031299的博客 1万+

深入解析Linux Suspend/Resume机制——从用户态到内核态的完整流程

本文深入解析Linux Suspend/Resume机制,从用户态触发到内核态执行的完整流程。详细介绍了三种挂起模式(Freeze、Standby、Suspend to RAM)的实现原理,包括系统调用入口、状态验证、设备挂起流程及平台相关操作。同时提供实战调试技巧,帮助开发者解决电源管理中的常见问题。

weixin_29313239的博客 444

嵌入式 Linux 设备树(DTS)完全指南:从入门到踩坑排错

设备树(DTS)是Linux内核中用于描述硬件信息的结构化文本格式,解决了传统硬编码方式导致的内核臃肿问题。其工作流程包括:编写DTS源文件、DTC编译为二进制DTB、U-Boot加载、内核解析四个阶段。核心语法包含节点(Node)、属性(Property)和phandle引用机制,驱动通过compatible匹配机制与设备树节点关联。文章详细介绍了DTS语法要点、驱动使用OF API的方法,并总结了常见问题排查流程,包括probe未调用、节点覆盖、reg解析异常等典型问题的解决方法。最后通过RK3568添

米联客(milianke) 1668

深入Android构建系统:一次修改ro.vendor.build.fingerprint失败的排查与解决记录

本文深入探讨了Android构建系统中修改ro.vendor.build.fingerprint的完整解决方案。通过分析vendor分区的特殊地位和构建指纹的生成路径,提供了三种实战修改方法,并揭示了指纹修改可能遇到的陷阱与对策,帮助开发者彻底解决这一常见问题。

weixin_30621711的博客 144

win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结

之前安装过一次VMware虚拟机,后来由于某些已遗忘原因把它卸载了,但是没有卸载完全,为以后安装留下了一些麻烦,现在根据我google很多内容总结后写下了自己的解决办法。 一些我搜的的可以用的VM12的注册码 5A02H-AU243-TZJ49-GTC7K-3C61N ZZ510-DYX47-48ERP-D6XZG-YCKU2 YV5MU-2FX5H-M841P-LZX5X-PYHX8

Jeason的博客 2万+

Linux 设备树中的dtc dts/dtsi dtb的关系梳理:

dtc工具的源代码在内核根目录下的/scripts/dtc文件夹中,在对应的Makefile中可以看到内核将跟dtc有关的文件都进行编译,最后生成一个可执行程序。dtb是由dts/dtsi被编译后生成的二进制文件,dtb文件是可以被内核解析的文件,所以dtb文件会被烧到系统中,由uboot指定dtb的地址供内核去读取。dtc是用来编译设备树的工具,就像gcc可以用来编译C语言一样,设备树源文件也需要编译器来对它进行编译,而这个编译器就是dtc。:用来编译设备树的工具。是设备树的源文件,驱动。

m0_66064778的博客 1395

48-OpenCVSharp —-Cv2.MatchTemplate() 函数功能(模板匹配)详解

是 OpenCV 中一个常见且简单的模板匹配算法,适用于目标检测和图像识别中的静态场景。它的优点是易于理解和实现,但在面对旋转、尺度变化、复杂背景或光照变化等挑战时,效果可能大打折扣。在这些情况下,结合多尺度图像、特征匹配算法(如 SIFT、SURF、ORB 等)以及深度学习模型可以显著提高匹配的鲁棒性和精度。模板匹配仍然是一个非常基础但强大的工具,适用于一些简单的图像匹配任务。对于更加复杂和动态的图像识别任务,我们通常会使用其他更加复杂的算法或者深度学习模型来处理。

weixin_45590420的博客 4523

Linux 总线、设备、驱动模型的探究,以及设备树的由来(1/2)

Linux 总线、设备、驱动模型的探究 设备驱动模型的需求 总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。举个例子,充电墙壁插座安静的嵌入在墙面上,无论设备是电脑还是手机,插座都能依然不动的完成它的使命——充电,没有说为了满足各种设备充电而去更换插座的。其实这就是软件工程强调的高内聚、低耦合概念。 所谓高内聚低耦合是模块内各元素联系越紧密就代表内聚性就越高,模...

CAESAR的专栏 608

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

底层软件 | Linux 总线、设备、驱动模型的探究

在Linux内核中,驱动和设备信息是分开的,中间通过总线(bus)来连接,做到了分层、分离的设计思想。内核既有虚拟的总线,也有实际的总线,比如i2c,spi,usb,pcie等,这一篇我先来探讨这三者之间的关系。

hydyxf的博客 1797

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux驱动学习—设备树及设备树下的platform总线

设备树是一种描述硬件资源的数据结构。他通过bootloader将硬件资源传给内核,使得内核和硬件资源 描述相对独立。 cd /proc/device-tree/下就可看到 cd /sys/firmware/devicetree/base/下就可看到。

suifen_的博客 2904

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

设备树与 Linux 内核设备驱动模型的整合

本章主要讲解:在 Linux 内核中,设备树(Device Tree)通过将硬件描述信息从内核代码中分离出来,简化了平台设备的管理。通过解析设备树中的设备节点,内核生成相应的结构,并使用函数如将这些设备节点注册为平台设备(),挂载到总线的设备链表上。总线机制会根据设备的属性匹配驱动程序,并调用驱动的probe函数对设备进行管理。与此相对,早期的设备管理依赖静态表格,而设备树则提供了动态方式,不再依赖硬编码。注:以下的代码皆摘自于linux 4.9.88版本的内核源码,不同版本可能有所出入。

caiji0169的博客 2576

​Linux总线-设备-驱动模型​

在Linux内核中,​总线-设备-驱动模型​(Bus-Device-Driver Model)是一种核心的设备管理机制,用于解耦硬件设备(Device)与驱动程序(Driver),通过总线(Bus)作为中介实现动态匹配。这种模型使得设备发现、驱动加载和资源管理更加灵活,尤其适应热插拔和多硬件平台场景。

浩瀚之水的专栏 1352

深入探究 Linux 设备树

Linux设备树机制是为了解决ARM架构硬件碎片化问题而引入的。早期ARM Linux采用board file模式,导致内核代码臃肿、维护困难。设备树通过将硬件描述从源码中剥离,使用.dts文本文件描述硬件结构,编译成.dtb二进制文件传给内核。这种分层机制类似面向对象编程,SOC级.dtsi文件描述芯片固有资源,板级.dts文件继承并修改特定配置。设备树显著减少了代码重复,使一个内核能支持多种硬件,提高了可维护性。典型实现如NXP i.MX6ULL,通过包含和引用机制实现硬件描述的继承与重写。

分享一些嵌入式Linux相关知识 1240

Linux总线设备驱动模型深度理解

物理上的总线是一堆电路线路连线(比如I2C总线、SPI总线、USB总线等等),软件上用来描述控制器与外设的连接关系,内核使用Bus结构体来描述这种连接关系,本质上总线Bus只是一个数据结构,它的名字用对应通信接口命名罢了,而一些驱动程序没有实际对应的通信接口(比如GPIO),那就用platform来命名吧,我们冠名为虚拟的总线!2、接下来看总线设备驱动模型和各类子系统(以platform设备驱动为例子,platform可以理解为通用简单的总线设备驱动的实现之一)的实现细节;2、总线设备驱动 的含义?

STCNXPARM的博客 1277

Linux驱动学习之平台总线&设备树驱动模型

在总线上驱动和设备的名字匹配的时候,就会调用驱动的probe函数,其主要目的就是初始化驱动程序并且注册设备,使得能够与内核和其他驱动程序进行交互int err;/* 设备树中定义有: sr501-gpios=<...>;*//*该行代码的作用:从设备树中获取与 pdev 关联的设备上的 "sr501" GPIO 线。&pdev->dev: 指向 struct device 结构体的指针,这个结构体描述了一个设备。

Lllongroad的博客 1834

Linux 设备树学习——基于i2c总线分析

本文基于i2c总线,简述了设备树的使用方式

multimicro的博客 2537

Linux 总线、设备、驱动模型的探究

设备驱动模型的需求总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。举个例子,充电墙壁插座安静的嵌入在墙面上,无论设备是电脑还是手机,插座都能...

Peter的专栏 1002

Linux 设备树

要想了解为什么会有设备树, 设备树是怎么来的, 我们就要先来回顾一下在没有设备树之前我们是怎么来写一个驱动程序的。 以字符设备驱动代码框架为例, 我们一起来回顾下。

yangxueyangxue的博客 3424
上一篇: Linux 总线、设备、驱动模型的探究,以及设备树的由来(1/2)
下一篇: Linux 文件系统基础
东晋偏安
博客等级 码龄18年 939粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值