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

news2024/11/23 16:34:26

目录

一、常见基本属性

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.coloradmin.cn/o/1611808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git:使用conda命令切换虚拟环境

1. 问题 在win10电脑的Git中&#xff0c;无法使用conda list命令&#xff0c;报错&#xff08;bash&#xff1a;conda&#xff1a;command not found&#xff09;。也无法使用conda activate base命令激活虚拟环境&#xff0c;报错&#xff08;bash&#xff1a;conda&#xff…

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation

提出一个模型同时考虑到object motion和camra motion&#xff0c;分别对应着OMCM module和CMCM module&#xff0c;因为缺少同时包含text\trajectory\camera pose的数据&#xff0c;所以本文使用的是一个multistep的训练策略 Camera Motion Control Module (CMCM) a. 训练的数…

InFusion:通过从扩散先验学习深度完成来修复3D高斯

InFusion: Inpainting 3D Gaussians via Learning Depth Completion from Diffusion Prior InFusion&#xff1a;通过从扩散先验学习深度完成来修复3D高斯 Zhiheng Liu * 刘志恒 *1144Hao Ouyang * 欧阳浩 *2233Qiuyu Wang 王秋雨33Ka Leong Cheng 郑家亮2233Jie Xiao 街小…

prompt提示工程

一、什么是提示工程&#xff08;Prompt Engineering&#xff09; 提示工程也叫「指令工程」。 Prompt 就是你发给大模型的指令&#xff0c;比如「讲个笑话」、「用 Python 编个贪吃蛇游戏」、「给男/女朋友写封情书」等貌似简单&#xff0c;但意义非凡 「Prompt」 是 AGI 时代…

政安晨:【Keras机器学习示例演绎】(六)—— 通过 CT 扫描进行 3D 图像分类

目录 简介 设置 下载 MosMedData&#xff1a;胸部CT扫描与COVID-19相关发现 加载数据和预处理 建立训练和验证数据集 数据增强 定义 3D 卷积神经网络 训练模型 模型性能可视化 通过一次 CT 扫描进行预测 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍…

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

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

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 一、简单介绍 二、简单人脸检测添加戴眼镜效…

就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色

六、Ansible playbook 简介 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。   通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的…

设计了一个最佳分词自回归模型训练方案

概述 使用Token和二值Token进行分词&#xff1a; 文本被划分为一系列的Token&#xff0c;并引入二值Token来指示分词的边界。随机分配二值Token并训练模型&#xff1a; 训练数据的Token被随机分配二值Token&#xff0c;表示可能的分词位置&#xff0c;然后这些Token序列被输入…

Python基础学习之**kwargs

在Python编程中&#xff0c;**kwargs 是一个强大的工具&#xff0c;它允许我们在函数定义中接受任意数量的关键字参数。kwargs 是 "keyword arguments" 的缩写&#xff0c;实际上是一个字典&#xff0c;其中包含了传递给函数的所有关键字参数。本文将详细介绍 **kwar…

Zynq 7000 系列中的JTAG和DAP子系统

Zynq 7000系列SoC器件通过标准JTAG调试接口提供调试访问。在内部&#xff0c;SoC设备器件在处理系统&#xff08;PS&#xff09;内部实现了一个Arm调试访问端口&#xff08;DAP&#xff09;&#xff0c;同时在可编程逻辑&#xff08;PL&#xff09;内部实现了一个标准的JTAG测试…

机器视觉系统:PVC片材表面缺陷检测的锐利“眼睛”

PVC片材作为一种广泛应用于建筑、包装、医疗等领域的塑料材料&#xff0c;其表面质量对于产品的性能和使用寿命至关重要。然而&#xff0c;在生产过程中&#xff0c;PVC片材可能会出现多种表面缺陷&#xff0c;如划痕、污渍、气泡、压痕等。为了确保产品质量&#xff0c;机器视…

亚信安慧AntDB:数据库性能新高度

亚信安慧AntDB秉持着为客户提供最佳数据库解决方案的理念&#xff0c;不断探索并创新&#xff0c;最近取得了重大的突破。他们成功地研发出一种先进的数据库割接方案&#xff0c;实现了不停服、零故障的数据库割接操作&#xff0c;有效地将替换所带来的业务影响降至最低。 这一…

同旺科技 USB TO SPI / I2C适配器读写24LC128--读写

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、24LC128芯片&#xff1b; 适应于同旺科技 USB TO SPI / I2C适配器专业版&#xff1b; 专业版配套软件更新&#xff1b; 直接读取HEX文件&#xff0c;自动完成文件解析&#xff1b; 支持芯片&#xf…

书生·浦语大模型实战训练营--第二期第六节课--Lagent AgentLego 智能体应用搭建--notebook

一、 大模型的局限性 大模型本身存在下面的几个问题&#xff1a;幻觉&#xff08;虚假信息&#xff0c;不符合实际&#xff09;、时效性&#xff08;训练数据过时&#xff0c;不能实时更新&#xff09;、可靠性&#xff08;对于复杂任务&#xff0c;可能错误输出&#xff09; …

K-means和DBSCAN

目录 一、K-means和DBSCAN之间的主要区别 二、DBSCAN聚类算法 2.1DBSCAN聚类算法实现点集数据的聚类 2.2DBSCAN聚类算法实现鸢尾花数据集的聚类 三、K-means聚类算法 3.1K-means聚类算法实现随机数据的聚类 3.2K-means聚类算法实现鸢尾花数据集的聚类 一、K-means和DBSC…

【点云语义分割】弱监督点云语义分割-双教师指导的对比学习

Weakly Supervised Learning for Point Cloud Semantic Segmentation With Dual Teacher 摘要&#xff1a; 为了增强特征学习能力&#xff0c;我们在这项工作中引入了双教师指导的对比学习框架&#xff0c;用于弱监督点云语义分割。双教师框架可以减少子网络耦合&#xff0c;促…

LeetCode - 283.移动零

题目链接&#xff1a; LeetCode - 283.移动零 题目分析&#xff1a; ​​​​​ 题解代码&#xff1a; #include<iostream> #include<vector> using namespace std;class Solution { public:void moveZeroes(vector<int>& nums) {for (int cur 0, des…

4步生成高质量图像,Stable Diffusion WebUI 1.9.0来了!

上周Stable Diffusion WebUI正式发布了1.9.0版本&#xff0c;我也第一时间把AutoDL镜像升级到了最新版本&#xff0c;有几个比较重要的更新再和大家同步下。 1、为SDXL-Lightning模型使用SGM统一调度器 SDXL-Lightning由字节跳动开源&#xff0c;是一款闪电般的快速文生图模型…

插入排序的可视化实现(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…