Linux设备树学习日记(一)设备树简单介绍

一、linux设备树简介

1.    设备树是一种描述硬件的数据结构,它起源于openfirmware,采用设备树后,许多硬件的细节可以直接通过它传递给linux,而不需要在内核中进行大量冗余编码。

 

2.    设备树由一系列被命名的节点(Node)和属性(property)组成,而节点本身可包含于子节点。所谓属性,其实就是成对出现的名称和值。在设备树中,可描述的信息包括(原先这些信息大多被硬编码在内核中):

(1)    CPU的数量和类别。

(2)    内存基地址和大小。

(3)    总线和桥。

(4)    外设连接。

(5)    中断控制器和中断使用情况。GPIO控制器和GPIO使用情况。

(6)    时钟控制器和时钟使用情况。

它基本上就是画一棵电路板上CPU、总线、设备组成的树,BootLoader会将这棵树传递给内核,然后内核可以识别这棵树。并根据它展开出linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。

 

3.    DTC是将.dts编译为.dtb的工具。DTC的源代码位于内核的script/dtc目录中。在linux内核的arch/arm/boot/dts/Makefile中,描述了当某种SOC被选中后,哪些.dtb文件会被编译出来。在linux下,我们可以运行make dtbs单独编译设备树文件。DTC除了可以编译.dts文件以外,也可以“反汇编”.dtb文件为.dts文件,其指令格式为:

./script/dtc/dtc -I dtb -O dtb -o dts xxx.dtsarch/arm/boot/dts/xxx.dtb

 

4.    文件.dtb是.dts被DTC编译后的二进制格式的设备树描述,可由linux内核解析,当然u-boot这样的BootLoader也是可以识别.dtb的。通常我们在为电路板制作NAND、SD启动映像时,会为.dtb文件单独留下一个很小的区域以存放之,之后BootLoader在引导内核的过程中,会先读取该.dtb到内存。也可以直接把.dtb文件和zImage绑定在一起做成一个映像文件,当然内核编译时要能支持CONFIG_ARM_APPENDED_DTP这个选项,以支持“Use appendeddevice tree blob to zImge”

二、linux设备树常用API

a)     #define for_each_child_of_node(parent, child);遍历parent下的所有子节点。

b)     static inline int of_get_gpio_flags(structdevice_node *np, int index,                 enum of_gpio_flags *flags);获取对应GPIO口的值

c)     unsigned int irq_of_parse_and_map(structdevice_node *dev, int index);解析中断,实际上是从.dts中的interrupts属性里解析出中断号,若设备使用了多个中断,index指定中断的索引号。

d)     struct device_node *of_find_compatible_node(structdevice_node *from,

const char *type, const char *compat);根据兼容性,获得设备节点。遍历设备树中的设备节点,看看哪个节点的类型、兼容属性与本函数的输入参数匹配,在大多数情况下,from、type为NULL,则表示遍历了所有的节点。

e)     static inline int of_property_read_s32(conststruct device_node *np,

const char *propname, s32 *out_value);读取设备节点np的属性名,为propname,属性类型为32位整型数组。

f)      const void *of_get_property(conststruct device_node *np, const char *name,

 int *lenp);在节点node中找到name的属性并返回它的值。

g)     static inline intof_get_child_count(const struct device_node *np);获得子节点的数量

如有不当之处请指正,转载请注明出处。


你可能感兴趣的:(linux设备树)