• 一、 尝试在 spi 驱动里边读取 设备树里面 节点的信息

    //  dts  里面的参数配置503 &spi0 {504     status = "okay";505     pinctrl-name = "default";506     pinctrl-0 = <&spi0_pins>;507     ti,pindir-d0-out-d1-in;508509     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.c1428 #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)));12581259     if (IS_ERR(val))1260         return PTR_ERR(val);12611262     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 的链表就是设备树节点1129q1130     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);11361137     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;238239     raw_spin_lock_irqsave(&devtree_lock, flags);240     pp = __of_find_property(np, name, lenp);            //  加一个自旋锁 保证安全,然后继续匹配241     raw_spin_unlock_irqrestore(&devtree_lock, flags);242243     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;217218     if (!np)219         return NULL;220221     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     }228229     return pp;230 }include/linux/of.h227 #define of_prop_cmp(s1, s2)     strcmp((s1), (s2))
  • 三、 关联起来的过程如下

    // driver/spi/spi.c1428 #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 11522     printk("wk2124A debug speed : %d\n", spi->max_speed_hz);15231524     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

转载于:https://www.cnblogs.com/chenfulin5/p/8473642.html

spidev 驱动 probe 获取 dts 节点参数相关推荐

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

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

  2. Linux i2c子系统驱动probe

    I2C 子系统 I2C 子系统使用的概率非常大,我之前有做过手机的经验, 手机跑的安卓系统,内核是Linux,手机的很多器件都是用I2C通信的,我经历过从板级设备到dts设备树的阶段,知道I2C在整个 ...

  3. OV4689 和IMX179的dts中节点的区别,以及dts节点的注释说明,基于rv1108平台

    文件路径:/kernel/arch/arm/boot/dts/rv1108-camb-v12.dtsi 根据实际的硬件连接. sensor 要求, 的各项信息,尤其注意 i2c 地址. pinctrl ...

  4. sklearn RandomForest(随机森林)模型使用RandomSearchCV获取最优参数及模型效能可视化

    sklearn RandomForest(随机森林)模型使用RandomSearchCV获取最优参数及模型效能可视化 随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林 ...

  5. xgboost是什么?相对于gbdt有什么优势?如何使用randomSearchCV和xgboost进行组合获取最优参数组合?

    xgboost是什么?相对于gbdt有什么优势?如何使用randomSearchCV和xgboost进行组合获取最优参数组合? GBDT (Gradient Boosting Decision Tre ...

  6. JavaScript基础12-day14【DOM查询(获取元素节点、获取元素节点的子节点)、全选练习、DOM增删改、DOM添加删除记录、Window对象方法】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

  7. DOM-4 【utils/待讲评】节点创建删除、元素属性设置获取、节点属性

    讲评 节点创建 Document.prototype ← document.createElement('div') document.createTextNode('xxx') // 创建文本节点 ...

  8. qtreewidget 获取根节点_详解去中心化信任根dRoT技术

    近日,第21届国际信息与通信安全会议(ICICS 2019)在北京召开.ICICS是国际公认的网络与信息安全类顶级学术会议,汇聚了国内外诸多信息安全专家与学术泰斗.本届ICICS 2019会议围绕信息 ...

  9. linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...

    按照国嵌的视频教程上来说的,最后就是-自动创建设备文件! 其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!! 不管了,写完收 ...

  10. jQuery.获取子节点

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

最新文章

  1. 知乎 开源机器学习_使用开源数据和机器学习预测海洋温度
  2. python寻找1000以内的阿姆斯特朗数
  3. 【软件测试】软件测试需要遵守哪些原则
  4. 【排列组合、思维】Combinatorics Homework
  5. HTML全面深入学习-用label获得焦点
  6. 震旦ad369s_震旦ad369s驱动
  7. pg数据库的一些问题
  8. pdf2Image Pdf文件存为jpg NodeJs实现
  9. JAVA_OPTS参数说明与配置
  10. Mycat全局序列号失效的诡异事件
  11. html5视频播放器 知乎,6款让人赞不绝口的电脑软件,知乎超10W人推荐,建议悄悄收藏...
  12. 3.14 我总结的一些小红书笔记发布频率技巧!【玩赚小红书】
  13. linux系统如何运行ansys,ANSYS在linux下使用
  14. 常用模块fractions基本使用
  15. [小白向]Python使用request库调用API并获取返回的JSON数据包中的内容
  16. 【用户行为分析】 用wiki百科中文语料训练word2vec模型
  17. 千克与磅之间的转换 Exercise05_05
  18. 树形结构——JAVA实现
  19. web前端电影项目作业源码 大学生影视主题网页制作电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作
  20. csdn--接口自动化测试之postman如何设置断言

热门文章

  1. 顺序存储循环队列的基本操作
  2. 【leetcode】二叉树(python)
  3. clion opencv安装_Mac 下搭建 Clion + OpenCV4.x 的开发环境
  4. docker镜像打包
  5. 深度学习(四):高级卷积神经网络
  6. BFGS优化算法简介
  7. python实现arxiv论文数据解析处理
  8. 字典序的理解以及python实现
  9. Spring学习(一)Spring简介、SpringIOC
  10. $.ajax(0,jQuery Ajax显示0而不是Array(jQuery Ajax showing 0 instead of Array)