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

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

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之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  2. 启动了VSAN服务的主机不在vCenter集群中

    背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...

  3. CSS float 浮动属性

    本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录: 1. 页面布局方式:介绍文档流.浮动层以及float属性. 2. float:left :介绍float为 left 时的布局方式. 3. ...

  4. 【.net 深呼吸】启动一个进程并实时获取状态信息

    地球人和火星人都知道,Process类既可以获取正在运行的进程,也可以启动一个新的进程.在79.77%应用场合,我们只需要让目标进程顺利启动就完事了,至于它执行了啥,有没有出错,啥时候退出就不管了. ...

  5. git 命令

    切换仓库地址: git remote set-url origin xxx.git切换分支:git checkout name撤销修改:git checkout -- file删除文件:git rm  ...

  6. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  7. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  8. python 数据类型 ----字典

    字典由一对key:value 组成的 python中常用且重量级的数据类型 1. key , keys, values 字典由一对key:value 组成的 python中常用且重量级的数据类型 1. ...

  9. linux拷贝命令,移动命令

    http://blog.sina.com.cn/s/blog_7479f7990101089d.html

  10. 新技术≠颠覆:CIO 要有战略耐心

    新技术≠颠覆:CIO 要有战略耐心 大数据,云时代,互联网思维, 物联网--最近一两年,这些字眼一次次地出现在各种大大小小的CIO会议上和他们的私下交流圈子里,作为对新技术最敏感的人群,一方面他们迫切 ...