• 一、 尝试在 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 节点参数的更多相关文章

  1. iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数

    iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的, ...

  2. React对比Vue(03 事件的对比,传递参数对比,事件对象,ref获取DOM节点,表单事件,键盘事件,约束非约束组件等)

    import React from 'react'; class Baby extends React.Component { constructor (props) { super(props) t ...

  3. 以太网驱动的流程浅析(四)-以太网驱动probe流程【原创】

    以太网驱动的流程浅析(四)-以太网驱动probe流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<Lin ...

  4. JavaScript之怎样获取元素节点

    JavaScript获取元素节点一共有三种方法,分别是通过元素ID.通过标签名字和通过类名字来获取: 1.通过元素ID属性的ID值来获得元素对象-getElementById() DOM提供了一个名为 ...

  5. Jquery学习笔记:利用parent和parents方法获取父节点

    通过选择器一般只能获取指定标识的节点,或者获取子节点. 有些场景下,往往需要根据当前节点找到满足条件的父节点.这个可以通过相应的方法来实现. 1.parent方法 该方法可以获取元素的直接父节点. 我 ...

  6. 遍历DOM树,获取子节点

    获取子节点的方法有:  方法  说明  children()  选取子节点,可以带过滤参数.但只能选择子节点,不能选择孙子节点.  find()  选取子节点,可以带过滤参数.可以选择子节点及孙子节点 ...

  7. ztree获取选中节点时不能进入可视区域出现BUG如何解决

    zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. zTree 的特点编辑 ● zTree v3.0 将核心代码按照功能进 ...

  8. jsTree获取选中节点和选中指定节点

    jstree获取当前选中的checkbox和获取选中节点的所有节点 首先初始化一个带有复选框的 jstree $('#demo_tree').jstree({ "core" : { ...

  9. javascript基础(六): 获取节点实例 jquery获取当前节点的前一个节点

    jquery获取当前节点的前一个节点步骤如下: 1.打开html开发工具,新建一来个html代码页面. 2.在html页面创建三个p标签,然后给这三个p标签设置不同的2113内容. 3.引入jquer ...

随机推荐

  1. Groovy 学习手册(6)

    9. 不可变特性 不可变特性和函数式编程在一起就像是花生酱和果酱在一起一样.虽然没有必要非要在一起使用,但他们相处得很好. 在纯正的函数式语言中,每个函数对本身之外没有影响,即没有副作用.这意味着每次 ...

  2. virtualbox 最小化安装centos7 配置双网卡(nat和桥接)记录----已经过期

    该文章已经过期   请参考另一篇文章:virtualbox 安装centos7 配置桥接网卡,实现主机和虚拟机互通,虚拟机可以访问外网,解决无法上网问题   先说明一下为什么要配置双网卡? 配置nat ...

  3. uiautomatorviewer 查看元素新思路

    用adb 命令把图片和uix获取出来,再导入uiautomatorviewer adb shell uiautomator dump /data/local/tmp/uidump.uixadb pul ...

  4. GitHub 上值得推荐的开源电子书

    GitHub 上值得推荐的开源电子书 开源不仅局限于软件领域,开源同样意味着自由选择的权利和对知识开放的追求. 可以参照这篇文章,已附上所有超链接编程类开放书籍荟萃-Linux Story 语言无关类 ...

  5. php反射获取类和方法中的注释

    通过php中的反射机制,获取该类的文档注释,再通过获取其所有的方法,获取方法的注释 所用到的主要类及其方法 ReflectionClass ReflectionClass::getDocComment ...

  6. php基础面试题:

    1:print.print_r.echo到底有什么区别? 2:get和post的区别 echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对 ...

  7. IOS 集成支付宝和邮件发送

    列表中自找 :http://blog.csdn.net/sing_sing?viewmode=contents

  8. JDK1.5新特性,基础类库篇,线程类(Thread)增强了哪些

    java.lang.Thread类增强特性如下: 线程优先级已经更改.java.lang.Thread.MIN_PRIORITY = 1 java.lang.Thread.NORM_PRIORITY ...

  9. C++/C课程设计(2)工资管理系统功能说明

    原文取自个人博客:www.jycoder.com欢迎訪问 百度网盘下载源码:Demo.zip 百度网盘下载软件文档:软件文档.zip 工资管理系统 一,     基本功能要求: 1)以password ...

  10. vim的Tab键

    vim中默认的tab键大约是6个空格(目测)的宽度.如果想修改为4个空格,用以下命令:    shiftwidth=4    softtabstop-4shiftwidth的含义是:回车后需要缩进时, ...