linux设备树常用of操作函数

    科技2022-07-21  123

    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属性值。

    Processed: 0.009, SQL: 8