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

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

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

完.

Linux驱动开发—— of_property_read_u8的更多相关文章

  1. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  2. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  3. 【转】linux驱动开发的经典书籍

    原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书 ...

  4. Linux驱动开发 -- 打开dev_dbg()

    Linux驱动开发 -- 打开dev_dbg() -- :: 分类: LINUX linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KER ...

  5. Linux驱动开发学习的一些必要步骤

      1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...

  6. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  7. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  8. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  9. Linux内核(17) - 高效学习Linux驱动开发

    这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...

随机推荐

  1. JavaScript的继承实现方式

    1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...

  2. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  3. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  4. iOS微信里打开app,Universal Links

    这两天在弄分享,从第三方应用或者浏览器打开自己app的东西 传统的方式是通过URL Scheme的方式,但是iOS9以后又出了新的更完美的方式Universal Links. 传统的URL Schem ...

  5. 微信小程序前端源码逻辑和工作流

    看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.j ...

  6. JDBC增加删除修改

    一.配置程序--让我们程序能找到数据库的驱动jar包 1.把.jar文件复制到项目中去,整合的时候方便. 2.在eclipse项目右击"构建路径"--"配置构建路径&qu ...

  7. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  8. springMVC初始化绑定器

    单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   propertyEditor为属性编辑器,此处我们选用 CustomDateEd ...

  9. mono for android 读取网络远程图片

    布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=& ...

  10. Vue.js——60分钟组件快速入门(下篇)

    概述 上一篇我们重点介绍了组件的创建.注册和使用,熟练这几个步骤将有助于深入组件的开发.另外,在子组件中定义props,可以让父组件的数据传递下来,这就好比子组件告诉父组件:"嘿,老哥,我开 ...