首页
学习
活动
专区
圈层
工具
发布

devm_xxx机制

前言 devm是内核提供的基础机制,用于方便驱动开发者所分配资源的自动回收。参考内核文档devres.txt。总的来说,就是驱动开发者只需要调用这类接口分配期望的资源,不用关心释放问题。...devres使用 不同的内核模块提供了对应的devm_xxx接口,如下(不仅仅这些): MEM devm_kmalloc() devm_kzalloc() devm_kcalloc(...devres group主要用于处理初始化的时候,有多种资源类型需要初始化,每种资源类型的初始化又由多个devres_xxx资源申请组成的情况,将这些devres_xxx按类别组合成group,这样在需要显示释放某一类的资源时...,调用devres group的api即可实现。...在分配内存的时候,会分配比我们要求大的空间,空间的前面部分用于存放实现devres机制的数据结构,然后返回的是用户期望的空间的指针(该指针是实际分配的空间指针的devres结构的偏移)。

1.8K20

Linux GPIO 开发指南

(图中最上面一层 device driver 表示 Pinctrl 驱动的使用者) ​ 图 2-1: pinctrl 驱动整体框架图 Pinctrl api: pinctrl 提供给上层用户调用的接口...gpio属性配置需要的参数个数,对于linux-5.4为3 /* * 以下配置为模块使用的pin的配置,模块通过引用相应的节点对pin进行操作 * 由于不同板级的pin经常改变...default,即模块正常工作模式下对应的 pin 配置 • pinctrl-1 对应 pinctrl-names 中的 sleep,即模块休眠模式下对应的 pin 配置 5.2 接口使用示例 5.2.1...配置设备引脚 一般设备驱动只需要使用一个接口 devm_pinctrl_get_select_default 就可以申请到设备所有pin 资源。...使用 irq-domain 为 gpio 中断实现虚拟 irq 的功能,使用 gpio 中断功能时,设备驱动只需要通过 gpio_to_irq 获取虚拟中断号后,其他均可以按标准 irq 接口操作。

9.3K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux Regulator Framework(1)_概述

    需要考虑这种情况,尽量简化接口。...这主要用于描述regulator在板级的级联关系,需要留意的是,它和clock不同,这种级联关系是非常确定的,以至于需要使用静态的方式描述,而不是像clock那样,在注册的时候动态指定并形成。...接口汇整 本节对regulator framework向各个层次提供的API做一个汇整,具体细节会在后续的文章中详细描述。...1)struct regulator struct regulator结构用于从consumer的角度抽象一个regulator,consumer不需要关心该结构的细节,当作一个句柄使用即可(类似struct...4.2 consumer模块向用户空间consumer提供的接口 用户空间程序可以通过sysfs接口,使用regulator,就像内核空间consumer一样。

    96520

    已解决【nvidia-smi】Failed to initialize NVML: Driverlibrary version mismatch解决方法

    方法二:不用重启 采用指令退出当前内核使用的显卡模块,然后重新加载升级后版本的显卡驱动作为内核模块。...sudo rmmod nvidia sudo nvidia-smi #nvidia-smi发现没有kernel mod的时候,会自动装载 但是这种方法可能会遇到一定的问题: $ sudo rmmod...nvidia rmmod: ERROR: Module nvidia is in use by: nvidia_modeset nvidia_uvm 说明我们正在使用,所以需要手动退出两个nvidia...然后再重新执行如下的指令: sudo rmmod nvidia sudo nvidia-smi #nvidia-smi发现没有kernel mod的时候,会自动装载 如果还是不可以,使用命令强制终止相关服务...sudo rmmod nvidia sudo nvidia-smi #nvidia-smi发现没有kernel mod的时候,会自动装载

    40.8K21

    2——Pinctrl子系统重要概念

    Pinctrl子系统重要概念 引入 无论是哪种芯片,都有类似下图的结构: 要想让pinA、B用于GPIO,需要设置IOMUX让它们连接到GPIO模块; 要想让pinA、B用于I2C,需要设置IOMUX...所以GPIO、I2C应该是并列的关系,它们能够使用之前,需要设置IOMUX。有时候并不仅仅是设置IOMUX,还要配置引脚,比如上拉、下拉、开漏等等。...开玩笑的,BSP工程师是更懂他自家的芯片,但是如果驱动工程师看不懂他们的代码,那你的进步也有限啊。 所以,要把引脚的复用、配置抽出来,做成Pinctrl子系统,给GPIO、I2C等模块使用。...等等,GPIO模块在图中跟I2C不是并列的吗?干嘛在讲Pinctrl时还把GPIO子系统拉进来? 大多数的芯片,没有单独的IOMUX模块,引脚的复用、配置等等,就是在GPIO模块内部实现的。...非要自己调用,也有函数: devm_pinctrl_get_select_default(struct device *dev); // 使用"default"状态的引脚 pinctrl_get_select

    95130

    05_GPIO子系统层次与数据结构

    视频观看 百问网驱动大全 GPIO子系统层次与数据结构 参考资料: Linux 5.x内核文档 Linux-5.4\Documentation\driver-api Linux-5.4\Documentation...devm_gpiod_put_array 1.3 GPIOLIB向下提供的接口 2....需要提供函数,设置引脚方向、读取/设置数值 需要提供函数,把引脚转换为中断 以Linux面向对象编程的思想,一个GPIO Controller必定会使用一个结构体来表示,这个结构体必定含有这些信息: GPIO...引脚的函数(引脚控制、中断相关),都放在gpio_chip里 2.2 gpio_chip 我们并不需要自己穿件gpio_device,编写驱动时要创建的是gpio_chip,里面提供了: 控制引脚的函数...各个引脚的名字? 2.3 gpio_desc 我们去使用GPIO子系统时,首先是获得某个引脚对应的gpio_desc。

    98130

    手把手教你使用 gpio 子系统 API

    本文讲解 pinctrl 子系统和 gpio 子系统的 API,以及使用示例。 传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。...对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始化工作均由 pinctrl 子系统来完成。...(pinctrl 的 api 其实可以实现所有需求,但 gpio 的函数更常用一些) 1、gpio 子系统 API gpio 子系统中操作一个 GPIO 需要如下几步: 1、of_find_compatible_node...2、pinctrl 子系统 API pinctrl 子系统的 API 有很多,对于驱动工程师来说,pinctrl 操作一个 GPIO 只需要三步: 1、devm_pinctrl_get 2、pinctrl_lookup_state...有时候使用的一些芯片在 Documentation/devicetree/bindings 目录下找不到对应的文档,这个时候就要咨询芯片的提供商,让他们给你提供参考的设备树文件。

    2.3K10

    【深度】韦东山:GPIO和Pinctrl子系统的使用

    要想让pinA、B用于GPIO,需要设置IOMUX让它们连接到GPIO模块; 要想让pinA、B用于I2C,需要设置IOMUX让它们连接到I2C模块。...所以GPIO、I2C应该是并列的关系,它们能够使用之前,需要设置IOMUX。有时候并不仅仅是设置IOMUX,还要配置引脚,比如上拉、下拉、开漏等等。...等BSP工程师在GPIO子系统、Pinctrl子系统中把自家芯片的支持加进去后,我们就可以非常方便地使用这些引脚了:点灯简直太简单了。 等等,GPIO模块在图中跟I2C不是并列的吗?...如果使用devm的相关函数,在内存申请失败时可以直接返回:设备的销毁函数会自动地释放已经申请了的GPIO资源。 建议使用“devm_”版本的相关函数。...基于GPIO子系统的LED驱动程序 3.1 编写思路 GPIO的地位跟其他模块,比如I2C、UART的地方是一样的,要使用某个引脚,需要先把引脚配置为GPIO功能,这要使用Pinctrl子系统,只需要在设备树里指定就可以

    13.9K74

    Linux common clock framework(1)_概述

    因此,蜗蜗会将clock framework的分析文章分为3篇: 第一篇为概述和通用API的使用说明,面向的读者是使用clock的driver开发者,目的是掌握怎么使用clock framework(就是本文...Loop);用于分频的divider;用于多路选择的Mux;用于clock enable控制的与门;使用clock的硬件模块(可称作consumer);等等。...clock framework提供的通用API 管理clock的最终目的,是让device driver可以方便的使用,这些是通过include/linux/clk.h中的通用API实现的,如下: 1...b)devm_clk_get,和clk_get一样,只是使用了device resource management,可以自动释放。...c)clk_put、devm_clk_put,get的反向操作,一般和对应的get API成对调用。

    1.2K30

    linux内核模块加载命令

    目录 一,内核相关的命令 1、lsmod 列出已经加载的内核模块; 2、modinfo 查看模块信息; 3、modprobe 挂载新模块以及新模块相依赖的模块 4、rmmod 移除已挂载模块;...[root@localhost beinan]# modprobe -r 模块名 //移除已加载的模块,和rmmod 功能相同; 注意:模块名是不能带有后缀的,我们通过modprobe -l 所看到的模块...就说这么多吧,更为详细的还是用 man modprobe 来查看和尝试; 4、rmmod 移除已挂载模块; rmmod 模块名 注意: 模块名是不能带有后缀的,我们通过modprobe -l 所看到的模块...(modulefile.o 或modulesfile.ko ); 对于这个工具,我们只是介绍一下, 并不推荐使用。...因为模块有依赖关系,对于新手来说,可能不知道这个模块依赖和哪个模块依赖; 举例: [root@localhost beinan]# insmod /lib/modules/2.6.11-1.1369_FC4

    6.1K30

    Linux笔记(21)| platform总线驱动分析

    平台总线也是基于上一节当中的设备模型,在上一节里,介绍了创建总线,也提到了在实际当中,并不需要我们去创建新的总线,而是一般直接用现成的,平台总线就是这样一种现成的总线。...重点还是在probe函数里面,上一节也说过,probe函数是当驱动和设备相匹配的时候会自动执行的。搞清楚了这个怎么写,驱动也就基本结束了。 probe函数里要做什么事情呢?...每个设备所需要资源的个数是不一定的,为此内核对这些资源进行了编号,对于不同的资源,编号之间是相互独立的。...devm_ioremap将获取到的寄存器地址转化为虚拟地址。...dev: 指定要获取哪个平台设备的资源; offset: 寄存器的物理地址 size: 资源大小,这里就是寄存器4个字节 static inline void *dev_get_platdata(const

    3K40

    【linux命令讲解大全】036.Linux常用命令解析:rmmod和usermod

    rmmod 从运行的内核中移除指定的内核模块 补充说明 rmmod 命令用于从当前运行的内核中移除指定的内核模块。执行 rmmod 指令,可删除不需要的模块。...Linux 操作系统的核心具有模块化的特性,因此在编译核心时,务须把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。...语法 rmmod [选项] [参数] 选项 -v:显示指令执行的详细信息; -f:强制移除模块,使用此选项比较危险; -w:等待着,直到模块能够被除时再移除模块; -s:向系统日志(syslog)发送错误信息...参数 模块名:要移除的模块名称。...实例 用 rmmod 命令主要用于卸载正在使用的Linux内核模块,与 modprobe -r 命令相似,如下所示: [root@localhost boot]# lsmod | grep raid1

    43510

    Linux内核显示、加载、卸载等超实用命令

    内核模块操作相关的命令主要有以下几种: 一、lsmod命令 列出当前已加载的内核模块及其依赖关系和使用情况。...例如将一个名为 hello.ko 的内核模块加载到内核中,可以使用以下命令 [root@localhost ~]# insmod /path/to/hello.ko 其中/path/to 是模块文件所在的目录...❞ 三、rmmod命令 将指定的内核模块卸载出内核,需要提供模块名称。...例如想将一个名为 hello 的内核模块卸载出内核,可以使用以下命令: [root@localhost ~]# rmmod hello 如果卸载成功,没有输出信息;如果卸载失败,会输出错误信息。...-r选项卸载模块,等同于rmmod tap 五、depmod命令 生成模块依赖关系文件,这个命令通常不需要手动运行,而是安装新的内核或模块时自动运行。

    46410

    2——GPIO子系统重要概念

    我们要做的是找到它名字,比如“gpio1”,然后指定要用它里面的哪个引脚,比如。...devm_gpiod_put_array 有前缀“devm_”的含义是“设备资源管理”(Managed Device Resource),这是一种自动释放资源的机制。...它的思想是“资源是属于设备的,设备不存在时资源就可以自动释放”。 比如在Linux开发过程中,先申请了GPIO,再申请内存;如果内存申请失败,那么在返回之前就需要先释放GPIO资源。...如果使用devm的相关函数,在内存申请失败时可以直接返回:设备的销毁函数会自动地释放已经申请了的GPIO资源。 建议使用“devm_”版本的相关函数。...旧的“gpio_”函数没办法根据设备树信息获得引脚,它需要先知道引脚号。 引脚号怎么确定?

    2.1K20

    Linux DRM 框架与实例分析

    在 FrameBuffer Device 驱动框架下,我们能够快速开发出可供简单使用的显示驱动。...DRM 将现代显示领域中会涉及的一些操作进行分层并使这些模块独立,如果上层应用想操作显存、显示效果、GPU,都必须在一些框架的约束下进行。...Libdrm DRM 框架在用户空间提供的 Libdrm,对底层接口进行封装,主要是对各种 IOCTL 接口进行封装,向上层提供通用的 API 接口,用户或应用程序在用户空间调用 libdrm 提供的库函数...,即可访问到显示的资源,并对显示资源进行管理和使用。...4、Encoder 编码器,转换输出器,负责电源管理、显然输出需要不同的信号转换器,将内存的像素转换成显示器需要的信号。

    3.5K10

    linux 内核模块开发相关的文章搜集和模块开发过程中的小技巧

    最近需要开发一些内核模块,进行探究linux内核的一些特征,现在把一些遇到的比较好的文章和知识点,进行简要记录和备忘; 内核模块开发相关链接: https://www.thegeekstuff.com/...内存模型讲解和Linux访问userspace内存API讲解; 内核模块开发过程遇到的知识点: make命令,会隐士调用cc -c 命令,生成.o文件;所以在内核模块的makefile中,可以直接写上:...内核模块只能访问内核导出的函数和变量;EXPORT_SYMBOL(my_variable);  想要熟悉内核模块编程,写一个linux设备驱动程序是比较好的学习方法;  在进行开发linux内核模块的时候...,最好下载对应版本的linux内核代码,使用source insight或者vscode工具进行打开进行参考;因为经常内核中的API会改变;你参考别人的针对其他版本开发的代码,编译不通过; 内核模块和内核公用一个地址空间...,可以使用所有模块导出的符号表;我们可以使用内存拷贝函数,把用户空间中的一些代码段,拷贝到内核态来完成。

    97620

    嵌入式软件工程师笔试面试指南-Linux驱动

    查看文件内容有哪些命令可以使用? 怎么向屏幕输出带空格的字符串,比如”hello world”? 移动文件用哪个命令?改名用哪个命令? 删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?...cat命令 常用的GCC指令 预处理 编译为汇编代码 汇编 链接 一步到位编译 多文件编译 警告处理 常用的GDB调试指令 常用的驱动开发指令 加载/卸载驱动 Linux驱动如何查看驱动模块中打印信息?...如何查看内核中已有的字符设备的信息? 如何查看正在使用的有哪些中断号? uboot 什么是bootloader? uboot启动过程中做了那些事? 为什么要给内核传递参数呢?...insmod,rmmod一个驱动模块,会执行模块中的哪个函数?在设计上要注意哪些问题? NAND驱动的probe流程 Linux驱动开发中,常用的调试方法有哪些?...文中的勘误,我都会更新在github中。点击阅读原文可以直达github。 如果觉得本篇文章对你有帮助,在收藏的时候,可以双击下屏幕支持下作者,这个对我真的很重要!

    2.7K10
    领券