一,
由于每个制造商的平台不同,每个制造商可能都有自己的触发器信息目录下,如果是/arch/arm/arch-中的触发器信息,则有很多重复的代码
目的:加快linux内核的bsp开发,以避免各厂商代码重复(注: bsp :board support packge ) )。
设备树:描述板硬件信息的数据结构
文件(二进制文件)在lk (引导装载器)中不同)加载相应的)内核。
内容: dts源文件--------DTC编译生成--------dtb文件-----------可以用引导装载器加载到内核中。
源文件:包含cpu总线、串行端口、物理内存、GPIO控制器等信息。 (类似于以前的扳机信息mach-xxx。 )
从open firmware派生的
lk--引导内核对该文件结构进行适当的文件语法分析,并且当内核启动时,一些适当的设备可以获得适当的触发信息。 mach-xxx都是垃圾,实际使用的是/arch/arm/boot/dts
二、
设备树和以前的触发信息mach-xxx的区别
probe函数配置(总线、设备、驱动程序三者之间的绑定)匹配不同
设备树: of _ match _ table=qup _ I2C _ dt _ match,的。 兼容性值匹配。
以前的扳机信息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函数获取平台数据
s3c 24 xx _ uda 134 x _ L3 _ pins=pdev-dev.platform _ data;
. platform _ data=mini 2440 _ audio _ pins,
静态结构3c 24 xx _ uda 134 x _ platform _ data mini 2440 _ 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一起识别机器(板)
过程:在加载linux内核的过程中,bootloader会将设备树的二进制文件复制或复制到内存中,并在加载linux内核时解析设备树的DTB文件。 主要由勇敢的LK传递的参数(r0、r1、r2寄存器)分别为r0、r1:机器码、machinetyppper
以前没有设备数时是TAGLIST的地址
加载linux后,内核会将设备树(dtb )文件分析或扩展到) device_node结构列表。 然后,进行一系列操作(总线设备驱动程序注册)。
如何生成结构列表(设备节点) )
用driver/of/fdt.c中名为of_fdt_unflatten_tree的函数
linux如何执行一系列操作
在我们系统的初始化过程中,平台总线上的设备-------API接口-----与驱动程序/of/platform.c相对应的of_platform_populate
设备树是哪种文件格式
加载过程中内核为裸机代码。 每个程序都在硬件上运行。
如果是程序,就必须配置内存、缓存、中断、终端打印等信息
这个布局由谁来完成
所有操作都是对处理器寄存器的操作。 要写多久? 地址是多少? 这个时候linux必须知道这个数据。 linux是怎么知道这个数据的? 没有设备树的时代:指定在内核代码中写入代码的数据。 存储器(如果存在设备树,则将字节数据结构(dtb )复制到RAM ();已知将物理存储器传递到linux内核) )从标准平台接口获取
一个设备树DTB对应于一个触发信息
文件DTS-源文件DTSI头文件DTB---源代码由DTC编译生成的二进制文件