Pinctrl子系统、GPIO子系统概念

Pinctrl概念:

无论是哪种芯片,都有类似图 16.1 的结构:
要想让 pinA B 用于 GPIO ,需要设置 IOMUX 让它们连接到 GPIO 模块;
要想让 pinA B 用于 I2C ,需要设置 IOMUX 让它们连接到 I2C 模块。
为了将人们从繁杂的寄存器设置工作中解放出来,就把引脚的复用、配置抽出来,做成 Pinctrl 子系统,给 GPIO I2C 等模块使用。
从设备树开始学习 Pintrl 会比较容易。
这会涉及 2 个对象: pin controller client device
前者提供服务:可以用它来复用引脚、配置引脚。
后者使用服务:声明自己要使用哪些引脚的哪些功能,怎么配置它们。
pin controller
在芯片手册里找不到 pin controller ,它是一个软件上的概念,你可以认为它对应 IOMUX ──用来复用引脚,还可以配置引脚 ( 比如上下拉电阻等 )
注意, pin controller GPIO Controller 不是一回事,前者控制的引 脚可用于 GPIO 功能、 I2C 功能;后者只是把引脚配置为输入、输出等简单的功能。即先用 pin controller 把引脚配置为 GPIO ,再用 GPIO Controler 把引 脚配置为输入或输出。
client device:
“客户设备”,谁的客户? Pinctrl 系统的客户,那就是使用 Pinctrl 系统 的设备,使用引脚的设备。它在设备树里会被定义为一个节点,在节点里声明要用哪些引脚。
a) pin state
对于一个“ client device ”来说,比如对于一个 UART 设备,它有多个“状 态”:default sleep 等,那对应的引脚也有这些状态。
怎么理解?
比如默认状态下, UART 设备是工作的,那么所用的引脚就要复用为 UART 功 能。
在休眠状态下,为了省电,可以把这些引脚复用为 GPIO 功能;或者直接把 它们配置输出高电平。
b) groups function
一个设备会用到一个或多个引脚,这些引脚就可以归为一组 (group)
这些引脚可以复用为某个功能: function。( 复用功能的宏定义在arch/arm/boot/dts/imx6ul-pinfunc.h中
当然:一个设备可以用到多组引脚,比如 A1 A2 两组引脚, A1 组复用为 F1 功能,A2 组复用为 F2 功能。
c) Generic pin multiplexing node Generic pin configuration node
在上图左边的 pin controller 节点中,有子节点或孙节点,它们是给 client device 使用的。
可 以 用 来 描 述 复 用 信 息 : 哪 组 (group) 引 脚 复 用 为 哪 个 功 能 (function);
可以用来描述配置信息:哪组 (group) 引脚配置为哪个设置功能 (setting),比如上拉、下拉等。
注意 pin controller 节点的格式, 没有统一的标准, 每家芯片都不一样。 甚至上面的 group function 关键字也不一定有,但是概念是有的。

GPIO子系统概念:

要操作 GPIO 引脚,先把所用引脚配置为 GPIO 功能,这通过 Pinctrl 子系统来实现。
然后就可以根据设置引脚方向 ( 输入还是输出 ) 、读值──获得电平状态,写值──输出高低电平。
以前我们通过寄存器来操作 GPIO 引脚,即使 LED 驱动程序,对于不同的板子它的代码也完全不同。 当 BSP 工程师实现了 GPIO 子系统后,我们就可以:
在设备树里指定 GPIO 引脚
在驱动代码中:使用 GPIO 子系统的标准函数获得 GPIO 、设置 GPIO 方向、读取/ 设置 GPIO 值。
这样的驱动代码,将是单板无关的。
在设备树中指定引脚:
在几乎所有 ARM 芯片中, GPIO 都分为几组,每组中有若干个引脚。所以在 使用 GPIO 子系统之前,就要先确定:它是哪组的?组里的哪一个?
在设备树中,“ GPIO 组”就是一个 GPIO Controller ,这通常都由芯片厂家设置好。我们要做的是找到它名字,比如“gpio1” ,然后指定要用它里面的哪个 引脚,比如<&gpio1 0>
有代码更直观,下图是一些芯片的 GPIO 控制器节点,它们一般都是厂家定义好,在 xxx.dtsi 文件中: 
我们暂时只需要关心里面的这 2 个属性:
gpio-controller;
#gpio-cells = <2>;
gpio-controller ”表示这个节点是一个 GPIO Controller ,它下面有很 多引脚。
  #gpio-cells = <2> ”表示这个控制器下每一个引脚要用 2 32 位的数 (cell)来描述。 为什么要用 2 个数?
其实使用多个 cell 来描述一个引脚,这是 GPIO Controller 自己决定的。比如可以用其中一个 cell 来表示那是哪一个引脚,用另一个 cell 来表示它是高电平有效还是低电平有效,甚至还可以用更多的 cell 来示其他特性。 普遍的用法是,用第 1 cell 来表示哪一个引脚,用第 2 cell 来表示 有效电平:
GPIO_ACTIVE_HIGH : 高电平有效
GPIO_ACTIVE_LOW : 低电平有效
定义 GPIO Controller 是芯片厂家的事,我们怎么引用某个引脚呢?在自 己的设备节点中使用属性"[<name>-]gpios" ,示例如下:
上图中,可以使用 gpios 属性,也可以使用 name-gpios 属性。
在驱动代码中调用 GPIO 子系统
在设备树中指定了 GPIO 引脚,在驱动代码中如何使用? 也就是 GPIO 子系统的接口函数是什么?
GPIO 子系统有两套接口:基于描述符的 (descriptor-based) 、老的 (legacy)。前者的函数都有前缀“ gpiod_ ”,它使用 gpio_desc 结构体来表示 一个引脚;后者的函数都有前缀“gpio_ ”,它使用一个整数来表示一个引脚。要操作一个引脚,首先要 get 引脚,然后设置方向,读值、写值。

当pinctrl子系统配置引脚为GPIO模式后,才能用gpio子系统控制引脚。gpio 子系统是基于 pinctrl 子系统的,gpio 的 API 接口的实现很多都是基于 pinctrl 子系统的函数。

参考: https://www.bilibili.com/read/cv13931424/from=search&spm_id_from=333.337.0.0 出处:bilibili

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

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

相关文章

Go第三方框架--ants协程池框架

1. 背景介绍 1.1 goroutine ants是站在巨人的肩膀上开发出来的&#xff0c;这个巨人是goroutine&#xff0c;这是连小学生都知道的事儿&#xff0c;那么为什么不继续使用goroutine(以下简称go协程)呢。这是个思考题&#xff0c;希望讲完本文大家可以有个答案。 go协程只涉及用…

python中使用print方法打印时显示颜色

使用说明 在编程中&#xff0c;使用颜色来区分不同类型的输出或突出显示关键信息是一种常见的做法&#xff0c;特别是在调试和日志记录过程中。以下是一些使用颜色输出的常见场景和用途&#xff1a; 调试信息&#xff1a;在调试代码时&#xff0c;可以使用不同颜色来区分不同级…

CSDN 通过博客关注了你

CSDN 通过博客关注了你 前言通过“博文XXX”和“博客”的区别 前言 最近新增粉丝里发现&#xff0c;粉丝来源有不同的方式&#xff1a; 通过博文XXX关注了你 通过你的主页关注了你 通过用户推荐关注了你 通过博客关注了你 通过“博文XXX”和“博客”的区别 通过博文XXX和…

序列化、反序列化:将对象以字节流的方式,进行写入或读取

序列化&#xff1a;将指定对象&#xff0c;以"字节流"的方式写入一个文件或网络中。 反序列化&#xff1a;从一个文件或网络中&#xff0c;以"字节流"的方式读取到对象。 package com.ztt.Demo01;import java.io.FileNotFoundException; import java.io.Fi…

LeetCode-2009. 使数组连续的最少操作数【数组 哈希表 二分查找 滑动窗口】

LeetCode-2009. 使数组连续的最少操作数【数组 哈希表 二分查找 滑动窗口】 题目描述&#xff1a;解题思路一&#xff1a;正难则反滑动窗口解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 n…

rabbitmq延迟队列的使用

rabbitmq延迟队列的使用 1、场景&#xff1a; 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&a…

麒麟V10安装Redis6.2.6

1、下载redis安装包 Redis各版本下载&#xff1a;https://download.redis.io/releases/ 2、将下载后的.tar.gz压缩包上传到到服务器自定义文件夹下 3、 解压文件 tar -zxvf redis-6.2.6.tar.gzmv redis-6.2.6 redis4、安装redis 在redis文件夹下输入make指令 cd /opt/redi…

性能测试 —— Jmeter 命令行详细

我们在启动Jmeter时 会看见&#xff1a;Don’t use GUI mode for load testing !, only for Test creation and Test debugging.For load testing, use CLI Mode (was NON GUI) 这句话的意思就是说&#xff0c;不要使用gui模式进行负载测试&#xff0c;gui模式仅仅是创建脚本…

【LeetCode: 628. 三个数的最大乘积 + 排序 + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

C++ linked_hash_map按顺序保存的容器

HashMap中不存在保存顺序的机制。而在LinkedHashMap中可以保持两种顺序&#xff0c;分别是插入顺序和访问顺序&#xff0c;这个是可以在LinkedHashMap的初始化方法中进行指定的。相对于访问顺序&#xff0c;按照插入顺序进行编排被使用到的场景更多一些&#xff0c;所以默认是按…

实现鼠标在页面点击出现焦点及大十字星

近段时间&#xff0c;在完成项目进度情况显示时候&#xff0c;用户在操作鼠标时候&#xff0c;显示当鼠标所在位置对应时间如下图所示 代码实现步骤如下&#xff1a; 1.首先引用 jquery.1.7.js 2.再次引用raphael.js 3.然后引用graphics.js 4.最后引用mfocus.js 其中mfocu…

【leetcode面试经典150题】38. 生命游戏(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

蓝桥杯第九届省赛真题代码——彩灯控制器-附详细讲解思路

1. 比赛题目要求 2. 功能实现推荐步骤 首先&#xff0c;添加头文件&#xff0c;搭建最底层的代码&#xff0c;实现基本的流水灯运转与数码管显示rb2的电阻值 然后&#xff0c;进行pwm脉宽调制&#xff0c;实现rb2数值不同&#xff0c;从而灯光亮度不同。并作出数码管的多窗口…

Java GC了解

Jstack找到线程的快照 jvm提供其他命令作用 jps&#xff1a; 虚拟机进程状况工具&#xff0c;类似linux的ps命令 jstat&#xff1a;虚拟机统计信息监视工具&#xff0c;经常看gc情况的会使用到 jinfo: java配置信息工具 jmap&#xff1a; java内存映射工具&#xff0c;dump&am…

别催了!超真实格行5G随身WiFi问答它来了!格行5G随身WiFi靠谱吗? 看完这篇文章你就懂了?

总让我测格行5G随身WiFi&#xff0c;一直催催催。这下别催了&#xff0c;你们要的格行5G随身WiFi真实测评它来了&#xff01;这次着重回答大家最关心&#xff0c;问的最多的几个问题&#xff01; 一、问&#xff1a;格行5G随身WiFi网速怎么样&#xff1f; 答&#xff1a;格行5G…

网络编程套接字(一)

目录 一、源IP和目的IP 二、端口号 三、UDP协议和TCP协议 四、网络字节序 五、socket编程 1、socket 常见接口 2、struct sockaddr结构体 一、源IP和目的IP IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&am…

原子操作和竞争条件

所有系统调用都是以原子操作方式执行的。之所以这么说&#xff0c;是指内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行&#xff0c;其间不会为其他进程或线程所中断。原子性是某些操作得以圆满成功的关键所在。特别是它规避了竞争状态&#xff08;race condi…

解决ModuleNotFoundError: No module named ‘exceptions‘

一、问题描述 使用python语言处理docx文档&#xff0c;在安装docx库时出现问题&#xff0c;No module named ‘exceptions‘ 二、解决方法 卸载docx&#xff0c;安装python-docx。 pip uninstall docx pip install python-docx 问题解决&#xff01;

SSRF靶场

SSRF概述 ​ 强制服务器发送一个攻击者的请求 ​ 互联网上的很多web应用提供了从其他服务器&#xff08;也可以是本地)获取数据的功能。使用用户指定的URL&#xff0c;web应用可以获取图片&#xff08;载入图片&#xff09;、文件资源&#xff08;下载或读取)。如下图所示&…

[lesson17]对象的构造(上)

对象的构造(上) 对象的初始化 从程序设计的角度&#xff0c;对象只是变量&#xff0c;因此&#xff1a; 在栈上常见对象时&#xff0c;成员变量初始为随机值在堆上创建对象时&#xff0c;成员变量初始为随机值在静态存储区创建对象时&#xff0c;成员变量初始为0值 生活中的对…