6ull Linux驱动开发笔记(三)设备树

1、简介

设备树是一个描述设备信息如CPU数量、外设、内存等的树型结构文件。语法类似css

根节点:

/ {
    //属性......
	//一级子节点......
};

节点格式:

	标号 : 节点名@地址{
		//属性......
		//子节点......
	};

" & "的作用:

​ ” & “表示追加。加在节点名前,表示追加该节点的内容。如追加相同属性内容则会覆盖之前内容。

	&标号(节点名){
		//属性......
		//子节点......
	};



2、特殊节点



3、常用属性

compatible 属性

compatible 属性的值是一个字符串列表,compatible 属性用于将设备和驱动绑定起来。

compatible = "manufacturer,model","manufacturer2,model2";

manufacturer 表示厂商,model 一般是模块对应的驱动名字。

#address-cells和#size-cells属性

#address-cells 和**#size-cells**用于描述子节点的地址信息。#address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位),#size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。

reg = <address1 length1 address2 length2 address3 length3……> //reg属性格式

如#address-cells = <1>,#size-cells = <0>,说明子节点 reg 属性中起始地址所占用的字长为 1,地址长度所占用的字长为 0。没有 length 的值,相当于设置了起始地址,而没有设置地址长度。

reg 属性

reg 属性的值一般是(address,length)对。reg 属性一般用于描述设备地址空间资源信息。

reg = < 0X020C406C 0X04 	/* CCM_CCGR1_BASE */
		0X020E0068 0X04 	/* SW_MUX_GPIO1_IO03_BASE */
		0X020E02F4 0X04 	/* SW_PAD_GPIO1_IO03_BASE */
		0X0209C000 0X04 	/* GPIO1_DR_BASE */
		0X0209C004 0X04 >; 	/* GPIO1_GDIR_BASE */

model 属性

model 属性值是一个字符串,一般 model 属性描述设备模块信息。

model = "mpu6050-imu";

status 属性

描述设备状态,字符串类型;

可选的状态如表所示:

描述
“okay”表明设备是可操作的。
“disabled”表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。
“fail”表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
“fail-sss”含义和“fail”相同,后面的 sss 部分是检测到的错误内容。

ranges 属性

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

矩阵,ranges 是一个地址映射/转换表,ranges 属性每个项目由子地址、父地址和地址空间长度

这三部分组成:

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

所占用的字长。

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

理地址所占用的字长。

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

如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换。



4、OF函数

​ 既然有了设备树描述的设备信息,那么就应有提取信息的函数。于是OF函数就解决这一问题的。

of_find_node_by_name

of_find_node_by_name 函数通过节点名字查找指定的节点。

struct device_node *of_find_node_by_name(struct device_node *from,const char *name);

from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。

name:要查找的节点名字。

**返回值:**找到的节点,如果为 NULL 表示查找失败。

of_find_node_by_type

of_find_node_by_type 函数通过 device_type 属性查找指定的节点。

struct device_node *of_find_node_by_type(struct device_node *from, const char *type)

from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。

type:要查找的节点对应的 type 字符串,也就是 device_type 属性值。

**返回值:**找到的节点,如果为 NULL 表示查找失败。

of_find_compatible_node

of_find_compatible_node 函数根据 device_type 和 compatible 这两个属性查找指定的节点

struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compatible)

from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。

type:要查找的节点对应的 type 字符串,也就是 device_type 属性值,可以为 NULL,表示忽略掉 device_type 属性。

compatible:要查找的节点所对应的 compatible 属性列表。

**返回值:**找到的节点,如果为 NULL 表示查找失败

of_find_matching_node_and_match

of_find_matching_node_and_match 函数通过 of_device_id 匹配表来查找指定的节点

struct device_node *of_find_matching_node_and_match(struct device_node *from,const struct of_device_id *matches,const struct of_device_id **match)

from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。

matches:of_device_id 匹配表,也就是在此匹配表里面查找节点。

match:找到的匹配的 of_device_id。

**返回值:**找到的节点,如果为 NULL 表示查找失败

of_find_node_by_path

of_find_node_by_path 函数通过路径来查找指定的节点。

inline struct device_node *of_find_node_by_path(const char *path)

path:带有全路径的节点名,可以使用节点的别名,比如“/backlight”就是 backlight 这个节点的全路径。

**返回值:**找到的节点,如果为 NULL 表示查找失败





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值