【获取设备树结点信息】

什么是设备树

设备树是一种结构化的文件,通常在嵌入式Linux中用来表示和控制硬件设备。它由一系列键值对组成,用于标识某个硬件节点以及为其指定属性和设备标识。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储。

键值对的格式

文本字符串(以 null 结尾)用双引号表示:
string-property = “a string”;
“cell”是 32 位无符号整数,由尖括号分隔:
cell-property = <0xbeef 123 0xabcd1234>;
二进制数据用方括号分隔:
binary-property = [0x01 0x23 0x45 0x67];
不同表示形式的数据可以使用逗号连接在一起:
mixed-property = “a string”, [0x01 0x23 0x45 0x67], <0x12345678>;
逗号也用于创建字符串列表:
string-list = “red fish”, “blue fish”;

添加自定义设备节点

 mynode@0x12345678{
    compatible = "hqyj,mynode";
        astring="hello world";
    uint  =<0xaabbccdd 0x11223344>;
        binarry=[00 0c 29 7b f9 be];
        mixed ="hello",[11 22],<0x12345678>;
     };

驱动程序中如何获取设备数信息

获取设备树节点信息

一、根据设备树节点的名字解析设备树节点

struct device_node *of_find_node_by_name(struct device_node *from,
    const char *name);

二、根据设备树节点路径解析设备树节点

struct device_node *of_find_node_by_path(const char *path)

三、根据设备树节点中compatibe键来解析设备树节点

struct device_node *of_find_compatible_node(struct device_node *from,
    const char *type, const char *compat);

解析设备树节点属性

基于解析后的设备树节点信息结构体解析指定属性键值对

struct property *of_find_property(const struct device_node *np,const char *name,int *lenp)

代码实例

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/device.h>
#include <linux/poll.h>
#include <linux/of.h>
struct device_node *node;
struct property *pr;
int len;
static int __init mycdev_init(void)
{
    
    
    int i;
    // 解析设备树节点
    node = of_find_node_by_path("/mynode@0x12345678");
    if (node == NULL)
    {
    
    
        printk("设备树节点信息解析失败\n");
        return -ENOENT;
    }
    pr = of_find_property(node, "astring", &len);
    printk("name = %s value = %s", pr->name, (char *)pr->value);
    
    if(len) {
    
    
        for (i = 0; i < len; i++)
        {
    
    
            printk("name=%s,value=%x\n", pr->name, ((char *)pr->value)[i]);
        }
    }
    return 0;
}
static void __exit mycdev_exit(void)
{
    
    
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

猜你喜欢

转载自blog.csdn.net/a1379292747/article/details/129016041