没有合适的资源?快使用搜索试试~ 我知道了~
首页ARM_Device_Tree 设备树
资源详情
资源评论
资源推荐
ARM$Linux&设备树(Device&Tree)&
宋宝华!Barry!Song!<21cnbao@gmail.com>!
1. ARM&Device&Tree 起源&
Linus Torvalds 在 2011 年 3 月 17 日的 ARM Linux 邮件列表宣称“this whole ARM thing
is a f*cking pain in the ass”,引发 ARM Linux 社区的地震,随后 ARM 社区进行了一系列
的重大修正。在过去的 ARM Linux 中,arch/arm/plat-xxx 和 arch/arm/mach-xxx 中充斥着大
量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不
过是垃圾,如板上的 platform 设备、resource、i2c_board_info、spi_board_info 以及各种硬
件的 platform_data。读者有兴趣可以统计下常见的 s3c2410、s3c6410 等板级目录,代码量
在数万行。
社区必须改变这种局面,于是 PowerPC 等其他体系架构下已经使用的 Flattened Device
Tree(FDT)进入 ARM 社区的视野。Device Tree 是一种描述硬件的数据结构,它起源于
OpenFirmware (OF)。在 Linux 2.6 中,ARM 架构的板极硬件细节过多地被硬编码在
arch/arm/plat-xxx 和 arch/arm/mach-xxx,采用 Device Tree 后,许多硬件的细节可以直接透
过它传递给 Linux,而不再需要在 kernel 中进行大量的冗余编码。
Device Tree 由一系列被命名的结点(node)和属性(property)组成,而结点本身可包
含子结点。所谓属性,其实就是成对出现的 name 和 value。在 Device Tree 中,可描述的信
息包括(原先这些信息大多被 hard code 到 kernel 中):
CPU 的数量和类别
内存基地址和大小
总线和桥
外设连接
中断控制器和中断使用情况
GPIO 控制器和 GPIO 使用情况
Clock 控制器和 Clock 使用情况
它基本上就是画一棵电路板上 CPU、总线、设备组成的树,Bootloader 会将这棵树传
递给内核,然后内核可以识别这棵树,并根据它展开出 Linux 内核中的 platform_device、
i2c_client、spi_device 等设备,而这些设备用到的内存、IRQ 等资源,也被传递给了内核,
内核会将这些资源绑定给展开的相应的设备。
2. Device&Tree 组成和结构&
整个 Device Tree 牵涉面比较广,即增加了新的用于描述设备硬件信息的文本格式,又
增加了编译这一文本的工具,同时 Bootloader 也需要支持将编译后的 Device Tree 传递给
Linux 内核。
DTS (device tree source)
.dts 文件是一种 ASCII 文本格式的 Device Tree 描述,此文本格式非常人性化,适合人
类的阅读习惯。基本上,在 ARM Linux 在,一个.dts 文件对应一个 ARM 的 machine,一般
放置在内核的 arch/arm/boot/dts/目录。由于一个 SoC 可能对应多个 machine(一个 SoC 可
以对应多个产品和电路板),势必这些.dts 文件需包含许多共同的部分,Linux 内核为了简
化,把 SoC 公用的部分或者多个 machine 共同的部分一般提炼为.dtsi,类似于 C 语言的头
文件。其他的 machine 对应的.dts 就 include 这个.dtsi。譬如,对于 VEXPRESS 而言,
vexpress-v2m.dtsi 就被 vexpress-v2p-ca9.dts 所引用, vexpress-v2p-ca9.dts 有如下一行:
/include/ "vexpress-v2m.dtsi"
当然,和 C 语言的头文件类似,.dtsi 也可以 include 其他的.dtsi,譬如几乎所有的 ARM
SoC 的.dtsi 都引用了 skeleton.dtsi。
.dts(或者其 include 的.dtsi)基本元素即为前文所述的结点和属性:
/ {
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
上述.dts 文件并没有什么真实的用途,但它基本表征了一个 Device Tree 源文件的结构:
1 个 root 结点"/";
root 结点下面含一系列子结点,本例中为"node1" 和 "node2";
结点"node1"下又含有一系列子结点,本例中为"child-node1" 和 "child-node2";
各结点都有一系列属性。这些属性可能为空,如" an-empty-property";可能为字符串,
如"a-string-property";可能为字符串数组,如"a-string-list-property";可能为 Cells(由 u32
整数组成),如"second-child-property",可能为二进制数,如"a-byte-data-property"。
下面以一个最简单的 machine 为例来看如何写一个.dts 文件。假设此 machine 的配置如
下:
1 个双核 ARM Cortex-A9 32 位处理器;
ARM 的 local bus 上的内存映射区域分布了 2 个串口(分别位于 0x101F1000 和
0x101F2000)、GPIO 控制器(位于 0x101F3000)、SPI 控制器(位于 0x10170000)、中
断控制器(位于 0x10140000)和一个 external bus 桥;
External bus 桥上又连接了 SMC SMC91111 Ethernet(位于 0x10100000)、I
2
C 控制器
(位于 0x10160000)、64MB NOR Flash(位于 0x30000000);
External bus 桥上连接的 I
2
C 控制器所对应的 I
2
C 总线上又连接了 Maxim DS1338 实时
钟(I
2
C 地址为 0x58)。
其对应的.dts 文件为:
/ {
compatible = "acme,coyotes-revenge";
#address-cells = <1>;
#size-cells = <1>;
interrupt-parent = <&intc>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = "arm,cortex-a9";
reg = <0>;
};
cpu@1 {
compatible = "arm,cortex-a9";
reg = <1>;
};
};
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>;
};
spi@10115000 {
compatible = "arm,pl022";
reg = <0x10115000 0x1000 >;
interrupts = < 4 0 >;
};
external-bus {
#address-cells = <2>
#size-cells = <1>;
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
ethernet@0,0 {
compatible = "smc,smc91c111";
reg = <0 0 0x1000>;
interrupts = < 5 2 >;
};
i2c@1,0 {
compatible = "acme,a1234-i2c-bus";
#address-cells = <1>;
#size-cells = <0>;
reg = <1 0 0x1000>;
interrupts = < 6 2 >;
rtc@58 {
compatible = "maxim,ds1338";
reg = <58>;
interrupts = < 7 3 >;
};
};
flash@2,0 {
compatible = "samsung,k8f1315ebm", "cfi-flash";
reg = <2 0 0x4000000>;
剩余11页未读,继续阅读
木木总裁
- 粉丝: 241
- 资源: 44
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
- MW全能培训汽轮机调节保安系统PPT教学课件.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0