实现一个驱动读取自己定义的设备树
1 设备树读写接口
头文件
cpp
#include <linux/of.h> //节点、属性基础接口
#include <linux/of_address.h> //reg物理地址
#include <linux/of_irq.h> //中断
#include <linux/of_gpio.h> //GPIO
#include <linux/of_clk.h> //时钟
#include <linux/of_pinctrl.h> //引脚配置
#include <linux/of_property.h>
查找/遍历设备节点
| 接口 | 功能说明 |
|---|---|
of_find_node_by_path() |
按照设备树全路径查找节点 |
of_find_node_by_name() |
按节点 name 查找 |
of_find_node_by_type() |
按 device‑type 属性查找 |
of_find_compatible_node() |
根据 compatible 匹配节点 |
of_get_child_by_name() |
获取指定名字的子节点 |
of_next_child_node() |
循环遍历所有子节点 |
of_node_put() |
节点引用计数释放(查到节点必须调用) |
of_device_is_available() |
判断节点 status = "okay" 是否启用 |
读取节点属性(最常用)
| 接口 | 用途 |
|---|---|
of_property_read_bool(node, "xxx") |
布尔属性,存在即返回 true |
of_property_read_u8() |
读取 uint8 属性 |
of_property_read_u16() |
读取 uint16 |
of_property_read_u32() |
读取单个 32 位整型 |
of_property_read_u64() |
读取 64 位整型 |
of_property_read_u32_array() |
读取 u32 数组 |
of_property_read_string() |
读取字符串属性 |
of_property_read_string_array() |
读取字符串数组 |
of_property_match_string() |
匹配字符串列表索引 |
of_find_property() |
获取 property 原始结构体 |
reg物理内存地址操作
| 接口 | 作用 |
|---|---|
of_address_to_resource() |
reg 转为 struct‑resource |
of_iomap() |
物理地址映射成内核虚拟地址 |
of_iounmap() |
解除地址映射 |
of_address_in_resource() |
检查地址是否落在 reg 区间 |
中断资源
| 接口 | 说明 |
|---|---|
irq_of_parse_and_map() |
解析 interrupts 属性、映射中断号 |
of_irq_get() |
获取节点第 n 个中断 |
of_irq_to_resource() |
中断转为 resource 结构体 |
phandle引用节点
| 接口 | 说明 |
|---|---|
of_parse_phandle() |
解析 phandle,拿到被引用节点 |
of_parse_phandle_with_args() |
解析带参数的 phandle(中断控制器常用) |
此外还有一些,就不全部列了。。