在Linux驱动开发中,设备树(Device Tree)是描述硬件配置的核心机制。以下是对of_property_read_string、of_property_count_elems_of_size

Linux驱动开发中的设备树操作函数详解

『AI先锋杯·14天征文挑战第5期』 10w+人浏览 735人参与

在Linux驱动开发中,设备树(Device Tree)是描述硬件配置的核心机制。以下是对of_property_read_stringof_property_count_elems_of_sizeof_property_read_u32_array三个函数的详解,结合内核源码与实际场景分析:

1. of_property_read_string

  • 作用:从设备树属性中读取单字符串值(如compatiblemodel属性)。
  • 函数原型
    int of_property_read_string(struct device_node *np, const char *propname, const char **out_string);
    
  • 参数
    • np:设备节点指针(如struct device_node *node)。
    • propname:属性名(如"compatible")。
    • out_string:输出参数,指向存储读取结果的指针。
  • 返回值
    • 成功返回0,失败返回负值错误码:
      • -EINVAL:属性不存在或参数无效。
      • -ENODATA:属性无值。
      • -EILSEQ:字符串未正确终止(非空结尾)。
  • 典型场景
    • 读取compatible属性匹配驱动:
      const char *compat;
      of_property_read_string(np, "compatible", &compat);
      
    • 获取设备型号信息(如model属性)。
  • 注意事项:仅适用于单字符串属性,多字符串需用of_property_read_string_array

2. of_property_count_elems_of_size

  • 作用:统计设备树属性中指定大小的元素数量(如数组长度)。
  • 函数原型
    int of_property_count_elems_of_size(const struct device_node *np, const char *propname, int elem_size);
    
  • 参数
    • np:设备节点指针。
    • propname:属性名(如"reg""interrupts")。
    • elem_size:元素大小(如4表示u32数组,1表示u8数组)。
  • 返回值
    • 成功返回元素数量,失败返回负值错误码(同上)。
  • 典型场景
    • 确定reg属性中寄存器地址数组的长度:
      int count = of_property_count_elems_of_size(np, "reg", 4);
      
    • 校验中断数组的合法性(如interrupts属性)。
  • 注意事项:需确保elem_size与属性数据类型匹配,否则返回-EINVAL

3. of_property_read_u32_array

  • 作用:从设备树属性中读取u32类型数组(如寄存器列表、中断号数组)。
  • 函数原型
    int of_property_read_u32_array(const struct device_node *np, const char *propname, u32 *out_values, size_t sz);
    
  • 参数
    • np:设备节点指针。
    • propname:属性名。
    • out_values:存储读取结果的u32数组指针。
    • sz:期望读取的元素数量。
  • 返回值
    • 成功返回实际读取的元素数量,失败返回负值错误码:
      • -EOVERFLOW:属性数据长度不足或超出范围。
  • 典型场景
    • 读取寄存器地址数组:
      u32 reg_values[4];
      of_property_read_u32_array(np, "reg", reg_values, ARRAY_SIZE(reg_values));
      
    • 解析中断号列表(如interrupts属性)。
  • 注意事项
    • 需预先通过of_property_count_elems_of_size确定数组长度。
    • 确保out_values缓冲区足够大,避免缓冲区溢出。

函数关联与最佳实践

  • 协同使用:通常结合使用,例如:
    1. of_property_count_elems_of_size确定数组长度。
    2. of_property_read_u32_array读取数组数据。
  • 错误处理:必须检查返回值,避免空指针或无效数据导致系统崩溃。
  • 内核版本兼容性:函数行为可能随内核版本微调,需参考对应版本的内核源码(如drivers/of/property.c)。

这些函数是Linux驱动与设备树交互的基石,正确使用它们可确保驱动兼容不同硬件配置,提升代码可移植性与健壮性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HH予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值