RK3568平台 of 操作函数获取设备树节点

一.of函数概述

Linux内核给我们提供了一系列的函数来获取设备树中的节点或者属性信息,这一系列的函数都有一个统一的前缀 ”of“ , 所以在很多资料里面也被叫做OF函数。

Linux 内核使用device_node 结构体来描述一个节点,此结构体定义在文件include/linux/of.h 中,定义如下:

二.查找节点的of函数

of_find_node_by_name 函数,该函数通过节点名字查找指定的节点。

struct device_node *of_find_node_by_name(struct device_node *from, const char *name);

from : 开始查找的节点,如果为NULL 表示从根节点开始查找整个设备树。

name :**要查找的节点名字。

返回值:**找到的节点,如果为NULL 表示查找失败。

of_find_node_by_path,该函数通过路径来查找指定的节点。

struct device_node *of_find_node_by_path(const char *path);

path : 带有全路径的节点名,可以使用节点的别名,比如:“/backlight” 就是backlight 这个节点的

返回值:**找到的节点,如果为NULL 表示查找失败。

of_get_parent 函数,该函数用于获取指定节点的父节点(如果有父节点的话)。

struct device_node *of_get_parent(const struct device_node *node);

node : 要查找父节点的节点。

返回值: 找到的父节点。

 of_get_next_child 函数,该函数用迭代的方式查找子节点。

struct device_node *of_get_next_child(const struct device_node *node,struct device_node *prev);

node : 父节点。

prev:**前一个子节点,也就是从哪个子节点开始迭代的查找下一个子节点。可以设置为NULL,表示从第一个子节点开始。

返回值:**找到的下一个子节点

of_find_compatible_node 该函数根据device_type 和compatible 这两个属性查找指定的节点

struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compat);

from : 开始查找的节点,如果为NULL 表示从根节点开始查找整个设备树。

type :**要查找的节点对应的type 字符串,也就是device_type 属性值。可以为NULL,表示忽略掉device_type 属性。

compatible : 要查找的节点所对应的compatible 属性列表。
返回值:**找到的节点,如果为NULL 表示查找失败。

of_find_matching_node_and_match该函数通过 of_device_id 匹配表来查找指定的节点。

struct device_node *of_find_matching_node_and_match(struct device_node *from,const struct of_device_id *matches,const struct of_device_id **match);

from : 开始查找的节点,如果为NULL 表示从根节点开始查找整个设备树。

matches : of_device_id 匹配表,也就是在此匹配表里面查找节点。

match : 找到的匹配的of_device_id 。

返回值:**找到的节点,如果为NULL 表示查找失败。

三.of函数获取设备树节点实验

dts:

/{topeet{#address-cells = <1>;#size-cells = <1>;compatible = "simple-bus";myLed{compatible = "my devicetree";reg = <0xFDD60000 0x00000004>;};};
};

驱动程序:

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
#include <linux/of.h>struct device_node *mydevice_node;      
const struct of_device_id *mynode_match;
struct of_device_id mynode_of_match[] = {{.compatible="my devicetree"},{},
};// 平台设备的初始化函数
static int my_platform_probe(struct platform_device *pdev)
{printk(KERN_INFO "my_platform_probe: Probing platform device\n");// 通过节点名称查找设备树节点mydevice_node = of_find_node_by_name(NULL, "myLed");printk("mydevice node is %s\n", mydevice_node->name);// 通过节点路径查找设备树节点mydevice_node = of_find_node_by_path("/topeet/myLed");printk("mydevice node is %s\n", mydevice_node->name);// 获取父节点mydevice_node = of_get_parent(mydevice_node);printk("myled's parent node is %s\n", mydevice_node->name);// 获取子节点mydevice_node = of_get_next_child(mydevice_node, NULL);printk("myled's sibling node is %s\n", mydevice_node->name);// 使用compatible值查找节点mydevice_node=of_find_compatible_node(NULL ,NULL, "my devicetree");printk("mydevice node is %s\n" , mydevice_node->name);//根据给定的of_device_id匹配表在设备树中查找匹配的节点mydevice_node=of_find_matching_node_and_match(NULL , mynode_of_match, &mynode_match);printk("mydevice node is %s\n" ,mydevice_node->name);return 0;
}// 平台设备的移除函数
static int my_platform_remove(struct platform_device *pdev)
{printk(KERN_INFO "my_platform_remove: Removing platform device\n");// 清理设备特定的操作// ...return 0;
}const struct of_device_id of_match_table_id[]  = {{.compatible="my devicetree"},
};// 定义平台驱动结构体
static struct platform_driver my_platform_driver = {.probe = my_platform_probe,.remove = my_platform_remove,.driver = {.name = "my_platform_device",.owner = THIS_MODULE,.of_match_table =  of_match_table_id,},
};// 模块初始化函数
static int __init my_platform_driver_init(void)
{int ret;// 注册平台驱动ret = platform_driver_register(&my_platform_driver);if (ret) {printk(KERN_ERR "Failed to register platform driver\n");return ret;}printk(KERN_INFO "my_platform_driver: Platform driver initialized\n");return 0;
}// 模块退出函数
static void __exit my_platform_driver_exit(void)
{// 注销平台驱动platform_driver_unregister(&my_platform_driver);printk(KERN_INFO "my_platform_driver: Platform driver exited\n");
}module_init(my_platform_driver_init);
module_exit(my_platform_driver_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("topeet");

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

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

相关文章

设计模式三(原型模式)

在开发过程中&#xff0c;创建多个数据相同的对象&#xff0c;每次new都开销比较大&#xff0c;在这里可以使用对象克隆&#xff0c;以先创建的原型对象为模板进行对象的复制。这种模式是实现了一个原型接口&#xff0c;该接口用于创建当前对象的克隆。当直接创建对象的代价比较…

Python初学者学习记录——python基础综合案例:数据可视化——折线图可视化

一、案例介绍 效果一&#xff1a;2020年印美日新冠累计确诊人数 效果二&#xff1a;全国疫情地图可视化 效果三&#xff1a;动态GDP增长图 数据来源&#xff1a; 本案例数据全部来自《百度疫情实时大数据报告》&#xff0c;及公开的全球各国GDP数据 使用的技术&#xff1a; E…

C++爱好者的科目四易错点总结

科目四易错点总结 在科目四考试中&#xff0c;一部分内容是可以通过刷题快速掌握的&#xff0c;一部分内容缺因易混淆而降低我们的准确率&#xff0c;本文主要对后者进行总结&#xff0c;期待大家补充与指正。 注&#xff1a; 本文不是全部的知识点总结处 本文不是权威机构 本文…

张维迎《博弈与社会》笔记(3)导论:一些经济学的基础知识

这篇的主要内容介绍了经济学的基础知识吧。 经济学、社会学、心理学的区别 经济学与社会学的区别与共同点 经济学一般是从个人的行为出发解释社会现象&#xff08;from micro to macro&#xff09;。社会学的传统方法则是从社会的角度来解释个人的行为&#xff08;from macro…

硕士毕业论文如何体现自己的工作量

一、工作量是什么 工作量就是你在科研过程中做的所有工作量的体现&#xff0c;包括你对背景的调查&#xff0c;对问题的发现&#xff0c;你做的实验&#xff0c;提出的创新点。 notice&#xff1a;任何别人做的实验&#xff0c;提出的模型&#xff0c;都不能算是你的工作量。…

uniapp+vue3+ts --微信小程序tab导航可以上下滚动选中选项组件代码

uniappvue3ts --微信小程序tab导航可以上下滚动选中选项组件代码 废话不多说&#xff0c;直接上代码。 组件代码&#xff1a; <template><view class"scroll-tabs-container"><view class"radiusz bg-white pt-[10rpx] z-[999]" :class&…

文件包含漏洞长度截断

长度截断 文件漏洞的利用方式什么是长度截断通过实操理解00截断对版本要求更高一点&#xff0c;而长度截断则是利用了windows的系统漏洞&#xff0c;就是windows文件名&#xff08;就是文件名后缀之后&#xff09;之后如果有空格&#xff0c;或者是点都会被忽略掉&#xff0c;也…

Oracle报错:ORA-08002: sequence CURRVAL is not yet defined in this session

问题 直接查询序列的当前值&#xff0c;然后报了这个错误。 SELECT HR.EMPLOYEES_SEQ.CURRVAL; ORA-08002: sequence CURRVAL is not yet defined in this session解决 ORA-08002错误是Oracle数据库中的一个常见错误&#xff0c;它表示在当前会话中未定义序列的CURRVAL值。这…

Python tkinter (6) —— Listbox控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 目录…

【并发编程】volatile原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 volatile原理实现是内存屏障&#xff0c;Memory Barrier 对volatile变量的写指令后会加入写屏障。对volatile变量的读指令前会加入读屏障 如何…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-2 JavaScript 获取HTML元素对象

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>JavaScript 获取 HTML 元素对象</title> </head><body> <input type"text" value"admin" /> <br> <input …

【深度学习:t-SNE 】T 分布随机邻域嵌入

【深度学习&#xff1a;t-SNE 】T 分布随机邻域嵌入 降低数据维度的目标什么是PCA和t-SNE&#xff0c;两者有什么区别或相似之处&#xff1f;主成分分析&#xff08;PCA&#xff09;t-分布式随机邻域嵌入&#xff08;t-SNE&#xff09; 在 MNIST 数据集上实现 PCA 和 t-SNE结论…

数据中心代理IP:最优性价比业务应用指南

数据中心代理IP在应对高速高并发的业务时&#xff0c;以独特的高速传输&#xff0c;游刃有余地应对多任务处理&#xff0c;适合于特定业务场景的高效加速。理性选用数据中心代理IP&#xff0c;可以为业务将迎来更加稳健和迅速的发展。今天&#xff0c;我们将揭示数据中心代理IP…

Python代码耗时统计

time模块 在代码执行前后各记录一个时间点&#xff0c;两个时间戳相减即程序运行耗时。这种方式虽然简单&#xff0c;但使用起来比较麻烦。 time.time() 函数返回的时间是相对于1970年1月1日的秒数 import timestart time.time() time.sleep(1) end time.time() print(f&…

flutter 搜索框实现,键盘搜索按钮,清空,防抖

import package:flutter/material.dart; import package:flutter_screenutil/flutter_screenutil.dart; import package:flutter_svg/svg.dart; import package:sy_project/config/app_colors.dart; import package:sy_project/core/assets.dart;/// 搜索textview class Custom…

JavaSE核心基础-面向对象一 - 类和对象 成员变量与局部变量-知识点

1.面向对象的特点 ①.面向对象是一种常见的思想&#xff0c;比较符合人们的思考习惯&#xff1b; ②.面向对象可以将复杂的业务逻辑简单化&#xff0c;增强代码复用性&#xff1b; ③.面向对象具有抽象、封装、继承、多态等特性。 2.面向对象的三大特征 ①.封装性 封装是面向对…

【MIdjourne基础】 |MIdjourney基础参数全解析,各类辅助知识

文章目录 1 参数列表1.1 基础参数列表 2 基础参数详解2.1 模型版本选择2.2 模型出图模式选择2.3 基础生图参数2.3.1 --ar2.3.2 --stylize2.3.3 --no2.3.4 --chaos2.3.5 --quality2.3.6 --stop2.3.7 --hd2.3.8 --repeat 1 参数列表 1.1 基础参数列表 模型版本选择 目标参数作…

Linux delay相关函数实现

1、udelay 与 sleep 相关函数相比&#xff0c;delay 的最大区别是忙等、一直占用 CPU&#xff0c;而 sleep 会让出 CPU 控制权。 mdelay、ndelay都是基于 udelay 来实现的。在 include/linux/delay.h 中&#xff0c;如下&#xff1a; /** Using udelay() for intervals grea…

杂项基础知识

换行与回车 ASCII中的CR与LF CR&#xff08;Carriage Return&#xff09;&#xff0c;回车字符\r&#xff0c;控制字符&#xff0c;将光标移动到本行行首 LF&#xff08;Line Feed&#xff09;&#xff0c;换行字符\n&#xff0c;控制字符&#xff0c;将光标下移一行 ASCII…

开源项目对于新用户和初学者适合哪些工作

目录 一、阅读和理解文档 二、报告问题 三、测试和验证修复 四、编写和更新文档 五、简单的代码更改和修复 六、参与社区讨论 开源项目对于新用户和初学者来说&#xff0c;提供了宝贵的学习和实践机会。以下是一些适合新用户和初学者参与的工作&#xff1a; 一、阅读和理…