Linux内核的OF操作函数
这些函数或结构体都在 include/linux/of.h 文件中定义。
使用OF函数查找到设备树中具体的某个节点
首先,我们在设备树中描述了设备的信息,当时Linux驱动程序如何获取到这些信息呢?
在驱动中使用OF函数可以获取到设备树中的所描述的设备信息。 of函数所有的函数名都以of开头,所以叫of函数。
驱动要想操作设备,首先要找到设备树中的节点,常用的查找节点of函数有5种:
- of_find_node_by_name 函数 //通过名字查找节点
- of_find_node_by_type 函数 //通过类型查找节点
- of_find_compatible_node 函数 //通过兼容性查找
- of_find_node_by_path 函数 //通过路径查找节点
- of_find_matching_node_and_match //通过of_device_id查找节点
节点结构体: 用一个 device_node结构体来描述设备树中的一个节点。
struct device_node {
const char *name; /* 节点名字 */
const char *type; /* 设备类型 */
phandle phandle;
const char *full_name; /* 节点全名 */
struct fwnode_handle fnode;
struct property *properties; /* 属性 */
struct property *deadprops; /* removes 属性 */
struct device_node *parend; /* 父节点 */
struct device_node *child; /* 子节点 */
struct device_node *sibling;
struct kobject kobj;
...
}
计算一个节点下有多少个子节点:
inline int of_get_child_count(const struct device_node *np) //返回子节点个数
获取父节点:
struct device_node *of_get_parent(const struct device_node *node);
寻找下一个子节点:
inline struct device_node *of_get_next_child(const struct device_node *node, struct device_node *prev)
node:父节点;prev:子节点(查找第一个子节点时prev 传入NULL)
for 循环遍历所有子节点的宏:
#define for_each_child_of_node(parent, child)
for (child = of_get_next_child(parent, NULL); child != NULL;
child = of_get_next_child(parent, child))
查找属性
-
of_find_property 函数 //查找指定的属性,返回值就是找到的属性,属性的所有内容都会被包含在这个结构体里。
-
of_property_read_u8 函数
of_property_read_u16 函数
of_property_read_u32 函数
of_property_read_u64 函数
用于读取只有一个整形值的属性,分别用于读取 u8、 u16、 u32 和 u64 类型属性值。 -
of_property_read_string 函数
of_property_read_string 函数用于读取属性中字符串值,也可以获取到属性,然后直接得到属性的值。 -
of_property_count_elems_of_size 函数 //用于获取属性中元素的数量,如果一个属性的值像一个数组一样,有多个元素,该函数就是用于获取元素的数量。
-
of_property_read_u32_index 函数 //当属性的值有多个的时候,用标号指定要读第几个元素,和数组下标类似。用于从属性中获取指定标号的 u32 类型数据值(无符号 32位),比如某个属性有多个 u32 类型的值,那么就可以使用此函数来获取指定标号的数据值。
-
of_property_read_u8_array 函数
of_property_read_u16_array 函数
of_property_read_u32_array 函数
of_property_read_u64_array 函数
这组函数读取属性中 u8、 u16、 u32 和 u64 类型的数组数据,比如大多数的 reg 属
性都是数组数据,可以使用这 4 个函数一次读取出 reg 属性中的所有数据。使用这个函数是数组空间可以用kmalloc来申请,kfree释放内存。kmalloc
属性结构体: Linux内核中用一个结构体来描述一个属性。
struct property {
char *name; //属性名字
int length; //属性长度
void *value; //属性值
struct property *next;//下一个属性
unsigned long _flags;
unsigned int unique_id;
struct bin_attribute attr;
}