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

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

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

相关文章

go语言学习--4.方法和接口

目录 1.方法 2.接口 2.1结构体类型 2.2具体类型向接口类型赋值 2.3获取接口类型数据的具体类型信息 3.channel 3.1阻塞式读写channel操作 2.3非阻塞式读写channel操作 4.map 4.1插入数据 4.2删除数据 4.3查找数据 4.4扩容 1.方法 方法一般是面向对象编程(OOP)的一…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.2 月末操作:GR/IR重组

2.6.2 月末操作&#xff1a;GR/IR重组 SAP在采购订单收货和发票校验时分别产生凭证&#xff0c;中间采用GR/IR过渡。GR即为收货&#xff0c;IR即为收票。月末&#xff0c;GR/IR的余额根据收货和收票的情况进行判断&#xff0c;转入“应付暂估”或“在途物资”&#xff0c;次月自…

C++ 数据类型

数据类型介绍 数据类型的作用&#xff1a;编译器预算数据分配的内存空间大小。 ps&#xff1a;可以通俗理解为&#xff1a;数据类型是用来规范内存的开销&#xff0c;约定数据在内存中的格式&#xff0c;便于存储。 变量 变量的语法 在计算机程序中&#xff0c;变量是用来存…

Visual Studio 2022 快速注释代码

在 Visual Studio 2022 中&#xff0c;可以使用快捷键来快速注释或取消注释代码。以下是如何进行操作的步骤&#xff1a; 注释 1. 单行注释&#xff1a; 对于当前行或选定的多行代码&#xff0c;按下 Ctrl /&#xff08;斜杠&#xff09;可以添加单行注释符号&#xff08;在…

Testng测试框架(4)-数据驱动

​数据驱动 Testng使用 Parameters注释传递任意参数给测试用例 There are three ways to set these parameters 有三种方法设置参数&#xff1a; 1、testng.xml文件 2、Programmatically 3、Java system properties testng.xml文件中的参数 Parameters({ "first-name&q…

Vue3实践之全局请求URL配置和请求参数说明

Vue3实践之全局请求URL配置和请求参数说明 全局请求URL配置 1、首先需要导入router和axios import router from "/router";2、创建app&#xff0c;将router挂载到app上 const app createApp(App) app.use(router).use(elementIcons).mount(#app)3、设置全局请求…

安装苹果ipa的方法

1、如何生成udid udid获取工具 https://www.betaqr.com/tools 提示下载后 2、爱思助手安装苹果app mac下载爱思助手&#xff0c;数据线连接手机&#xff0c;把ipa包拖到爱思助手app应用选项里 3、新手机调试需要先选中设备&#xff0c;再注册

VMwear桥接网络正确配置+静态IP设置

1.桥接网络配置 很多时候在VMware安装完虚拟机之后&#xff0c;会发现配置的桥接网络没有起作用&#xff0c;如果是Linux下输入ifconfig发现只有ipv6的地址而没有ipv4&#xff0c;说明没有桥接没有启用成功&#xff0c;需要按照以下方式来设置 在VMware的左上角打开编辑&#…

Redis(持久化 -- RDB AOF)

持久化 通常我们认为持久化为: 重启进程/重启主机之后, 数据仍然存在不丢失 把数据存储在硬盘上 – 持久 把数据存储在内存中 – 不持久 Redis 持久化 redis 是一个内存数据库, 也就是说本身是不持久的(但是快[效率高]), 于是 Redis 提供了持久化机制 — RDB 和 AOF 二者都是对…

H.265网页无插件播放EasyPlayer.js流媒体播放器常见问题及解答

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…

Android 输入法框架

输入法属于输入系统的一部分&#xff0c;区别于输入系统只能向系统产生时间&#xff0c;输入法能向系统输入具体的内容&#xff0c;下面来认识输入法的大体框架&#xff0c;以下内容参考清华大学出版社出版的《Android图形显示系统》。 输入法框架包含3个组件&#xff0c;各组件…

python画图Matplotlib和Seaborn

python画图Matplotlib和Season 一、Matplotlib1、介绍2、安装3、内容二、Seaborn1、介绍2、安装3、内容一、Matplotlib Matplotlib官网 1、介绍 Matplotlib 是一个 Python 的绘图库,用于创建高质量的二维图表和一些基本的三维图表。它广泛应用于科学计算、数据分析、工程学和…

基于springboot+vue实现的的成人教育教务系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

uview2 表单Form校验validate不生效处理方法

先贴官网实例&#xff1a; <template><view class""><u-form :model"form" ref"uForm"><u-form-item label"姓名" prop"name"><u-input v-model"form.name" /></u-form-item&g…

AI时代,搜索引擎的巨头地位恐怕不保了

兄弟们&#xff0c;你们使用搜索网站的频率有降低吗&#xff1f; ChatGPT 已经流行了一年多了&#xff0c;这期间数个大模型都发展了起来。 搜索引擎本质上也属于问答系统&#xff0c;所以&#xff0c;在大模型成熟之后&#xff0c;我使用搜索的频率越来越低了。 主要是因为…

python实现pdf的页面替换

利用第三方库PyPDF2&#xff0c;下面例子中进行的是将 origin.pdf 的第17页替换为 s17.pdf 的第1页&#xff1a; import PyPDF2def replace_pages(original_pdf_path, replacement_pages):with open(original_pdf_path, rb) as original_file:original_pdf PyPDF2.PdfReader(…

水牛社:互联网赚钱秘籍,免费项目,你真敢要吗?

免费是最贵的。真正理解并使用这句话的只有少数人&#xff0c;今天在网上分享一下免费项目背后的逻辑&#xff0c;抛开现象&#xff0c; 本质是最重要的。 我从事互联网工作15年。不管是过去还是现在&#xff0c;总有人喜欢问有没有免费项目&#xff1f; 其实我平时懒得回答…

java基础语法(13)

1. final关键字 final概述 学习了继承后&#xff0c;我们知道&#xff0c;子类可以在父类的基础上改写父类内容&#xff0c;比如&#xff0c;方法重写。那么我们能不能随意的继承API中提供的类&#xff0c;改写其内容呢&#xff1f;显然这是不合适的。为了避免这种随意改写的情…

pkg打包nodejs程序用动态require路由出现问题

动态路由问题 pkg打包的时候会自动生成一个虚拟路径/snapshot/…会导致你的路径出现一些问题 而项目中依据route文件夹下的文件动态use相应的router&#xff0c;这就需要动态require&#xff0c;但是这个require的路径会被虚拟路径代替导致取不到&#xff0c;所以可以使用写死…

理解vue2中的watch监听

vue实例组件初始化过程中&#xff0c;在执行initState(vm)方法初始化状态时&#xff0c;判断options.watch有值时会进行initWatch(vm, options.watch)处理&#xff0c;然后对watch对象中的每个watch属性执行createWatcher方法 function initState(vm) {// 传入的watchif (opti…