Linux下用户空间控制GPIO

参考文章

https://blog.csdn.net/qq_41483419/article/details/134015533

https://blog.csdn.net/baidu_38661691/article/details/97147652

一、简介

在用户空间中控制GPIO:

​ /sys/class/gpio为通用输入输出(GPIO)设备类的子目录,用于与外部设备进行数字输入和输出的通信。

知识点补充:/sys/class 该目录下包含所有注册在kernel里面的设备类型,这是按照设备功能分类的设备模型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下都是这种设备类型的各种具体设备的符号链接,这些链接指向/sys/devices/name下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)

​ 在/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表示具体的引

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

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

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

二、GPIO接口原理图

通过GPIO控制LED1~3的亮灭(LED4被占用为常亮状态)

设备GPIO的物理编号编程中使用的GPIO编号
LED1GPIO49465
LED2GPIO51467
LED3GPIO50466

三、在用户空间控制GPIO步骤

  1. 执行 echo <GPIO_Number> > /sys/class/gpio/export 导出 GPIO 管脚,将 GPIO_Number 替换为你想操作的 GPIO 编号。

  2. 检查 /sys/class/gpio/gpio<GPIO_Number> (将 GPIO_Number 替换为你想操作的 GPIO 编号)目录下是否有 direction 和 value 文件。

    物理GPIO口和GPIO编号之间的映射关系: 参考自己所用芯片的手册,我的在 Linux外设驱动开发参考.pdf

LED1

    ## LED1
    echo 465 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio465/direction
    echo 1 > /sys/class/gpio/gpio465/value
    echo 0 > /sys/class/gpio/gpio465/value

请添加图片描述

LED2

    ## LED2
    echo 467> /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio467/direction
    echo 1 > /sys/class/gpio/gpio467/value
    echo 0 > /sys/class/gpio/gpio467/value

请添加图片描述

LED3

    ## LED3
    echo 466 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio466/direction
    echo 1 > /sys/class/gpio/gpio466/value
    echo 0 > /sys/class/gpio/gpio466/value

LED1与LED2

    ## LED1与LED2
    
    echo 465 > /sys/class/gpio/export
    echo 467 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio465/direction
    echo out > /sys/class/gpio/gpio467/direction
    echo 1 > /sys/class/gpio/gpio465/value
    echo 1 > /sys/class/gpio/gpio467/value
    echo 0 > /sys/class/gpio/gpio465/value
    echo 0 > /sys/class/gpio/gpio467/value

请添加图片描述

  • 31
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值