Linux下控制GPIO的三种方法

这篇具有很好参考价值的文章主要介绍了Linux下控制GPIO的三种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://blog.csdn.net/qq_41076734/article/details/124669908

1. 应用空间控制gpio

1.1简介

在/sys/class/gpio/下有个export文件,向export文件写入要操作的GPIO号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO输入或者输出模式,而value可控制GPIO的状态或者读取状态。

/sys/class/gpio/目录下各个文件说明:
/sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号;
/sys/class/gpio/unexport 用于通知系统取消导出;
/sys/class/gpio/gpioX/direction文件,可以写入in(设置输入方向)或out(设置输出方向);
/sys/class/gpio/gpioX/value文件是可以读写GPIO状态;
/sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号,寄存器名称,引脚总数;其中X表示具体的引脚编号。

如果你在sys/class/gpio/下面没有看到gpioX,可能是这个 GPIO 管脚还没有被导出(export)供用户态使用,如下图:
echo 63 > /sys/class/gpio/unexport,gpio
你可以试试以下步骤:

  1. 执行 echo <GPIO_Number> > /sys/class/gpio/export 导出 GPIO 管脚,将 GPIO_Number 替换为你想操作的 GPIO 编号。
  2. 检查 /sys/class/gpio/gpio<GPIO_Number> (将 GPIO_Number 替换为你想操作的 GPIO 编号)目录下是否有 directionvalue 文件。

echo 63 > /sys/class/gpio/unexport,gpio
需要导出的GPIO编号(GPIO Number)往往取决于具体的硬件设计和应用需求。每个GPIO口在硬件设计图(如原理图)中通常都有对应的编号,这个就是GPIO的物理编号。而在编程中使用的GPIO编号则取决于操作系统和驱动如何映射这些物理GPIO口。在许多情况下,硬件设计师或者系统集成者会提供一个文档,列出了各个GPIO口的物理编号和它们的功能(比如连接到哪个设备、控制什么信号等)。在这个文档的帮助下,你可以确定你在应用程序中需要使用哪个GPIO口,然后查找相应的GPIO编号。

在某些情况下,你可能需要查看内核源代码或者硬件抽象层(HAL)的源代码来找出物理GPIO口和GPIO编号之间的映射关系。

echo 63 > /sys/class/gpio/unexport,gpio

1.2操作gpio

比如我要操作GPIO8_A6作为高电平输出有效, 那么有以下三个操作:

1. 2.1 换算对应的gpio number

可以通过/sys/kernel/debug/gpio查询信息:

root@rk3288:/sys/kernel/debug # cat gpio                                       
//snip
GPIOs 184-215, platform/ff770000.pinctrl, gpio6:
 gpio-193 (?                   ) in  hi
 gpio-194 (?                   ) in  hi
 
GPIOs 216-247, platform/ff770000.pinctrl, gpio7:
 gpio-218 (enable              ) out hi
 gpio-219 (lcd_en              ) in  hi
 gpio-220 (lcd_cs              ) in  hi
 gpio-221 (gslX680 wake pin    ) out hi
 gpio-222 (gslX680 irq pin     ) out lo
 gpio-223 (headset_gpio        ) in  hi
 gpio-233 (?                   ) in  hi
 gpio-234 (?                   ) in  hi
 GPIOs 248-279, platform/ff770000.pinctrl, gpio8:
 
 GPIOs 280-311, platform/ff770000.pinctrl, gpio15:

可以看到gpio8是以nubmer为248开始, 那么GPIO8_A6就是 248 + 6 = 254,接下来就可以导出gpio了。

root@rk3288:/sys/class/gpio # echo 254 > export                          
root@rk3288:/sys/class/gpio # ls
export
gpio254

1.2.2 设置成输出

root@rk3288:/sys/class/gpio/gpio254 # echo out > direction                     
root@rk3288:/sys/class/gpio/gpio254 # cat direction                            
out

1.2.3 输出高电平

root@rk3288:/sys/class/gpio/gpio254 # echo 1 > value                           
root@rk3288:/sys/class/gpio/gpio254 # cat value 

1.3 总结

这种方式一般不采用,为了gpio使用的安全性,一般是不将gpio的使用权暴露给应用层的,即sys/class/下没有gpio节点。

2. 内核空间控制gpio

在内核空间控制gpio有两种方法,第一种是通过调用gpiolib的接口来控制gpio;第二种是通过ioremap来控制gpio。

2.1 gpiolib控制gpio

2.1.1 gpiolib简介

Linux Kernel 中对 GPIO 资源进行了抽象,抽象出一个叫做 Gpiolib 的东西。

echo 63 > /sys/class/gpio/unexport,gpio
2.1.2 Gpiolib 为其他驱动提供的 APIs

int gpio_request(unsigned gpio, const char *label);
/*向内核申请 gpio,要使用 GPIO 首先应该向内核进行申请,返回 0,代表申请成功,
 *可以进行后续操作*/
 
void gpio_free(unsigned gpio);
/*对应 gpio_request,是使用完gpio以后把gpio释放掉*/
 
int gpio_direction_input(unsigned gpio);
/*设置 GPIO 为输入*/
 
int gpio_direction_output(unsigned gpio, int value);
/*设置 GPIO 为输出*/
 
int gpio_get_value(unsigned gpio);
/*读取 GPIO 的值*/
 
int gpio_set_value(unsigned gpio);
/*设置 GPIO 的值*/

2.1.3 操作gpio

功能和1.2一样。

#define GPIO8_A6 254
ret = gpio_request(GPIO8_A6 , "gpio8_a6");
if (!ret) {
	printk("request for gpio8_a6 failed:%d\n", ret);
    	return 0;
}
gpio_direction_output(GPIO8_A6 ,1);//设置GPIO8_A6为输出功能且输出高电平

2.2 ioremap控制gpio

这种方法会降低程序的可读性,不建议使用。

linux内核空间访问的地址为虚拟地址(3~4GB),故在内核空间操作某个寄存器时,需先通过ioremap函数将物理地址映射成虚拟地址。

用ioremap() 获取寄存器的地址:

unsigned int __iomem  *base_addr1;  //__iomem可选择,告诉你为虚拟地址
#define  GPIO8_REGBASE  (0x20A0000)
#define  GPIO8_A6 (*(volatile unsigned int *)(base_addr1 + 6)) //指针unsigned int为4字节,指针加1,字节加4
base_addr1 = ioremap(GPIO8_REGBASE, 0x14)

通过 readl() 或者 writel() 函数直接操作映射后的地址:

GPIO8_A6 |= (1<<8);
 
int temp;
temp = readl(GPIO8_A6);
temp |= (1<<8);
writel(temp, GPIO8_A6);

使用完后,取消映射:

iounmap(base_addr1);

3. 查看GPIO全部信息文章来源地址https://www.toymoban.com/news/detail-778274.html

cat /sys/kernel/debug/pinctrl/pinctrl/pinmux-pins
 
Pinmux settings per pin
Format: pin (name): mux_owner gpio_owner hog?
pin 0 (gpio0-0): wireless-wlan (GPIO UNCLAIMED) function wireless-wlan group wifi-wake-host
pin 1 (gpio0-1): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 2 (gpio0-2): (MUX UNCLAIMED) gpio0:2
pin 3 (gpio0-3): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 4 (gpio0-4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 5 (gpio0-5): (MUX UNCLAIMED) gpio0:5
pin 6 (gpio0-6): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 7 (gpio0-7): (MUX UNCLAIMED) gpio0:7
pin 8 (gpio0-8): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 9 (gpio0-9): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 10 (gpio0-10): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 11 (gpio0-11): ff050000.i2c (GPIO UNCLAIMED) function i2c1 group i2c1-xfer
pin 12 (gpio0-12): ff050000.i2c (GPIO UNCLAIMED) function i2c1 group i2c1-xfer
pin 13 (gpio0-13): (MUX UNCLAIMED) (GPIO UNCLAIMED)

到了这里,关于Linux下控制GPIO的三种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】 网络配置常见的三种方法

    目录 前言 方法一:(在图形化界面修改) 方法二:(修改ifcfg-eth60文件) 1.配置虚拟网络编辑器  2.配置ip ​编辑  3.网络验证 方法三:(利用nmtui命令修改) 总结 文章用配置的网络,我整理出来的这三种方法这里我们用Redhat9演示,希望能够读者带来帮助。 在配置网络之前

    2024年03月15日
    浏览(32)
  • Linux更改普通用户密码的三种方法

    Linux服务器使用root管理员用户创建完成普通用户之后,为了后续使用该用户能够登录服务器(/etc/passwd中每个用户的shell类型为/bin/bash的可用来登录linux服务器),我们需要为普通用户设置登录密码。 useradd用户创建: https://blog.csdn.net/z19861216/article/details/130613814 Linux下,使用root管

    2024年02月15日
    浏览(33)
  • linux修改文件名的三种方法

    我们在使用linux系统过程中为了便于记忆或整理维护,经常需要对文件名进行修改,下面文章介绍了linux系统的三种修改文件名称的方式。 语法:mv [options] source dest 参数说明: 示例:将a.txt修改为a1.txt 语法:cp [options] source dest 参数说明: 示例:将a.txt修改为a1.txt,通过cp命令

    2024年02月02日
    浏览(40)
  • 14 | linux设置开机自启动的三种方法

    vim /etc/rc.local reboot下服务器,看该服务,还在不在 注意:在/etc/rc.d/init.d下是shell脚本或者可执行二进制文件 可执行权限 chmod +x filename 重启服务reboot,查看该服务是否还在 制作service服务并设置开机自启动 以nginx为例 安装路径:/usr/local/nginx 在/etc/systemd/system/路径下创建nginx.s

    2024年02月16日
    浏览(32)
  • Linux中修改文件名的三种方法

      在Linux操作系统中,对文件名的修改是一项常见且至关重要的操作。文件名修改的需求多样,包括但不限于:促进文件组织的清晰性、确保命名符合特定规则,以及简单地修复拼写错误。与通过图形界面直接下载后修改文件名相比,采用命令行方式进行文件名修改,能够带

    2024年01月17日
    浏览(43)
  • Linux下修改文件名的三种方法

    在Linux系统中,有多种方法可以用来修改文件名。以下是三种常用的方法: 1. 使用 mv 命令 mv 命令是最基本也是最直接的方式来重命名文件。它的基本语法是: 打开终端 :首先,你需要打开一个命令行终端。 定位到文件所在目录 :使用 cd 命令进入包含你想要重命名的文件的

    2024年01月17日
    浏览(42)
  • Linux批量快速修改文件名的三种方法

    在Linux中, 批量重命名文件 是一项常见且有用的操作。以下是三种常用的批量重命名文件的方法,每种方法都附有示例。这些方法既可以适用于新手,也适用于更有经验的用户。 话不多说,直接上干货! rename 命令 rename命令是一种强大的批量重命名工具,它支持使用正则表

    2024年04月11日
    浏览(43)
  • linux修改文件名的三种方法有哪些

    在Linux中,你可以使用以下三种方法来修改文件名: 使用  mv  命令: mv  命令是用于移动或重命名文件和目录的常用命令。要修改文件名,可以使用以下语法: php复制代码 mv 旧文件名 新文件名 例如,要将文件  oldname.txt  重命名为  newname.txt ,可以运行以下命令: bash复制

    2024年01月17日
    浏览(37)
  • Linux:安装jdk的三种方法(yum+rpm+下载包)

    在 linux 上使用 yum 安装是非常粗暴无脑的,但仍然有需要注意的点,不然会掉坑里。这里说一下步骤。 1.1. 执行命令 yum list |grep jdk 查看可安装 jdk 版本 执行成功后可以看见如下的结果: 1.2. 选择一个 java 版本进行安装 这里我们希望安装 java1.8 ,因为我们的机器是64位的,所

    2024年02月03日
    浏览(43)
  • 黑龙江等保测评Linux服务器的三种配置 IP方法

    说明: 使用nmcli命令配置的网络配置可以立即生效且系统重启后配置也不会丢失。 nmcli介绍 nmcli 是NetworkManager的一个命令行工具,它提供了使用命令行配置由NetworkManager管理网络连接的方法。nmcli命令的基本格式为: nmcli [OPTIONS] OBJECT { COMMAND | help } 其中,OBJECT选项可以是gene

    2024年04月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包