Linux驱动开发——(一)设备树的基本属性及其应用

目录

一、常见基本属性

1.1 compatible属性

1.2 status属性

1.3 reg属性

1.4 #address-cells属性和#size-cells属性

二、基本属性在设备树的表现

三、基本属性在驱动代码的表现

3.1 驱动代码

3.2 驱动代码中的OF函数

3.2.1 of_find_node_by_path

3.2.2 of_find_property 

3.2.3 of_property_read_string 

3.2.4 of_property_read_u32_array

四、平台实验测试


一、常见基本属性

常见的基本属性有compatible、status、reg、#address-cells#size-cells

1.1 compatible属性

compatible属性的值是一个字符串列表,将设备和驱动绑定起来。compatible属性的值格式如下所示:

"manufacturer,model"

manufacturer:厂商。

model:模块对应的驱动名字。

 比如:

compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";

其中”fsl“表示厂商是飞思卡尔,“imx6ul-evk-wm8960”和 “imx-audio-wm8960”表示驱动模块名字。 这个设备首先使用第一个兼容值“imx6ul-evk-wm8960”在Linux内核里面查找,看看能不能找到与之匹配的驱动文件,如果没有找到的话就使用第二个兼容值“imx-audio-wm8960”查。

1.2 status属性

status属性值也是字符串,是和设备状态有关的。

描述
”okay“表明设备是可操作的。
"disabled"表明设备当前是不可操作的,但是在未来可以变为可操作的。
”fail”表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
”fail-sss“含义和“fail”相同,后面的 sss部分是检测到的错误内容。
1.3 reg属性

reg属性的值一般是 (address length)对。 reg属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。

1.4 #address-cells属性和#size-cells属性

这两个属性的值都是无符号32位整形, #address-cells和 #size-cells这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。

#address-cells属性值决定了子节点reg属性中地址信息所占用的字长(32位),#size-cells属性值决定了子节点reg属性中长度信息所占的字长(32位)。


二、基本属性在设备树的表现

以I.MU6ULL为例,打开设备树dts文件,在根节点“/”下创建一个名为“alphaled”的子节点。

alphaled { #address-cells = <1>; #size-cells = <1>; compatible = "atkalpha-led"; status = "okay"; reg = < 0X020C406C 0X04 /* CCM_CCGR1_BASE */ 0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */ 0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */ 0X0209C000 0X04 /* GPIO1_DR_BASE */ 0X0209C004 0X04 >; /* GPIO1_GDIR_BASE */ 
};

第2、3行,属性#address-cells#size-cells都为1,表示reg属性中起始地址占用一个字长
(cell),地址长度也占用一个字长 (cell)。
第4行,属性compatbile设置alphaled节点兼容性为“atkalpha-led”。
第5行,属性status设置状态为“okay”。
第6~10行,属性reg设置了驱动里面所要使用的寄存器物理地址,比如第6行的“ 0X020C406C 0X04”表示 I.MX6ULL的 CCM_CCGR1寄存器,其中寄存器首地址为 0X020C406C,长度为4个字节。

然后重新编译设备树,使用新的设备树启动Linux。


三、基本属性在驱动代码的表现

3.1 驱动代码

驱动入口函数加入以下代码:

/* 获取设备树中的属性数据 *//* 1、获取设备节点:alphaled */dtsled.nd = of_find_node_by_path("/alphaled");if(dtsled.nd == NULL) {printk("alphaled node nost find!\r\n");return -EINVAL;} else {printk("alphaled node find!\r\n");}/* 2、获取compatible属性内容 */proper = of_find_property(dtsled.nd, "compatible", NULL);if(proper == NULL) {printk("compatible property find failed\r\n");} else {printk("compatible = %s\r\n", (char*)proper->value);}/* 3、获取status属性内容 */ret = of_property_read_string(dtsled.nd, "status", &str);if(ret < 0){printk("status read failed!\r\n");} else {printk("status = %s\r\n",str);}/* 4、获取reg属性内容 */ret = of_property_read_u32_array(dtsled.nd, "reg", regdata, 10);if(ret < 0) {printk("reg property read failed!\r\n");} else {u8 i = 0;printk("reg data:\r\n");for(i = 0; i < 10; i++)printk("%#X ", regdata[i]);printk("\r\n");}
3.2 驱动代码中的OF函数
3.2.1 of_find_node_by_path

通过路径来查找指定的节点,函数原型如下:

inline struct device_node *of_find_node_by_path(const char *path)

path:带有全路径的节点名,可使用节点的别名。
返回值: 找到的节点,如果为 NULL表示查找失败。

3.2.2 of_find_property 

用于查找指定的属性compatible,函数原型如下:

property *of_find_property(const struct device_node *np, const char *name, int *lenp)

np:设备节点。
name:属性名字。
lenp:属性值的字节数
返回值: 找到的属性。

3.2.3 of_property_read_string 

用于读取属性中字符串值,函数原型如下:

int of_property_read_string(struct device_node *np, const char *propname, const char **out_string)

np:设备节点。
proname:要读取的属性名字。
out_string:读取到的字符串值。
返回值: 0,读取成功;负值,读取失败。

3.2.4 of_property_read_u32_array

读取属性中u32类型的数组数据,大多数的reg属性都是数组数据,可以使用该函数一次读取出reg属性中的所有数据。这该函数的原型如下:

int of_property_read_u32_array(const struct device_node *np, const char *propname, u32 *out_values, size_t sz)

np:设备节点。

proname: 要读取的属性名字。

out_value:读取到的数组值,分别为 u8、 u16、 u32和 u64。

sz:要读取的数组元素数量。

返回值: 0,读取成功;负值,读取失败,-EINVAL表示属性不存在,-ENODATA表示没有要读取的数据,-EOVERFLOW表示属性值列表太小。


四、平台实验测试

如图:

输出正确,实现成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp之消除图片的空白占用空间

我们在使用uniapp开发的过程中一定会遇到一个情况就是我们加载的图片总有一点空白出现在不该出现的地方代码如下 <view style"background:#ff0000;"><image style"width:100%;"src"https://t7.baidu.com/it/u1819248061,230866778&fm19…

插入排序的可视化实现(Python)

插入排序的Python代码 import tkinter as tk import random import timeclass InsertionSortVisualizer:def __init__(self, root, canvas_width800, canvas_height400, num_bars10):self.root rootself.canvas_width canvas_widthself.canvas_height canvas_heightself.nu…

【1471】java项目进度管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 项目进度管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

javaWeb项目-智慧餐厅点餐管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JavaScript Java…

中国人为什么不说自信,而说信天

中国人从来不说自信&#xff0c;中国人信天&#xff0c;老天爷是最公平的。做好自己&#xff0c;天命注定&#xff0c;我都这么努力了&#xff0c;老天爷不帮我帮谁&#xff1f; 中国人信天是有逻辑关系的&#xff0c;很简单&#xff1a;做错事情了或者结果不好了&#xff0c;…

如何爬出 Kotlin 协程死锁的坑?

作者&#xff1a;悬衡 一、前言 在 Java 中有一个非常经典的死锁问题, 就是明明自己已经占用了线程池, 却还继续去申请它, 自己等自己, 就死锁了, 如下图和代码: // 这段代码将死锁到天荒地老final ExecutorService executorService Executors.newSingleThreadExecutor();exe…

c/c++开发方向

(17 封私信 / 1 条消息) c/c中最挣钱的方向是哪个&#xff1f; - 知乎 (zhihu.com) C的特点是尽量把硬件的性能利用起来。 性能敏感的垂直领域。 &#xff08;快&#xff09;&#xff08;性能&#xff09;&#xff08;性能&#xff09; &#xff08;可能就不是去写应用层业…

域名信息查询同款WHOIS源码

域名查询一般是指查询域名的whois注册信息&#xff0c;域名WHOIS是当前域名系统中不可或缺的一项信息服务。在使用域名进行Internet冲浪时&#xff0c;很多用户希望进一步了解域名、名字服务器详细信息&#xff0c;这就会用到WHOIS。 域名信息查询同款WHOIS源码

鞋狗电子书免费下载

鞋狗电子书免费下载 链接&#xff1a;https://pan.quark.cn/s/54e80e57fb42

CCF-CSP真题《202312-3 树上搜索》思路+c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 问题描述 试题编号&#xff1a;202312-3试题名称&#xff1a;树上搜索时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 题目背景 问题描述 输入格式 输出格式 样…

16.Class绑定

Class绑定 数据绑定的一个常见需求场景是操纵元素的 CSS class 列表&#xff0c;因为 class 是 attribute&#xff0c;我们可以和其他 attribute 一样使用 v-bind 将它们和动态的字符串绑定。但是&#xff0c;在处理比较复杂的绑定时&#xff0c;通过拼接生成字符串是麻烦且易出…

stl_set

文章目录 set1.关联式容器2.键值对3. set3.1 set介绍3.2 set的使用3.2.1 pair3.2.2 find3.2.3 lower_bound 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用3.3.3 find3.3.4 equal_range3.3.5 erase set 1.关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分…