Linux驱动中常用的一些接口函数(经典)

news2025/1/11 21:49:36

图片

​第一:设备树相关

查找节点的of函数

of_find_node_by_name

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

通过节点名字查找指定的节点

  • from:要开始查找的节点

  • name:节点名字

of_find_node_by_type

通过 device_type 属性查找指定的节点,函数原型如下:

struct device_node *of_find_node_by_type(struct device_node *from,
          const char *type);

函数参数和返回值含义如下:

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

  • type: 要查找的节点对应的 type 字符串,也就是 device_type 属性值。

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

of_find_compatible_node

根据 device_type 和 compatible 这两个属性查找指定的节点,函数原型如下:

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

函数参数和返回值含义如下:

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_find_node_by_path

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

inline 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函数

of_find_property

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

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

函数参数和返回值含义如下:

  • np: 设备节点;

  • name: 属性名字;

  • lenp: 属性值的字节数;

返回值: 找到的属性。

of_property_count_elems_of_size

用于获取属性中元素的数量,比如 reg 属性值是一个数组,那么使用此函数可以获取到这个数组的大小,此函数原型如下:

int of_property_count_elems_of_size(const struct device_node *np,
         const char *propname,
         int elem_size);

函数参数和返回值含义如下:

  • np: 设备节点。

  • proname: 需要统计元素数量的属性名字。

  • elem_size: 元素长度。

返回值: 得到的属性元素数量。

of_property_read_u8_array

从属性中查找并读取 u8 数组,此函数原型如下:

int of_property_read_u8_array(const struct device_node *np,
             const char *propname, u8 *out_values, size_t sz)

函数参数和返回值含义如下:

  • np: 设备节点;

  • proname: 要读取的属性名字;

  • out_values: 指向返回值的指针,仅当返回值为 0 时才修改;

  • sz: 要读取的数组元素数;

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

of_property_read_u8

读取 u8类型属性值,函数原型如下:

int of_property_read_u8(const struct device_node *np,
      const char *propname,
      u8 *out_value)

函数参数和返回值含义如下:

  • np: 设备节点。

  • proname: 要读取的属性名字。

  • out_value: 读取到的数组值。

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

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

of_n_addr_cells

用于获取 #address-cells 属性值,函数原型如下:

int of_n_addr_cells(struct device_node *np);

函数参数和返回值含义如下:

  • np: 设备节点。

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

of_n_size_cells

用于获取 #size-cells 属性值,函数原型如下:

int of_n_size_cells(struct device_node *np);

函数参数和返回值含义如下:

  • np: 设备节点。

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

其他常用of函数

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 的话表示读取失败。

of_translate_address

负责将从设备树读取到的地址转换为物理地址,函数原型如下:

u64 of_translate_address(struct device_node *dev,
      const __be32 *in_addr);

函数参数和返回值含义如下:

  • dev: 设备节点。

  • in_addr: 要转换的地址。

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

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,成功;负值,失败。

of_iomap

用于直接内存映射,以前我们会通过 ioremap来完成物理地址到虚拟地址的映射,采用设备树以后就可以直接通过 of_iomap来获取内存地址所对应的虚拟地址,不需要使用 ioremap了。该函数的原型如下:

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

函数参数和返回值含义如下:

  • np: 设备节点。

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

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

​第二:GPIO相关

GPIO子系统相关函数

gpio_request

申请一个GPIO

int gpio_request(unsigned gpio, const char *label)

gpio:管脚号;

label:管脚名,可以为空(NULL)

返回值:成功返回0,失败返回错误码

gpio_free

释放注册的GPIO

void gpio_free(unsigned gpio)

gpio:管脚号

gpio_direction_input

设置GPIO为输入,函数原型如下:

int gpio_direction_input(unsigned gpio)

gpio:管脚号

返回值:成功返回0,失败返回错误码

gpio_get_value

获取GPIO输入值,函数原型如下:

int gpio_get_value(unsigned gpio) 

gpio:管脚号

返回值:0或1

gpio_set_value

设置GPIO控制值,函数原型如下:

void gpio_set_value(unsigned gpio, int value)

gpio:管脚号;

value:控制值,0或1

与GPIO相关的of函数

of_gpio_named_count

用于获取设备树某个属性里面定义了几个 GPIO 信息,函数原型如下:

int of_gpio_named_count(struct device_node *np, const char *propname)

np:设备节点

propname:要统计的gpio属性

返回值:正确返回统计的gpio数量,错误返回负数

of_gpio_count

用于统计gpios 这个属性的 GPIO 数量,函数原型如下:

int of_gpio_count(struct device_node *np)

np:设备节点

返回值:正确返回统计的gpio数量,错误返回负数

of_get_named_gpio

用于获取 GPIO 编号,函数原型如下:

int of_get_named_gpio(struct device_node *np, const char *propname, int index)

np:设备节点

propname:包含要获取 GPIO 信息的属性名

index:GPIO 索引

返回值:正确返回获取到的GPIO编号,错误返回负数

​第三:devm相关

clock

devm_clk_get

用于获取时钟源,函数原型如下:

struct clk *devm_clk_get(struct device *dev, const char *id);

dev:device设备

id:时钟源名字,可以为NULL

返回值:正确返回struct clk指针,错误返回NULL

devm_clk_put

用于释放时钟源,函数原型如下:

void devm_clk_put(struct device * dev, struct clk * clk);

dev:device设备

id:时钟源名字

iomap

devm_ioremap_resource

先申请,后映射物理内存,函数原型如下:

void __iomem *devm_ioremap_resource(struct device *dev,
        const struct resource *res);

dev:device设备

res:resource资源

返回值:成功返回虚拟地址指针,识别返回错误码

devm_iounmap

释放之前映射的地址,函数原型如下:

void devm_iounmap(struct device *dev, void __iomem *addr);

dev:device设备

addr:要释放的虚拟地址

irq

devm_request_irq

用于注册中断服务函数,函数原型如下:

int devm_request_irq(struct device *dev, unsigned int irq, irq_handle_t handle, 
                unsigned int flags, const char *name, void* dev_id);

dev:device设备

irq:中断号,可以通过platform_get_irq获得

handle:中断处理函数

flags:中断触发方式,上升沿/下降沿等

name:中断名称

dev_id:中断共享时用到,一般设置为结构体或NULL

devm_free_irq

用于释放devm_request_irq注册的中断,函数原型如下:

void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id)

dev:device设备

irq:中断号,与devm_request_irq注册的对应

dev_id:与devm_request_irq注册的对应

mem

devm_kmalloc

分配的内存物理上连续(虚拟上也连续),只能在低端内存分配(直接内存映射区),函数原型如下:

void *kmalloc(size_t size, gfp_t gfp);

size:分配的大小

gfp:申请内存的类型标志

devm_kzalloc

与devm_kmalloc类似,只不过devm_kzalloc会对申请到的内存内容清零,函数原型如下:

void * devm_kzalloc (struct device * dev, size_t size, gfp_t gfp);

dev:device设备

size:申请内存的大小

gfp:申请内存的类型标志

devm_kfree

devm_kmalloc()devm_kzalloc()申请的内存必须调用devm_kfree()释放,函数原型如下:

void devm_kfree(struct device *dev, void *p);

dev:device设备

p:内存指针

pinctrl

devm_pinctrl_get

用于获取pin操作句柄,函数原型如下:

struct pinctrl * devm_pinctrl_get(struct device *dev); 

dev:device设备

返回值:pinctrl句柄

devm_pinctrl_put

用于释放pin操作句柄,函数原型如下:

void devm_pinctrl_put(struct pinctrl *p); 

p:pinctrl句柄

以上就是比较常用的一些接口,当然像devm的接口还有很多,这里只列举clock、mem等会经常用到的接口。​

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

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

相关文章

CSS 滚动驱动动画 scroll()

CSS 滚动驱动动画 scroll() animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提供一个匿名的 scroll progress timeline. 通过元素在顶部和底部(或左边和右边)的滚动推进 scroll progress timeline. 并且元素滚动的位置会被转换为百分比, 滚动开始被转化为…

Nginx详解 四:重写功能

文章目录 1. 重写功能简介2. if 指令2.1 基本语法 3. return 指令3.1 语法格式3.2 示例3.2.1 状态码及响应报文返回3.2.2 URL返回 4. set 指令4.1 基本语法4.2 示例 5. break 指令5.1 示例 6. rewrite 指令6.1 语法格式6.2 rewrite flag部分使用介绍6.3 示例6.3.1 重写URL路径:…

攻防世界-Broadcast

原题 解题思路 原以为要运行py文件,结果打开就有

信息系统项目管理师(第四版)教材精读思维导图-第十章项目进度管理

请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 ​ 目录 10.1 管理基础 10.2 管理过程 10.3…

华为静态路由配置实验(超详细讲解+详细命令行)

系列文章目录 华为数通学习(7) 前言 一,静态路由配置 二,网络地址配置 AR1的配置: AR2的配置: AR3的配置: 三,测试是否连通 AR1的配置: 讲解: AR2的配置&#…

如何制作一个百货小程序

在这个数字化时代,小程序已成为各行各业的必备工具。其中,百货小程序因其便捷性和多功能性,越来越受到人们的青睐。那么,如何制作一个百货小程序呢?下面,我们就详细介绍一下无需编写代码的步骤。 一、进入后…

如何在虚拟机上安装各类操作系统(以CentOS7系统为例)

1.安装 VMware Workstation Pro 官方下载链接: 官方已经出到17了,我用的是16 https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html 成功安装效果如下: 2.准备对应操作系统的ISO镜像文件 我们要下载CentOS7系统&am…

Nginx详解 第五部分:Ngnix反向代理(负载均衡 动静分离 缓存 透传 )

Part 5 一、正向代理与反向代理1.1 正向代理简介1.2 反向代理简介 二、配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其余参数 2.2 配置实例:反向代理单台web服务器2.3 代理转发 三、反向代理实现动静分离四、缓存功能五、反向代理客户端的IP透传5.1 原理概述5.2 一…

PCL error C4996和warning C4819 解决办法

每当新建一个项目时,常常会遇到这两个错误,这次记录一下解决办法加深记忆 1.error C4996 报错:error C4996 ‘pcl::PassThroughpcl::PointXYZ::setFilterLimitsNegative’: use inherited FilterIndices::setNegative() instead (It will b…

React 第一个Demo

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库 次笔记仅记录学习React过程中的笔记&#xff0c;因为有必要掌握一门前端的框架&#xff0c; 在vue和React中选择了React。 0x01 正文 目标&#xff1a; 实现Demo&#xff1a; <!DOCTYPE html> <html lang&q…

java-方法重载

定义&#xff1a;一个类中&#xff0c;出现多个方法名称相同&#xff0c;但是他们的行参列表不同&#xff0c;那么这些方法就称为方法重载了。

Hydra工具的使用

目录 Hydra初识 Hydra使用 hydra破解mysql 前言 不固定用户名密码爆破 hydra破解ssh 以用户名为密码登录 hydra破解rdp 将爆破密码的结果输出到文件中 Hydra初识 前言&#xff1a; hydra是一款开源的暴力破解工具&#xff0c;支持多种服务破解原理&#xff1a;使用户…

NSSCTF2nd与羊城杯部分记录

文章目录 前言[NSSCTF 2nd]php签到[NSSCTF 2nd]MyBox[NSSCTF 2nd]MyHurricane[NSSCTF 2nd]MyJs[NSSCTF 2nd]MyAPK羊城杯[2023] D0nt pl4y g4m3!!!羊城杯[2023]ezyaml羊城杯[2023]Serpent羊城杯[2023]EZ_web羊城杯[2023]Ez_misc总结 前言 今天周日&#xff0c;有点无聊没事干&a…

Java集合、泛型、增强For

集合的概念&#xff1a; 集合类存放的都是对象的引用&#xff0c;而非对象本身。 集合是一个动态的数组&#xff0c; 数组的长度是不可变的&#xff0c;集合长度是可变的 集合的类型&#xff1a; Collection接口&#xff1a; Collection表示一组对象&#xff…

springboot + vue + elementui — upload解决跨域、实现图片上传

今日记录通过elementui上传时得到的问题。 我们在本地部署的服务,前端服务请求后端接口,存在跨域问题&#xff0c; 1.可以利用springboot解决跨域问题&#xff0c;这里不列举 2.利用vue配置进行反向代理。 vue解决跨域 在vue.config.js文件中配置 const { defineConfig }…

nginx-gzip压缩

gzip压缩算法&#xff0c;在客户端要支持&#xff0c;在服务端浏览器也要支持该算法。 gzip动态压缩 nginx配置 gzip_buffers:缓冲区大小。 gzip_comp_level:压缩等级&#xff0c;1-9等级越高&#xff0c;压缩速率越高&#xff0c;压缩比也越高&#xff0c;当然消耗cpu资源…

chmod文件和目录的关系

结论&#xff1a;目录的权限和文件的权限并没啥关系&#xff0c;授权777后&#xff0c;在777的目录底下新增文件&#xff0c;默认还是只有当前用户有权限&#xff0c;不会有继承关系

sudo apt update 出现Release is not valid yet

一、问题 今天执行&#xff0c;下面的这命令报错。 sudo apt update二、成因 就是时钟问题&#xff0c;导致ssh认证不了&#xff0c;调正好就行。 三、解决方法 执行下面这行命令就可以正常了。 sudo hwclock --hctosys四、最后 求赞&#xff0c;求收藏&#xff01;&…

SW-重新组织装配体代替柔性装配体

柔性装配体容易报错&#xff0c;只有把简单的配合零件做用重新组织装配体的方式另存到顶层&#xff0c;以便与动画模拟

【Unity3D赛车游戏优化篇】【八】汽车实现镜头的流畅跟随,以及不同角度的切换

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…