i.MX6ULL(十九) linux gpio子系统

news2024/12/27 12:40:35

一 简介

pinctrl 子系统重点是设置 PIN( 有的 SOC 叫做 PAD) 的复用 和电气属性,
如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系 统了。gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO
为输入输出,读取 GPIO 的值等。 gpio 子系统的主要目的就是方便驱动开发者使用 gpio ,驱动
开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API
函数来操作 GPIO Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程,极大的方便了驱动开
发者使用 GPIO

1.1、设备树中的 gpio 信息

一种设备的节点属性设置都会有一些套路,查询内核中的文档,比如Documentation/devicetree/bindings/i2c/i2c-imx.txt就描述了imx平台的i2c属性设置方法
I.MX6ULL-ALPHA 开发板上的 UART1_RTS_B 做为 SD 卡的检测引脚, UART1_RTS_B
用为 GPIO1_IO19 ,通过读取这个 GPIO 的高低电平就可以知道 SD 卡有没有插入。 首先肯定是
UART1_RTS_B 这个 PIN 复用为 GPIO1_IO19 ,并且设置电气属性,也就是上一小节讲的
pinctrl 节点。打开 imx6ull-alientek-emmc.dts UART1_RTS_B 这个 PIN pincrtl 设置如下:

示例代码 45.2.2.1 SD 卡 CD 引脚 PIN 配置参数
316 pinctrl_hog_1: hoggrp-1 {
317 fsl,pins = <
318 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
......
322 >;
323 };
pinctrl 配置好以后就是设置 gpio 了, SD 卡驱动程序通过读取 GPIO1_IO19 的值来判断 SD
卡有没有插入,但是 SD 卡驱动程序怎么知道 CD 引脚连接的 GPIO1_IO19 呢?肯定是需要设
备树告诉驱动啊!在设备树中 SD 卡节点下添加一个属性来描述 SD 卡的 CD 引脚就行了
 
示例代码 45.2.2.2 设备树中 SD 卡节点
760 &usdhc1 {
761 pinctrl-names = "default", "state_100mhz", "state_200mhz";
762 pinctrl-0 = <&pinctrl_usdhc1>;
763 pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
764 pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
765 /* pinctrl-3 = <&pinctrl_hog_1>; */
766 cd-gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;
767 keep-power-in-suspend;
768 enable-sdio-wakeup;
769 vmmc-supply = <&reg_sd1_vmmc>;
770 status = "okay";
771 };
cd - gpios = <& gpio1 19 GPIO_ACTIVE_LOW >;
属性“ cd-gpios ”描述了 SD 卡的 CD 引脚使用的哪个 IO 。属性值一共有三个,
我们来看一下这三个属性值的含义,“ &gpio1 ”表示 CD 引脚所使用的 IO 属于 GPIO1 组,“ 19
表示 GPIO1 组的第 19 IO ,通过这两个值 SD 卡驱动程序就知道 CD 引脚使用了 GPIO1_IO19
GPIO 。“ GPIO_ACTIVE_LOW ”表示低电平  1   有效,如果改为“ GPIO_ACTIVE_HIGH ”就表
示高电平 0 有效。

示例代码 45.2.2.2 gpio1 节点
504 gpio1 : gpio@0209c000 {
505 compatible = "fsl,imx6ul-gpio" , "fsl,imx35-gpio" ;
506 reg = < 0x0209c000 0x4000 >;
507 interrupts = < GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH >,
508 < GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH >;
509 gpio - controller ;
510 #gpio - cells = < 2 >;
511 interrupt - controller ;
512 #interrupt - cells = < 2 >;
513 };
gpio1 节点信息描述了 GPIO1 控制器的所有信息,重点就是 GPIO1 外设寄存器基地址以及
兼 容 属 性 。 关 于 I.MX 系 列 SOC GPIO 控 制 器 绑 定 信 息 请 查 看 文 档
Documentation/devicetree/bindings/gpio/ fsl-imx-gpio.txt
505 行,设置 gpio1 节点的 compatible 属性有两个,分别为“ fsl,imx6ul-gpio ”和“ fsl,imx35-
gpio ”,在 Linux 内核中搜索这两个字符串就可以找到 I.MX6UL GPIO 驱动程序。
506 行, reg 属性设置了 GPIO1 控制器的寄存器基地址为 0X0209C000,
509 行,“ gpio-controller ”表示 gpio1 节点是个 GPIO 控制器。
510 行,“ #gpio-cells ”属性和“ #address-cells ”类似, #gpio-cells 应该为 2 ,表示一共有
两个 cell ,第一个 cell GPIO 编号 ,比如“ &gpio1 3 ”就表示 GPIO1_IO03 。第二个 cell 表示
GPIO 极 性  .

1.2 添加gpio节点到设备树 

在根节点“/”下创建 test 设备子节点:

添加 pinctrl 信息 

 添加 GPIO 属性信息 

test {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_test>;
    gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
}

 二  GPIO 驱动程序简介

下图是gpio和pinctrl子系统架构图 

image-20230415163259138

2.1 如何从设备树中获取gpio信息

linux设备树中读取gpio信息 通过操作gpiolib库实现 该库是linux 设备管理 分层思想中 驱动。

  1.  首先获取gpio所处的设备节点 of_find_node_by_path
  2.  获取gpio编号 of_get_named_gpio 
  3.  请求此编号的gpio gpio_request函数
  4.  设置gpio输入输出 gpio_direction_input 或 gpio_direction_outout
  5.  gpio 输入输出值设置  gpio_get_value /gpio_set_value

2.2 gpio api

gpio 子系统提供的常用的 API 函数有下面 几个:
1 gpio_request 函数
gpio_request 函数用于申请一个 GPIO 管脚,在使用一个 GPIO 之前一定要使用 gpio_request
进行申请,函数原型如下:
int gpio_request(unsigned gpio, const char *label)
函数参数和返回值含义如下:
gpio :要申请的 gpio 标号,使用 of_get_named_gpio 函数从设备树获取指定 GPIO 属性信
息,此函数会返回这个 GPIO 的标号。
label :给 gpio 设置个名字。
返回值: 0 ,申请成功;其他值,申请失败。
2 gpio_free 函数
如果不使用某个 GPIO 了,那么就可以调用 gpio_free 函数进行释放。函数原型如下:
void gpio_free(unsigned gpio)
函数参数和返回值含义如下:
gpio :要释放的 gpio 标号。
返回值: 无。
3 gpio_direction_input 函数
此函数用于设置某个 GPIO 为输入,函数原型如下所示:
int gpio_direction_input(unsigned gpio)
函数参数和返回值含义如下:
gpio :要设置为输入的 GPIO 标号。
返回值: 0 ,设置成功;负值,设置失败。
4 gpio_direction_output 函数
此函数用于设置某个 GPIO 为输出,并且设置默认输出值,函数原型如下:
int gpio_direction_output(unsigned gpio, int value)
函数参数和返回值含义如下:
gpio :要设置为输出的 GPIO 标号。
value GPIO 默认输出值。
返回值: 0 ,设置成功;负值,设置失败。
5 gpio_get_value 函数
此函数用于获取某个 GPIO 的值 (0 1) ,此函数是个宏,定义所示:
#define gpio_get_value __gpio_get_value
int __gpio_get_value(unsigned gpio)
函数参数和返回值含义如下:
gpio :要获取的 GPIO 标号。
返回值: 非负值,得到的 GPIO 值;负值,获取失败。
6 gpio_set_value 函数
此函数用于设置某个 GPIO 的值,此函数是个宏,定义如下
#define gpio_set_value __gpio_set_value
void __gpio_set_value(unsigned gpio, int value)
函数参数和返回值含义如下:
gpio :要设置的 GPIO 标号。
value 要设置的值。
返回值:
关于 gpio 子系统常用的 API 函数就讲这些,这些是我们用的最多的。

对gpio操作实例 将在platform中讲解

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

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

相关文章

idea,选中同一个变量高亮显示

阅读复杂代码时&#xff0c;我们经常因为找不清变量位置&#xff0c;而浪费精力重新去看变量名。 效果展示&#xff1a; 在设置里直接搜索按照步骤&#xff0c;勾选然后修改选中变量时的变量背景颜色和字体颜色 这里是设置选中变量时&#xff0c;其他变量的背景颜色和字体颜色…

终于搞懂!数字化、信息化、智能化,到底有什么不同?

引言 随着科技的飞速发展&#xff0c;数字化、信息化和智能化这三个术语在各行各业中频繁出现。然而&#xff0c;许多人对它们之间的区别并不十分清楚。本文旨在阐明数字化、信息化和智能化的含义&#xff0c;探讨它们在实践中的应用&#xff0c;并梳理其异同之处。 一、数字化…

你不知道的AI绘画变现方式

&#x1f3c6; 文章目标&#xff1a;学习AI绘画变现方式 &#x1f340; 入门篇&#xff1a;你不知道的AI绘画变现方式 ✅ 创作者&#xff1a;熊猫Jay ✨ 个人公众号: 熊猫Jay字节之旅 (文末有链接) &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c;请帮忙点个…

【科研必备】生态系统碳循环模型CENTURY建模方法

CENTURY模型&#xff0c;主要基于过程的陆地生态系统生物地球化学循环模型。主要用于模拟不同土壤-植被系统间C、N、P和S的长期动态。根据土壤有机质的分解速率&#xff0c;CENTURY模型将土壤总有机碳&#xff08;TOC&#xff09;分成了三个碳库&#xff0c;即活性、慢性和惰性…

Rest API 开发分享

概述 REST 从资源的角度来观察整个网络&#xff0c;分布在各处的资源由URI确定&#xff0c;而客户端的应用通过URI来获取资源的表示方式。获得这些表徵致使这些应用程序转变了其状态。随着不断获取资源的表示方式&#xff0c;客户端应用不断地在转变着其状态&#xff0c;所谓表…

js获取本js文件名称

使用 script 标签的 src 属性&#xff1a; 如果您的 JavaScript 文件是通过 script 标签引入的&#xff0c;您可以使用以下方法来获取当前脚本的文件名&#xff1a; var scripts document.getElementsByTagName(script); var currentScript scripts[scripts.length - 1]; va…

CMU 15-445 -- Multi-Version Concurrency Control - 16

CMU 15-445 -- Multi-Version Concurrency Control - 16 引言MVCCExample #1Example #2小结 Design DecisionsConcurrency Control ProtocolVersion StorageAppend-Only StorageTime-Travel StorageDelta Storage Garbage CollectionTuple-Level GCTransaction-Level GC Index …

Android编译报错-keystore2

vendor/mediatek/proprietary/trustzone/trustkernel/source/build/k39tv1_64_bsp_k419/array.c vendor/mediatek/proprietary/trustzone/trustkernel/source/build/k39tv1_64_bsp_k419/cert.dat 这个两个文件和厂家名称等配置信息有关。

STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

时钟配置HSI主频配置64M 勾选打开8个通道的ADC 使能连续转换模式 配置好串口&#xff0c;选择异步模式配置好需要的开发环境并获取代码 修改main.c 串口重定向 #include "stdio.h" int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch…

SOP8,SOP10,SOP16封装的PY32F002A/PY32F003管脚复用

PY32F0系列的封装 在PY32F0系列的封装可以分为两大类, 20PIN及以上的和小于20PIN的. 20PIN, 24PIN 和 32PIN, 带有独立的 NRST 和 BOOT0, PIN脚互相独立不复用;8PIN, 10PIN 和 16PIN, 没有 BOOT0, 存在多个PIN脚共用同一个物理管脚的情况 这篇主要介绍没有BOOT0的情况如何修…

Linux:chown、chmod修改文件目录权限命令

chown 命令 可以认为是 "change owner" 的缩写&#xff0c;主要用于修改文件&#xff08;或目录&#xff09;的所有者&#xff0c;除此之外&#xff0c;这个命令也可以修改文件&#xff08;或目录&#xff09;的所属组。 当只需要修改所有者时&#xff0c;可使用如下…

Python 基础(十九):内置函数大全

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、数学相关函数二、序列相关函数三、类型转换函数四、文件操作函数五、输入输出函数…

B. The Butcher

Problem - 1819B - Codeforces 思路&#xff1a;因为在切割之后放回一个&#xff0c;然后拿另一个再进行切割&#xff0c;那么我们就想到了&#xff0c;我们可以求出切割之后的h和w的最大值&#xff0c;那么要么就是高为h要么就是宽为w&#xff0c;并且我们还能够知道所有矩形的…

酒店管理又出新招了!这样处理高级炸了

电力&#xff0c;作为酒店不可或缺的生命线&#xff0c;为酒店的正常运营和客户体验提供了坚实的基础。在这个电力系统的核心中&#xff0c;配电柜扮演着至关重要的角色&#xff0c;负责将能源有序地分配到各个区域和设备。 因此&#xff0c;为了确保电力供应的稳定性和安全性&…

【Linux命令200例】find用来查找文件和目录,不可错过的15个例子

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

跨平台的重复文件查找和删除工具,速度媲美Everything!

首先是第一款&#xff0c;功能较为简单&#xff0c;能够查找重复文件并执行删除的操作 Dupeguru DupeGuru是一个跨平台(Linux&#xff0c;OS X&#xff0c;Windows)的GUI工具&#xff0c;用于在系统中查找重复文件。它主要是用Python 3编写的&#xff0c;具有使用多个GUI工具…

【深度学习】基于图形的机器学习:概述

一、说明 图神经网络&#xff08;GNN&#xff09;在数据科学和机器学习中越来越受到关注&#xff0c;但在专家圈之外仍然知之甚少。为了掌握这种令人兴奋的方法&#xff0c;我们必须从更广泛的图形机器学习&#xff08;GML&#xff09;领域开始。许多在线资源谈论GNN和GML&…

四、运算符(3)

本章概要 移位运算符三员运算符字符串运算符常见陷阱类型转换 截断和舍入类型提升 Java 没有 sizeof总结 移位运算符 移位运算符面向的运算对象也是二进制的“位”。它们只能用于处理整数类型&#xff08;基本类型的一种&#xff09;。左移位运算符 << 能将其左边的运…

python_day15_闭包

闭包 def outer(logo):def inner(msg):print(f"<{logo}>{msg}<{logo}>")return innerfunc_1 outer("####") print(type(func_1)) func_1("jsy")func_2 outer("$$$$$") func_2(hello)nonlocal关键字&#xff0c;在闭包中…

C#|无法打开cs文件设计窗口

报错信息&#xff1a;To prevent possible data loss before loading the designer, the following errors must be resolved: 解决方案&#xff1a;实不相瞒我把项目解决方案名称改短了就可以了。。有其他原因或者解决方案望不吝赐教。。