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

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

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,iVBORw0KGgoAAAANSUhEUgAAAQYAAABJCAIAAABQLh9mAAAAA3NCSVQICAjb4U/gAAAR9klEQVR4Xu1dB1yURxafrbD0BXZRyiIiiCKIJRHbRTxjiSWIDU/8hXixn5cIajRqxKBJNDFq1HjGEg0ixYYXW9SgpyQxBqWoKBZQ1KiLwrK9fzffFnaX3f2WIgjLTAi633vz5r3/mzflfbMjCQDAr+HB36ggBBACEAEyQgEhgBAwRgCFBOoPCAETBFBIoA6BEEAhgfoAQsA6AlQtqbrq5aOKh2KRUK1WW2dGlNaOgLOLCycwiOnp1doVbcX64SEB4+HundsRPXt5ebPJZDKpFauLVCNAQKVWv3zBvV5UEBIahqKCAChiEh4SFQ/LI3r2ZrF9MG0hroGorRUBEonEYnfoERl1704pColGewkPCZFQ6OXljaElU6NRbDUV4Zjm7c0uLrjaajRqe4ro9hJkCgXtItqe9yxpTCKTkSstAVPfZ7qQABiG/6DS9hGAy6e2b8TrtEAXEjAaYEy8TkVQ268IAeTFJgKpnyWgGIRlE7FE1e0CgdqQwFdOdmERMgL5sUl9QL9weoVbCTW/5NSxIvcRkwaxjeagJmnZViurqgqOH7/nNyauryelgTYoFAoajWZcCWaTpFIpg8EgloS2hMT42KQanXHS7rA1vzHR3ePfJCVOnADLjPWX+WpNxNTzR1lVeDwnt7RGXU/+JrJJS3fPj5+9/YaEQI4xj1r87OaVgociaGV9LWo0p4L7R86xi+UNbotXXZ2cnHzw4EFjDffs2bNkyRJIsqG2TZ8jBkIELC6cZHcOrPuhMDB+YWIPT6Cgc5xIsFPUv2iZtf3ItJaq5vrxtKwzV24/lwAH77DBE2clDuU4ajIkqpd/Znz3w8lirtzRt8+7M+fFRbjXhismKTvx9ao0wfTvvhzuVfegIpnh7efvx3IiE6TMjHlk9zO/XFce9+0GDqOhI3f9IdBzWofCuiwul7tixUpvlteZM2dUKuWUKVMgb1ra/vz8fE8v5tJly9asSfXyIjiy0RBfWVej3VJqk7BG22vVy5s3qj0GLhrbP9RBC0yDQNYyw9/mtUhkTEzvNmZOXEcHwd3c9Kz/fOnUefP0IBpQPDz8+boc8cDpSf/0fPLznqw16503rx7VgQJUgrLfjmWkHSusAqCzRZlU/3FL14+Depo3V+tVYx4C9V55L2h4W3BptHz5Ci9vTx8fHxabnXv+vMYuLO/XvLBuYWQSSSqVpaau2bRxo1VlCXCwWgcRDAhYSsKq5RI54J1ZPu0Mzuc7ZeOGMbxts1c/GL/569iOcGRVPftp8YIjQau3L+iGlf286z/ZeeUCDDiw+iZ+umiYD0XjQ17Bnk9mlj3gqejs8GH/mDVtYEc6fEpyiYifGaFtPbKT8uqV7XeeiLFObtLSYycqmMNT54zr6giwUKeH877IOVk+9P0u5Ge5O364yhqdNPvWlh183YrB1H+KhxkfLT7f54utM4Lpqhe/7tyclf/gaY0Mb4zzZuzM2ePCXEjGPJrJ5HH6v6ek43K6J/+wOtpZJ1FTPfPP8md8OQAUZtjf3+1Pu/5LXlFFjdLBp1fsnAVx4a7aSUpVde3QrrRT+Y9FwNn/jdHvfRAXxdTOOZjsyaX932f8cuuFgsIMCqYJAIRYt1NTVF7J3rn/58KnErJrp/5xMz8YHepc5yWCg6NDfHx8eno63Eu4uLgEB3c+f+ECnCtCQkNqeDw+n//yxctFixYR5EJQRJj2jwZ/spSE1YDqOnDBJ7EcGiDRmWwKpv8mau2wBzkwOLbnfLP7ivekpNTeXmreU0EHDwpk0PCo5W5RExbEe6srLmYe2JQid/tmVg8j96vEfxWe+vmhY0RiCOyPisqSOyKHkDc4jnhdknOX6CDS5ZI7PFUw23fs57vGkUmSoq+0fcfc4bVP4F9UoorrpVUB8Unzgx2lf/15+Mf9X1I5W//dCw9HTdGrxxq1ZNFQFgWQGWyGYXrRVK8OnLooNsRBUHpyZ9beUr8hCYmLOY5V+RnfZ21MD982J8wBYJLStFVfnACDpiclcsDDC/vT1qZI166bHgLDWVC0M2XLRafB0z4azKG+LPklqxwPCU274pJ9q766yIqduepNL0HBoe37Pt/pu+XD3i5136wNjYlRKZX709OVSvinksMJgNsegUDA5wtqeDWzZ83uEd7DoLPeMvTnq0LA4l4CB5zq1jEgkKPrS1Jtd9JtD7RDFPytEr0QApdePSJCgxkkEKxxPd5D4f/MfhMmjgiG1Xv3DFQ+SD58tCg+vL8b7n2s5lLK7C234Rl0t37zk2JYcA+gEHKhHJYLWTf40T1YTuAGV6AELLhUgFW0PVm/Ha5ruyYoanUDTgGRvaNg05Hd2dxrS//3W4Usqou2Cxm2N3RPX06gZsaTiYUijQBAcaTjbE7+EVERsHpX7+d5BUf8Bg4b0BPmeEKpRRfXllx/rggLoPCvZZ1+7jtlw9yx/jAlFNm9o7RscU52wbhPol151w5frAmYtnreOFw46OZ+L7egRKObmn81+1x1+Nw1UwcxoUlBs15eWZB57r6kFy69bhn29jCFUpGVna1Wq5QKJZlCFolEAr5g0qRJ0f2jCaYIjSCtOXVlos/1RKBJaVKH4HGx3fPTVy24N3jEqHeGDwh2t7BhpbLCw1yzi+++UPR30yyeXPvMX7eW++zeH8cObFu6mbph4QCneirbQDYaM9ATiKvEKuv1JDc2z1qbr9AwdF+8830jTqpbB1cg4/HlGIDxTnXzcQGlfBmMZBX31iOVx5uRLF2KlOYT2d3t4LVbXEW0Q+Wdp5hHdDcvcxzk3NInKhVv65wpWw2NUKukGukWCo/Hc6A7eDCZPF41JHt4eEjE0spKrgVW9OiVIlAbEhb9om+KRKKQgFqhqjv+OHDeXbX9jcLc4znHtiw7enzCZymTu1gY9GAOF5Dgf9pCdmIHhsAfGCmPZ3+b81tlv+Eu3i5AWCnU9V1MzqsUAxe2i3nHapjtFAqcgvDGrRaH4KnLV45S4nS4vHcE94w4KTQqCUj11Sl0ClDjeWXCgh8wgi1a4sKTvow3//VpfOfaZRzJwVMzcZqV7Ozs3Nzzvn4d4XJJJpPBcR8unDp07JCXlwdfVkydOtWshvEDiyIJayCiEQJ1U5qWwSE7wz5bVc6VmfuaxPDtNXpWyqbVI9zLT50sg9vaOkX2KP+mkBYYxjKfkPAOpFKqAc07PNRZdjf/kaY2Jr73xwPMs3uoR1NDoq4qms8kKoMGZAJ8vIdx4BLQLUJbwjvpts4Waxk9pLO7BVB4N4srtZMLUHCLS/hUTjc2DUCSP6Wm+NpTuD2vU+isUF+S5MEjEtu/tsDUsQUTDx06dPbsOaaXRzWvWigUSkRSOD8IBcJqXhXTiwlDBTLUlY4+vzoEdP3UxulJWsd+/X0O5+zakTNtSLAr9rScr9FAyf3jTBHgdPJ2VFQWV4iAE7PWxeLH1wuKJQzZ86LTGT+98BufHOkKBy/p/RNHbzh1DvR2AsLHBSczb6qD/tEX7nKpoWPfCbh4cOtO3+mDPf86s/t3WWjiqE61o6mZufKyfR8uO9dl+ffJkRYmJTN2kwd0dpg/5Wxu1omQUZ2wFzzmG291xVWrfyG59Zo80mdl1vrt9GlDArEH59MPPu0w9l9RUAokxY/qsOLI51+p40dEsGmi0r8kOsEkjz4Th3qmHlu3gTx5WDibLuE+5gcMGRZSJ+UEk7AXLlyAY4VIKJLL5Qq5MjExkUKh7N69G04zKqUKkiDDxIkTrSlsw5XWqqHnegTMh26L2NACJ3w8T7g9I/vby3B1Q3FmBUV0cacoeWW/HzqxtxoOlxT3oH7TP4rrBNfXKmdORKjHlYMb1sAFCY3Zpd/0lPdGB+NvONQyftW9/x357xMBFMLw6Rb9XkrCSD9cBVpg3LLF8u/27v/6osKhY59Jn8wZDl9KWC2YUqYEcLVFwGK1LskjeubM4o1pBzZcA1SvnlNDB3Z1NTk4YbWmnkBidE1YtdRxd9rhb/LEMAnbd9KyD+JCNG8cSYzQaatXuu1LP7l7fQ5uvmuHsGh/+BoRT6RFzPhsicfezDO7vjqqAhRXzoDEfkNDnE1tcHR0XLNmzcqVn4pEQlhn8uRJMTFDYG2pVHLgQIZSoXJ2doIMNnVEDI1GAPfj6eM5w0aOkcvNFz2NFtu8FbGavFVzdrkv2ZbcS/9KoXkbbGnpcG8No2LQoIHaV9fa5o8cOZqb+0tqaiqTySRQiE53OHf6+IDBQwh4EIkAgXrOEgQSXgNJ+qiY69E/Psw+4wECCvNL69evq3PCLy5u/KhRI20e+3sN/rCvJuu3l2hlNjN6zPtui5rcJsO5vlBa7PoWH9aRiPYS9YXYCl9txqlBO0wrwlrwMZlav1xZC6rUappqY65sNbjpFEEdq7V5BOnzmhFAIfGaHYCab20I6EICLUBbm2MarQ9yZaOh01Zsq3uJJppt19XRXqJJ7kULpybBhyrbHwK6RKZMKjWcy7M/K9uTRdCV0NzfLl1oT0a/Slt1IeHIYEgl+uM4r1I+kvUaEBgx+t3X0Kq9NGl43QWjwl6MaowdpJkkbKfRQV/8lLf5ud/GSEZ12hYCaC/RtvyFtG12BFBINDvEqIG2hQAKibblL6RtsyNgdnROVnZ7afLNUjkgObHnbho4xs8kaOyPSoywrCxrafI+DRpRczetHuNn8s0KYqoNySBrKdhXin8DN2ouWD0GmEompNqQ3Fw6S++BZUsB/OKkXAn6zgUrxgHdNV9afWRN0JnYopanwu9LaP9FLniNxOOkv53IeKTC7x+9UxQb82shvFdSX+yParANAx/A7bTxZ/xSjbykvyVkPJJr0NgRG5NiigYR1USW2Qc1lpeEJWRgGsnYjlgspdCIh5hqJszkQbPprHyKzXgHy63UtCbB9r+Prcp/RToTW9TiVDwADSHBO3UiJrVSqtNCfjk5c34e7jZtsT+qEdwWQoJ3KiEm9YYeDdHl5Lfm5wmN0CCiEjuShyXEYEaSsbfmY0aSCak2JDeXzpJb2P4i/KYFbZGVYLFLMLEBjSboTGxRi1NNlkWqJ4Wy3m+766dDWveR7hU3Jfo7X+yPSjwhy58U1vR+O0iPhlP3kZ0rbr7Uo0FMtSUZ1PQGRpJB5wpgJJmIaktyc+nsGAamRdbesgKE5UDtq7m1TVPkTxqvM7FFLU81CQlMIiCzjO6poLo7UflKfSewPyox3GqJgMpyNWy2qO5sKr/2Uihiqi3JgMoy9Cf4N/jPDhhJJqLaktxcOhu3K70DPtwJlr1v2P+oJY3Xmdiilqeaba9bXoXW2iLxizpiKrFNxHWJqa9Lcm278ocgaTFI2AWi3Qy6NEVnYotanmoyS5AYrupKgeaCI01R1oiVrlT9FRL2RyWGm8JwVVbCSzgNaHCVrrUX8BNTbUkGykpgJBlwlcBIMhHVluTm0lnbLpwf5swFb28DI1gmilAYjdeZ2KKWp5qEBMUvin71LH7rtqYoSk7XcHoYXGV3VGK46X5RblfPluvREJecLuP08NYPEMRUW5KB21VgJBmUcYCRZCKqLcnNpTNsV1gMZiSD+L1gvH9dLeh+jde5rqzW8NkkCbtw8IlMoyRsgSGpgKdo7YxqlM2wkHFS8y8tHJyQaZSENUWDiEqcJ1FjlxZiCZlGSdgCowrEVBuSm0tn3u/YhPFYXpW+eRH2/R6YjNWXpuhMbFGLU3X3OBnOTkrv3/540c27cGyEr+o2Dxxr+qrO/qj6McnysT/p/cyPF/2oQaPn3M2fjTV9VUdMJR7tpCDzY/DjXZyp51zw2VjTV3XEVBuSm0Xnn0aCJDEIcdG1jclBiRO4/l9g2FA0RWdii1qWahYSLdt862nNcki0Hv2QJi2FADrj1FJIo3baCAIoJNqIo5CaLYUAei9hHelG33WBvntkHdTWT0GzROv3EdKwRRFAs4QVuNFIbwUYu3+MZgmdi02+eG33bkcGWkcAhYR1bBClXSKAQqJduh0ZbR0BFBLWsUGUdokACol26XZktHUEUEhYxwZR2iUCKCTapduR0dYRQCFhHRtEaZcIoJBol25HRltHAIWEdWwQpV0igEKiXbodGW0dARQS1rFBlHaJAAqJdul2ZLR1BFBIWMcGUdolAigk2qXbkdHWEUAhYR0bRGmXCPwfFowkX07jVBMAAAAASUVORK5CYII=" 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. 关于几个主流语音SDK的接入问题

    这两周都在忙着游戏上线还有接入游戏语音,两周分别接了腾讯语音和百度语音!!! 关于腾讯语音的一些问题 由于发现腾讯语音的在录完音频后的数据是编过码的所以出现了一些问题: *不能解码(腾讯方不提供解码算 ...

  2. Python编码记录

    字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...

  3. C#异步编程(一)

    异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...

  4. 重撸js_2_基础dom操作

    1.node 方法 返回 含义 nodeName String 获取节点名称 nodeType Number 获取节点类型 nodeValue String 节点的值(注意:文本也是节点) 2.inn ...

  5. [APUE]文件和目录(中)

    一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...

  6. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  7. PHP之使用网络函数和协议函数

    使用其他Web站点的数据 <html> <head> <title> Stock Quote From NASDAQ </title> </hea ...

  8. 【Big Data】HADOOP集群的配置(一)

    Hadoop集群的配置(一) 摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问 ...

  9. 4.Android 打包时出现的Android Export aborted because fatal error were founds [closed]

    Android 程序开发完成后,如果要发布到互联网上供别人使用,就需要将自己的程序打包成Android 安装包文件(Android Package,APK),其扩展名为.apk.使用run as 也能 ...

  10. arcgis api for js入门开发系列七图层控制(含源代码)

    上一篇实现了demo的地图分屏对比模块,本篇新增图层控制模块,截图如下(源代码见文章底部): 图层控制模块实现的思路如下: 1.在地图配置文件map.config.js里面配置图层目录树节点信息,作为 ...