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

计算一个节点下有多少个子节点:
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;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值