of_函数读取设备树结点

of_函数读取设备树结点

1. OF 函数

  • 设备树描述了设备的详细信息,这些信息包括数字类型的、字符串类型的、数组类型的,我们在编写驱动的时候需要获取到这些信息。Linux 内核给我们提供了一系列的函数来获取设备树中的节点或者属性信息,这一系列的函数都有一个统一的前缀“of_”,所以在很多资料里面也被叫做 OF 函数。这些 OF 函数原型都定义在include/linux/of.h 文件中。

在这里插入图片描述

2. 使用示例

设备树节点

...
{
    backlight {
        compatible = "pwm-backlight";
        pwms = <&pwm1 0 5000000>;
        brightness-levels = <0 4 8 16 32 64 128 255>;
        default-brightness-level = <6>;
        status = "okay";
        wp-inverted ;
    };
};
...

驱动代码


struct device_node* ofdts_node;
struct property*    blprop;
int ret = 0;
const char* out_string;
int result = 0;
int mem_count = 0;
u32* out_values;

static int __init xxx_init(void)
{
   ...
     printk("\n initing.........\n");
    /* 0. find backlight node*/
    ofdts_node = of_find_node_by_name(NULL, "backlight");
    if(!ofdts_node){
        printk("of_find_node error !\n");
        return -ENODEV;
    }
    printk("of_find_node_by_name = %s\n", ofdts_node->name);

    /* 1. read compatible string*/
    ret = of_property_read_string(ofdts_node, "compatible", &out_string);
    if(ret < 0){
        printk("oproperty_read error !\n");
        return ret;
    }
    printk("of_property_read_string = %s\n", out_string);

    /* 2. read node property*/
    blprop = of_find_property(ofdts_node, "status", NULL);
    if(!blprop){
        printk("of_find_property error !\n");
        return -ENODEV;
    }
    printk("of_find_property = %s\n", (char*)blprop->value);

    
    /* 3.read one of_property_count */
    mem_count = of_property_count_elems_of_size(ofdts_node, "default-brightness-level", sizeof(u32));
    if(mem_count < 0){
        printk("fail_property_count_elems_of_size!!!\n");
        return -ENODEV;
    }
    ret = of_property_read_u32(ofdts_node, "default-brightness-level", out_values);
    if(ret < 0){
            printk("fail_read_u32!!!\n");
            kfree(out_values);
            return -ENODEV;
    }
    printk("of_property_read_u32:%d\n", *out_values);  

     /* 4.read  of_property_counts */
    mem_count = of_property_count_elems_of_size(ofdts_node, "brightness-levels", sizeof(u32));
    if(mem_count < 0){
        printk("fail_property_count_elems_of_size!!!\n");
        return -ENODEV;
    }
    ret = of_property_read_u32_array(ofdts_node,"brightness-levels", out_values,mem_count);
    if(ret < 0){
            printk("fail_read_u32!!!\n");
            kfree(out_values);
            return -ENODEV;
    }
    printk("of_property_read_u32_array ");  
    for(i = 0; i < mem_count; i++){
            printk("%d\t",out_values[i]); 
        }
   

   ...


}

log打印

initing.........
of_find_node_by_name = backlight
of_property_read_string = pwm-backlight
of_find_property = okay
of_property_read_u32:6
of_property_read_u32_array 0 4 8 16 32 64 128 255
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值