设备树介绍

一、

由于各个厂家平台不一样,每个厂商可能将自己的扳机信息都放在扳级信息目录下,在/arch/arm/arch-都是扳级信息,就会有很多重复的代码

目的:为了避免各个厂商代码重复,加速linux内核的bsp开发(注:bsp :board support packge)

设备树:就是一个描述板子硬件信息的数据结构

文件(二进制文件)通过lk(bootloader)加载不同(对应的)内核.

内容:dts源文件-----------dtc编译生成------------dtb文件------可通过(bootloader)加载到内核里面去。

源文件:包含cpu总线、串口、物理内存、GPIO控制器等信息等等(类似我们以前的扳机信息 mach-xxx)


基于open firmware衍生而来的


lk--引导内核会对这个文件结构进行相应的文件进行语法解析,内核起来的时候,一些相应的设备,就可以得到相应的扳机信息。mach-xxx都是垃圾,真正用到的是/arch/arm/boot/dts

二、

设备树与以前扳机信息mach-xxx区别

1.进入probe函数配置(总线,设备,驱动三者之间绑定)匹配不同

设备树:of_match_table=qup_i2c_dt_match,中的。compatible的值进行匹配的。

以前的扳机信息 mach-xxx: .driver={

.name ="i2c_qup"

}

通过name进行匹配


进来之后

struct device_node *node = pdev->dev.of_node 对应设备树的那个节点

of_property_read_u32(node,"chocl-frequency",&clk_freq);




2.解析不同

设备数:通过特有的函数接口获取硬件信息


以前的扳机信息

s3c24xx_uda134x_probe函数获取平台数据

s3c24xx_uda134x_l3_pins = pdev->dev.platform_data;

.platform_data = &mini2440_audio_pins,

static struct s3c24xx_uda134x_platform_data mini2440_audio_pins = {
.l3_clk = S3C2410_GPB(4),
.l3_mode = S3C2410_GPB(2),
.l3_data = S3C2410_GPB(3),
.model = UDA134X_UDA1341
};


3.扳机信息--存放的位置不同

CPU、内存、外设控制器(i2c,spi,i2s)总线,GPIO地址等等


设备树:保存在DTS---编译成DTB二进制文件

存在内存-提供给lk加载到kernel时候将这些硬件信息加载给内核(扳机信息可以独立编译生成)


以前的扳机信息mach-xxx将以前的扳机信息mach-xxx硬件信息编译集成到内核中(必须与内核编译)


如何在linux3.x内核编译设备树

1.设备树的好处

在usage-model.txt(内核源代码中)有这么一句话


第一个是平台验证

第二个是内核运行时候的配置信息?配置什么信息

第三个是平台设备的一些信息


LK一起来识别机器(板子)

过程:bootloader在加载linux内核过程中,设备树二进制文件复制或者拷贝到内存里面去,在加载linux内核的时候,就会解析设备树DTB文件,主要勇敢LK传过来的参数(r0,r1,r2寄存器)分别是r0是0,r1:机器码,machine type number  r3:设备树编译后生成二进制文件在内存中的RAM的物理地址。


以前没有设备数的时候为TAGLIST的地址

假如linux加载完的那瞬间,内核就会将设备树(dtb)文件--解析或者扩展成为(device_node)结构体列表。然后进行一系列的操作(bus device driver注册)


如何生成结构体列表(device node)

通过driver/of/fdt.c中的of_fdt_unflatten_tree这个函数


linux如何对它进行一系列的操作

在我们系统初始化过程中,就会初始化平台总线上的设备------对应API接口-----driver/of/platform.c的of_platform_populate这个函数----将结构体列表(device_node)转换为平台设备的数据加载到平台总线上的device链表中去。


设备树是什么文件格式

在加载过程中内核也就是一个裸机代码(任何一个程序都是在硬件上跑的)

只要是程序,那么就必须要配置内存,cache,中断,终端打印等等信息

这个配置是谁来完成呢

所有的操作无非就是对处理器寄存器的操作。要写多大??地址是多少??这个时候linux必须要知道这个数据。linux如何知道这个数据??没有设备树的时代:内核代码中指定代码写好的数据。有设备树时将字节数据结构(dtb)复制到RAM(已经知道内存---物理内存给linux内核) 通过标准的平台接口获取等等


一个设备树DTB对应一个扳机信息


文件DTS-源码  文件DTSI头文件  文件DTB---源码通过DTC编译生成的二进制文件











  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值