设备树接口函数

2024-06-04 10:36
文章标签 设备 接口函数

本文主要是介绍设备树接口函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/1029840

相关文章

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

海鲜加工污水处理设备处理效果高

诸城市鑫淼环保小编带大家了解一下海鲜加工污水处理设备处理效果高   海鲜加工污水处理设备通常采用物理、化学和生物处理相结合的方法,对废水中的污染物进行高xiao去除。设备设计紧凑,占地面积小,操作简便,适用于不同规模的海鲜加工厂。   设备特点   高xiao性:采用先进的处理工艺和技术,确保废水处理效果稳定可靠。   占地面积小:设备设计紧凑,占地面积小,适合在有限的空间内安装。

集运系统需要与哪些硬件设备集成?

随着电商和跨境贸易的不断发展,集运服务越来越受到海外用户的青睐。集运系统作为一种高效的跨境物流管理工具,可以协调各个环节之间的物流流程,提高物流效率和管理水平,被越来越多的集运企业采用。而集运系统作为集运服务的重要组成部分,也需要配套相应的硬件设备才能更好地支持跨境集运业务。下面就来介绍一下集运系统需要哪些硬件设备支持呢? 1.PDA:是一种便携式电子设备,可以轻松地进行数据采集和处理,具有移

3.门锁_STM32_矩阵按键设备实现

概述 需求来源: 门锁肯定是要输入密码,这个门锁提供了两个输入密码的方式:一个是蓝牙输入,一个是按键输入。对于按键输入,采用矩阵按键来实现。矩阵按键是为了模拟触摸屏的按键输入,后续如果项目结束前还有时间就更新为触摸屏按键输入。 矩阵按键开发整体思路: 由于矩阵按键就是GPIO的控制,所以不进行芯片和设备的分层编写,控制写在同一个文件中,最终向应用层提供一个接口。 代码层级关系:

Anroid BLE蓝牙(手机分别作为中心设备和外围设备)

蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙。  BLE蓝牙模块主要应用领域     1、移动扩展设备     2、汽车电子设备     3、健康医疗用品:心跳带、血压计等     4、定位应用:室内定位、井下定位等     5、近距离数据采集:无线

RS在不同设备间同步文件

参考: 1. Resilio(BtSync)搭建 2. 使用Resilio Sync共享文件【附操作指南】 4. Linux 下挂载新硬盘方法 5. Partition 1 does not start on physical sector boundary. 6. Ubuntu 16.04添加开机启动脚本的方法 7. Ubuntu 16.04以普通用户身份开机启动 8. Ubunt

如何编写Linux PCI设备驱动器 之一

如何编写Linux PCI设备驱动器 之一 PCI寻址PCI驱动器使用的APIpci_register_driver()pci_driver结构pci_device_id结构 如何查找PCI设备存取PCI配置空间读配置空间APIs写配置空间APIswhere的常量值共用部分类型0类型1 PCI总线通过使用比ISA更高的时钟速率来实现更好的性能;它是时钟运行在 25 或 33 M