linux设备树常用of操作函数
设备树描述了设备的详细信息,这些信息包括数字类型的、字符串类型的、数组类型的,这些信息一般通过of函数获取,这些of函数的原型大部分定义在include/linux/of.h文件中,其中GPIO相关的定义在include/inux/of_gpio.h中。
1、 GPIO相关
int of_gpio_named_count(struct device_node *np, const char *propname)
函数用于获取设备树某个属性里面定义了几个 GPIO信息,要注意的是空的 GPIO信息也会被统计到。
@np:设备节点。
@propname:要统计的 GPIO属性。
@返回值: 正值,统计到的 GPIO数量;负值,失败。
static inline int of_gpio_count(struct device_node *np)
{
return of_gpio_named_count(np, "gpios");
}
和 of_gpio_named_count函数一样,但是不同的地方在于,此函数统计的是“ gpios”这个属性的 GPIO数量,而 of_gpio_named_count函数可以统计任意属性的 GPIO信息,
@np:设备节点。
@返回值: 正值,统计到的 GPIO数量;负值,失败。
static inline int of_get_named_gpio(struct device_node *np, const char *propname, int index)
@np: gpio所在的设备节点
@propname: gpio属性的名字
@index:gpio定义时的索引
@返回值:为用于gpio相关API的gpio号。
2、 查找节点
struct device_node *of_find_node_by_name(struct device_node *from, const char *name);
通过节点名查找指定的节点。
@from:开始查找的节点,如果为NULL表示从根节点开始查找整个设备树。
@name:要查找的节点的名字
@返回值:找到的节点,如果失败返回NULL。
struct device_node *of_find_node_by_type(struct device_node *from, const char *type)
函数通过 device_type属性查找指定的节点,函数原型如下:
@from:开始查找的节点,如果为 NULL表示从根节点开始查找整个设备树。
@type:要查找的节点对应的 type字符串,也就是 device_type属性值。
@返回值:找到的节点,如果为 NULL表示查找失败。
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表示查找失败
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表示查找 失败
inline struct device_node *of_find_node_by_path(const char *path)
函数通过路径来查找指定的节点,函数原型如下:
@path:带有全路径的节点名,可以使用节点的别名,比如 “/backlight”就是 backlight这个
节点的全路径。
@返回值: 找到的节点,如果为 NULL表示查找失败
3、 查找父/子节点
struct device_node *of_get_parent(const struct device_node *node)
函数用于获取指定节点的父节点 (如果有父节点的话 )
@node:要查找的父节点的节点。
@返回值: 找到的父节点。
struct device_node *of_get_next_child(const struct device_node *node, struct device_node *prev)
@node:父节点。
@prev:前一个子节点,也就是从哪一个子节点开始迭代的查找下一个子节点。可以设置为NULL,表示从第一个子节点开始。
@返回值: 找到的下一个子节点。
4、 提取属性值
property *of_find_property(const struct device_node *np, const char *name, int *lenp)
函数用于查找指定的属性
@np:设备节点。
@name 属性名字。
@lenp:属性值的字节数
@返回值: 找到的属性。
int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value)
函数用于从属性中获取指定标号的 u32类型数据值 (无符号 32位 ),比如某个属性有多个 u32类型的值,那么就可以使用此函数来获取指定标号的数据值。
@np:设备节点。
@proname 要读取的属性名字。
@index:要读取的值标号。
@out_value:读取到的值
@返回值: 0读取成功,负值,读取 失败, ,-EINVAL表示属性不存在, ,-ENODATA表示没有要读取的数据, -EOVERFLOW表示属性值列表太小。
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)
这 4个函数分别是读取属性中 u8、 u16、 u32和 u64类型的数组数据,比如大多数的 reg属性都是数组数据,可以使用这4个函数一次读取出 reg属性中的所有数据。
@np:设备节点。
@proname 要读取的属性名字。
@out_value:读取到的数组值,分别为 u8、 u16、 u32和 u64。
@sz 要读取的数组元素数量。
@返回值: 0,读取成功,负值,读取失败 ,-EINVAL表示属性不存在,-ENODATA表示没有要读取的数据,-EOVERFLOW表示属性值列表太小。
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_u64(const struct device_node *np, const char *propname, u64 *out_value)
有些属性只有一个整形值,这四个函数就是用于读取这种只有一个整形值的属性,分别用
于读取 u8、 u16、 u32和 u64类型属性值。
@np:设备节点。
@proname 要读取的属性名字。
@out_value:读取到的数组值。
@返回值:0,读取成功,负值,读取失败,-EINVAL表示属性不存在, -ENODATA表示没有要读取的数据,-EOVERFLOW表示属性值列表太小。
int of_property_read_string(struct device_node *np, const char *propname, const char **out_string)
函数用于读取属性中字符串值
@np:设备节点。
@proname 要读取的属性名字。
@out_string:读取到的字符串值。
@返回值: 0,读取成功,负值,读取失败。
int of_n_addr_cells(struct device_node *np)
函数用于获取 #address-cells属性值。
@np:设备节点。
@返回值:获取到的 #address-cells属性值。
int of_n_size_cells(struct device_node *np)
函数用于获取 #size-cells属性值。
@np:设备节点。
@返回值:获取到的 #size-cells属性值。