07 linux内核device-tree基础

深入FMQL芯片启动流程:从BootROM到Linux内核,手把手解析SDK中每个文件夹的作用 本文深入解析复旦微FMQL芯片的启动流程,从BootROM到Linux内核的完整过程,详细讲解SDK中每个文件夹的作用。通过分析工程结构设计原理和各组件依赖关系,帮助开发者掌握FMQL-Linux-SDK的核心目录功能,包括buildroot、linux内核、U-Boot等关键组件,提升嵌入式Linux开发能力。 阅读详情

设备树是用一个类似文本的dts文件来描述所有硬件相关的内容. dtb是dts文件编译后得到的文件.
dtc命令可以把dts文件编译成dtb, 也可以把dtb文件反编译成dts.

H5所用的dts文件在内核源码目录arch/arm64/boot/dts/allwinner/里.

dtsi文件是多个方案的设备树共用部分,像c的头文件可在设备树文件里include引用.
现H5方案用的dts是: sun50i-h5-nanopi-neo2.dts


dtc命令主要用法:

dtc -I 输入格式(dts/dtb)  -O 输出格式(dts/dtb)  -o 输出文件名   输入文件...

把dtb文件反编译成dts文件:

dtc -I dtb -O dts -o my.dts sun50i-h5-nanopi-neo2.dtb

把dts文件编译成dtb文件:

dtc -I dts -O dtb -o my.dtb my.dts


参考文档: https://elinux.org/Device_Tree_Usage

设备树是由节点和属性组成, 一个节点可以有多个子节点, 子节点里还可以有它的子节点和属性…
节点名和属性名可以自定义, 也有些专门用途的属性.
设备树是由根节点”/”开始的, 用”{}”表示其作用范围. 如:

/ {   /* 根节点 */
    node1 {  /* 子节点 */
        property = "string";  /* 子节点属性 */
        child-node1 {   /* 子节点的子节点 */
            child-property = <1>;  /* 子节点的子节点属性 */
        };
        child-node2 {  /* 子节点属性 */
        };
    };
    node2 {

    };
};


----------
node1和node2分别描述一个设备的信息.
每个节点或每个属性语句都需要以分号结尾.
节点属性的值只分成3种:
 1)  字符串, 以双引号括起来. 如:   what = "hello";  表示what属性的值是一个字符串"hello"
 2)  32位无符号整形数, 以<>符号括起来. 如: cout = <11>;  表示count属性的值是一个整型数11
 3)  字节数组, 以[]符号括起来. 如:  mymac = [11 22 33 44 55 66]; 表示mymac属性值是一个char数组.
     //注意字节数组里内容默认是16进制的,0x即使不写也是按16进制数来处理.

属性值可以有连续多个值,需要使用逗号隔开就可以了. 如:
mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
string-list = "red fish", "blue fish";

与地址相关的节点以"name@基地址"方式来命名, name只能是英文,31个字符长度.
无需写基地址的节点则可以以"name"方式直接来命名.
如果设备的基地址由片选和内部片选号(一般为0)组成,则"name@片选号,内部片选号"的方式来命名
        ethernet@0,0 {
            compatible = "smc,smc91c111";
            reg = <0 0 0x1000>;
        };

name通常是一种设备的类型,不是具体的型号.
节点的compatible属性用于与设备驱动匹配使用(非常重要). 它是一个字符串数组.
compatible属性值可以有多个字符串,表示此设备是有兼容多种角色的功能.
注意属性值里的通配符是不会起作用的.

地址相关的属性.

reg属性表示相关的配置寄存器基地址及地址长度,可以表示多个基地址及其长度.
   写法: "reg = <address1 length1 address2 length2 address3 length3 ...>"

reg属性值里的顺序可以是: "基地址  地址长度  基地址  地址长度"
         也可以是: "基地址 基地址 ... 地址长度 地址长度 ... "
#address-cells属性表示子节点reg属性值里多少个基地址后才可能会有地址长度,如果#size-cells为0则表示reg属性值里全是基地址
#size-cells属性表示子节点reg属性值里多少个地址长度才可能会有另外的基地址

如:

/ {
    #address-cells = <1>; //表示子节点里的reg属性值里一个基地址后就可能有地址长度或另一个基地址
    #size-cells = <1>;    //表示reg属性值里一个基地址后就有一个地址长度

    serial@101f0000 {
        compatible = "arm,pl011";
        reg = <0x101f0000 0x1000 >;
    };

    gpio@101f3000 {
        compatible = "arm,pl061";
        reg = <0x101f3000 0x1000
               0x101f4000 0x0010>;
    };
};
    external-bus {
        #address-cells = <2>;
        #size-cells = <1>; 
        //表示它的子节点里的reg属性值里可以是: "基地址 基地址 地址长度"
                     也可以是: "基地址 基地址 地址长度 基地址 基地址 地址长度 ..."
        ...
    };

ranges属性可以在根节点制定好具体控制器的基地址表格,而控制器只需写上ranges里的序号作基地址即可.
如smc91c111的基地址为0x10100000, a1234-i2c-bus的基地址为0x10160000, k8f1315ebm的基地址为0x30000000

/ {
    ...
    external-bus {
        #address-cells = <2>
        #size-cells = <1>;
        ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet
                //当访问地址0x10100000时,Ethernet则占用地址总线和数据总线
                  1 0  0x10160000   0x10000     // Chipselect 2, i2c controller
                  2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash
           // 第一列表示片选线的序号(用于确定哪个控制器工作), 第二列表示内部片选线序号(控制器的内部片选)

        ethernet@0,0 {  /* 这里的"0,0"是指ranges表格里的<0  0 ...项 */
            compatible = "smc,smc91c111";
            reg = <0 0 0x1000>;
        };

        i2c@1,0 {
            compatible = "acme,a1234-i2c-bus";
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <1 0 0x1000>;
            rtc@58 {
                compatible = "maxim,ds1338";
                reg = <58>;
            };
        };

        flash@2,0 {
            compatible = "samsung,k8f1315ebm", "cfi-flash";
            reg = <2 0 0x4000000>;
        };
    };
};

中断相关的属性:

interrupt-controller;属性用于标明此节点设备会接收处理中断信号.
#interrupt-cells; 属性用于标明当前节点里的interrupts属性值里的数值个数.
interrupt-parent; 使用指定的节点作父节点, 相当于在当前位置展开父节点内容
interrupts;属性指定使用的中断号
/ {
    ...
    interrupt-parent = <&intc>; //引用intc节点
    ...

    serial@101f0000 {
        compatible = "arm,pl011";
        reg = <0x101f0000 0x1000 >;
        interrupts = < 1 0 >;
    };

    serial@101f2000 {
        compatible = "arm,pl011";
        reg = <0x101f2000 0x1000 >;
        interrupts = < 2 0 >;
    };

    gpio@101f3000 {
        compatible = "arm,pl061";
        reg = <0x101f3000 0x1000
               0x101f4000 0x0010>;
        interrupts = < 3 0 >;
    };

    intc: interrupt-controller@10140000 {
        compatible = "arm,pl190";
        reg = <0x10140000 0x1000 >;
        interrupt-controller;
        #interrupt-cells = <2>;
    };
};

aliases节点用于设置别名.

    aliases {
        ethernet0 = &eth0;  
        serial0 = &serial0;
    };

chose节点用于设置内核里使用的默认参数, 如bootargs

    chosen {
        bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1:/nfs console=ttyS0,115200";
    };
U-Boot 2026.07 启动流程深度解析:从Boot ROM到内核移交的7个关键阶段 本文深度解析U-Boot 2026.07的启动流程,详细介绍了从Boot ROM初始化到内核移交的7个关键阶段,包括启动模式选择、设备初始化、DCD解析、低级硬件初始化、板级配置、驱动初始化和内核加载。内容涵盖ARM Cortex-A系列处理器的启动机制、DDR控制器配置、设备树处理等核心技术,为开发者提供全面的U-Boot启动流程指南。 阅读详情

相关推荐

Linux内核下HYM8563 RTC芯片驱动移植实战指南

实时时钟(RTC)是嵌入式系统中用于保持精确时间的关键组件,尤其在电池供电设备中,其低功耗特性至关重要。其工作原理是通过独立的振荡电路和备用电池,在系统主电源关闭后持续计时。在Linux系统中,RTC子系统为各类RTC芯片提供了统一的驱动框架,极大简化了开发流程。通过实现标准的rtc_class_ops接口,开发者可以快速集成新硬件,其技术价值在于确保系统时间的持久化与精确性,广泛应用于物联网终端、工业控制等需要长时间独立运行的场景。本文以国产HYM8563芯片为例,详细解析了在Linux内核中,如何基于I

weixin_34378767的博客 412

Linux驱动开发—设备树基本概念,语法详解

设备树(Device Tree,简称DT)是一种数据结构,用于描述硬件的布局和连接方式。它最初由Open Firmware引入,后来被Linux社区采用,用于解决在嵌入式系统中硬件描述的问题。设备树通过一种独立于硬件平台的方式,向操作系统内核提供设备信息,使得内核不再需要内置具体的硬件配置代码,从而提高了系统的可移植性和灵活性。平台独立性:设备树使硬件描述从内核代码中分离出来,通过一份设备树文件(通常是.dts文件)来描述硬件。这样,同一内核可以运行在不同硬件平台上,只需提供相应的设备树文件。

weixin_46999174的博客 2798

U-Boot v2026.07 启动流程深度解析:从 Boot ROM 到内核加载的 7 个关键阶段

本文深度解析U-Boot v2026.07的启动流程,详细阐述从Boot ROM到内核加载的7个关键阶段,包括硬件初始化、SPL加载、设备树解析等核心技术。特别针对UBOOT在嵌入式系统中的优化实践,提供性能提升方案和常见问题解决方案,帮助开发者深入理解启动机制并实现高效系统设计。

weixin_33827590的博客 301

dtc 命令

sudo apt-get install device-tree-compiler dtc --help dtc -I dts -O dts -o ~/xx.dts msm8974-v2.2-mtp.dts

ermuzhi的专栏 1万+

保姆级教程:从NXP官方EVK到正点原子阿尔法板,Linux内核设备树移植全流程解析

本文详细解析了从NXP官方EVK到正点原子阿尔法板的Linux内核设备树移植全流程,重点介绍了IMX6ULL平台下的设备树配置、硬件适配及调试技巧。通过实战案例展示如何修改内存配置、时钟体系和外设使能,帮助开发者快速完成Linux内核4.1.15版本的移植工作。

433

【Linux内核】设备模型之设备树

设备树在Linux内核中扮演着重要角色,特别是在嵌入式系统中。通过设备树,内核可以动态地识别和初始化硬件设备,而无需修改内核代码。本文介绍了设备树的基本结构、终端设备的描述方法,以及如何通过设备树匹配并初始化串口设备。通过实例代码,展示了设备树在实际驱动开发中的应用。

以实战经验介绍行业知识 1571

dtc 编译命令

设备树编译 设备树的编译器是dtc,源代码目录kernel\scripts\dtc,只要编译过内核,就会生成dtc, dtc编译器可以把dts文件编译成为dtb,也可把dtb编译成为dts文件,编译命令格式如下: dtc [-I input-format] [-O output-format][-o output-filename] [-V output_version] input_filen...

oqqGuMu的专栏 9344

全志H2芯片技术文档 Allwinner_H2+_Datasheet_V1.2.zip

资料不好找 需要的拿走 下载的时候用了几十积分 好气 啊 需要的拿走资料不好找 需要的拿走资料不好找 需要的拿走

Linux设备树(Device Tree)

在Linux3.x版本下,Linux内核中ARM架构的板级信息大量放置在 arch/arm/mach-xxx 和 arch/arm/plat-xxx 文件夹下,例如platform设备、resource、spi_board_info以及各种硬件的platform_data,这些信息对Linux内核来说无关紧要,会造成大量的冗余编码,导致ARM的merge工作量较大。当采用设备树(device tree)之后,许多硬件的细节可以直接透过设备树传递给Linux内核,大大减少了Linux内核的冗余代码量。....

Eddy的博客 4635

Allwinner_H2+_Datasheet_V1.2

很难找的资料,有需要的拿去

PCB工程师必看:别再搞错1078玻纤布的Dk了,手把手教你算等效介电常数

本文为PCB工程师提供了1078玻纤布等效介电常数(Dk)的详细计算指南,帮助解决高速设计中的信号完整性问题。通过解析玻纤布结构、混合介质理论和实战计算方法,指导工程师准确设置EDA工具参数,避免常见的Dk计算误区,提升设计精度和仿真准确性。

weixin_42546392的博客 399

Linux 3.10 ARM Device Tree 的初始化

Linux 3.10 ARM Device Tree 的初始化 分类:LINUX 2013-07-03 13:53:16 本文代码均来自标准 linux kernel 3.10,可以到这里下载https://www.kernel.org/ 以arch/arm/mach-msm/board-dt-8960.c 为例,在该文件中的msm_dt_init 函数的...

Linux小辉的博客 201

C#+Winform+OpenCvSharp实战:5步搞定工业视觉检测框架(附源码下载)

本文详细介绍了如何使用C#、Winform和OpenCvSharp构建工业视觉检测框架,通过5个关键步骤实现高效、稳定的视觉检测系统。内容涵盖环境配置、相机集成、核心算法实现、系统集成与通信,以及部署优化,帮助开发者快速掌握工业视觉检测技术,提升检测精度和效率。附完整源码下载,助力工业数字化转型。

pz89012345的博客 550

4019 设备树 Linux device tree 概述

一:主要关键字定义说明 <1>. DT :Device Tree <2>. FDT : Flattened Device Tree <3>. OF :Open Firmware <4>. DTS :device tree source <5>. DTSI:device tree source include <6>...

OpenWrt/WLAN/驱动/Android/嵌入式开发总结 2690

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4647

【AVRCP】规范精讲[19]: 媒体属性全解析,让你的蓝牙设备显示完整歌曲信息

AVRCP协议中的媒体属性是蓝牙音频设备传输歌曲元数据的关键,包含标题、艺术家、专辑等32位ID标识的键值对信息。规范要求字符串属性必须使用UTF-8编码,但乱码问题频发(如中文显示异常),主因是设备未遵循编码标准或使用GBK等非规范格式。常见问题包括信息不全(仅显示标题)、封面缺失(因带宽限制或格式不支持)及更新延迟(通知机制未启用)。解决方案包括强制UTF-8编码、优化封面大小(如300x300像素JPEG)、主动请求缺失属性。Android示例代码展示了通过广播接收器解析媒体属性的方法。

byte轻骑兵的技术小窝 1万+

Linux 内核裁剪与移植

对于嵌入式 Linux 开发者而言,**内核裁剪与移植**是从"会用 Linux"迈向"能定制 Linux"的关键一步。主线 Linux 内核的全量编译产物超过 500MB,而一块典型的 ARM 嵌入式板子可能只有 8MB NOR Flash 和 32MB RAM——如何从庞大的内核源码中裁剪出一个能在目标板子上运行的精简镜像?当换了一块新 SoC,内存映射、中断控制器、时钟树、外设全部变了,又如何让内核在新硬件上成功启动?

leizisdu的专栏 271

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

linux驱动笔记-设备树解析device_node

setup_arch()函数中三个主要函数用于对设备操作:

q912533的博客 427

基于FPGA的时间数字转换(TDC)设计(一:原理)

基于FPGA的时间数字转换(TDC)设计,此为第一篇

sdau2005的博客 5069

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?此外,用户还可以选择将接收到的图片、视频和文件保存到指定的文件夹中。‌用户可以在微信设置中调整这一设置。

qq_15963745的博客 5086

树莓派Linux驱动开发实战:从内核模块到GPIO/PWM/红外驱动

Linux驱动开发是嵌入式系统领域的核心技术,它实现了操作系统与硬件设备之间的通信桥梁。其工作原理是通过内核模块机制,将设备控制代码动态加载到内核空间,实现对硬件资源的直接访问。在物联网和嵌入式设备领域,驱动开发具有重要价值,能够充分发挥硬件性能,确保系统稳定运行。常见的应用场景包括GPIO引脚控制、PWM调光输出、红外通信等外设驱动实现。本实战项目基于树莓派3B+平台,提供完整的驱动开发框架,涵盖从基础内核模块到各种接口驱动的开发流程,特别适合嵌入式Linux初学者和物联网开发者学习实践。项目采用模块化设

weixin_34297704的博客 441

135、高通 ChromaTix 调优工具入门:参数含义、调优流程与效果对比

本文介绍了高通ChromaTix色彩调优工具的核心使用要点:1. ChromaTix是位于ISP管线中的色彩处理系统,核心任务是将原始色彩映射为符合人眼感知的"舒适"效果;2. 重点解析了饱和度、色调、亮度相关饱和度等关键参数的实际含义和调试陷阱;3. 分享了四步调优流程,强调需要基于多场景数据验证;4. 通过案例展示了参数调整带来的色彩改善效果;5. 总结了实用建议,包括保持单一变量调试、量化评估色差、关注极端场景表现等。文章指出ChromaTix调优是平衡不同场景需求的"妥协艺术",需要结合客观数据和主

sundong_81的博客 106

linux驱动(第十八课,PINCTRL,GPIO, GPIO_CHIP, IRQ_CHIP)

在linux中,pinctrl被定义为一个子系统。pinmux功能被pinctrl子系统所管理。 这个功能通常有SOC厂商提供。我们需要关心的是,如何使用它的功能。 pin_configuration_node 是一个多维向量,通常的组成形式是: pinctrl1:xxxxgroup_1{ xxx,pins= < PIN_FUNCTION1 PIN_SETTING1 PIN_FUNCTION2 PIN_SETTING2 PIN_FUNCTION3 PIN_SETTING3 ..

Huskar_Liu的博客 2159

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 06 H5直接使用网络文件系统
下一篇: 08 在设备树里描述platform_device
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值