1.Device Tree语法(上)
2.dtb是驱动驱动什么意思备注?
3.Linux 设备树 devicetree(DTS)入门
4.Linux驱动开发 - Linux 设备树学习 - DTS语法
5.linux设备驱动:一站式解决probe不跑问题
6.linux设备驱动程序——设备树(0)-dtb格式
Device Tree语法(上)
DeviceTree的起源与用途
DeviceTree发源于PowerPC架构,其设计初衷是源码源代为了去除代码中冗余的device注册代码,现已成为Linux的驱动驱动通用机制。
DeviceTree的源码源代组成与结构
DeviceTree由Node(节点)与Property(属性)两种元素构成。例如,驱动驱动"/"为根节点,源码源代ems系统源码下载"chosen"为子节点,驱动驱动"model = "mt";"与"compatible = "mediatek,源码源代mt";"即为属性。
Node与Property的驱动驱动自定义与标准
Node与Property的名称与值可自由设定,无严格限制,源码源代但标准预定了部分Node与Property,驱动驱动以及它们之间的源码源代约束规则,详情请参阅官方规格文档。驱动驱动
标准Property解析
Property格式为"property-name=value",源码源代value的驱动驱动类型有多种。例如:
"compatible"属性用于设备与驱动程序的适配,格式推荐为"manufacturer,model"。
"model"属性简单表示型号,root节点通过它传递值给machine_desc_str。
"phandle"定义与引用在DeviceTree中更常见。
"reg"属性解析出"address,length"数值,解析格式依据父节点的"#address-cells、#size-cells"定义。
"ranges"属性用于节点与父节点间的地址映射,格式为(child-bus-address, parentbus-address, length),解析长度受节点与父节点的"#address-cells、#size-cells"属性控制。
中断相关的node与属性
中断相关的node可分为三类,并有特定属性,如:
"interrupt-parent"属性用于明确中断父节点的定义,值为中断控制器的phandle。
节点与父节点间"child unit address"与"parent unit address"的cells长度依据"#address-cells"属性。
"interrupt-parent"与"parent interrupt specifier"的cells长度分别由子节点与父节点的"#interrupt-cells"属性决定。
实例说明
以上内容仅作简要概述,详细信息请参阅官方文档。
dtb是什么意思备注?
DTB全称为“Device Tree Blob”,中文意为设备树二进制文件。它是一种用于描述硬件设备信息的文本描述文件,是嵌入式系统中的一种重要的组件。在嵌入式系统中,为了方便操作系统内核访问和使用底层硬件资源,通常需要使用设备树来描述特定硬件平台的信息。
DTB文件通常会在系统启动时被加载到内存中,内核会通过解析它来获取硬件信息。使用DTB可以让系统在不同配置下更加容易地适配各种硬件环境,实现驱动的模块化和动态加载,提高了操作系统的稳定性和可用性。DTB在嵌入式系统中得到了广泛的应用,比如树莓派、联通直播源码抓取BeagleBone等单板电脑都使用了设备树。
DTB最大的优点是支持硬件平台的快速适配和模块化开发。但是,DTB文件也有一些缺点。首先,编写和修改DTB文件需要一定的专业技能和知识,对于新手来说可能比较困难;其次,DTB文件是硬件平台相关的,对于不同的平台需要使用不同的DTB文件,这增加了软件开发者的工作量。因此,在使用DTB时需要仔细选择合适的开发平台和相应的DTB文件。
Linux 设备树 devicetree(DTS)入门
本文将为您深入探讨Linux设备树(DTS)的基本概念与应用,从ARM设备树起源的背景讲起,直至DTS知识介绍、描述、重要点的解析,直至内核初始化设备驱动的细节,以及一些实用工具和技巧。DTS作为设备配置的一种方式,在现代Linux系统中扮演着至关重要的角色,它改变了设备配置硬编码到内核中的传统做法,通过设备树结构传递硬件拓扑和资源信息。
### ARM设备树起源背景
在早期的ARM Linux系统中,设备代码与特定公司单板的启动和运行细节紧密绑定,这种设计导致代码难以复用和移植。同时,内核中缺乏统一的规范指导设备驱动的编写,使得代码结构逐渐变得臃肿且复杂。这一问题在内核OMAP开发树的维护者Tony Lindgren发送邮件给Linus,请求改进和提交代码修改时,达到了一个临界点。Linus的回应表明了对这种混乱状态的不满,随后,制定了一系列规范以改善ARM平台相关代码的组织结构。
### DTS知识介绍与应用
在ARM系统启动过程中,设备可以通过DTS(设备树)或ACPI(高级配置和电源接口)进行初始化,本文将重点介绍DTS的使用。DTS提供了一种描述硬件配置的结构化方式,内核通过解析DTS生成的dtb(设备树表示)来初始化硬件设备。DTS文件由一系列被命名的节点和属性组成,每个节点可以包含子节点,属性则为成对出现的名称和值,用于描述设备配置信息,如CPU数量、内存基地址、时钟频率、外设连接、is语音源码中断配置、串口等。
### DTS描述与配置
DTS描述信息包括硬件的CPU、内存、中断控制器、定时器、外设、串口等的配置,这些信息原本多被硬编码在内核中,通过DTS可以清晰地表示硬件资源的结构和连接方式。例如,描述中断控制器GICV3的配置信息包括节点名称、兼容性标识、中断类型、基地址、触发方式等。
### 常见问题与解决方法
在使用DTS时,常见问题包括DTS与dtb的转换、理解DTS中node节点的配置意义、内核初始化设备驱动的流程等。DTS的转换可通过dtc工具实现,而理解node节点配置可通过查找内核文档中对应的compatible字符串,或直接阅读驱动代码实现。内核初始化设备驱动时,会根据compatible字符串匹配,决定是否执行特定驱动的初始化。
### 内核初始化与驱动开发
驱动开发者需要掌握DTS的细节,以确保设备驱动能够正确初始化。配置错误可能导致驱动功能失效。此外,DTS允许用户根据配置选择启动哪些硬件,从而实现精简内核的目标。
### DTS中的关键概念与工具
DTS支持include机制,用于复用描述节点。此外,提供了多种获取设备节点属性的方法,如读取字符串、整型值、数组等。理解这些工具可以帮助开发者更高效地解析和使用DTS文件。
总之,DTS作为Linux设备配置的核心技术,在简化内核代码、增强设备兼容性和灵活性方面发挥了重要作用。通过掌握DTS的使用与解析,开发人员可以更高效地进行内核定制与设备驱动开发。
Linux驱动开发 - Linux 设备树学习 - DTS语法
设备树(Device Tree)是一种描述硬件设备的树形结构文件,主要用于Linux系统中描述板级设备信息,本地客服系统源码如CPU数量、内存基地址、IIC接口和SPI接口所连接的设备等。设备树的主干是系统总线,IIC控制器、GPIO控制器、SPI控制器等设备是系统总线上的分支。例如,IIC控制器分为IIC1和IIC2,其中IIC1连接了FT和ATC这两个IIC设备,IIC2仅连接了MPU一个设备。
在开发Linux设备驱动时,需要了解DTS(Device Tree Source)、DTB(Device Tree Binary)和DTC(Device Tree Compiler)之间的关系。DTC工具依赖于特定的源代码文件,最终生成主机文件DTC。要编译DTS文件,只需在Linux源码根目录下执行命令“make all”或“make dtbs”,后者仅编译设备树。
在开发板中,每个板子都对应一个DTS文件,以I.MX6ULL芯片为例,打开arch/arm/boot/dts/Makefile文件,可以找到特定编译配置。当选中I.MX6ULL芯片后,与该芯片相关的DTS文件会被编译成DTB文件。若要为新的板子编写DTS文件,只需新建此板子对应的DTS文件,并在dtb-$(CONFIG_SOC_IMX6ULL)下添加对应的DTB文件名,这样在编译设备树时会自动编译为二进制文件。
在Linux内核源码分析学习方面,可参考指定地址。此外,Linux内核源码分析交流群提供学习资源,包括书籍、视频等,通过加入该群可以获取这些资源。
在编写设备树文件时,需要了解DTS语法。DTS文件支持头文件,扩展名为.dtsi。设备树节点通过属性信息描述,属性是键值对形式。例如,在imx6ull.dtsi文件中,描述了CPU架构、频率、外设寄存器地址范围等信息。网络斗牛游戏源码设备节点是树形结构中描述设备的节点,通过节点名字和地址来描述。
兼容性属性(compatible)是设备树中非常重要的属性,用于将设备与驱动绑定。属性值是一个字符串列表,格式为“厂商名称, 设备名称”。Linux下的外设驱动通常会使用这些兼容性属性来查找与设备匹配的驱动程序。
模型属性(model)描述设备模块信息,如设备名字。状态属性(status)记录设备状态,可选状态包括正在运行、已停止、错误等。地址属性(address-cells和size-cells)用于描述设备子节点的地址信息,reg属性用于描述设备地址空间资源信息。ranges属性用于描述设备子地址和父地址的映射关系。
在产品开发过程中,设备树文件需要随着硬件需求的变更而更新。例如,需要在I.MX6U-ALPHA开发板的I2C1接口上添加一个新设备时,需要在对应的DTS文件中向已有节点添加新子节点。
在Linux内核启动时,设备树信息会被解析并在根文件系统中以目录/proc/devicetree的形式体现。通过该目录可以查看根节点的属性和子节点,如模型、兼容性、地址等信息。这些信息与设备树文件中的描述相匹配。
linux设备驱动:一站式解决probe不跑问题
理想的驱动应该具备跨平台性,代码结构清晰,实现“高内聚,低耦合”。本文将探讨Linux设备驱动中的probe不跑问题的解决策略。
当驱动工程师遇到probe函数未运行的问题时,首先需要检查driver和device是否正确注册。确保它们在同一总线级别(如platform bus或i2c bus),并且driver的compatible属性与device匹配。排查步骤如下:
1. 检查driver和device的注册状态,可通过adb在/sys/bus/…/driver和/devices目录查看。
2. 如果driver和device都存在,问题可能出在compatible属性上,需要调整。
3. 如果driver未注册,检查driver_register调用是否成功,若未成功,提高log等级寻找原因。
4. 如果device未注册,着重检查dts文件的修改是否生效,确认dts节点与实际硬件平台的对应关系。
- 对于platform device,确认dts节点位置是否正确。
- 对于i2c device,可能需要检查总线驱动或特定device的注册问题,通过log查找线索。
参考资源:
- 宋宝华的“让天堂的归天堂,让尘土的归尘土——谈Linux的总线、设备、驱动模型”
- Device Tree(四):文件结构解析
通过以上步骤,驱动工程师可以有效地解决Linux设备驱动probe不跑的问题。
linux设备驱动程序——设备树(0)-dtb格式
设备树的一般操作方式是:开发人员根据开发需求编写dts文件,然后使用dtc将dts编译成dtb文件。
dts文件是文本格式的文件,而dtb是二进制文件,在linux启动时被加载到内存中,接下来我们需要来分析设备树dtb文件的格式。
为什么要了解设备树dtb文件的格式
dtb作为二进制文件被加载到内存中,然后由内核读取并进行解析,如果对dtb文件的格式不了解,那么在看设备树解析相关的内核代码时将会寸步难行,而阅读源代码才是了解设备树最好的方式,所以,如果需要更透彻的了解设备树解析的细节,第一步就是需要了解设备树的格式。
dtb格式总览
dtb的格式是这样的:
dtb header
但凡涉及到数据的记录,就一定会有一个总的描述部分,就像磁盘的超级块,书的目录,dtb当然也不例外,这个描述头部就是dtb的header部分,通过这个header部分,用户可以快速地了解到整个dtb的大致信息。
header可以用这么一个结构体来描述:
magic
设备树的魔数,魔数其实就是一个用于识别的数字,表示设备树的开始,linux dtb的魔数为 0xddfeed.
totalsize
这个设备树的size,也可以理解为所占用的实际内存空间。
off_dt_struct
offset to dt_struct,表示整个dtb中structure部分所在内存相对头部的偏移地址
off_dt_strings
offset to dt_string,表示整个dtb中string部分所在内存相对头部的偏移地址
off_mem_rsvmap
offset to memory reserve map,dtb中memory reserve map所在内存相对头部的偏移地址,
version
设备树的版本,截至目前的最新版本为.
last_comp_version
最新的兼容版本
boot_cpuid_phys
这部分仅在版本2中存在,后续版本不再使用。
size_dt_strings
表示整个dtb中string部分的大小
size_dt_struct
表示整个dtb中struct部分的大小
alignment gap
中间的alignment gap部分表示对齐间隙,它并非是必须的,它是否被提供以及大小由具体的平台对数据对齐和的要求以及数据是否已经对齐来决定。
memory reserve map
memory reserve map:描述保留的内存部分,这个map的数据结构是这样的:
这部分存储了此结构的列表,整个部分的结尾由一个数据为0的结构来表示(即physical_address和size都为0,总共字节)。
这一部分的数据并非是节点中的memory子节点,而是在设备开始之前(也就是第一个花括号之前)定义的,例如:
这一部分的作用是告诉内核哪一些内存空间需要被保留而不应该被系统覆盖使用,因为在内核启动时常常需要动态申请大量的内存空间,只有提前进行注册,用户需要使用的内存才不会被系统征用而造成数据覆盖。
值得一提的是,对于设备树而言,即使不指定保留内存,系统也会默认为设备树保留相应的内存空间。
同时,这一部分需要位(8字节)对齐。
device-tree structure
device-tree structure:每个节点都会被描述为一个struct,节点之间可以嵌套,因此也会有嵌套的struct。
structure的的结构是这样的:
device-tree strings
device-tree strings:在dtb中有大量的重复字符串,比如"model","compatile"等等,为了节省空间,将这些字符串统一放在某个地址,需要使用的时候直接使用索引来查看。
需要注意的是,属性部分格式为key = value,key部分被放置在strings部分,而value部分的字符串并不会放在这一部分,而是直接放在structure中。
dtb文件解析示例
光说不练假把式,下面我就使用一个简单的示例来剖析dtb的文件格式。
下述示例仅仅是一个演示demo,不针对任何平台,为了演示方便,编写了一个非常简单的dts文件。 /dts-v1/; / {
编译当前dts文件,获取对应的dtb文件。
鉴于dtb文件为二进制文件,普通编辑器打开显示乱码,我们使用ultraEdit查看,它将数据以进制形式显示:
整个dtb文件还是比较简单的,图中的红色框出的部分为header部分的数据,可以看到:
整个头部为字节,进制为0x,从头部信息中off_mem_rsvmap部分可以得到,reserve memory起始地址为0x,上文中提到,这一部分使用一个字节的struct来描述,以一个全为0的struct结尾。
后字节全为0,可以看出,这里并没有设置reserve memory。
structure 部分
上文回顾:每一个属性都是以 key = value的形式来描述,value部分可选。
偏移地址来到0x(0x+0x),接下来8个字节为,根据上述structure中的描述,这是OF_DT_PROP,即标示属性的开始。
接下来4字节为,表明该属性的value部分size为字节。
接下来4字节是当前属性的key在string 部分的偏移地址,这里是,由头部信息中off_dt_strings可以得到,string部分的开始为,偏移地址为0,所以对应字符串为"compatible".
之后就是value部分,这部分的数据是字符串,可以直接从右侧栏看出,总共字节的字符串"hd,test_dts", "hd,test_xxx",因为字符串之间以0结尾,所以程序可以识别出这是两个字符串。
可以看出,到这里,compatible = "hd,test_dts", "hd,test_xxx";这个属性就被描述完了,对于属性的描述还是非常简单的。
按照固有的规律,接下来就是对#address-cells = <0x1>的解析,然后是#size-cells = <0x1>...
然后就是递归的子节点chosen,memory@等等都是按照上文中提到的structure解析规则来进行解析,最后以结尾。
与根节点不同的是,子节点有一个unit name,即chosen,memory@这些名称,并非节点中的.name属性。
而整个结构的结束由来描述。
一般而言,在位系统中,dtc在编译dts文件时会自动考虑对齐问题,所以对于设备树的对齐字节,我们只需要有所了解即可,并不会常接触到。
好了,关于linux设备树dtb文件格式的讨论就到此为止啦。
dtb是什么意思?
首先,dtb是指Device Tree Blob,是存储在设备中的二进制文件,用于描述设备的硬件资源和配置信息。在嵌入式系统中,它非常重要,因为它能够帮助操作系统管理硬件资源,具有更好的可移植性和可扩展性。
其次,dtb通常由bootloader生成,然后传递给操作系统。操作系统可以使用dtb来识别和配置设备的驱动程序,这对于支持多种不同设备的系统非常有用。这也使得操作系统更容易移植到不同的硬件平台。
dtb是近年来流行的设备树技术的核心组成部分。设备树为硬件资源提供了一种通用的、可重用的描述方式,这些资源可以在不同的硬件平台和操作系统之间共享。dtb与设备树紧密相关,并为我们提供了跨平台的硬件资源描述和管理的能力。
总之,dtb是嵌入式系统中非常重要的概念,它提供了一种通用的、可重用的描述设备硬件资源和配置信息的方式,从而促进了多设备应用的可移植性和可扩展性。
设备树篇-----openwifi学习
设备树描述硬件参数,是学习Openwifi项目中的关键。Openwifi使用了ADI的射频芯片、Xilinx的FPGA以及ARM的SoC平台。ADI提供了硬件评估板和软件资源,包括无操作系统和带Linux操作系统的资源。使用Linux内核版本_r2,需要制作启动SD卡文件,包含uImage、BOOT.bin、devicetree.dtb。devicetree.dtb文件是设备树的基础,用于描述硬件信息。设备树文件中,根节点包含各种硬件节点,如USB、I2C、SPI、UART等,每个节点可以包含更详细的下级节点。
设备树节点的使用示例中,iic设备树节点包含compatible属性,用于匹配Linux驱动,内核中可搜索到匹配代码。节点之间可以互相引用,如Openwifi接收部分的IP核需要一个DMA,因此引用了DMA节点。dts文件与dtsi文件类比C语言中的头文件,用于描述硬件配置。
在使用官方板子的情况下,设备树配置基本无忧。然而,理解设备树文件和其作用对于开发软件定义无线电系统至关重要。在设备树中添加节点可以描述FPGA下的IP核,如Openwifi的接收部分使用了ADI的DMA。在FPGA工程中删掉dma时,需要在设备树中相应节点中注释掉引用,否则系统可能会崩溃。
Soc的节点相对固定,用于传递硬件参数,如描述CPU、USB、I2C、以太网等。Openwifi的节点则包含了其使用方法,如使用两个dma,共有4个通道,被不同的节点引用。在查找节点时,Linux内核提供了一系列的of系列函数,如通过名字、路径或compatible属性查找。获取资源时,Linux也提供了相应的函数,如获取中断号、寄存器资源等。
设备树编译工具为dtc,可以将devicetree.dts文件编译为dtb文件,也可以将dtb文件反编译为dts文件。在基于Zynq的平台下,通过分析ADI提供的设备树文件,可以得到自己的设备树文件,并在内核中执行编译。
总的来说,设备树在硬件描述方面提供了简洁而智能的设计,为硬件与操作系统之间的交互提供了一种一劳永逸的解决方案。然而,在自定义节点时,需要深入考虑硬件描述、连接情况以及编写驱动,这属于硬件平台(bsp)工程师的工作范畴。