在使用設備樹的時候, 有時會遇到下面的問題.

在設備樹中配置的屬性如下:

fusb301,init-mode = <0x20>;

但是在驅動中讀出的卻是:

rc = of_property_read_u8(dev_node,
                "fusb301,init-mode", &data->init_mode);

加打印發現, 讀出的值是0, 並不是0x20.

使用下面的命令將對應的節點從內存中pull出來:

adb pull "/sys/firmware/devicetree/base/soc/i2c@7af6000/fusb301@25/fusb301,init-mode"

這是一個二進制文件, 使用二進制閱讀工具打開:

aaarticlea/png;base64,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" alt="" />

可以看到, 0x20存放在高字節, 即設備樹編譯工具是按大端格式組織數據的, 但是使用of_property_read_u8卻是按小端格式.

然後做了如下實驗:

添加屬性:

fusb301,test = <0x12345678>;

在驅動中解析這個字段:

    u8 value8;
u16 value16;
u32 value32; of_property_read_u8(dev_node,"fusb301,test", &value8);
of_property_read_u16(dev_node,"fusb301,test", &value16);
of_property_read_u32(dev_node,"fusb301,test", &value32); printk("%s: value8: %x, value16: %x, value32: %x\n", __func__, value8, value16, value32);

輸出的log如下:

fusb301_parse_dt: value8: 12, value16: 1234, value32: 12345678

可以驗證我們的猜想.

那麼如何解決這個問題呢?

通過閱讀內核代碼發現, 內核中其實有說明:

 /**
* of_property_read_u8_array - Find and read an array of u8 from a property.
*
* @np: device node from which the property value is to be read.
* @propname: name of the property to be searched.
* @out_values: pointer to return value, modified only if return value is 0.
* @sz: number of array elements to read
*
* Search for a property in a device node and read 8-bit value(s) from
* it. Returns 0 on success, -EINVAL if the property does not exist,
* -ENODATA if property does not have a value, and -EOVERFLOW if the
* property data isn't large enough.
*
* dts entry of array should be like:
* property = /bits/ 8 <0x50 0x60 0x70>;
*
* The out_values is modified only if a valid u8 value can be decoded.
*/
int of_property_read_u8_array(const struct device_node *np,
const char *propname, u8 *out_values, size_t sz)
{
const u8 *val = of_find_property_value_of_size(np, propname,
(sz * sizeof(*out_values))); if (IS_ERR(val))
return PTR_ERR(val); while (sz--)
*out_values++ = *val++;
return ;
}
EXPORT_SYMBOL_GPL(of_property_read_u8_array);

然後我做了如下實驗:

添加如下幾個屬性:

        fusb301,test8 = /bits/  <0x12>;
fusb301,test16 = /bits/ <0x1234>;
fusb301,test32 = <0x12345678>;

修改驅動, 解析這些字段:

    u8 value8;
u16 value16;
u32 value32; of_property_read_u8(dev_node,"fusb301,test8", &value8);
of_property_read_u16(dev_node,"fusb301,test16", &value16);
of_property_read_u32(dev_node,"fusb301,test32", &value32); printk("%s: value8: %x, value16: %x, value32: %x\n", __func__, value8, value16, value32);

輸出的log如下:

fusb301_parse_dt: value8: 12, value16: 1234, value32: 12345678

完.

最新文章

  1. [AngularJS] AngularJS系列(7) 进阶篇之promise
  2. 【发布】工业串口和网络软件通讯平台(SuperIO v2.2.4)
  3. 计算机中数据实体和数据表示形式(以C#为例)
  4. PIVOT&amp;UNPIVOT
  5. 06---Net基础加强
  6. thinkphp连接mysql5.5版本数据库
  7. 记事本写hello world_Java
  8. ACM学习-POJ-1003-Hangover
  9. C#后台跳转
  10. no copy constructor available or copy constructor is declared &amp;#39;explicit&amp;#39;
  11. libev中timer时间事件监控器
  12. ERP中自定义报表制作流程
  13. 算法第四版学习笔记之快速排序 QuickSort
  14. 解决vs-code高cpu占用率问题
  15. 怎么去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: &#39;NSInteger&#39; (aka &#39;long&#39;) to &#39;int32
  16. python去除字符串里的非数字
  17. Zephyr学习专题
  18. [WF2012]infiltration
  19. JAVA设计模式——第 3 章 单例模式【Singleton Pattern】(转)
  20. 前端解析cookie出现多余的双引号的问题

热门文章

  1. nodejs进阶(4)—读取图片到页面
  2. JavaScript 字符串实用常操纪要
  3. Java 8五大主要功能为开发者提供了哪些便利?
  4. 用scikit-learn学习谱聚类
  5. CRL快速开发框架系列教程六(分布式缓存解决方案)
  6. 玩转spring boot——AOP与表单验证
  7. jquery屏幕滚动计算事件总结
  8. 漫谈C#编程语言在游戏领域的应用
  9. Flyweight(享元模式)
  10. BPM任务管理解决方案分享