Linux设备树中的 gpio 信息

一.  简介

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

二.  Linux设备树中的 gpio 信息

1.  SD卡设备节点

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 设置如下:
pinctrl_hog_1: hoggrp-1 {
    fsl,pins = <
    MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
......
  >;
};

3 行,设置 UART1_RTS_B 这个 PIN GPIO1_IO19
pinctrl 配置好以后,就是设置 gpio 了。 SD 卡驱动程序通过读取 GPIO1_IO19 的值来判断 SD
卡有没有插入,但是 SD 卡驱动程序怎么知道 CD 引脚连接的 GPIO1_IO19 呢?
肯定是需要设 备树告诉驱动!在设备树中 SD 卡节点下添加一个属性,来描述 SD 卡的 CD 引脚就行了, SD 卡驱动直接读取这个属性值,就知道 SD 卡的 CD 引脚使用的是哪个 GPIO 了。
SD 卡连接在 I.MX6ULL usdhc1 接口上,在 imx6ull-alientek-emmc.dts 中找到名为 “ usdhc1 ” 的节点,这个 节点就是 SD 卡设备节点,如下所示:
&usdhc1 {
	pinctrl-names = "default", "state_100mhz", "state_200mhz";
	pinctrl-0 = <&pinctrl_usdhc1>;
	pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
	pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
    /* pinctrl-3 = <&pinctrl_hog_1>; */
	cd-gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;
	keep-power-in-suspend;
	enable-sdio-wakeup;
	vmmc-supply = <&reg_sd1_vmmc>;
	status = "okay";
};
6 行,此行本来没有,是作者添加的。 usdhc1 节点作为 SD 卡设备总节点, usdhc1 节点 需要描述 SD 卡所有的信息,因为驱动要使用。本行就是描述 SD 卡的 CD 引脚 pinctrl 信息 所在的子节点,因为 SD 卡驱动需要根据 pincrtl 节点信息来设置 CD 引脚的复用功能等。
第3~5 行的 pinctrl-0~2 ,都是 SD 卡其他 PIN pincrtl 节点信息。
但是大家会发现,其实在 usdhc1 节点 中,并没有 “ pinctrl-3 = <&pinctrl_hog_1> ” 这一行,也就是说并没有指定 CD 引脚的 pinctrl 信息, 那么 SD 卡驱动就没法设置 CD 引脚的复用功能啊?
这个不用担心,因为在 “ iomuxc ” 节点下 引用了 pinctrl_hog_1 这个节点,所以, Linux 内核中的 iomuxc 驱动就会自动初始化 pinctrl_hog_1 节点下的所有 PIN
7 行, “cd-gpios” 属性描述了 SD 卡的 CD 引脚使用的哪个 IO 。属性值一共有三个, 我们来看一下这三个属性值的含义。
&gpio1 ” 表示 CD 引脚所使用的 IO 属于 GPIO1 组,“ 19 表示 GPIO1 组的第 19 IO ,通过这两个值 SD 卡驱动程序就知道 CD 引脚使用了 GPIO1_IO19 。“ GPIO_ACTIVE_LOW ” 表示低电平有效,如果改为“ GPIO_ACTIVE_HIGH ”就表 示高电平有效。

根据上面这些信息,SD 卡驱动程序就可以使用 GPIO1_IO19 来检测 SD 卡的 CD 信号了。

2.  gpio1 节点信息

打开 imx6ull.dtsi ,在里面找到如下所示内容:
gpio1: gpio@0209c000 {
	    compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
		reg = <0x0209c000 0x4000>;
		interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
		    <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
		gpio-controller;
		#gpio-cells = <2>;
		interrupt-controller;
		#interrupt-cells = <2>;
};

gpio1 节点信息,描述了 GPIO1 控制器的所有信息,重点就是 GPIO1 外设寄存器基地址以及 兼 容 属 性 。 关 于 I.MX 系 列 SOC GPIO 控 制 器 绑 定 信 息 请 查 看 文 档
Documentation/devicetree/bindings/gpio/ fsl-imx-gpio.txt (文档在 Linux内核源码目录下)。
2 行,设置 gpio1 节点的 compatible 属性有两个,分别为“ fsl,imx6ul-gpio ”和“ fsl,imx35-
gpio ”,在 Linux 内核中搜索这两个字符串就可以找到 I.MX6UL GPIO 驱动程序。
3 行, reg 属性设置了 GPIO1 控制器的寄存器基地址为 0X0209C000 ,大家可以打开
I.MX6ULL 参考手册》找到 " Chapter 28" ,有如图 45.2.2.1 所示的寄存器地址表:

从上表中可以看出, GPIO1 控制器的基地址就是 0X0209C000
6 行,“ gpio-controller ” 表示 gpio1 节点是个 GPIO 控制器。
7 行,“ #gpio-cells ” 属性和 “ #address-cells ” 类似, #gpio-cells 应该为 2 ,表示一共有 两个 cell ,第一个 cell GPIO 编号,比如,“ &gpio1 3 ” 就表示 GPIO1_IO03 。第二个 cell 表示 GPIO 极 性 , 如 果 为 0(GPIO_ACTIVE_HIGH) 的 话, 表 示 高 电 平 有 效 , 如 果 为 1(GPIO_ACTIVE_LOW) 的话,表示低电平有效。

总结:经过上面的分析,可以知道:对于 SD卡而言,SD卡检测引脚就是 GPIO1_19,而且是低电平有效。

所以在写 SD卡驱动时,可以读取 "cd-gpios" (当然对于不同芯片,可能该属性命名就不同)属性信息就可以得到 引脚。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

若依微服务框架 上传文件(文件表)

若依微服务得上传文件只有在头像那里才有&#xff0c;而且存储得是地址。 如果想要进行文件表存储&#xff0c;只能自己进行封装。 若依微服务框架 上传文件&#xff08;文件表&#xff09; 一、问题二、代码1.组件代码2、调用 一、问题 若依在上传文件这里使用了watch监听&a…

Webpack5 基本使用 - 1

Webpack 是什么 webpack 的核心目的是打包&#xff0c;即把源代码一个一个的 js 文件&#xff0c;打包汇总为一个总文件 bundle.js。 基本配置包括mode指定打包模式&#xff0c;entry指定打包入口&#xff0c;output指定打包输出目录。 另外&#xff0c;由于 webpack默认只能打…

R语言批量把数值变量和因子变量的互转

#我们以rms包的lung数据集为例 library(rms) data<-lung #这里有两种方法&#xff0c; #第1是知道需要转化的变量在哪几列&#xff1b; #第2知道需要转化的变量名 str(data) #假设我们想转化inst/status/sex/三个变量的类型 #图1先看看变量类型和处于第几列 str(dat…

【C++11并发】mutex 笔记

简介 在多线程中往往需要访问临界资源&#xff0c;C11为我们提供了mutex等相关类来保护临界资源&#xff0c;保证某一时刻只有一个线程可以访问临界资源。主要包括各种mutex&#xff0c;他们的命名大都是xx_mutex。以及RAII风格的wrapper类&#xff0c;RAII就是一般在构造的时…

VRRP6协议--负载均衡配置

VRRP6负载均衡 VRRP6负载均衡指的是创建多个备份组,多个备份组同时承担数据转发的任务,对于每一个备份组,都有自己的Master和若干Backup设备。 VRRP6负载分担与VRRP6主备备份的基本原理和报文协商过程都是相同的。同样对于每一个VRRP6备份组,都包含一个Master设备和若干Ba…

蓝桥杯备战——7.DS18B20温度传感器

1.分析原理图 通过上图我们可以看到DS18B20通过单总线接到了单片机的P14上。 2.查阅DS18B20使用手册 比赛的时候是会提供DS18B20单总线通讯协议的代码&#xff0c;但是没有提供读取温度数据的代码&#xff0c;所以还是需要我们去查看手册&#xff0c;我只把重要部分截下来了 …

幻兽帕鲁搭建私服,一键更新方法

看着帕鲁这么火&#xff0c;估计更新会变为常态了&#xff0c;如果有自己搭建私服的话&#xff0c;跟着我下面的方法去进行更新吧&#xff01; 如果你还没有自己的私服&#xff0c;快去三五十搞一个吧&#xff0c;只需三五分钟&#xff0c;叫上你的小伙伴一起去搞起来吧 只需3分…

计算机网络体系架构认知--网络协议栈

文章目录 一.计算机网络分层架构各协议层和计算机系统的联系从整体上理解计算机网络通信计算机网络通信的本质 二.Mac地址,IP地址和进程端口号三.局域网通信与跨局域网通信局域网通信跨局域网通信全球互联的通信脉络 四.网络编程概述 一.计算机网络分层架构 实现计算机长距离网…

25考研每日的时间安排

今天要给大家分享一下25考研每日的时间安排。 没有完美的计划&#xff0c;只有合适的计划。 仅供参考 很多人说复习不要只看时长而是要看效率&#xff0c;所以学多长时间不重要&#xff0c;重要的高效率完成任务。 完美的计划 这个计划看起来很完美&#xff0c;从早到晚有学习…

【产品笔记】ESP32及其物联网硬件设备——ESP32智能网关

ESP32是一款适用于许多物联网应用的强大芯片。本文作为学习笔记&#xff0c;记录ESP32及其衍生产品在物联网中的特点&#xff0c;希望对您选择基于ESP32的物联网网关也能有帮助。 什么是ESP32&#xff1f; 在嵌入式系统和物联网应用领域&#xff0c;ESP32是一款广受欢迎的微控…

【JavaMail】Java中发送邮件

文章目录 一、概念二、Java中发送邮件1.导入2.连接SMTP服务器3.创建Session会话4.发送纯文本邮件5.发送带附件邮件 三、封装工具类 一、概念 首先需要明白以下概念&#xff1a; 不需要深入了解他们是怎么工作的&#xff0c;记住关键字即可&#xff1a; SMTP协议&#xff1a;邮…

进程地址空间(Linux)

进程地址空间 一、引入概念1. 程序的地址分布2. 线性地址和物理地址 二、进程地址空间1. 初步认识2. 地址空间和物理内存的联系3. 区域划分4. 拓展——关于“线” 三、进一步理解进程地址空间四、页表总结 一、引入概念 1. 程序的地址分布 测试代码&#xff1a; #include &l…

HttpHeaders 源码中headers成员变量为什么声明为final

源码如下 public class HttpHeaders implements MultiValueMap<String, String>, Serializable {private final Map<String, List<String>> headers;public String getFirst(String headerName) {List<String> headerValues (List)this.headers.get(…

STM32标准库开发—W25Q64详细介绍

W25Q64简介 Flash编程原理都是只能将1写为0&#xff0c;而不能将0写成1.所以在Flash编程之前&#xff0c;必须将对应的块擦除&#xff0c;而擦除的过程就是将所有位都写为1的过程&#xff0c;块内的所有字节变为0xFF.因此可以说&#xff0c;编程是将相应位写0的过程&#xff0c…

【Java发送邮箱】spring boot 发送邮箱

导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 2.在properties配置邮箱 # 发件人QQ号 spring.mail.username2508575653qq.com # QQ邮箱授权码 sp…

EIGRP实验

实验大纲 一、基本配置 1.构建网络拓扑结构图 2.路由器基本配置 3.配置PC 4.测试连通性 5.保存配置文件 二、配置EIGRP 1.查看路由表 2.配置EIGRP动态路由 3.查看路由器路由表 4.测试网络连通性 5.查看所有路由器的路由协议 6.保存配置文件 三、配置OSPF 1.配置…

vue+draggable+el-upload上传图片拖拽重排方法

vuedraggableel-upload上传图片拖拽重排方法 1.html <el-row><el-col><el-form-item label"添加视频/图片" prop"device_id"><div class"image-upload"><draggable v-model"fileList" update"dataDr…

外包干了2个月,技术反而退步了...

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

OpenHarmony—类型转换仅支持as T语法

规则&#xff1a;arkts-as-casts 级别&#xff1a;错误 在ArkTS中&#xff0c;as关键字是类型转换的唯一语法&#xff0c;错误的类型转换会导致编译时错误或者运行时抛出ClassCastException异常。ArkTS不支持使用语法进行类型转换。 当需要将primitive类型&#xff08;如num…

2.4.4 代理一个TCP客户端(示例补充)

2.4.4 代理一个TCP客户端 不能直接访问的目标网站&#xff1a; package mainimport ("io""log""net" )// echo is a handler function that simply echoes received data. func echo(conn net.Conn) {defer conn.Close()// Create a buffer to s…