-
一
arm-
linux
内核设备树来源
在
过
去
的
arm-li
nux
内
核
源
码
树
中
arch/arm/plat-
xxx
和
arch/arm/mach-xxx
等目录下边充斥着大量的垃圾代码,相当多数的
代码只是在描述板级细节信息
,
而这些板级细节信息对于内核来说都
是垃圾代码,
比如板上的
platform_device
、
resource
、
i2c_board_info
、
spi_board_info
以及各种硬件的
platform_data.
为了改变这种局面,
ARM
社区开始使用
PowerPC
p>
等其他体系架
构下已经使用的
Flatte
ned
Device
Tree(FDT).
Device
Tree
是一种描述
硬件的数据结构,
它起源于
OpenF
irmware(OF).
采用
Device Tree
后,
许多板级
细节信息可以直接通过
Device
Tree
传递给
linux
内核,
而不
需要在
ar
ch/arm/plat-
xxx
和
arch/arm/mach-xxx
中进行大量的冗余编
码,内核启动时会展开
Devic
e
Tree
并创建和注册相关的设备
(
比如
platform_device
,
i2c_client
,
spi_
device)
,
同时驱动程序也会以新的方
< br>式和
Devie
Tree
中定义的设备结点进行匹配
. Device Tre
e
的主要优势:
对于相同
SOC
的不同板卡,
只需更换设备树文件
.dtb<
/p>
即可实现不同板
卡的无差异支持
二
arm-
linux
内核设备树简介
Device
Tree
由一系列被命
名的结点
(node)
和属性
(pro
perty)
组成,
而结点本身可包含子结点,所谓属性其实就
是成对出现的
name
和
value.
在
Device
Tree
中可描述的细节信息包括
system runtime
参数
(
主要设置
bootargs)
cpu
的数量和类别
memory
基地址和大小
(
设置
DDR
内存
)
总线控制器和桥
总线外设
内核基础设施使用情况,比如:
中断控制器和中断使用情况
DMA<
/p>
控制器和
DMA
使用情况
GPIO
控制器和
GPIO
使用情况
CLOCK
控制器和
ClOCK
使用情况
PINCTRL
控制器和
PINCTR
L
使用情况
从上述信息可知
Device
Tre
e
并不能描述所有硬件信息,一般可以动
态识别的设备
(
如
usb
设备,
p>
pci
设备
)
是不
需要设备树进行描述,
它们
是在设备热插拔时,由内核自动进行
探测
设备树包含
DTC(device tree
compiler)
、
DTS(device tree source)
和
DTB(device tree
binary)
,其对应关系如下图
1
所示:
图
1
下面简单描述
.dts
文件
.dtb
文件和
DTC
.dts
文件是一种
ASCII
文本文件,放置在
arch/arm/boot/dts
目
录
.
由于每个
SOC
< br>可能有多个不同的电路板,每个电路板都有一个
.dts
文件,
这些
.dts
文件势必会存在许多共同部分,
Linux
内核为了简化,
把
SOC
公用的部分或者多个
machine
共同的部分保存到
.dtsi
文件中,
供不同的
.dts
< br>文件引用
.
例如
引用了
,
此时
中会有如下行:
#include
,
告诉
编译器
需要引用
.
类似于
C
语言的头
文件,
.dtsi
也可以
include
其他的
.dtsi
,例如几乎所有
ARM SOC
的
.dtsi
都引用了
DTC
为编译工具,它可以将
.dts
文件编译成
.dtb
文件,
DTC
的源
码位于
scr
ipts/dtc
目录,
在内核
arc
h/arm/boot/dts/Makefile
中,
描述
了某个
SOC
被选中后,哪些
.dtb
文件会被编译出来,
例如与
VEXPRESS
对应的
.dtb
包括:
dtb-$$(CONFIG_ARCH_VEXPRESS) +=
从
上述
Makefile
可知,若选择
C
ONFIG_ARCH_VEXPRESS
,上述
.dtb
文件,都会从对应的
.dts
文件编译生成
bootloader
在引导内核时,会预先读取
.dtb
文件到内存,
进而由
内核解析
三
arm-
linux
内核设备树语法
下面以最简单的
machine
为例来看如何编写
.dts
文件,假设此
machine
的配置如下:
双核
ARM
Cortex-A9
处理器
2
p>
个串口
(
分别位于
0x101F1000
和
0x101F2000)
GPIO
控制器
(
< br>位于
0x101F3000)
SPI
控制器
(
位于
0x101F4
000)
I2C
控制器
(
位于
0x101F5000)
I2C
控制器连接了
maxim
DS1338
实时钟
(i2c
地址为
0x58)
中断控制器
(
位于
0x10100000)
图
2
上图
2
即一个简单的设备树,下面着重分析相关概念
compatible
属性
.dts
文件的每个设备结点,
都有一个
compatible
属性,
该属性用来决定
device_driver
和
dev
ice
的相互匹配
.
compati
ble
是一
个字符串列表,列表的第一个字符串表征了结点所代
表的确切设备,
该字符串的组织形式为:
“
<
制造商
>
,
<
型号
>
”
,其后的字符串则表示
与它兼容的设备
.
如上图
2
所
示串口设备的
compatible
属性为
:
“
ti
,
omap4-uart
”
,表示该设备节点是
omap4
芯片的串口设备
再
比如
飞
思卡尔
mpc8349
芯
片
拥有
一个兼
容
美国国
家半导
体
p>
ns16550
的串口设备,那么该串口设备的
compatible
属性应该是:
-
-
-
-
-
-
-
-
-
上一篇:Java基本数据类型详解——全英文
下一篇:水洗标符号