linux读取引脚是否被使用

linux读取引脚是否被使用,第1张

是。Linux用于服务器 *** 作系统比较多。该linux的读取引脚被别人使用,因此该linux软件用不了了。日常所见比较多的Ubuntu、企业常用的centos其实都是Linux系统,基于Linux内核搞出来的,都可以视为Linux系统大家族的成员。

            pinctrl意思是pin ctrl,很简单就是系统中pin引脚的控制。文章主要针对的是嵌入式系统来说,其实PC中应该也有,但是我们实际使用还更多的是嵌入式系统需要做配置改动。对于一款SOC,设计出来之后会支持多种功能,同时在一个SOC也肯定会在多个产品中使用。对于硬件数量有限的pin脚来说,不可能适配所有的产品功能。所以硬件设计师就利用了复用功能来达到以上要求。一个pin设计假定它支持8种功能,那么实际同一时刻只有一个功能能够被配置并使用。所有的pin我们通过一个统一的控制器去控制他们的mux功能,用人话说就是选择某个功能使用。比如pin脚编号1,支持iic sda, gpio0_0, spi cs, uart rx等功能,那我们可以通过mux控制器来选择具体使用哪个功能。

            如果只是这样那就太简单了,pin在硬件领域还有所谓的上下拉输出和驱动力的配置。这个说实话作为软件设计人员,硬件说配置成啥样就啥样了,我是不懂的。用专业术语来说,就是配置DS和pull up/down功能。

            结合以上说法,pinctrl的功能就是配置mux, DS和up/down功能。正常来说,一个pin的相关控制器都在同一个32bits的寄存器当中。其中up/down控制占2位,mux功能占8位,DS功能占3位,剩下的就是预留的(只是通常情况下,实际硬件的设计各有不同,举个例子而已)。

            再说一嘴,一个SOC如果有96个pin脚,那它就肯定有96个寄存器去控制对应pin脚的功能。

            前面说了什么是pinctrl,那么问题就来了,应该怎么样去使用它,从而达到我们的目的呢?这边主要分两个部分来说,从难到易吧。作为一个嵌入式Linux系统,肯定存在类似uboot这样的bootloader,也肯定有Linux(废话)。简单的地方就说little kernel中怎么配置(因为uboot我不懂,但原理应该类似---瞎猜的),难的地方就说Linux里面怎么使用pinctrl。确实挺难的,因为特别绕~

            前面说了这个地方使用pinctrl是简单的,因为lk中我们只会用到某些引脚,而且很简单,没有复杂的引用关系。需要做的仅仅是根据需求把对应的pin寄存器去直接 *** 作就行。类似于你们刚开始接触嵌入式时候的裸写寄存器,就这样完了。当然为了统一方便,我们会封装成一个配置寄存器函数,然后再提供一个大的config数组。数组中也有96个成员,包含所有pin脚配置和上下拉以及DS驱动力控制。这样,函数里遍历所有的数组成员,然后一个个把对应的值写进去,就完成了pinctrl的 *** 作。

            是不是很简单,反正我觉得确实很简单~

            这里面就说来话长了,期待我的下一个文章吧。后续主要会对它进行更新

本文基于 RockPI 4A 单板 Linux 4.4 内核介绍 RK3399 Linux GPIO 功能。

GPIO(General Purpose Input/Output Port) :通用输入输出端口。

除作为一般的输入/输出功能外,还可以配置为中断和模拟 PWM、I2C 等接口功能。

RK3399 GPIO 属性如下:

1、一共有5组 GPIO(GPIO0~4) ,每组 GPIO 为一个 Bank ,共32个引脚。每个 Bank 包括4个 Group (GPIOA(0~7) ~ D(0~7)) 。不是所有 Bank 都有 GPIOA~D 的编号, RK3399 共122个 GPIO 引脚。

2、所有 GPIO 都可被配置为 CA55或CA53 的中断功能,且 GPIO0 和 GPIO1 可用于系统低功耗唤醒模式。

3、在上电复位后,所有 GPIO 默认输入状态。

4、软件可配置 GPIO 驱动强度。

RK3399 引脚在系统中显示如下:

RK3399 GPIO 引脚号计算方式:

例:

以 ROCKPI 4A 单板 WIFI 模块电源( GPIO0_B2 )为例,介绍 DTS 中 GPIO 配置。

在系统启动后,可以查看 GPIO ,命令如下:

注:

如果debugfs没有挂载,使用下面命令挂载

Linux 内核 GPIO 主要实现文件:

GPIO 子系统有两套 API :

1、基于描述符(descriptor-based)

前缀为: gpiod_ 。

参考: Documentation/gpio/consumer.txt

2、老版本接口(legacy)

前缀为: gpio_ 。

参考: Documentation/gpio/gpio-legacy.txt

3、常用API

GPIO 还有很多接口,就不一一列举了。

RK3399 GPIO 控制器驱动实现文件: drivers/pinctrl/pinctrl-rockchip.c ,涉及主要函数:

所有 GPIO 子系统的 API 最终都会调到 SOC 的 GPIO 控制器驱动函数。

ROCKPi 4A 单板有个40个引脚的扩展口,引用 radxa 图片,见下图。

1、进入测试目录

2、导出GPIO

在使用 GPIO2_A7 前,需要导出该引脚。方法:配置 export 后,会出现 gpio71 节点。

测试时,注意不要使用在程序中已经申请过或配置为其它功能的 GPIO 引脚。

3、配置GPIO方向

设置 GPIO2_A7 的输入/输出方向。

in :表示输入。

out :表示输出。

active_low :用于中断配置中高电平或低电平有效。

edge :用于中断配置中上升沿或下降沿有效。

4、配置GPIO输出值

在 GPIO 为输入时,通过 value 查询 GPIO 的输入电平(高或低电平)。

在 GPIO 为输出时,通过 value 配置 GPIO 的输出电平(高或低电平)。

5、查看GPIO

查看已经导出的 GPIO71 。

6、取消导出

使用完 GPIO2_A7 后,需要进行释放。方法:配置 unexport 后, gpio71 节点会消失。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7123609.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-01
下一篇2023-04-01

发表评论

登录后才能评论

评论列表(0条)

    保存