设备树常用of函数

一、常见的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
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Linux内核中,可以使用 `devm_gpio_request()` 函数来请求一个GPIO资源,然后使用 `gpio_to_desc()` 函数将GPIO号转换为GPIO描述符,最后使用 `gpio_desc_to_chip()` 函数获取描述符对应的GPIO控制器,从而获取设备中的GPIO号。 具体的代码实现如下: ```c #include <linux/gpio/driver.h> static int my_probe(struct platform_device *pdev) { int ret; struct gpio_desc *desc; struct gpio_chip *gpio_chip; /* 请求GPIO资源 */ ret = devm_gpio_request(&pdev->dev, MY_GPIO, "my-gpio"); if (ret < 0) return ret; /* 将GPIO号转换为GPIO描述符 */ desc = gpio_to_desc(MY_GPIO); /* 获取GPIO描述符对应的GPIO控制器 */ gpio_chip = gpio_desc_to_chip(desc); /* 获取设备中的GPIO号 */ int dt_num = of_get_gpio_count(pdev->dev.of_node); if (dt_num > 0) { int dt_gpio = of_get_gpio(pdev->dev.of_node, 0); if (dt_gpio >= 0) { int gpio_num = gpio_chip->base + dt_gpio; printk(KERN_INFO "Device tree GPIO number: %d\n", gpio_num); } } return 0; } static const struct of_device_id my_of_match[] = { { .compatible = "my-device" }, { }, }; MODULE_DEVICE_TABLE(of, my_of_match); static struct platform_driver my_driver = { .probe = my_probe, .driver = { .name = "my-device", .of_match_table = my_of_match, }, }; module_platform_driver(my_driver); ``` 其中,`MY_GPIO` 是在设备中定义的GPIO号,可以在设备中使用 `gpio` 属性进行定义和配置。当设备中定义了GPIO号时,`of_get_gpio_count()` 函数返回的值大于0,可以使用 `of_get_gpio()` 函数获取GPIO号。最后需要计算出实际的GPIO号,即 `gpio_chip->base + dt_gpio`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值