OF函数

Linux内核的OF操作函数

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;
    ...
}

查找属性

  • 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;
}

上一篇:Unity编辑器开发CustomPropertyDrawer


下一篇:Android7.1 logd 日志记录缓冲区大小