注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
dingguanliang的个人空间
https://home.eeworld.com.cn/space-uid-432437.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
设备树
已有 1162 次阅读
2015-12-2 13:12
1、起源:由于各家厂商重复添加代码到linux kernel中,导致内核充斥着大量重复代码。在linus爆发后,arm linux社区在linux kernel 3.1.y左右版本后,引进了其他体系(PowerPC:
Flattened Device Tree)的
设备树结构。
2、变化:
a、添加描述设备的配置文本(.dts)。
b、添加对配置文本解析的工具(dtc),将.dts编译成.dtb,.dtb可以单独编译,编译完成后可以追加到bootload或kernel镜像的后面 。
c、bootload需要传递设备树参数给内核。即从某个地址搬运.dtb到内存中,然后将地址传递给内核。
3、.dts与machine:.dts与machine的关系一般是一一对应。如果多个machine有共享的数据,则可以合成.dsti,相当于c语言的头文件。其他.dts要用的时候直接include就行。
4、.dts格式:.dts文件包含了节点和属性。节点可以包含子节点(形成树的结构)。节点表示machine上面的一个device,如:cpu, ram或rom。属性表示device的各种资源,由name和value组成。
例:ARM的local bus上内存映射区域分布了2个串口(分别位于0x101F1000 和0x101F2000)、GPIO控制器(位于0x101F3000)、SPI控制器(位于0x10170000)、中断控制器(位于0x10140000)和一个external bus桥;
External bus桥上又连接了SMC SMC91111 Ethernet(位于0x10100000)、I2C控制器(位于0x10160000)、64MB NOR Flash(位于0x30000000);
External bus桥上连接的I2C控制器所对应的I2C总线上又连接了Maxim DS1338实时钟(I2C地址为0x58)。
/ {
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>;
};
};
};
5、编译成dtb后组织结构为:
file:///C:/Users/guanliang%20ding/AppData/Local/YNote/data/smart_john_ding@163.com/b26333ec6fcd424185d081430628657c/clipboard.png
注:
1、节点与具体设备一一对应。如总线控制器下挂载多个从设备。就会有控制器节点和从设备节点。
2、具体配置参考内核doc。路径:Documentation/devicetree/bindings。
3、由于设备树和内核分开编译。所以极大的增加了内核的灵活性。某些情况下不需要重新编译内核就能将内核移植到另一个平台上。即平台管脚和内存布局定义相同,差别的只是资源在系统中的位置。这类设备的显著特点是同一个厂商。
4、设备树是从各类驱动中抽象并且分离出来的特性。如平台驱动的struct platform_device、i2c设备的struct i2c_board_info与spi设备的struct spi_board_info。
5、bootload将设备树从flash搬到ram中。然后内核读取设备树后,将其转化成对应的信息存储在/sys文件系统中。接着,驱动加载时,可由驱动或者驱动框架去读取。待驱动注册成功时,设备驱动会在/dev/目录下出现设备名。
6、设备树可以单独编译(# dtc xxx.dtb),也可以在内核中编译(# make xxx.dtb)。运行# make xxx.dtb可以将arch/arm/boot/dtc/中的xxx.dts编译成xxx.dtb。
7、fdt是dt的一种。是一种符合open firmware标准的启动部件。在linux内核中,所有跟fdt有关的函数都会以of_xxx开头。
8、设备树属于一种静态配置资源的方式,不同于x86的动态配置。x86动态配置主要体现在即插即用技术,例如pci总线。另外,还有地址重映射机制。任何地址空间都能动态的映射到cpu总线空间,而在嵌入式中一般是固定的。
9、设备树中的内容。一部分由系统读取,并交给驱动。例如:reg、clk、gpio和interrupt。另外一部分可能由驱动自己去读取。所以,针对不同的设备树,需要根据驱动代码具体分析。
10、一个设备的设备树一般需要创建三个文件。*.h文件定义一些常量,*.dts文件用来放核心部件的配置,*.dtsi用来放外设配置。
本文来自论坛,点击查看完整帖子内容。
收藏
邀请
举报
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
dingguanliang
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
突发!晶圆代工老二“手撕”老大
华为之后,英特尔“杀入”激光雷达领域?
对话技术“大牛”,电子产业走向何方?
短短二十年,这家企业如何逆袭成为传感器行业领头羊!
汽车雷达需求旺盛,射频微波产业迎发展拐点
装修时,买家秀=卖家秀是怎样一种体验?
新增数据手册
AD5242BRU1M
6QDPS-064-06.00-TEU-TBL-1
SIT1602BC-72-30E-66.660000G
SL8A-03-154R-CC
RNC70H2713BRBSL
C1210X7R160-105JP6E
热搜器件
MP6600GR-P
DS10CP152TMAX/NOPB
5SGXEB6R2F40I3N
MRS16000C4023FRP00
TJ1501800000G
RSF100JB-73-3R3
推荐下载
GSM 短消息(PP)协议 (免费分享)
基于双恒流源法的高精度应变测量技术
本系统是以面向对象语言在Delphi 6.0 为前台开发工具
一个多线程web服务器实例(C,Linux,详细的web服务器原理)
火电厂加装低压省煤器经济效益分析
单片机试卷2
推荐关注
《Linux内核深度解析》-系统调用学习
《Linux内核深度解析》-- 内核互斥技术
电池插入检测电路
过孔的设计孔径是真的很重要,但高速先生也是真的不关心
本地匿名化解决方案:隐私保护、自主掌控和高效运行!
移动式电子汽车衡行业数据分析报告2025