linux设备驱动模型:设备树

news2024/12/23 11:41:54

设备树诞生背景:硬件设备中种类逐年递增,板级platform平台设备文件越来越多。

设备树由根节点开始,可以包含若干个子节点;每个子节点又可以包含若干个子节点

DTS(device tree source):设备树源文件,ASCII格式。

DTC(device tree compiler):设备树编译工具,将dts文件编译成dtb文件。

DTB(device tree blob):二进制设备树。

设备树使用:uboot负责加载dtb文件到内存的特定位置,内核在启动时从这个位置获取dtb文件并解析使用。

野火imx 6ull的pro开发板的设备树源文件dts存放在内核/arch/arm/boot/dts/imx6ull-mmc-npi.dts。  

设备树编译工具(内核主目录下执行)

内核编译

#进行内核配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig

#编译dts
make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs

手动编译

#编译dts为dtb
./scripts/dtc/dtc -I dts -O dtb -o xxx.dtb arch/arm/boot/dts/xxx.dts

#反编译dtb为dts
./scripts/dtc/dtc -I dtb -O dts -o xxx.dts arch/arm/boot/dts/xxx.dtb

#-I:指定输入格式
#-O:指定输出格式
#-o:指定输出文件

设备树框架

从上到下

头文件

#include <dt-bindings/input/input.h>
#include "imx6ull.dtsi"

主体

注意,.dtsi文件中也有/根节点。经过内核解析后会和主题的根节点合并。

/ {
        model = "Embedfire i.MX6ULL Board";
        compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";

        aliases {
                pwm0 = &pwm1;
                pwm1 = &pwm2;
                pwm2 = &pwm3;
                pwm3 = &pwm4;
        };
        chosen {
                stdout-path = &uart1;
        };

        memory {
                reg = <0x80000000 0x20000000>;
        };

        reserved-memory {
                #address-cells = <1>;
                #size-cells = <1>;
                ranges;

                linux,cma {
                        compatible = "shared-dma-pool";
                        reusable;
                        size = <0x14000000>;
                        linux,cma-default;
                };
        };

        regulators {
                compatible = "simple-bus";
                #address-cells = <1>;
                #size-cells = <0>;

				reg_sd1_vmmc: regulator@1 {
                        compatible = "regulator-fixed";
                        regulator-name = "VSD_3V3";
                        regulator-min-microvolt = <3300000>;
                        regulator-max-microvolt = <3300000>;
                        gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
                        off-on-delay = <20000>;
                        enable-active-high;
                };
/*
                reg_gpio_dvfs: regulator-gpio {
                        compatible = "regulator-gpio";
                        pinctrl-names = "default";
                        pinctrl-0 = <&pinctrl_dvfs>;
                        regulator-min-microvolt = <1300000>;
                        regulator-max-microvolt = <1400000>;
                        regulator-name = "gpio_dvfs";
                        regulator-type = "voltage";
                        gpios = <&gpio5 3 GPIO_ACTIVE_HIGH>;
                        states = <1300000 0x1 1400000 0x0>;
                };
*/
        };

        leds {
                compatible = "gpio-leds";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_led>;
				
				led0: cpu {
                        label = "cpu";
                        gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;
                        default-state = "on";
                        linux,default-trigger = "heartbeat";
                };
        };


        /* External sound card */
        sound: sound {
                                status = "disabled";
        };

        spi4: 74hc595 {
                compatible = "spi-gpio";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_spi4>;
                pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
                status = "disabled";
                gpio-sck = <&gpio5 11 0>;
                gpio-mosi = <&gpio5 10 0>;
                cs-gpios = <&gpio5 7 0>;
                num-chipselects = <1>;
                #address-cells = <1>;
                #size-cells = <0>;

                gpio_spi: gpio_spi@0 {
                        compatible = "fairchild,74hc595";
                        gpio-controller;
                        #gpio-cells = <2>;
                        reg = <0>;
                        registers-number = <1>;
                        registers-default = /bits/ 8 <0x57>;
                        spi-max-frequency = <100000>;
                };
        };
};
//截取部分

多个根节点合并。

根节点下包含多个子节点。

子节点追加内容

若要对某个节点A追加内容,只需增设&A节点即可,&A节点内容就是要追加的内容。A是节点标签,而且追加节点要放在根节点的外面。

&cpu0 {
        /*dc-supply = <&reg_gpio_dvfs>;*/
        clock-frequency = <800000000>;
};

&clks {
        assigned-clocks = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;
        assigned-clock-rates = <786432000>;
};


&fec1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet1>;
        phy-mode = "rmii";
        phy-handle = <&ethphy0>;
        status = "okay";
};
...

节点命令

基本方法

node-name@unit-address{

属性1 = …

属性2 = …

属性3= …

子节点…

}
node-name:指定节点的名称

unit-address:用于指定“单元地址”

节点标签

cpu0: cpu@0 {
    compatible = "arm,cortex-a7";
    device_type = "cpu";
    reg = <0>;
}
cpu0:标签,为节点名称起一个别名。

在追加节点、引用节点时,都要使用该节点的标签。

别名子节点

    aliases {
    can0 = &flexcan1;
    can1 = &flexcan2;
    ethernet0 = &fec1;
    ethernet1 = &fec2;
    ...
}

与节点标签不同的是:别名子节点可以批量地为若干个节点规定别名。

从外到内

常见通用节点属性(供所有外设使用)

compatible属性

属性值类型:字符串

主要用来匹配驱动。

设备树中的节点,若是有compatile属性,内核会为其生成一个struct device结构体。

intc: interrupt-controller@a01000 {
    compatible = "arm,cortex-a7-gic";
    #interrupt-cells = <3>;
    interrupt-controller;
    reg = <0xa01000 0x1000>,
          <0xa02000 0x100>;
};
arm:芯片厂商

cortex-a7-gic:模块对应的驱动名字

一个节点的 compatible 也可以设置多个属性值,如此可以和多个驱动匹配。

/ {
    model = "Gateworks Ventana i.MX6 Dual/Quad GW51XX";
    compatible = "gw,imx6q-gw51xx", "gw,ventana", "fsl,imx6q";
};

model属性

属性值类型:字符串

用来准确描述当前板子型号信息。

model = "Embedfire i.MX6ULL Board";

status属性

属性值类型:字符串

用来描述设备运行状态。

状态值描述
“okay” 设备正常运行
“disabled”该设备目前尚未运行,但它可能在未来开始运行(例如,某些东西没有插入或关闭)
“fail”设备不可操作
“fail-sss”设备不可操作,原因是设备中检测到一个严重的错误,如果没有修复,它就不太可能运行。“sss”的值指示具体的错误原因
reg属性

属性值类型:一系列<地址、长度>对

ocrams: sram@900000 {
      compatible = "fsl,lpm-sram";
      reg = <0x900000 0x4000>;
    };

地址:外设寄存器组的起始地址。

长度:外设寄存器组的字节长度。

#address-cells和#size-cells属性

属性值类型:u32

#address-cells:设置子节点中reg地址的数量,通常取值为1。

#size-cells:设置子节点中reg地址的长度的数量,通常取值为1或者0。

soc {
    #address-cells = <1>;
    #size-cells = <0>;
    compatible = "simple-bus";
    interrupt-parent = <&gpc>;
    ranges;
    ocrams: sram@900000 {
            compatible = "fsl,lpm-sram";
            reg = <0x900000>;
    };
};

linux系统中查看设备树(板子linux)

以目录的形式体现设备树结构。有两个目录,都可以查看。

ls /sys/firmware/devicetree/base
ls /proc/device-tree

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

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

相关文章

人力资源管理难?看看这些大厂是怎么做的!附数据分析模板

组织管理的质量是影响企业运作效率的重要因素之一。今天&#xff0c;本文分享帆软自己是如何用简道云搭建HR系统的。 Tips&#xff1a;本文中的“同学”&#xff0c;是对帆软员工的称呼。本文由帆软人事同学提供。 最初&#xff0c;在帆软的快速成长期&#xff0c;公司聚焦发展…

景区气象站丨它的结构与功能是什么样的?

景区气象站是由传感器、数据采集系统、LED显示屏、供电系统、立杆和监控主机组成&#xff0c;能够同时监测大气温度、湿度、大气压、风速、风向、pm2.5 /pm10、二氧化碳、光照强度等气象参数&#xff0c;并将这些气象参数上传至环境监控平台&#xff0c;具有数据传输快、无需布…

excel中两列数据生成折线图

WPS中excel的两列数据&#xff0c;第一列为x轴&#xff0c;第二列为y轴&#xff0c;生成折线图&#xff0c;并生成拟合函数。 1.选中两列数据&#xff0c;右击选择插入图表&#xff0c;选择XY&#xff08;散点图&#xff09;&#xff0c;生成散点折线图 2.选中图中散点&#x…

高压功率放大器在损伤检测中的应用有哪些

损伤检测技术是一种基于材料力学和声学原理的非破坏性检测技术。它通过对材料内部声波传播的特征进行分析&#xff0c;来判断材料内部是否存在缺陷、裂纹等损伤。在损伤检测技术中&#xff0c;高压功率放大器作为信号源和信号放大器&#xff0c;发挥着重要的作用。下面&#xf…

【Linux】实现进度条的两种方式(C语言实现)

文章目录 前言一、简单写法1.processbar.h2. processbar.c3.main.c 二、使用回调函数1.processbar.h2. processbar.c3.main.c 前言 回车&#xff08;\r&#xff09;&#xff1a;让光标回到当前行的最左端 换行&#xff08;\n&#xff09;&#xff1a;让光标回到下一行的最左端&…

Camunda 7.x 系列【24】脚本任务

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 脚本3. 案例演示3.1 建模3.2 测试1. 概述 Script Task脚本任务是一个自动化的活…

SpringBoot - 两种方式刷新配置信息

一、第一种方式 ​ConfigurationProperties​不能自动刷新&#xff0c;需要手动调用contextRefresher.refresh()方法来刷新配置。 import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;Component…

pytorch里面的nn.AdaptiveAvgPool2d

今天遇到nn.AdaptiveAvgPool2d((None, 1)) AdaptiveAvgPool2d函数详细解释&#xff1a; 2D自适应平均池化&#xff08;2D adaptive average pooling&#xff09;是一种对输入信号进行二维平均池化的操作&#xff0c;输入信号由多个输入平面&#xff08;input planes&#xff0…

MAC 查看被占用的端口

今天启动一个一个服务的时候&#xff0c;总是报端口被占用的错误&#xff0c;所以就需要找一下是哪个程序占用了端口&#xff0c;查看的命令是&#xff1a; netstat -anp tcp -v | grep 8082那这个命令出来的那个是进程id呢&#xff0c;很显然我画框的就是了&#xff0c;前面的…

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg&#xff0c;方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

IDEA项目实践——VUE介绍与案例分析

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring集成mybatis、spring当中的事务 IDEA项目实践——Spring当中的切面AOP IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——Spring框架简介&#xff0c;以及IOC注解 I…

制造业与MES管理系统:一对不可分割的“黄金搭档”

在当今高度竞争的市场环境中&#xff0c;制造业企业面临着越来越多的挑战。为了保持竞争力并实现可持续发展&#xff0c;许多企业已经开始寻求采用先进的技术和系统来提高生产效率和产品质量。在这方面&#xff0c;MES系统&#xff08;制造执行系统&#xff09;已经成为制造业中…

mac常用

一、查看ip地址 ifconfig en0 二、telnet命令 如果报没有telnet命令则安装 brew install telnet 在linux/unix下使用telnet&#xff08;telnet ip 端口号&#xff09;连接主机时提示Escape character is ^]。 1、这个提示的意思是按Ctrl ]会呼出telnet的命令行。 2、telnet…

esp32 micropython oled实时时钟

简介 合宙esp32C3&#xff0c;128*64 I2C oled&#xff0c;硬件i2c,将下面两个py文件放入esp32. ssd1306.py是我优化后的&#xff0c;为了避免错误&#xff0c;使用我提供的ssd1306驱动 只支持128*64的I2C oled 代码 main.py import network import urequests import ujso…

数据结构——布隆计算器

文章目录 1.什么是布隆过滤器&#xff1f;2.布隆过滤器的原理介绍3.布隆过滤器使用场景4.通过 Java 编程手动实现布隆过滤器5.利用Google开源的 Guava中自带的布隆过滤器6.Redis 中的布隆过滤器6.1介绍6.2使用Docker安装6.3常用命令一览6.4实际使用 1.什么是布隆过滤器&#xf…

JavaScript基础(Dom操作)

目录 一&#xff0c;BOM模型1.1&#xff0c;BOM可实现功能 二&#xff0c;Window对象的常用属性2.1&#xff0c;Window对象的常用方法2.1-1&#xff0c;open()和close()方法 三&#xff0c;History对象四&#xff0c;Location对象五&#xff0c;Document对象的常用方法六&#…

配置PPPoE拨号双链路负载分担示例

配置PPPoE拨号双链路负载分担示例 组网需求 如图1所示&#xff0c;设备作为企业出口网关&#xff0c;通过PPPoE拨号双上行接入Internet&#xff0c;链路1和链路2的出口路由采用等价路由进行负载分担。设备上配置NAT实现企业私网用户访问Internet。 图1 设备作为PPPoE Client…

MySQL 实战(一):实现“附近的人”功能

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;MySQL 教程&#xff1a;从入门到精通 文章目录 ST_Distance_Sphere 函数示例一&#xff1a;计算北京站到北京西站的距…

Neo4j实现表字段级血缘关系

需求背景 需要在前端页面展示当前表字段的所有上下游血缘关系&#xff0c;以进一步做数据诊断治理。大致效果图如下&#xff1a; 首先这里解释什么是表字段血缘关系&#xff0c;SQL 示例&#xff1a; CREATE TABLE IF NOT EXISTS table_b AS SELECT order_id, order_status F…

分布式数据库架构:高可用、高性能的数据存储

在现代信息时代&#xff0c;数据是企业发展的核心。为了支持海量数据的存储、高并发访问以及保证数据的可靠性&#xff0c;分布式数据库架构应运而生。分布式数据库架构是一种将数据存储在多个物理节点上&#xff0c;并通过一系列复杂的协调和管理机制来提供高可用性和高性能的…