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;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 节点参数相关推荐
- iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数
iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的, ...
- Linux i2c子系统驱动probe
I2C 子系统 I2C 子系统使用的概率非常大,我之前有做过手机的经验, 手机跑的安卓系统,内核是Linux,手机的很多器件都是用I2C通信的,我经历过从板级设备到dts设备树的阶段,知道I2C在整个 ...
- OV4689 和IMX179的dts中节点的区别,以及dts节点的注释说明,基于rv1108平台
文件路径:/kernel/arch/arm/boot/dts/rv1108-camb-v12.dtsi 根据实际的硬件连接. sensor 要求, 的各项信息,尤其注意 i2c 地址. pinctrl ...
- sklearn RandomForest(随机森林)模型使用RandomSearchCV获取最优参数及模型效能可视化
sklearn RandomForest(随机森林)模型使用RandomSearchCV获取最优参数及模型效能可视化 随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林 ...
- xgboost是什么?相对于gbdt有什么优势?如何使用randomSearchCV和xgboost进行组合获取最优参数组合?
xgboost是什么?相对于gbdt有什么优势?如何使用randomSearchCV和xgboost进行组合获取最优参数组合? GBDT (Gradient Boosting Decision Tre ...
- JavaScript基础12-day14【DOM查询(获取元素节点、获取元素节点的子节点)、全选练习、DOM增删改、DOM添加删除记录、Window对象方法】
学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...
- DOM-4 【utils/待讲评】节点创建删除、元素属性设置获取、节点属性
讲评 节点创建 Document.prototype ← document.createElement('div') document.createTextNode('xxx') // 创建文本节点 ...
- qtreewidget 获取根节点_详解去中心化信任根dRoT技术
近日,第21届国际信息与通信安全会议(ICICS 2019)在北京召开.ICICS是国际公认的网络与信息安全类顶级学术会议,汇聚了国内外诸多信息安全专家与学术泰斗.本届ICICS 2019会议围绕信息 ...
- linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...
按照国嵌的视频教程上来说的,最后就是-自动创建设备文件! 其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!! 不管了,写完收 ...
- jQuery.获取子节点
获取子节点 方法 说明 children() 选取子节点,可以带过滤参数.但只能选择子节点,不能选择孙子节点. find() 选取子节点,可以带过滤参数.可以选择子节点及孙子节点. <!DOC ...
最新文章
- 知乎 开源机器学习_使用开源数据和机器学习预测海洋温度
- python寻找1000以内的阿姆斯特朗数
- 【软件测试】软件测试需要遵守哪些原则
- 【排列组合、思维】Combinatorics Homework
- HTML全面深入学习-用label获得焦点
- 震旦ad369s_震旦ad369s驱动
- pg数据库的一些问题
- pdf2Image Pdf文件存为jpg NodeJs实现
- JAVA_OPTS参数说明与配置
- Mycat全局序列号失效的诡异事件
- html5视频播放器 知乎,6款让人赞不绝口的电脑软件,知乎超10W人推荐,建议悄悄收藏...
- 3.14 我总结的一些小红书笔记发布频率技巧!【玩赚小红书】
- linux系统如何运行ansys,ANSYS在linux下使用
- 常用模块fractions基本使用
- [小白向]Python使用request库调用API并获取返回的JSON数据包中的内容
- 【用户行为分析】 用wiki百科中文语料训练word2vec模型
- 千克与磅之间的转换 Exercise05_05
- 树形结构——JAVA实现
- web前端电影项目作业源码 大学生影视主题网页制作电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作
- csdn--接口自动化测试之postman如何设置断言
热门文章
- 顺序存储循环队列的基本操作
- 【leetcode】二叉树(python)
- clion opencv安装_Mac 下搭建 Clion + OpenCV4.x 的开发环境
- docker镜像打包
- 深度学习(四):高级卷积神经网络
- BFGS优化算法简介
- python实现arxiv论文数据解析处理
- 字典序的理解以及python实现
- Spring学习(一)Spring简介、SpringIOC
- $.ajax(0,jQuery Ajax显示0而不是Array(jQuery Ajax showing 0 instead of Array)