spidev 驱动 probe 获取 dts 节点参数
- 一、 尝试在 spi 驱动里边读取 设备树里面 节点的信息
    //  dts  里面的参数配置
    503 &spi0 {
    504     status = "okay";
    505     pinctrl-name = "default";
    506     pinctrl-0 = <&spi0_pins>;
    507     ti,pindir-d0-out-d1-in;
    508
    509     wk2124A {
    510         compatible = "wk2124A";
    511         reg = <0>;
    512         name = "chenfulin";
    513         // spi-cpha = <1>;
    514         // spi-tx-bus-width = <1>;
    515         // spi-rx-bus-width = <1>;
    516         spi-max-frequency = <10000000>;
    517     };
    518 };
- 二、 代码跟踪
    //  drivers/spi/spi.c
    1428 #if defined(CONFIG_OF)
    1429 static struct spi_device *
    1430 of_register_spi_device(struct spi_master *master, struct device_node *nc)·
    1431 {
            // ...
    1454     /* Device address */
    1455     rc = of_property_read_u32(nc, "reg", &value);           // 看他是怎么找到 reg 的值的
    1456     if (rc) {
    1457         dev_err(&master->dev, "%s has no valid 'reg' property (%d)\n",
    1458             nc->full_name, rc);
    1459         goto err_out;
    1460     }  
    //  include/linux/of.h
     857 static inline int of_property_read_u32(const struct device_node *np,
     858                        const char *propname,
     859                        u32 *out_value)
     860 {
     861     return of_property_read_u32_array(np, propname, out_value, 1);        // 从函数可以看出,找的是一个 u32的值
     862 }
    // drivers/of/base.c
    1252 int of_property_read_u32_array(const struct device_node *np,
    1253                    const char *propname, u32 *out_values,
    1254                    size_t sz)
    1255 {
    1256     const __be32 *val = of_find_property_value_of_size(np, propname,            // 然后函数又封了一层
    1257                         (sz * sizeof(*out_values)));
    1258
    1259     if (IS_ERR(val))
    1260         return PTR_ERR(val);
    1261
    1262     while (sz--)
    1263         *out_values++ = be32_to_cpup(val++);
    1264     return 0;
    1265 }
    1266 EXPORT_SYMBOL_GPL(of_property_read_u32_array);
    1125 static void *of_find_property_value_of_size(const struct device_node *np,
    1126             const char *propname, u32 len)
    1127 {
    1128     struct property *prop = of_find_property(np, propname, NULL);               // 这里就是找到节点的函数,这个 property 的链表就是设备树节点
    1129
    q1130     if (!prop)
    1131         return ERR_PTR(-EINVAL);
    1132     if (!prop->value)
    1133         return ERR_PTR(-ENODATA);
    1134     if (len > prop->length)
    1135         return ERR_PTR(-EOVERFLOW);
    1136
    1137     return prop->value;
    1138 }
     232 struct property *of_find_property(const struct device_node *np,
     233                   const char *name,
     234                   int *lenp)
     235 {
     236     struct property *pp;
     237     unsigned long flags;
     238
     239     raw_spin_lock_irqsave(&devtree_lock, flags);
     240     pp = __of_find_property(np, name, lenp);            //  加一个自旋锁 保证安全,然后继续匹配
     241     raw_spin_unlock_irqrestore(&devtree_lock, flags);
     242
     243     return pp;
     244 }
     245 EXPORT_SYMBOL(of_find_property);
     213 static struct property *__of_find_property(const struct device_node *np,
     214                        const char *name, int *lenp)
     215 {
     216     struct property *pp;
     217
     218     if (!np)
     219         return NULL;
     220
     221     for (pp = np->properties; pp; pp = pp->next) {
     222         if (of_prop_cmp(pp->name, name) == 0) {             // 如果找到了就直接返回 pp节点。
     223             if (lenp)
     224                 *lenp = pp->length;
     225             break;
     226         }
     227     }
     228
     229     return pp;
     230 }
    include/linux/of.h
    227 #define of_prop_cmp(s1, s2)     strcmp((s1), (s2))
- 三、 关联起来的过程如下
    // driver/spi/spi.c
    1428 #if defined(CONFIG_OF)
    1429 static struct spi_device *
    1430 of_register_spi_device(struct spi_master *master, struct device_node *nc)
    1431 {
    1432     struct spi_device *spi;
    1433     int rc;
    1434     u32 value;
            // ... ..
    1521     /* Store a pointer to the node in the device structure */
    1522     of_node_get(nc);
    1523     spi->dev.of_node = nc;
            // ... ... 这里直接把设备节点挂在了 spi-dev.of_node 下面,  上面的 np 就是节点
            //  struct property *pp == pp = np->properties    np 是一个链表。
    1538 }
- 四、在 spi drrver 里面找出相关参数
    //  probe 函数里面
    1521 #if 1
    1522     printk("wk2124A debug speed : %d\n", spi->max_speed_hz);
    1523
    1524     for (pp = spi->dev.of_node->properties; pp; pp = pp->next)
    1525     {
    1526         printk("%s   \n", pp->name);
    1527         if (strcmp(pp->name, "name") == 0)
    1528             printk("name : %s\n", (char *)pp->value);
    1529     }
    1530     printk("\n");
    1531 #endif
spidev 驱动 probe 获取 dts 节点参数的更多相关文章
- iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数
		iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的, ... 
- React对比Vue(03 事件的对比,传递参数对比,事件对象,ref获取DOM节点,表单事件,键盘事件,约束非约束组件等)
		import React from 'react'; class Baby extends React.Component { constructor (props) { super(props) t ... 
- 以太网驱动的流程浅析(四)-以太网驱动probe流程【原创】
		以太网驱动的流程浅析(四)-以太网驱动probe流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<Lin ... 
- JavaScript之怎样获取元素节点
		JavaScript获取元素节点一共有三种方法,分别是通过元素ID.通过标签名字和通过类名字来获取: 1.通过元素ID属性的ID值来获得元素对象-getElementById() DOM提供了一个名为 ... 
- Jquery学习笔记:利用parent和parents方法获取父节点
		通过选择器一般只能获取指定标识的节点,或者获取子节点. 有些场景下,往往需要根据当前节点找到满足条件的父节点.这个可以通过相应的方法来实现. 1.parent方法 该方法可以获取元素的直接父节点. 我 ... 
- 遍历DOM树,获取子节点
		获取子节点的方法有: 方法 说明 children() 选取子节点,可以带过滤参数.但只能选择子节点,不能选择孙子节点. find() 选取子节点,可以带过滤参数.可以选择子节点及孙子节点 ... 
- ztree获取选中节点时不能进入可视区域出现BUG如何解决
		zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. zTree 的特点编辑 ● zTree v3.0 将核心代码按照功能进 ... 
- jsTree获取选中节点和选中指定节点
		jstree获取当前选中的checkbox和获取选中节点的所有节点 首先初始化一个带有复选框的 jstree $('#demo_tree').jstree({ "core" : { ... 
- javascript基础(六): 获取节点实例 jquery获取当前节点的前一个节点
		jquery获取当前节点的前一个节点步骤如下: 1.打开html开发工具,新建一来个html代码页面. 2.在html页面创建三个p标签,然后给这三个p标签设置不同的2113内容. 3.引入jquer ... 
随机推荐
- Oracle 12C -- 删除PDB
			删除PDB SQL> select con_id,pdb_name,status from cdb_pdbs; CON_ID PDB_NAME STATUS ---------- ------- ... 
- Android 关于导航栏(虚拟按键)遮挡PopupWindow底部布局的问题
			我们自定义popupWindow的时候,一般会设置这些参数 setContentView(contentView); //设置高度为屏幕高度 setWidth(UIUtils.getScreenHei ... 
- 实用的php购物车程序
			实用的php教程购物车程序以前有用过一个感觉不错,不过看了这个感觉也很好,所以介绍给需要的朋友参考一下. <?php//调用实例require_once 'cart.class.php';ses ... 
- Android Studio入门指南 (历上最全,全球首发)
			下载地址:http://pan.baidu.com/s/1CEMma 8月份的时候因为Android开发团队全部使用Android Studio进行开发,所以我整理了Android Studio的一些 ... 
- mongodb 数据库操作--备份 还原 导出 导入(转)
			mongodb 数据库操作--备份 还原 导出 导入 -------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport ... 
- 关于ansbile工具的shell、command、script、raw模块的区别和使用场景
			command模块 [执行远程命令] [root@node1 ansible]# ansible testservers -m command -a 'uname -n' script模块 [在远程主 ... 
- Go 源码学习之--net/http
			其实自己不是很会看源码,但是学习优秀的源码是提升自己代码能力的一种方式,也可以对自己以后写代码有一个很好的影响,所以决定在之后的时间内,要有一个很好的习惯,阅读优秀的源码.刚开始自己会觉得看源码很痛苦 ... 
- vivado中设置多线程编译
			VIVADO中一个run编译时支持的线程数如下表:(综合时一般是2线程) Place Route Windows默认 2 2 Linux默认 4 4 Windows开启maxThreads=8 4 4 ... 
- ios日期格式转换
			转自:http://blog.csdn.net/l_ch_g/article/details/8217725 1.如何如何将一个字符串如“ 20110826134106”装化为任意的日期时间格式,下面 ... 
- node webkit(nw.js) 设置自动更新
			原理:把更新的文件放在服务器上,设置一个客户端版本号,每次打开客户端的时候,通过接口获取服务器上的版本,如果高于本地的版本就下载服务器上的代码,低于或等于就不更新 <script> var ... 
