【Linux 驱动】IMX6ULL gpio驱动

1. 概述

        如果 pinctrl子系统将一个 PIN 复用为 GPIO 的话,那么接下来要用到 gpio 子系统了。gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO为输入输出,设置读取 GPIO 的值等。

        gpio 子系统的主要目的就是方便驱动开发者使用 gpio,驱动开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API函数来操作 GPIO,Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程,极大的方便了驱动开发者使用 GPIO

Linux的GPIO子系统驱动框架由三个主要部分组成:① GPIO控制器驱动程序、②gpio lib驱动程序 ③GPIO字符设备驱动程序: 

2. gpio 子系统相关结构体

2.1 struct gpio_chip

/*** struct gpio_chip - abstract a GPIO controller* @label: for diagnostics* @dev: optional device providing the GPIOs* @owner: helps prevent removal of modules exporting active GPIOs* @list: links gpio_chips together for traversal* @request: optional hook for chip-specific activation, such as*	enabling module power and clock; may sleep* @free: optional hook for chip-specific deactivation, such as*	disabling module power and clock; may sleep* @get_direction: returns direction for signal "offset", 0=out, 1=in,*	(same as GPIOF_DIR_XXX), or negative error* @direction_input: configures signal "offset" as input, or returns error* @direction_output: configures signal "offset" as output, or returns error* @get: returns value for signal "offset"; for output signals this*	returns either the value actually sensed, or zero* @set: assigns output value for signal "offset"* @set_multiple: assigns output values for multiple signals defined by "mask"* @set_debounce: optional hook for setting debounce time for specified gpio in*      interrupt triggered gpio chips* @to_irq: optional hook supporting non-static gpio_to_irq() mappings;*	implementation may not sleep* @dbg_show: optional routine to show contents in debugfs; default code*	will be used when this is omitted, but custom code can show extra*	state (such as pullup/pulldown configuration).* @base: identifies the first GPIO number handled by this chip; or, if*	negative during registration, requests dynamic ID allocation.* @ngpio: the number of GPIOs handled by this controller; the last GPIO*	handled is (base + ngpio - 1).* @desc: array of ngpio descriptors. Private.* @names: if set, must be an array of strings to use as alternative*      names for the GPIOs in this chip. Any entry in the array*      may be NULL if there is no alias for the GPIO, however the*      array must be @ngpio entries long.  A name can include a single printk*      format specifier for an unsigned int.  It is substituted by the actual*      number of the gpio.* @can_sleep: flag must be set iff get()/set() methods sleep, as they*	must while accessing GPIO expander chips over I2C or SPI. This*	implies that if the chip supports IRQs, these IRQs need to be threaded*	as the chip access may sleep when e.g. reading out the IRQ status*	registers.* @exported: flags if the gpiochip is exported for use from sysfs. Private.* @irq_not_threaded: flag must be set if @can_sleep is set but the*	IRQs don't need to be threaded** A gpio_chip can help platforms abstract various sources of GPIOs so* they can all be accessed through a common programing interface.* Example sources would be SOC controllers, FPGAs, multifunction* chips, dedicated GPIO expanders, and so on.** Each chip controls a number of signals, identified in method calls* by "offset" values in the range 0..(@ngpio - 1).  When those signals* are referenced through calls like gpio_get_value(gpio), the offset* is calculated by subtracting @base from the gpio number.*/
struct gpio_chip {const char		*label;struct device		*dev;struct module		*owner;struct list_head        list;//请求一个 GPIO引脚int			(*request)(struct gpio_chip *chip,unsigned offset);//释放一个GPIO引脚void			(*free)(struct gpio_chip *chip,unsigned offset);//获取方向int			(*get_direction)(struct gpio_chip *chip,unsigned offset);//输入模式int			(*direction_input)(struct gpio_chip *chip,unsigned offset);//输出模式,并且set gpio valint			(*direction_output)(struct gpio_chip *chip,unsigned offset, int value);//读取 GPIO 引脚的值int			(*get)(struct gpio_chip *chip,unsigned offset);//设置gpio 引脚值void			(*set)(struct gpio_chip *chip,unsigned offset, int value);//设置多个gpio 引脚值void			(*set_multiple)(struct gpio_chip *chip,unsigned long *mask,unsigned long *bits);//设置 GPIO 引脚的去抖动时间int			(*set_debounce)(struct gpio_chip *chip,unsigned offset,unsigned debounce);int			(*to_irq)(struct gpio_chip *chip,unsigned offset);void			(*dbg_show)(struct seq_file *s,struct gpio_chip *chip);int			base;     //chip的基地址u16			ngpio;    //GPIO 引脚数量struct gpio_desc	*desc;    //gpio描述结构体数组,里面保存了此控制器可以控制的引脚描述const char		*const *names;bool			can_sleep;bool			irq_not_threaded;bool			exported;#ifdef CONFIG_GPIOLIB_IRQCHIP/** With CONFIG_GPIOLIB_IRQCHIP we get an irqchip inside the gpiolib* to handle IRQs for most practical cases.*/struct irq_chip		*irqchip;struct irq_domain	*irqdomain;unsigned int		irq_base;irq_flow_handler_t	irq_handler;unsigned int		irq_default_type;
#endif#if defined(CONFIG_OF_GPIO)/** If CONFIG_OF is enabled, then all GPIO controllers described in the* device tree automatically may have an OF translation*/struct device_node *of_node;int of_gpio_n_cells;int (*of_xlate)(struct gpio_chip *gc,const struct of_phandle_args *gpiospec, u32 *flags);
#endif
#ifdef CONFIG_PINCTRL/** If CONFIG_PINCTRL is enabled, then gpio controllers can optionally* describe the actual pin range which they serve in an SoC. This* information would be used by pinctrl subsystem to configure* corresponding pins for gpio usage.*/struct list_head pin_ranges;
#endif
};

 2.2 struct gpio_desc

struct gpio_desc {struct gpio_chip	*chip;    //属于哪个gpio_chipunsigned long		flags;    
/* flag symbols are bit numbers */
#define FLAG_REQUESTED	0
#define FLAG_IS_OUT	1
#define FLAG_EXPORT	2	/* protected by sysfs_lock */
#define FLAG_SYSFS	3	/* exported via /sys/class/gpio/control */
#define FLAG_TRIG_FALL	4	/* trigger on falling edge */
#define FLAG_TRIG_RISE	5	/* trigger on rising edge */
#define FLAG_ACTIVE_LOW	6	/* value has active low */
#define FLAG_OPEN_DRAIN	7	/* Gpio is open drain type */
#define FLAG_OPEN_SOURCE 8	/* Gpio is open source type */
#define FLAG_USED_AS_IRQ 9	/* GPIO is connected to an IRQ */
#define FLAG_SYSFS_DIR	10	/* show sysfs direction attribute */
#define FLAG_IS_HOGGED	11	/* GPIO is hogged */#define ID_SHIFT	16	/* add new flags before this one */#define GPIO_FLAGS_MASK		((1 << ID_SHIFT) - 1)
#define GPIO_TRIGGER_MASK	(BIT(FLAG_TRIG_FALL) | BIT(FLAG_TRIG_RISE))const char		*label;   
};

3. IMX6ULL gpio-controller构造过程

 4. gpiochip_add

 

5. gpio api与gpio子系统的调用关系

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

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

相关文章

MAE论文详解

文章目录 前言一、MAE理论二、MAE整体框架三、MAE简单实现四、实验总结 前言 MAE是Facebook团队在2021年11月发布的一篇论文&#xff0c;《Masked Autoencoders Are Scalable Vision Learners》&#xff0c;带掩膜的自编码器是可扩展的视觉学习器&#xff0c;MAE就是Masked Aut…

SpringBoot整合Liquibase

1、是什么&#xff1f; Liquibase官网 Liquibase是一个开源的数据库管理工具&#xff0c;可以帮助开发人员管理和跟踪数据库变更。它可以与各种关系型数据库和NoSQL数据库一起使用&#xff0c;并提供多种数据库任务自动化功能&#xff0c;例如数据库迁移、版本控制和监控。Li…

文本分类任务算法演变(二)

文本分类任务算法演变 1.深度学习-pipeline1.1fastText1.2LSTM1.2.1公式详解1.2.2可视化 1.3TextCNN1.4Gated CNN1.5TextRCNN1.6Bert1.6.1取[cls] token对应的向量1.6.2将整句话的向量取max/average pooling1.6.3将Bert编码后的向量再输入LSTM或CNN1.6.4将Bert中间层的结果取出…

Python生成432Hz音频

使用 numpy 来生成信号&#xff0c; 使用 matplotlib 可视化信号&#xff0c; 使用 sounddevice 播放声音。 以下生成和播放 432 Hz 的正弦波信号&#xff1a; import numpy as np import sounddevice as sd import matplotlib.pyplot as plt# 生成单音函数 def generate_to…

gstreamer系列 -- 获取媒体信息

Basic tutorial 9: Media information gathering

windows下的redis7.0.11的下载

天&#xff0c;我找redis7.0.11的安装包就找了好久&#xff0c;终于给我找到了。市面上好多是linux版本的。 安装包&#xff1a;Release Redis 7.0.11 for Windows zkteco-home/redis-windows GitHub 解压之后是这样的。 然后你要测试能不能启动&#xff1a; 1、指定配置文…

C语言-部分字符串函数详解 1-4

C语言-部分字符串函数详解 1-4 前言1.strlen1.1基本用法1.2注意事项\0size_t 1.3模拟实现 2.strcpy2.1基本用法2.2注意事项**源字符串必须以 \0 结束****会将源字符串中的 \0拷贝到目标空间****目标空间必须可修改****目标空间必须能容纳下源字符串的内容** 2.3模拟实现 3.strn…

RabbitMQ的核心概念

RabbitMQ是一个消息中间件&#xff0c;也是一个生产者消费者模型&#xff0c;负责接收&#xff0c;存储和转发消息。 核心概念 Producer 生产者&#xff0c;是RabbitMQ Server的客户端&#xff0c;向RabbitMQ发送消息。 Consumer 消费者&#xff0c;是RabbitMQ Server的客…

使用亮数据爬虫工具解锁复杂爬虫场景

在当今数据驱动型时代&#xff0c;数据采集和分析能力算是个人和企业的核心竞争力。然而&#xff0c;手动采集数据耗时费力且效率低下&#xff0c;而且容易被网站封禁。 我之前使用过一个爬虫工具&#xff0c;亮数据&#xff08;Bright Data&#xff09; &#xff0c;是一款低…

浅探空间智能

空间智能&#xff0c;这一概念在人工智能领域逐渐升温&#xff0c;部分归功于AI界的领军人物李飞飞博士所领导的创新项目。 Seeing is for doing and learning. 【精校】TED&#xff1a;李飞飞 | 空间智能让AI理解真实世界 2024.5 李飞飞在 X 上介绍称&#xff0c;「空间智能…

消防认证-火灾显示盘GB 17429-2011

一、消防认证 消防认证是指消防产品符合国家相关技术要求和标准&#xff0c;且通过了国家认证认可监督管理委员会审批&#xff0c;获得消防认证资质的认证机构颁发的证书&#xff0c;消防产品具有完好的防火功能&#xff0c;是住房和城乡建设领域验收的重要指标。 二、认证依据…

10结构型设计模式——桥接模式

一、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是结构型的设计模式之一。桥接模式基于类的最小设计原则&#xff0c;通过使用封装&#xff0c;聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象&#xff08;abstraction&#xff09;与行为实…

SystemUI下拉框新增音量控制条

Android产品下拉框一直只有亮度条没有音量控制条。 为了方便控制音量&#xff0c;普遍都是底部导航栏添加音量加减按钮&#xff0c;在Android10以后&#xff0c;大家普遍用上了手势导航&#xff0c;去掉底部导航栏。 目前需要再下拉框中可以直接控制音量。 文章目录 前言需求及…

day33

一、linux系统中的库 库在linux系统中是一个二进制文件&#xff0c;它是由XXX.c&#xff08;不包含main函数&#xff09;文件编译而来的&#xff0c;分为静态库和动态库。 库在系统中的内容是不可见的&#xff0c;是一个二进制乱码 当程序需要使用库中的相关函数时&#xff0c;…

安装docker 遇到异常Could not resolve host: mirrorlist.centos.org; 未知的错误

问题 安装docker 遇到异常 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误” 1、安装Docker依赖包 yum install …

基于SpringBoot的论坛系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

Android 12系统源码_多屏幕(二)模拟辅助设备功能开关实现原理

前言 上一篇我们通过为Android系统开启模拟辅助设备功能开关&#xff0c;最终实现了将一个Activity显示到多个屏幕的效果。 本篇文章我们具体来分析一下当我们开启模拟辅助设备功能开关的时候&#xff0c;Android系统做了什么哪些操作。 一、模拟辅助设备功能开关应用位置 …

存储实验:华为异构存储在线接管与在线数据迁移(Smart Virtualization Smart Migration 特性)

目录 目的实验环境实验步骤参考文档1. 主机安装存储多路径2. v2存储创建Lun&#xff0c;映射给主机&#xff1b;主机分区格式化&#xff0c;写数据3. 将v2存储映射该成映射到v3存储上(v3存储和v2之间链路搭建&#xff0c;测通&#xff0c;远端设备&#xff09;&#xff08;Smar…

便利店(超市)管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

中国:“虚拟资产”交易被列为公认的洗钱方式之一!最高法院承认加密货币交易!

2024年8月19日&#xff0c;最高人民法院和最高人民检察院表示&#xff0c;根据他们对反洗钱法的新解释&#xff0c;“虚拟资产”交易现已被列为公认的洗钱方式之一。这是中国首次针对此类资产类别采取此类举措&#xff0c;说明为应对加密货币和其他虚拟资产日益增长的使用&…