设备树接口函数

0.前言

在前一篇博客里面,写设备树语法介绍和接口函数的时候,写到一半发现csdn有篇幅限制,现在在此篇进行补充。

之前的文章路径如下

驱动开发之设备树语法-CSDN博客

1.接口函数

1.1.of_property_read_xx_array 函数

int of_property_read_u8_array(const struct device_node *np,
const char *propname, 
u8 *out_values, 
size_t sz)
int of_property_read_u16_array(const struct device_node *np,const char *propname, u16 *out_values, size_t sz)
int of_property_read_u32_array(const struct device_node *np,const char *propname, u32 *out_values,size_t sz)
int of_property_read_u64_array(const struct device_node *np,const char *propname, u64 *out_values,
size_t sz)

np:设备节点

 proname: 要读取的属性名字

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

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

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

1.2.of_property_read_xx_array 函数

of_property_read_u8 函数 of_property_read_u16 函数 of_property_read_u32 函数 of_property_read_u64 函数, 有些属性只有一个整形值,这四个函数就是用于读取这种只有一个整形值的属性,分别用 于读取 u8、u16、u32 和 u64 类型属性值

int of_property_read_u8(const struct device_node *np, 
const char *propname,
u8 *out_value)
int of_property_read_u16(const struct device_node *np, 
const char *propname,
u16 *out_value)
int of_property_read_u32(const struct device_node *np, 
const char *propname,
u32 *out_value)
int of_property_read_u64(const struct device_node *np, 
const char *propname,
u64 *out_value)

np:设备节点

proname: 要读取的属性名字

out_value:读取到的数组值

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

1.3.of_property_read_string 函数

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,读取成功,负值,读取失败

1.4.of_n_addr_cells 函数

of_n_addr_cells 函数用于获取#address-cells 属性值,

int of_n_addr_cells(struct device_node *np)

np:设备节点。

返回值:获取到的#address-cells 属性值。

1.5.of_n_size_cells 函数

of_size_cells 函数用于获取#size-cells 属性值,

int of_n_size_cells(struct device_node *np) 

np:设备节点。

返回值:获取到的#size-cells 属性值。 

 1.6.of_device_is_compatible 函数

of_device_is_compatible 函数用于查看节点的 compatible 属性是否有包含 compat 指定的字 符串,也就是检查设备节点的兼容性

 int of_device_is_compatible(const struct device_node *device, const char *compat) 

device:设备节点。

compat:要查看的字符串。

返回值:0,节点的 compatible 属性中不包含 compat 指定的字符串;正数,节点的 compatible 属性中包含 compat 指定的字符串。

1.7.of_get_address 函数

of_get_address 函数用于获取地址相关属性,主要是“reg”或者“assigned-addresses”属性 值

const __be32 *of_get_address(struct device_node *dev, int index, u64 *size, unsigned int *flags)  dev:设备节点。

index:要读取的地址标号。

size:地址长度。

flags:参数,比如 IORESOURCE_IO、IORESOURCE_MEM 等

返回值:读取到的地址数据首地址,为 NULL 的话表示读取失败。

1.8.of_translate_address 函数

of_translate_address 函数负责将从设备树读取到的地址转换为物理地址,函数原型如下: u64 of_translate_address(struct device_node *dev, const __be32 *in_addr)

dev:设备节点。

in_addr:要转换的地址。

返回值:得到的物理地址,如果为 OF_BAD_ADDR 的话表示转换失败。

1.9.of_address_to_resource 函数

IIC、SPI、GPIO 等这些外设都有对应的寄存器,这些寄存器其实就是一组内存空间,Linux 内核使用 resource 结构体来描述一段内存空间,“resource”翻译出来就是“资源”,因此用 resource 结构体描述的都是设备资源信息,resource 结构体定义在文件 include/linux/ioport.h 中,定义如 下 

struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};

对于 32 位的 SOC 来说,resource_size_t 是 u32 类型的。其中 start 表示开始地址,end 表示 结束地址,name 是这个资源的名字,flags 是资源标志位,一般表示资源类型,可选的资源标志 定义在文件 include/linux/ioport.h 中 

#define IORESOURCE_BITS 0x000000ff 
#define IORESOURCE_TYPE_BITS 0x00001f00 
#define IORESOURCE_IO 0x00000100 
#define IORESOURCE_MEM 0x00000200
#define IORESOURCE_REG 0x00000300 
#define IORESOURCE_IRQ 0x00000400
#define IORESOURCE_DMA 0x00000800
#define IORESOURCE_BUS 0x00001000
#define IORESOURCE_PREFETCH 0x00002000 
#define IORESOURCE_READONLY 0x00004000
#define IORESOURCE_CACHEABLE 0x00008000
#define IORESOURCE_RANGELENGTH 0x00010000
#define IORESOURCE_SHADOWABLE 0x00020000
#define IORESOURCE_SIZEALIGN 0x00040000 
#define IORESOURCE_STARTALIGN 0x00080000 
#define IORESOURCE_MEM_64 0x00100000
#define IORESOURCE_WINDOW 0x00200000 
#define IORESOURCE_MUXED 0x00400000 
#define IORESOURCE_EXCLUSIVE 0x08000000 
#define IORESOURCE_DISABLED 0x10000000
#define IORESOURCE_UNSET 0x20000000
#define IORESOURCE_AUTO 0x40000000
#define IORESOURCE_BUSY 0x80000000 

这些在platform实验里面有使用过,如果感兴趣可以看看下面这个文章

驱动开发之platform总线-CSDN博客 

 最 常 见 的 资 源 标 志 就 是 IORESOURCE_MEM 、 IORESOURCE_REG 和 IORESOURCE_IRQ 等。

of_address_to_resource 函数,此函数是从设 备树里面提取资源值,但是本质上就是将 reg 属性值,然后将其转换为 resource 结构体类型

函数原型如下所示 int of_address_to_resource(struct device_node *dev, int index, struct resource *r) 

dev:设备节点

index:地址资源标号。

r:得到的 resource 类型的资源值。

 

返回值:0,成功;负值,失败。

 1.10.of_iomap 函数

of_iomap 函数用于直接内存映射,以前我们会通过 ioremap 函数来完成物理地址到虚拟地 址的映射,采用设备树以后就可以直接通过 of_iomap 函数来获取内存地址所对应的虚拟地址, 不需要使用 ioremap 函数了。当然了,你也可以使用 ioremap 函数来完成物理地址到虚拟地址 的内存映射,只是在采用设备树以后,大部分的驱动都使用 of_iomap 函数了。of_iomap 函数本 质上也是将 reg 属性中地址信息转换为虚拟地址,如果 reg 属性有多段的话,可以通过 index 参 数指定要完成内存映射的是哪一段

of_iomap 函数原型如下:

void __iomem *of_iomap(struct device_node *np, int index) 

np:设备节点。

index:reg 属性中要完成内存映射的段,如果 reg 属性只有一段的话 index 就设置为 0。

返回值:经过内存映射后的虚拟内存首地址,如果为 NULL 的话表示内存映射失败。

2.实验

接口使用的实验后续补充

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

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

相关文章

富格林:正确抵制黑幕被骗陷阱

富格林指出,投资现货黄金对于新手投资者来说是一项有挑战性的任务,但其中最难的还属如何正确抵制黑幕被骗陷阱。事实上,我们可以采取一系列的措施来正确抵制黑幕被骗陷阱。有哪些措施可以帮助我们呢?下面富格林就给大家讲讲。 许…

Python笔记 - *args和**kwargs

探索Python的*args和**kwargs 在Python中,函数可以接受任意数量的参数,而这要归功于*args和**kwargs的强大功能。这两个特性使得函数在处理不同数量的输入时变得更加灵活和高效。在这篇博客中,我们将详细介绍*args和**kwargs,并展…

Redis键值数据库详解(科普面试必看)

目录 一、引言 二、Redis概述 三、Redis的特性 四、Redis的数据结构 五、Redis的应用场景 六、Redis的优化措施 一、引言 在当今大数据和云计算的时代,高效、稳定的数据存储与检索系统成为保障系统性能和可靠性的重要基础。键值数据库(Key-Value …

找回以前的视频:技术与实践3个指南

你们有没有发现现在视频已经成为我们生活中不可或缺的一部分了?不管是在工作场合做演示、在学习时看教学视频,还是在休闲娱乐时追剧看电影,视频都扮演着超级重要的角色。 然而误删或手机故障的发生很可能将以前的视频清除。本文将深入探讨手…

LeetCode 每日一题 数学篇 LCR 182.动态口令

某公司门禁密码使用动态口令技术。初始密码为字符串 password,密码更新均遵循以下步骤: 设定一个正整数目标值 target将 password 前 target 个字符按原顺序移动至字符串末尾 请返回更新后的密码字符串。 char* dynamicPassword(char* password, int …

「实战应用」如何用图表控件LightningChart JS创建SQL仪表板应用(一)

LightningChart JS是Web上性能特高的图表库,具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用,从而实现高刷新率和流畅的动画,常用于贸易,工程,航…

深入了解JVM命令:优化Java应用的利器

目录 前言JVM架构概述常用JVM命令 javajavacjpsjstackjmapjstatjinfojcmd 命令详解及使用场景 java命令javac命令jps命令jstack命令jmap命令jstat命令jinfo命令jcmd命令 高级JVM调优 GC调优内存调优性能监控和分析 总结 前言 JVM不仅仅是一个执行Java字节码的运行时环境&…

10-探索 Intersection Observer API:高效管理元素可见性

探索 Intersection Observer API:高效管理元素可见性 笔记分享 在前端开发中,处理元素的可见性是一个常见的需求,尤其是在实现懒加载、无限滚动或检测广告曝光度等场景中。传统的方法通常依赖于 scroll 事件和 getBoundingClientRect 方法&a…

【ES】docker安装ES7.14.0+es-head

# 拉取镜像 docker pull elasticsearch:7.14.0 # 运行 --- # 拷贝数据用于挂载 docker cp -a es:/usr/share/elasticsearch/config/. /volume/es/config # 启动容器 docker run -p 9200:9200 -p 9300:9300 --privilegedtrue --name es -e "discovery.typesingle-node&quo…

【递归、搜索与回溯】递归、搜索与回溯准备+递归主题

递归、搜索与回溯准备递归主题 1.递归2.搜索3.回溯与剪枝4.汉诺塔问题5.合并两个有序链表6.反转链表7.两两交换链表中的节点8.Pow(x, n)-快速幂(medium) 点赞👍👍收藏🌟🌟关注💖💖 你…

Docker基础篇之本地镜像发布到阿里云

文章目录 1. 本地镜像发布到阿里云的流程2. 阿里云开发平台3. 将自己的本地镜像推送到阿里云 1. 本地镜像发布到阿里云的流程 阿里云ECS Docker生态如下图所示: 2. 阿里云开发平台 在控制台找到容器和镜像服务: 然后创建一个个人实例: 下面…

深圳垣象科技golang期望19K一面挂

垣象科技是一个初创公司,我们看好制造业数字化这个大方向,希望搭建一个云平台,通过创新的产品和服务,提高电子及高科技行业产品创新的能力和研发的效率 一面(挂) 总体来说项目答得不好,h5 拖拽…

Spring为什么不支持static字段注入

Spring不支持直接依赖注入到静态变量中。在Spring框架中,依赖注入是一个核心概念,它允许开发者将对象间的依赖关系定义转移到容器中,由容器负责管理这些依赖关系。然而,当涉及到静态变量时,情况就变得复杂了。 首先从…

适用于 Windows 10 的 5 个最佳数据恢复工具

很多时候,由于存储设备故障或意外删除数据,有时您需要在Windows 10操作系统中恢复数据。大多数人不熟悉在Windows 10下恢复数据的过程。由于这个原因,他们经常认为这是不可能的。事实是,有很多工具可用于Windows 10数据恢复。今天…

Clickhouse 的分布式架构说明——Clickhouse 架构篇(五)

文章目录 前言架构特点及对比ClickHouse分布式架构的优点ClickHouse分布式架构的缺点ClickHouse与Hadoop的分布式架构对比 基本概念集群副本分片 ClickHouse的复制表引擎创建复制表复制表复制复制表查询 ClickHouse分布式表引擎分布式表查询原理分布式表的数据写入方案分布式表…

Plotting World Map in Python

1. 方法一 pygal Plotting World Map Using Pygal in Python import pygal # create a world map worldmap pygal.maps.world.SupranationalWorld() # set the title of map worldmap.title Continents# adding the continents worldmap.add(Africa, [(africa)]) worl…

加快Qt的编译速度有多种方法,以下是一些建议:

启用并行编译:Qt Creator默认采用串行编译方式,即一次只编译一个文件。在处理大量文件时,这种方式的效率较低。通过启用并行编译,可以同时编译多个文件,从而显著提高编译速度。 减少头文件依赖:头文件的依…

spring boot中redis操作Hash踩坑

目录 问题 原因 解决方案 问题 如下代码是获取短信验证码功能,会先检查下前面五分钟内发没发过验证码,也就是有没有手机号对应缓存key,有的话刷新过期时间,没有就缓存一下设置过期时间为5分钟。 但是经过测试在第一次发送时缓…

Java 新特性在实际项目中的应用与优势

Java的新特性在实际项目中的应用和优势主要体现在以下几个方面: Lambda表达式:Lambda表达式简化了代码编写,可以更方便地使用函数式编程的思想。在实际项目中,可以通过Lambda表达式简化集合的遍历、排序等操作,提高代码…

PyTorch深度学习实战(44)——基于 DETR 实现目标检测

PyTorch深度学习实战(44)——基于 DETR 实现目标检测 0. 前言1. Transformer1.1 Transformer 基础1.2 Transformer 架构 2. DETR2.1 DETR 架构2.2 实现 DETR 模型 3. 基于 DETR 实现目标检测3.1 数据加载与模型构建3.2 模型训练与测试 小结系列链接 0. 前…