设备树常用of操作函数
of函数作用:
Linux驱动中的设备树用来描述板级信息的,比如:GPIO,IIC,SPI等外设以及声卡,SD卡灯硬件。驱动开发人员在编写驱动代码的时候是需要根据设备树提供的信息来写驱动程序的,那么如何获取这些信息成了问题。
Linux内核提供了一系列读取设备树信息的函数,他们都以of开头,所以称为of函数
of_find_node_by_path
该函数通过节点路径名称来查找结点,是比较常用的查找节点的函数
函数原型:
inline struct device_node *of_find_node_by_path(const char *path)
参数解释:
path:带有全路径的节点名,可以使用节点的别名
返回值:成功返回device_node类型的节点结构体,失败返回NULL
of_find_property
static inline struct property *of_find_property(const struct device_node *np,
const char *name,
int *lenp)
参数一:要查找的属性所在的节点结构体
参数二:要查找的属性名字
参数三:返回值property结构体的name的长度,一般给NULL
(其实我很疑惑,调用这个函数的目的就是读取属性值的,那我们肯定实现不知道属性值啊?设置参数三的意义何在?)
of_property_read_string:
这个函数用于读取值是字符串的属性的值
static inline int of_property_read_string(const struct device_node *np,
const char *propname,
const char **out_string)
参数一:节点结构体
参数二:要读取的属性的名字
参数三:字符串指针,用于存放返回值,返回值就是读取到的字符串
of_property_read_u32_array
此函数也很常用,用于读取数组元素,存放在传入的指针指向的内存中
static inline int of_property_read_u32_array(const struct device_node *np,
const char *propname,
u32 *out_values, size_t sz)
参数一:节点结构体
参数二:要读取的属性名字(属性的元素是数组类型的)
参数三:u32类型的指针
参数四:要从指定属性读取的元素个数
of_iomap
把设备树节点中reg属性中的地址段映射为虚拟内存地址段,返回映射后的虚拟内存地址段指针。注意:reg中是以:”起始地址,地址长度“的格式来表示地址段的,通过of_iomap函数的参数三可以索引reg中要映射的地址段(从0开始索引),也就是说,reg属性元素的两个元素对应一个索引号
void __iomem *of_iomap(struct device_node *np, int index)
参数一:节点结构体
参数二:地址段索引
返回值:返回虚拟地址的指针,void __iomen *类型
of_property_read_bool
此函数判断设备节点是否含有某个属性
static inline bool of_property_read_bool(const struct device_node *np,
const char *propname)
参数一:节点结构体
参数二:属性名字
返回值:如果存在则返回非零,否则返回0
of_get_named_gpio
获取GPIO编号
static inline int of_get_named_gpio(struct device_node *np,
const char *propname, int index)
参数一:节点结构体
参数二:属性名字
参数三:GPIO 索引 因为一个属性里面可能包含多个 GPIO,此参数指定要获取哪个 GPIO的编号,如果只有一个 GPIO 信息的话此参数为 0。
返回值:如果为正值,则是获取到的gpio编号,如果为负值;则函数调用失败
of_gpio_named_count
获取某个节点的某个属性中定义了几个gpio信息
int of_gpio_named_count(struct device_node *np, const char *propname)
参数一:节点结构体
参数二:要统计的属性名字
返回值:失败返回负数,成功返回统计个数
of_gpio_count
与of_gpio_named_count功能相同,只不过它只能统计属性名为gpios的gpio数量
nt of_gpio_count(struct device_node *np)