设备树常用of函数

本文详细介绍了在设备驱动开发中如何利用设备树(Device Tree)进行操作,包括查找设备节点、获取属性值、读取节点数据等关键函数的使用,如of_find_property、of_get_property、of_get_named_gpio等。同时讲解了如何通过of_device_id匹配表找到兼容的设备节点,并进行内存映射等操作,对于理解设备驱动与硬件交互具有重要作用。
摘要由CSDN通过智能技术生成

一、常见的of函数解析

of_find_property
找到节点中的属性,参数name代表属性名;参数lenp保存属性值的长度
struct property *of_find_property(const struct device_node *np, const char *name, int *lenp)

of_get_property
通过给定的设备节点和属性名字得到value值
函数原型:
const void *of_get_property(const struct device_node *np,const char *name,int *lenp)

of_get_name_gpio
np:设备节点指针
propname:属性名字
index:gpio引脚编号
成功:得到gpio编号,失败:负数,绝对值是错误编码
int of_get_named_gpio(struct device_node *np,const char *propname,int index)

of_find_node_by_path
根据路径查找结点,参数path取值"/“对应根节点,”/memory"对应memory节点,以此类推
struct device_node *of_find_node_by_path(const char *path)

of_find_compatible_node
根据 compatible 找到节点,参数 from 表示从哪个节点开始找,传入NULL则为根节点;参数type一般取NULL(一般无type属性)
struct device_node *of_find_compatible_node(struct device_node *from, const char *type, const char *compat)

of_get_parent
找到节点的父节点

of_property_read_u32/u64
读取u32/u64整数
参数 propname 表示需要读取的属性名;参数 out_value 保存读取的值
int of_property_read_u32(const struct device_node *np, const char *propname, u32 *out_value)
int of_property_read_u64(const struct device_node *np, const char *propname, u64 *out_value)

of_property_read_variable_u8/u16/u32/u64_array
参数sz_min与sz_max用以限制值的长度,如果不满足两者,则一个数都读不到

int of_property_read_variable_u8_array(const struct device_node *np,
					const char *propname, u8 *out_values, size_t sz_min, size_t sz_max);
int of_property_read_variable_u16_array(const struct device_node *np,
					const char *propname, u16 *out_values, size_t sz_min, size_t sz_max);
int of_property_read_variable_u32_array(const struct device_node *np,
					const char *propname, u32 *out_values, size_t sz_min, size_t sz_max);
int of_property_read_variable_u64_array(const struct device_node *np,
					const char *propname, u64 *out_values, size_t sz_min, size_t sz_max);

of_property_read_string
//读取字符串

int of_property_read_string(const struct device_node *np, const char *propname, const char **out_string);

参数propname表示需要读取的属性名;参数out_string保存读取的字符串

如何在驱动中获取设备节点
struct device_node *node = pdev->dev.of_node;
pdev的dev成员中的of_node成员就代表了设备节点

const void *of_device_get_match_data(const struct device *dev)

功能:通过设备节点,获取设备节点里面的data属性,如下:

static const struct of_device_id mv88e6xxx_of_match[] = {
	{
		.compatible = "marvell,mv88e6085",
		.data = &mv88e6xxx_table[MV88E6085],
	},
	{ /* sentinel */ },
}

dev:设备节点
返回值:没有data则返回NULL,成功则返回data

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

功能:函数通过 device_type 属性查找指定的节点
from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。
type:要查找的节点对应的 type 字符串,也就是 device_type 属性值。
返回值:找到的节点,如果为 NULL 表示查找失败。

of_find_matching_node_and_match
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)

功能:通过 of_device_id 匹配表来查找指定的节点
from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。
matches:of_device_id :匹配表,也就是在此匹配表里面查找节点。
match:找到的匹配的 of_device_id。
返回值:找到的节点,如果为 NULL 表示查找失败

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

功能:根据 device_type 和 compatible 这两个属性查找指定的节点
from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。
type:要查找的节点对应的 type 字符串,也就是 device_type 属性值,可以为 NULL,表示忽略掉 device_type 属性。
compatible:要查找的节点所对应的 compatible 属性列表。
返回值:找到的节点,如果为 NULL 表示查找失败

of_get_parent
struct device_node *of_get_parent(const struct device_node *node)
功能:查找当前节点的父节点
参数:
node:当前节点
返回值:
找到的父节点

of_property_count_elems_of_size

此函数用于获取属性中元素的数量,比如reg 属性值是一个数组

那么使用该函数可以获取到这个数组的大小
参数:
np:设备节点
propname:需要统计元素数量的属性名字
elem_size:元素长度
返回值:得到属性元素的数量

of_property_read_u32_index
功能:从属性中获取指定标号的u32类型的数据值(无符号32位),比如某个属性有多个
u32类型的值,可以使用此函数获取指定标号的数据值
int of_property_read_u32_index(const struct device_node *np,const char *propname,u32 index,u32 *out_value)
参数:
np:设备节点
propname:要读取的值标号
out_value:读取到的值
返回值:0表示成功 负值:读取失败

of_property_read_string
int of_property_read_string(struct device_node *np,const char *propname,const char **out_string)
参数:
np 设备节点
propname 读取的属性名字
out_string 读取到的字符串值
返回值:
0 表示成功
负数 读取失败

of_n_addr_cells

int of_n_addr_cells(struct device_node *np)

用于获取#address_cells 属性值
参数:
	np设备节点
获取的

of_n_size_cells
int of_n_size_cells
功能:获取到#size-cells 属性值
返回值:获取到#size-cells 属性值

const u32 *of_get_address(struct device_node *dev,int index,u64 *size,unsigned int *flasg)
参数:
dev 设备节点
index:要读取的地址标号
size:地址长度
flag:参数,IORESOURCE_IO IORESOURCE_MEM

of_iomap
void _iomem *of_iomap(struct device_node *np,int index)
功能:
np 设备节点
index:reg属性中要完成的内存映射的段,如果reg属性只有一段的话index就设置为0
返回值:
经过内存映射后的虚拟内存首地址,如果NULL表示内存映射失败

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值