没有合适的资源?快使用搜索试试~ 我知道了~
首页devicetree入门资料
devicetree入门资料
需积分: 13 132 浏览量
更新于2023-05-23
评论
收藏 720KB DOC 举报
本文目标是了解dts基本语法,可以尝试去看内核dts中的文件,follow去配置。 DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。 在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,比如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data,这些板级细节代码对内核来讲只不过是垃圾代码。而采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。 每次正式的linux kernel release之后都会有两周的merge window,在这个窗口期间,kernel各个部分的维护者都会提交各自的patch,将自己测试稳定的代码请求并入kernel main line。每到这个时候,Linus就会比较繁忙,他需要从各个内核维护者的分支上取得最新代码并merge到自己的kernel source tree中。Tony Lindgren,内核OMAP development tree的维护者,发送了一个邮件给Linus,请求提交OMAP平台代码修改,并给出了一些细节
资源详情
资源评论
资源推荐

一、 产生原因
二、 基本知识
加载过程
描述信息
设备树框架
组成结构示例
语法
节点名
引用
字符串信息
无符号整型数组信息
二进制数数组
字符串哈希表
混合形式
!
!"!
#
驱动自定义 $
%&' 设备树的匹配过程
(% 中相关符号的含义
)%&' 中几个难理解的属性的解释
三、 与驱动
驱动移植
简单方法
详细方法
四常见的 %&'函数 (
五%&*+,- )
六.由 %&' 到 ,. 的过程 )
查看挂载上的所有设备
%&' 设备树描述文件中什么代表总线,什么代表设备
具体案例
$
高通 /'/)# 实例分析篇

dts
本文目标是了解 基本语法,可以尝试去看内核 中的文件,0 去配置。
一、dts 产生原因
%&' 即 %,&' 设备树源码1%,& 是一种描述硬件的数据结构,它起源于 230
+23-。
在 4 中,56/ 架构的板极硬件细节过多地被硬编码在 788!444 和 7887!444,比如
板上的 9 设备、 、..、.. 以及各种硬件的 9.,这些板级细节
代码对内核来讲只不过是垃圾代码。而采用 %,& 后,许多硬件的细节可以直接透过它传递给 4,而不
再需要在 $ 中进行大量的冗余编码。
每次正式的 4$ 之后都会有两周的 00,在这个窗口期间,$ 各个部分的维护
者都会提交各自的 7,将自己测试稳定的代码请求并入 $。每到这个时候, 就会比较繁忙,
他需要从各个内核维护者的分支上取得最新代码并 到自己的 $ 中。&,内核
2/5, 的维护者,发送了一个邮件给 ,请求提交 2/5 平台代码修改,并给出了一些细
节描述:
-简单介绍本次改动
-关于如何解决 :。有些 就可以处理,不能处理的,给出了详细介绍和解决方
案
一切都很平常,也给出了足够的信息,然而,正是这个 ; 引发了一场针对 56/ 4 的内核代
码的争论。我相信 一定是对 56/ 相关的代码早就不爽了,56/ 的 工作量较大倒在其次,主要是他
认为 56/ 很多的代码都是垃圾,代码里面有若干愚蠢的 ,而多个人在维护这个 ,从而导致了冲突。
因此,在处理完 2/5 的 ; 之后( 并非针对 2/5 平台,只是 & 撞在枪口上了),他
发出了怒吼:
<7< 170756/7=$7
之后经过一些讨论,对 56/ 平台的相关 做出如下相关规范调整,这个也正是引入 %&' 的原因。
它替代 788!444 和 7887!444 中的板级 代码,便于 管理。
56/ 平台的相关 相关规范调整:
、56/ 的核心代码仍然保存在 78 目录下
、56/'2*7 保存在 78 目录下
、56/'2* 的周边外设模块的驱动保存在 , 目录下
、56/'2* 的特定代码在 7887!444 目录下
、56/'2*: 的代码被移除,由 %,& 机制来负责传递硬件拓扑和硬件资源信息。
本质上,%,& 改变了原来用 7 方式将 >? 配置信息嵌入到内核代码的方法,改用
传递一些参数。
如果我们认为 $ 是一个 $4,那么其输入参数应该包括:
识别 9 的信息 的配置参数设备的拓扑结构以及特性

对于嵌入式系统,在系统启动阶段, 会加载内核并将控制权转交给内核,此外,还需要把上述
的三个参数信息传递给 $,以便 $ 可以有较大的灵活性。在 4$ 中,%,& 的设计目标就
是如此。
二、dts 基本知识
2.1 dts 加载过程
如果要使用 %,&,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成 %,
& :。通过 %&*(%,&*),可以将这些适合人类阅读的 %,& : 变成适合
机器处理的 %,&:(有一个更好听的名字,%&,,)。在系统启动的时候,
(例如::0、)可以将保存在 @7 中的 %& 到内存(当然也可以通过其他方式,
例如可以通过 的交互式命令加载 %&,或者 :0 可以探测到 , 的信息,组织成 %& 保存在
内存中),并把 %& 的起始地址传递给 (例如 2'$, 或者其他特殊功能的程序)。
对于计算机系统( ),一般是 :0!A!A2',对于嵌入式系统,一般是 !
A2'。
在高通 )## 平台:
将烧写在 中的 进行读取和处理,获得 9 和 ' ,如果没有 *%& 分区,那么就
使用代码里配置的 ,存入共享内存;
$ 将从共享内存中获得 9 和 ' 进行相应处理,确定 ,然后选择一个对应的 +所有
保存在 中-从 中读进内存地址 7!A.,这个参数会传递给 $;
$ 通过传入的 地址进行设备的创建。
2.2 dts 描述信息
%,& 由一系列被命名的结点()和属性()组成,而结点本身可包含子结点。所谓属性,
其实就是成对出现的 和 , 。在 %,& 中,可描述的信息包括(原先这些信息大多被 7 到
$ 中):
*B 的数量和类别
内存基地址和大小
总线和桥

外设连接
中断控制器和中断使用情况
<C2 控制器和 <C2 使用情况
*$ 控制器和 *$ 使用情况
它基本上就是画一棵电路板上 *B、总线、设备组成的树, 会将这棵树传递给内核,然后内核
可以识别这棵树,并根据它展开出 4 内核中的 9.,、.、., 等设备,而这些设备
用到的内存、C6D 等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。
是否 %,& 要描述系统中的所有硬件信息?答案是否定的。基本上,那些可以动态探测到的设备是不
需要描述的,例如 B',。不过对于 '2* 上的 7,它是无法动态识别的,需要在 ,
中描述。同样的道理,在 中,*C, 可以被动态探测到,不需要在 , 中描述,但
是 *C 如果不能被探测,那么就需要描述之。
文件是一种 5'*CC文本格式的 %,& 描述,此文本格式非常人性化,适合人类的阅读习惯。基本上,
在 56/ 4 在,一个 文件对应一个 56/ 的 7,一般放置在内核的 78888目录。由于一
个 '* 可能对应多个 7(一个 '* 可以对应多个产品和电路板),势必这些 文件需包含许多共同的部
分, 4 内核为了简化,把 '* 公用的部分或者多个 7 共同的部分一般提炼为,类似于 * 语言的头
文件。其他的 7 对应的 就 这个。
56/ 4在,一个文件对应一个 56/的 7,一般放置在内核的 78888目录。 目前在
中想使用到的宏定义都放在 目录下。
譬如在 78888;8目录下,高通的很多 都 了 $ 或者 $。
对于 #1在!#4! 中就包含了8 8E!#4E
当然,和 * 语言的头文件类似, 也可以 其他的,譬如几乎所有的 56/'* 的 都引用了
$,即F E$
或者 8 8E$E
Binding
对于 %,& 中的结点和属性具体是如何来描述设备的硬件细节的,
一般需要文档来进行讲解,文档的后缀名一般为4。
这些文档位于内核的 % 8,8 目录,其下又分为很多子目录。
每一个设备都有相对应的初始化程序, 的写法可以参照 下面的文档
设备树节点信息在"kernel/Documentation/devicetree/bindings/
正常情况下所有的 文件以及 文件都含有一个根节点”8,这样 之后就会造成有很多个“根节
点”。按理说, 既然是一个树,那么其只能有一个根节点,所有其他的节点都是派生于根节点的 7
。其实 %,&* 会对 %&' 的 进行合并,最终生成的 %& 中只有一个
, 的基本单元是 。这些 被组织成树状结构,除了 ,每个 都只有一个
。一个 , 文件中只能有一个 。每个 中包含了若干的 8, 来描述该
的一些特性。每个 用节点名字()标识,节点名字的格式是 ! !。如果该
没有 属性(后面会描述这个 ),那么该节点名字中必须不能包括和 !。 !
的具体格式是和设备挂在那个 上相关。例如对于 ,其 ! 就是从 开始编址,依次加一。
而具体的设备,例如以太网控制器,其 ! 就是寄存器地址。 的 是确定的,必须

是“8。
在一个树状结构的 , 中,如何引用一个 呢?要想唯一指定一个 必须使用 7,例如
8!!8!!8!!G
设备树框架
设备树用树状结构描述设备信息,它有以下几种特性
每个设备树文件都有一个根节点,每个设备都是一个节点。
节点间可以嵌套,形成父子关系,这样就可以方便的描述设备间的关系。
每个设备的属性都用一组 对键值对来描述。
每个属性的描述用;结束
所以,一个设备树的基本框架可以写成下面这个样子,一般来说,/表示板子,它的子节点 node1 表示 SoC 上的某
个控制器,控制器中的子节点 node2 表示挂接在这个控制器上的设备(们)。
/{ 根节点
node1{ 是节点名,是的子节点
key=; 的属性
...
node2{ 是 的子节点
key=; 的属性
...
}
} 的描述到此为止
node3{
key=;
...
}
}
剩余46页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0