Linux驱动开发—— of_property_read_u8
在使用設備樹的時候, 有時會遇到下面的問題.
在設備樹中配置的屬性如下:
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的更多相关文章
- 嵌入式Linux驱动开发日记
嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- 【转】linux驱动开发的经典书籍
原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书 ...
- Linux驱动开发 -- 打开dev_dbg()
Linux驱动开发 -- 打开dev_dbg() -- :: 分类: LINUX linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KER ...
- Linux驱动开发学习的一些必要步骤
1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...
- 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- Linux内核(17) - 高效学习Linux驱动开发
这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...
随机推荐
- CSS的未来
仅供参考 前言 完成<CSS核心技术与实战>这本书,已有一个多月了,而这篇文章原本是打算写在那本书里面的,但本章讲解的内容,毕竟属于CSS未来的范畴,而这一切都还不能够确定下来,所以这一章 ...
- CSS3 background-image背景图片相关介绍
这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...
- sublime常用快捷键
自己觉得比较实用的sublime快捷键: Ctrl + / ---------------------注释 Ctrl + 滚动 --------------字体变大/缩小 Ctrl + N----- ...
- Vue-Router 页面正在加载特效
Vue-Router 页面正在加载特效 如果你在使用 Vue.js 和 Vue-Router 开发单页面应用.因为每个页面都是一个 Vue 组件,你需要从服务器端请求数据,然后再让 Vue 引擎来渲染 ...
- HTML文档头部
前面的话 在声明文档类型之后,HTML文档的下一部分为<html>标签,告知浏览器应将括在<html>...</html>内的所有内容解析为HTML.然后是HT ...
- 了不起的 nodejs-TwitterWeb 案例 bug 解决
了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...
- CentOS7 重置root密码
1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...
- linux应用调试技术之GDB和GDBServer
1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...