设备树一

简介: 设备树一

前言

设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键—值对。节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性是标准属性, Linux 下的很多外设驱动都会使用这些标准属性。


一、compatible 属性

compatible 属性也叫做“兼容性”属性,这是非常重要的一个属性! compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序, compatible 属性的值格式如下所示:

compatible = "manufacturer,model";

其中 manufacturer 表示厂商, model 一般是模块对应的驱动名字。一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设

备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个

驱动。

设备树内容:

pinctrl_key: keygrp {
 fsl,pins = <
 MX6UL_PAD_UART1_CTS_B__GPIO1_IO18 0xF080 /* KEY0 */
 >;
 };
gpio_keys_imxu6ll {
compatible = "atkalpha-key";
gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_key>;
};

获取属性:

static const struct of_device_id gpio_key_tree[] = {
    { .compatible = "atkalpha-key" },
    { },
};
/*
 *数组 gpio_key_tree就是这个驱动文件的匹配表,此匹配表只
 * 有一个匹配值“atkalpha-key”。如果在设备树中有哪个节点
 * 的 compatible 属性值与此相等,那么这个节点就会使用此驱动文件。
 */
/* 1. 定义platform_driver */
static struct platform_driver gpio_key_driver = {
    .probe      = gpio_key_probe,
    .remove     = gpio_key_remove,
    .driver     = {
        .name   = "imx6ull_gpio_key",
        .of_match_table = gpio_key_tree,
    },
};

二、model 属性

model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的,比如:

model = "atkalpha-key";

三、status 属性

status 属性值也是字符串,字符串是设备的状态信息,不同值对应的属性:

“okay” 

表明设备是可操作的。

“disabled” 

表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。

“fail”

表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可

操作。

“fail-sss” 

含义和“fail”相同,后面的 sss 部分是检测到的错误内容。

四、reg,#address-cells 和#size-cells 属性

这两个属性的值都是无符号 32 位整形, #address-cells 和#size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。 #address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位), #size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。 #address-cells 和#size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度, reg 属性的格式一为:

reg = <address1 length1 address2 length2 address3 length3……

每个“address length”组合表示一个地址范围,其中 address 是起始地址, length 是地址长度, #address-cells 表明 address 这个数据所占用的字长, #size-cells 表明 length 这个数据所占用的字长,


五、ranges 属性

ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵,

ranges = <child-bus-address parent-bus-address length>

ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:

child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。

parent-bus-address: 父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。

length: 子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。



目录
相关文章
|
6月前
|
Linux API C语言
设备树知识小全(十):由设备树引发的BSP和驱动变更
设备树知识小全(十):由设备树引发的BSP和驱动变更
87 0
|
3月前
|
Linux SoC
【linux】【设备树】中断描述
【linux】【设备树】中断描述
33 0
|
6月前
|
Ubuntu Linux
编译替换内核_设备树_驱动_IMX6ULL
编译替换内核_设备树_驱动_IMX6ULL
编译替换内核_设备树_驱动_IMX6ULL
|
6月前
|
缓存 Linux API
设备树知识小全(六):设备节点兼容性
设备树知识小全(六):设备节点兼容性
87 0
|
存储 Linux 文件存储
Linux驱动入门(6.1)LED驱动---设备树
Linux驱动入门(6.1)LED驱动---设备树
186 0
|
Linux C语言 开发者
设备树二(一)
设备树二
191 0
|
Linux
设备树二(二)
设备树二(二)
75 0
|
JSON Linux 芯片
linux驱动----设备树
linux驱动----设备树
198 0
|
Linux
Linux驱动开发——(次设备号使用及混杂设备驱动开发)gpio(5)
Linux驱动开发——(次设备号使用及混杂设备驱动开发)gpio(5)
258 0
Linux驱动开发——(次设备号使用及混杂设备驱动开发)gpio(5)