1 Star 0 Fork 0

lozenyin/gpio_control_api

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

基于linux系统的led灯与开关监测

工程简介

基于任务要求,实现一个led灯的亮灭与开关的状态识别。led灯为状态指示灯,需要根据不同状态下切换不同的显示效果,开关为电源开关,开发设备上做了关闭开关后延时15秒才断电的操作,15秒内需要通知应用系统执行关机。

功能详情

主要实现的功能

  1. 检测开关是否断开
  2. 检测到断开后,需要联动系统进行关机操作
  3. 设备状态指示灯

要求

  1. 检测尽量不使用轮询机制,使用中断检测,当出现上升沿时触发
  2. 联动应用系统进行关机操作(只要系统提供一个关机脚本,该功能就能独立存在)
  3. T6和OPIzero2中都需要该功能,各自处理自身的断电关机

实现路径

第一种:设备驱动的方式

分成两个设备:/dev/state_led和/dev/power_switch。一个负责状态灯,另一个负责断电检测。先是编写驱动(底层的操作和系统接口),然后在基于设备编写应用程序……工作量和工作难度都比较高。

第二种:linux的GPIO子系统API

使用系统提供的GPIO API库#include <linux/gpio.h>。API库的相关描述在sd-fuse_rk3588-master/kernel/Documentation/translations/zh_CN/gpio.txt

第三种方法:sysfs方式(/sys/class/gpio/)(选用)

直接基于系统的文件操作方式,对GPIO进行操作。原先的控制脚本也是基于此,只是使用的是shell脚本语言和python语言编写的。这样的话需要修改成使用C/C++重新对操作进行编写了。

在T6上测试没有成功

第四种方法:libgpiod控制

发现sysfs方式在4.0内核后件会慢慢淘汰。试试使用这个库。

工程目录

.
|-- demo
|   `-- demo001.c
|-- main.c
|-- method1             # 方法一:驱动方式
|   `-- state_led.c
|-- method2             # 方法二:GPIO子系统API方式
|-- method3             # 方法三:/sys/class/gpio/方式
`-- readme.md           # 说明记录文件

安装内核头文件

因为设计内核操作,需要安转该内核头文件进行操作。以下转载至6.8 安装内核头文件

sudo dpkg -i /opt/linux-headers-*.deb
root@NanoPC-T6:~# sudo dpkg -i /opt/linux-headers-*.deb
Selecting previously unselected package linux-headers-5.10.160.
(Reading database ... 108405 files and directories currently installed.)
Preparing to unpack .../linux-headers-5.10.160-1.deb ...
Unpacking linux-headers-5.10.160 (5.10.160-1) ...
Setting up linux-headers-5.10.160 (5.10.160-1) ...

测试编译内核模块

sudo apt update
sudo apt install git gcc make bc
git clone https://github.com/RinCat/RTL88x2BU-Linux-Driver.git
cd RTL88x2BU-Linux-Driver
make -j$(nproc)
sudo make install
sudo modprobe 88x2bu

参考资料

  1. linux用户态使用gpio中断方法-CSDN
  2. 用户态下使用gpio中断
  3. Linux中断-简单中断,以GPIO中断为例-博客园
  4. 用 Linux 内核中断检测按键输入-知乎
  5. Linux学习笔记(17.4)——基于gpio中断的按键驱动-CSDN
  6. Linux 用户态设置GPIO控制-博客园
  7. Linux下对GPIO的操作控制(基于GPIO子系统)-博客园
  8. linux驱动GPIO中断检测状态-里纽斯小白-CSDN
  9. Linux无需开发底层驱动,从应用层获取GPIO中断-白菜爱吃白菜-CSDN
  10. linux用户空间控制gpio的两种方法-Golden_Chen-CSDN
  11. poll函数详解-青季-CSDN
  12. 中断深入--> poll机制-鸭鸭打瞌睡-CSDN

安装libgpiod库

#安装libgpiod库及头文件
 sudo apt install libgpiod-dev

 #安装gpiod 命令行工具
 sudo apt install gpiod

/sys/class/gpio的文件解析

/sys/class/gpio
root@NanoPC-T6:/sys/class/gpio# ll
total 0
drwxr-xr-x  2 root root    0 Dec  8 00:00 ./
drwxr-xr-x 77 root root    0 Dec  8 00:00 ../
--w-------  1 root root 4096 Dec  8 16:29 export    # 创建(添加)GPIO操作路径
lrwxrwxrwx  1 root root    0 Dec  8 16:29 gpio106 -> ../../devices/platform/pinctrl/fec40000.gpio/gpiochip3/gpio/gpio106/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpio107 -> ../../devices/platform/pinctrl/fec40000.gpio/gpiochip3/gpio/gpio107/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpio111 -> ../../devices/platform/pinctrl/fec40000.gpio/gpiochip3/gpio/gpio111/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpio115 -> ../../devices/platform/pinctrl/fec40000.gpio/gpiochip3/gpio/gpio115/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpio52 -> ../../devices/platform/pinctrl/fec20000.gpio/gpiochip1/gpio/gpio52/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpiochip0 -> ../../devices/platform/pinctrl/fd8a0000.gpio/gpio/gpiochip0/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpiochip128 -> ../../devices/platform/pinctrl/fec50000.gpio/gpio/gpiochip128/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpiochip32 -> ../../devices/platform/pinctrl/fec20000.gpio/gpio/gpiochip32/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpiochip509 -> ../../devices/platform/feb20000.spi/spi_master/spi2/spi2.0/rk806-pinctrl.6.auto/gpio/gpiochip509/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpiochip64 -> ../../devices/platform/pinctrl/fec30000.gpio/gpio/gpiochip64/
lrwxrwxrwx  1 root root    0 Dec  8 00:00 gpiochip96 -> ../../devices/platform/pinctrl/fec40000.gpio/gpio/gpiochip96/
--w-------  1 root root 4096 Dec  8 00:00 unexport  #销毁GPIO操作路径

其中一个GPIO的操作路径

root@NanoPC-T6:/sys/class/gpio/gpio106# tree -L 2
.
|-- active_low
|-- device -> ../../../gpiochip3
|-- direction
|-- edge
|-- power
|   |-- async
|   |-- autosuspend_delay_ms
|   |-- control
|   |-- runtime_active_kids
|   |-- runtime_active_time
|   |-- runtime_enabled
|   |-- runtime_status
|   |-- runtime_suspended_time
|   `-- runtime_usage
|-- subsystem -> ../../../../../../../class/gpio
|-- uevent
`-- value
  • active_low:表示GPIO是否为低电平有效。
  • device:指向GPIO芯片的设备节点。
  • direction:设置GPIO的输入输出方向。
  • edge:设置GPIO的触发边缘,用于中断。
  • power:包含与GPIO电源相关的属性。
  • async:表示GPIO是否支持异步操作。
  • autosuspend_delay_ms:表示GPIO自动挂起延迟时间。
  • control:表示GPIO是否受控。
  • runtime_active_kids:表示GPIO的活跃子设备数量。
  • runtime_active_time:表示GPIO的活跃时间。
  • runtime_enabled:表示GPIO是否启用。
  • runtime_status:表示GPIO的运行状态。
  • runtime_suspended_time:表示GPIO的挂起时间。
  • runtime_usage:表示GPIO的使用情况。
  • subsystem:指向GPIO子系统。
  • uevent:表示GPIO的事件。
  • value:表示GPIO的当前值。

这些文件可以通过sysfs文件系统进行访问和修改,以便对GPIO进行配置和控制。

部署

apt install cmake curl libssl-dev libcurl4-openssl-dev libcurl4

下载可执行文件

wget https://gitee.com/lozenyin/gpio_control_api/releases/download/V1.0.0/gpio_control_api_T6_v1.0.0_202312121645.tar.gz

/root/hardware 处解压

tar -zxvf gpio_control_api_T6_v1.0.0_202312121645.tar.gz

打包发行版的方式

find gpio_control_api/method3 -type f -name 'run_*' | xargs tar -czvf gpio_control_api_T6_v1.0.0_202312121645.tar.gz

空文件

简介

基于嵌入式linux环境操作GPIO与例程(led与按键) 展开 收起
Makefile 等 6 种语言
取消

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lozenyin/gpio_control_api.git
git@gitee.com:lozenyin/gpio_control_api.git
lozenyin
gpio_control_api
gpio_control_api
master

搜索帮助