Linux GPIO 应用编程

Linux GPIO 应用编程

嵌入式Linux应用开发中,系统经常会通过GPIO接入按键、各种感应开关等传感器,或控制电源开关、继电器等设备。

要在Linux应用层控制GPIO有两种方式:

  1. 通过sysfs控制
  2. 通过API控制

通过sysfs控制GPIO

为了用户空间运行的应用程序能够使用GPIO,Linux内核通过sysfs导出了与GPIO控制相关的文件,在/sys/class/gpio目录下,根据芯片不同,其下又有多个芯片子目录gpiochipN,例如在我使用的旭日X3pi中,有一个子目录gpiochip0,如果有多个带有GPIO的芯片,会有多个子目录。每个子目录中主要有以下与这个芯片相关的信息文件:

  • label: 通过一个字符串来标识这个GPIO芯片,提供给API或程序来查找相应的芯片,但这个信息不是必须的,这个文件在旭日X3pi中就是空的。通常我们还是通过目录上的编号N来找到和使用GPIO芯片。
  • base: 这个GPIO芯片提供的GPIO引脚编号的起始值,后续计算导出的GPIO编号时会用到。
  • ngpio: 这个GPIO芯片有多少个GPIO

/sys/class/gpio目录下有两个文件exportunexport,用来导出和取消导出GPIO,向export文件中写入要导出的GPIO的编号,会导出相应的GPIO,导出后会在/sys/class/gpio目录下生成一个与GPIO对应的子目录。向unexport文件写入GPIO编号会取消导出相应的GPIO。例如在X3pi上导出GPIO3:

root@ubuntu:/sys/class/gpio# ls
export  gpiochip0  unexport
root@ubuntu:/sys/class/gpio# echo 3 >export
root@ubuntu:/sys/class/gpio# ls
export  gpio3  gpiochip0  unexport
root@ubuntu:/sys/class/gpio# 

这个GPIO编号是全局GPIO编号,是在芯片的GPIO编号基础上加上芯片对应的base值。这里芯片的GPIO编号是3,芯片对应的base值是0,所以全局GPIO号还是3。

不同芯片的GPIO编号如何计算需要参考芯片相应文档,例如有的芯片GPIO名是A3,B5这样,其中A0-AF编号为0~15,B0-BF编号为16~31。

GPIO导出后,会生成一个名为gpioN的目录,其中N为GPIO编号,目录下有一些文件用来控制该GPIO或读取该GPIO的状态,主要有:

  • direction: 控制GPIO的工作方式是输入还是输出,写入in,表示输入状态,写入out表示输出状态。也可以用来读取GPIO当前的工作状态。
  • active_low: 表示低电平用什么值表示,0表示低电平用0,高电平用1;1表示相反,低电平用1,高电平用0;
  • value: GPIO输入时,读取当前GPIO电平,GPIO输出时控制GPIO电平。
  • edge: 设置中断触发条件:none - 不触发;rising - 上升沿触发;falling - 下降沿触发;both - 上升沿和下降沿都触发。设置触发中断后,在程序中可以使用poll检测引脚电平变化。此功能仅在引进作为输入时可用。

使用流程:

  1. export指定的GPIO
  2. 设置GPIO方向为输入或输出
  3. 读取或写入value来查看或控制GPIO电平
  4. unexport指定的GPIO

通过API控制GPIO

要通过API控制GPIO,首先要知道GPIO芯片对应的设备节点,例如,在旭日X3pi上,GPIO芯片对应的设备节点是/dev/gpiochip0,知道设备节点后,可以通过open打开设备节点,然后通过fcntl来控制GPIO,与GPIO控制相应的控制命令和数据结构定义在/usr/include/linux/gpio.h文件中,注意这不是kernel头文件。

通过芯片进一步可以获取引脚(line)的控制对象,从而控制引脚。

由于整个过程比较复杂,这里不具体介绍了,因为已经有人写了一个库来通过API控制GPIO,这个库就是libgpiod

相关推荐

  1. Linux PWM 应用编程

    2023-12-17 15:42:02       39 阅读
  2. Linux GPIO 应用编程

    2023-12-17 15:42:02       35 阅读
  3. Linux应用编程:定时器

    2023-12-17 15:42:02       31 阅读
  4. 【Linux应用编程笔记】GPIO

    2023-12-17 15:42:02       33 阅读
  5. CAN Linux C应用编程

    2023-12-17 15:42:02       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-17 15:42:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-17 15:42:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-17 15:42:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-17 15:42:02       18 阅读

热门阅读

  1. RMAN执行crosscheck archivelog出现ORA-19633错误

    2023-12-17 15:42:02       38 阅读
  2. 【设计模式】之工厂模式

    2023-12-17 15:42:02       38 阅读
  3. css的高级选择器使用

    2023-12-17 15:42:02       36 阅读
  4. ECAT【对象字典】

    2023-12-17 15:42:02       38 阅读
  5. 算法基础十四

    2023-12-17 15:42:02       29 阅读
  6. Spring boot 配置参数

    2023-12-17 15:42:02       26 阅读
  7. Go 小知识之 Go 中如何使用 set

    2023-12-17 15:42:02       35 阅读
  8. HTML基础:打开网页魔法的大门

    2023-12-17 15:42:02       40 阅读