概述
EmbedFire i.MX 6ull开发板学习笔记(七)---of函数
- 一、查询节点的of函数
- 二、查找父/子节点的of函数
- 三、获取属性值的of函数
- 四、其它of函数
Linux定义了大量的函数用于查询,获取设备树的内容,这些函数都是以of开头,所以又称为of函数。定义在include/linux目录下以of开头的头文件,如of.h、of_gpio.h等;以及drivers/of目录下。
便于描述设备中的节点,Linux定义了device_node结构体,定义在include/linux/of.h文件里,一些常用的of函数原型定义也在该文件里。
一、查询节点的of函数
1、
struct device_node *of_find_node_by_name(struct device_node *from, const char *name);
功能:根据节点名称查找节点
from:开始查找的节点,为NULL表示从根节点开始;
name:节点名称,如i2c1;
返回值:找到的节点,未找到为NULL
2、
struct device_node *of_find_node_by_type(struct device_node *from, const char *type);
功能:根据device_type属性值查找节点
from:开始查找的节点,为NULL表示从根节点开始;
type:device_type属性值
返回值:找到的节点,未找到为NULL
3、
struct device_node *of_find_compatible_node(struct device_node *from, const char *type, const char *compat);
功能:根据device_type和compatible属性值查找节点
from:开始查找的节点,为NULL表示从根节点开始;
type:device_type属性值,可为NULL,表示可忽悠;
compat:compatible属性列表;
返回值:找到的节点,未找到为NULL
4、
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:找到的匹配表;
返回值:找到的节点,未找到为NULL
5、
struct device_node *of_find_node_opts_by_path(const char *path, const char **opts);
功能:根据节点路径查找节点
path:节点的全路径,可为别名,如/leds
opts:附加在路径末尾带“:”的部分,即path使用了别名。如路径/cpu/leds/led3:cpu。可为NULL。
返回值:找到的节点,未找到为NULL
6、
struct device_node *of_find_node_by_path(const char *path);
功能:上面of_find_node_opts_by_path(const char *path, const char **opts) opts为NULL即为此函数
path:节点的全路径,可为别名
返回值:找到的节点,未找到为NULL。
7、
struct device_node *of_find_node_by_phandle(phandle handle);
功能:根据节点phandle指令查找节点
handle:指向节点的指针,编译后得到,用于指向&lable
返回值:找到的节点,为找到单位NULL。
8、
struct device_node *of_find_node_with_property(struct device_node *from, const char *prop_name);
功能:根据属性名称查找节点
from:查找的起始节点
prop_name:属性名称
返回值:找到的节点,未找到为NULL
二、查找父/子节点的of函数
1、
struct device_node *of_get_parent(const struct device_node *node);
功能:获取父节点
node:当前节点
返回值:找到的父节点,未找到为NULL。
2、
struct device_node *of_get_next_parent(struct device_node *node);
功能:同of_get_parent(),但无需调用of_node_put()减少节点引用数。
node:当前节点
返回值:找到的父节点,未找到为NULL。
3、
struct device_node *of_get_next_child(const struct device_node *node, struct device_node *prev);
功能:查找子节点
node:当前父节点
prev:子节点的其实位置,可为NULL,表示从第一个子节点开始。
返回值:找到的子节点,未找到为NULL。
4、
struct device_node *of_get_next_available_child(const struct device_node *node, struct device_node *prev);
功能:同of_get_next_child(),但会自动跳过status = "disabled"的节点
node:当前父节点
prev:子节点的其实位置,可为NULL,表示从第一个子节点开始。
返回值:找到的子节点,未找到为NULL。
5、
struct device_node *of_get_compatible_child(const struct device_node *parent, const char *compatible);
功能:根据compatible查找子节点
parent:父节点
compatible:待查找子节点compatible属性值
返回值:找到的子节点,未找到为NULL。
6、
struct device_node *of_get_child_by_name(const struct device_node *node, const char *name);
功能:根据节点名称查找子节点
parent:父节点
name:待查找子节点的名称
返回值:找到的子节点,未找到为NULL
三、获取属性值的of函数
Linux定义property结构体来表示属性值,定义在include/linux/of.h文件。
1、
struct property *of_find_property(const struct device_node *np, const char *name, int *lenp);
功能:根据指定属性名称和属性值长度查找属性
np:待查找的节点
name:属性名称
lenp:属性值的长度
返回值:找到的属性,未找到为NULL
2、
int of_property_count_elems_of_size(const struct device_node *np, const char *propname, int elem_size);
功能:根据指定属性名称获取该属性中元素的数量
np:待查找的节点
propname:属性名称
elem_size:单个元素长度
返回值:属性元素的数量
3、
int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value);
int of_property_read_u64_index(const struct device_node *np,const char *propname, u32 index, u64 *out_value);
功能:根据指定属性名称和索引位置获取属性值(u32或u64类型)
np:待查找的节点
propname:属性名称
index:属性索引位置
out_value:获取到的属性值
返回值:0表示成功;负值,读取失败;-EINVAL 表示属性不存在;-ENODATA 表示没有要读取的数据;-EOVERFLOW 表示属性值列表太小
4、
extern 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);
extern 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);
extern 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);
extern 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);
功能:读取属性中 u8、u16、u32 和 u64 类型的数组数据。
np:np:待查找的节点
propname:属性名称
out_values:获取到的属性值
sz_min:要读取数组元素的最小数量
sz_max:要读取数组元素的最大数量,可为0,表示没有上限
返回值:0,读取成功;负值,读取失败;-EINVAL 表示属性不存在;-ENODATA 表示没有要读取的数据;-EOVERFLOW 表示属性值列表太小
5、
int of_property_read_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz);
int of_property_read_u16_array(const struct device_node *np, const char *propname, u16 *out_values, size_t sz);
int of_property_read_u32_array(const struct device_node *np, const char *propname, u32 *out_values, size_t sz);
int of_property_read_u64_array(const struct device_node *np, const char *propname, u64 *out_values, size_t sz);
功能:同上,当sz_max为0时,即为该函数。
np:待查找的节点
propname:属性名称
out_values:获取到的属性值
sz:要读取数组元素的数量
返回值:0,读取成功;负值,读取失败;-EINVAL 表示属性不存在;-ENODATA 表示没有要读取的数据;-EOVERFLOW 表示属性值列表太小
6、
int of_property_read_u8(const struct device_node *np, const char *propname, u8 *out_value);
int of_property_read_u16(const struct device_node *np, const char *propname, u16 *out_value);
int of_property_read_u32(const struct device_node *np, const char *propname, u32 *out_value);
int of_property_read_s32(const struct device_node *np, const char *propname, s32 *out_value);
int of_property_read_u64(const struct device_node *np, const char *propname, u64 *out_value);
功能:获取只有一个整形数值的属性值。上面个函数sz为1,则为此函数
np:待查找的节点
propname:属性名称
out_values:获取到的属性值
返回值:0,读取成功;负值,读取失败;-EINVAL 表示属性不存在;-ENODATA 表示没有要读取的数据;-EOVERFLOW 表示属性值列表太小
7、
int of_property_read_string(const struct device_node *np, const char *propname, const char **out_string);
功能:获取字符串属性值
np:待查找的节点
propname:属性名称
out_string:获取到的字符串属性值。为一个字符串数组,即某个属性可能不止一个字符串
返回值:0表示成功;负值表示失败; -EINVAL表示属性不存在; -ENODATA 表示该属性没有值;-EILSEQ表示属性值字符串不是以null结束
8、
int of_property_match_string(const struct device_node *np, const char *propname, const char *string);
功能:查询指定字符串在字符串属性列表中的索引
np:待查找的节点
propname:属性名称
string:待查询字符串
返回值:>=0,索引;<0,未找到
9、
extern int of_n_addr_cells(struct device_node *np);
extern int of_n_size_cells(struct device_node *np);
功能:分别用于获取节点的#address-cells和#size-cells属性值
np:待查找的节点
返回值:#address-cells和#size-cells的属性值
10、
const __be32 *of_get_address(struct device_node *dev, int index, u64 *size, unsigned int *flags);
功能:of_get_address 函数用于获取地址相关属性,主要是“reg”或者“assigned-addresses”属性值
dev:待查找的设备节点
index:要读取的地址索引
size:地址长度
flags:IORESOURCE_IO、IORESOURCE_MEM等
返回值:读取到的地址数据首地址,为 NULL 的话表示读取失败
11、
u64 of_translate_address(struct device_node *np, const __be32 *addr);
功能:将从设备树种读取到的地址转换为物理地址
np:设备节点
addr:设备树中获取到的地址,可通过上面个函数获取。
返回值:转换后的物理地址
12、
int of_address_to_resource(struct device_node *dev, int index, struct resource *r);
功能:将从设备树种获取到的reg属性值转换为resource结构体类型。resource结构体定义在include/linux/ioport.h,用于描述设备寄存器地址信息
dev:设备节点
index:待转换地址的索引
r:转换后resource结构体类型
返回值:0,成功;负值,失败。
13、
void __iomem *of_iomap(struct device_node *device, int index);
device:设备节点。
index:reg 属性中要完成内存映射的段,如果 reg 属性只有一段的话 index 就设置为 0。
返回值:经过内存映射后的虚拟内存首地址,如果为 NULL 的话表示内存映射失败。
四、其它of函数
1、
const struct of_device_id *of_match_device(const struct of_device_id *matches, const struct device *dev);
功能:测试一个设备是否与匹配表匹配,用于各种总线(bus)的match
matches:匹配表
dev:当前设备
返回值:配合成功后的匹配表
最后
以上就是甜美砖头为你收集整理的EmbedFire i.MX 6ull开发板学习笔记(七)---of函数一、查询节点的of函数二、查找父/子节点的of函数三、获取属性值的of函数四、其它of函数的全部内容,希望文章能够帮你解决EmbedFire i.MX 6ull开发板学习笔记(七)---of函数一、查询节点的of函数二、查找父/子节点的of函数三、获取属性值的of函数四、其它of函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复