# gpio_control_api **Repository Path**: lozenyin/gpio_control_api ## Basic Information - **Project Name**: gpio_control_api - **Description**: 基于嵌入式linux环境操作GPIO与例程(led与按键) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-09 - **Last Updated**: 2024-01-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## 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 ``。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内核后件会慢慢淘汰。试试使用这个库。 ## 工程目录 ```bash . |-- demo | `-- demo001.c |-- main.c |-- method1 # 方法一:驱动方式 | `-- state_led.c |-- method2 # 方法二:GPIO子系统API方式 |-- method3 # 方法三:/sys/class/gpio/方式 `-- readme.md # 说明记录文件 ``` ## 安装内核头文件 > 因为设计内核操作,需要安转该内核头文件进行操作。以下转载至[6.8 安装内核头文件](https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T6/zh#.E5.AE.89.E8.A3.85.E5.86.85.E6.A0.B8.E5.A4.B4.E6.96.87.E4.BB.B6) ```bash sudo dpkg -i /opt/linux-headers-*.deb ``` ```bash 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) ... ``` 测试编译内核模块 ```bash 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](https://blog.csdn.net/sinat_22338935/article/details/122864216) 2. [用户态下使用gpio中断](https://wangzhou.github.io/%E7%94%A8%E6%88%B7%E6%80%81%E4%B8%8B%E4%BD%BF%E7%94%A8gpio%E4%B8%AD%E6%96%AD/#:~:text=echo%20%E2%80%9Cin%E2%80%9D%20%3E%20direction%20%E8%AE%BE%E7%BD%AEgpio66%E8%84%9A%E4%B8%BA%E8%BE%93%E5%85%A5%20echo,%E2%80%9Cfalling%E2%80%9D%20%3E%20edge%20%E8%AE%BE%E7%BD%AEgpio66%E8%84%9A%E4%B8%BA%E4%B8%8B%E9%99%8D%E6%B2%BF%E8%A7%A6%E5%8F%91%E4%B8%AD%E6%96%AD%2C%20%E4%B9%9F%E5%8F%AF%E4%BB%A5%E6%8A%8Afalling%E6%94%B9%E6%88%90rising%20%E5%8D%B3%E4%B8%BA%E4%B8%8A%E5%8D%87%E6%B2%BF%E8%A7%A6%E5%8F%91%EF%BC%8C%E8%BF%99%E6%97%B6%E5%BD%93gpio66%E7%AE%A1%E8%84%9A%E4%B8%8A%E5%AD%98%E5%9C%A8%E4%B8%80%E4%B8%AAfalling%E6%97%B6%E5%B0%B1%E4%BC%9A%E6%8E%A5%E6%94%B6%E5%88%B0%E4%B8%80%E4%B8%AA%E4%B8%AD%E6%96%AD%EF%BC%8C%E6%80%8E%E4%B9%88%E6%8A%8A) 3. [Linux中断-简单中断,以GPIO中断为例-博客园](https://www.cnblogs.com/TaXueWuYun/p/15452253.html) 4. [用 Linux 内核中断检测按键输入-知乎](https://zhuanlan.zhihu.com/p/571477664#:~:text=%E7%94%A8%20Linux%20%E5%86%85%E6%A0%B8%E4%B8%AD%E6%96%AD%E6%A3%80%E6%B5%8B%E6%8C%89%E9%94%AE%E8%BE%93%E5%85%A5%201%201.%20%E4%BF%AE%E6%94%B9%E8%AE%BE%E5%A4%87%E6%A0%91%E6%96%87%E4%BB%B6%20%E5%9C%A8%20Linux%E4%B8%8B%E7%9A%84%E6%8C%89%E9%94%AE%E8%BE%93%E5%85%A5%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91,%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F%E9%80%9A%E8%BF%87%E4%B8%8D%E6%96%AD%E7%9A%84%E8%AF%BB%E5%8F%96%2Fdev%2Fimx6uirq%E6%96%87%E4%BB%B6%E6%9D%A5%E8%8E%B7%E5%8F%96%E6%8C%89%E9%94%AE%E5%80%BC%EF%BC%8C%E5%BD%93%E6%8C%89%E9%94%AE%E6%8C%89%E4%B8%8B%E4%BB%A5%E5%90%8E%E5%B0%B1%E4%BC%9A%E5%B0%86%E8%8E%B7%E5%8F%96%E5%88%B0%E7%9A%84%E6%8C%89%E9%94%AE%E5%80%BC%E8%BE%93%E5%87%BA%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%8A%E3%80%82%20...%204%204.%20%E7%BC%96%E8%AF%91%E6%B5%8B%E8%AF%95%20%E2%8F%A9%20%E7%BC%96%E8%AF%91%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%EF%BC%9A%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E4%B8%8B%E5%88%9B%E5%BB%BAMakefile%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6make%E7%BC%96%E8%AF%91%20) 5. [Linux学习笔记(17.4)——基于gpio中断的按键驱动-CSDN](https://blog.csdn.net/glen_cao/article/details/122604445#:~:text=Linux%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%8817.4%EF%BC%89%E2%80%94%E2%80%94%E5%9F%BA%E4%BA%8Egpio%E4%B8%AD%E6%96%AD%E7%9A%84%E6%8C%89%E9%94%AE%E9%A9%B1%E5%8A%A8%201%20%E4%BD%BF%E7%94%A8%E4%B8%AD%E6%96%AD%20%E5%85%88%E5%89%8D%E9%87%87%E7%94%A8%E6%9F%A5%E8%AF%A2%E6%96%B9%E5%BC%8F%E7%9A%84%E6%8C%89%E9%94%AE%E9%A9%B1%E5%8A%A8%E5%8D%A0%E7%94%A8%E8%BF%87%E5%A4%9A%E5%86%85%E5%AD%98%EF%BC%8C%E4%B8%8D%E9%80%82%E5%90%88%E4%BA%A7%E5%93%81%E7%9A%84%E5%AE%9E%E9%99%85%E4%BD%BF%E7%94%A8%EF%BC%8C%E8%BF%99%E5%B0%B1%E8%A6%81%E4%BD%BF%E7%94%A8%E4%B8%AD%E6%96%AD%E3%80%82%20Linux%E7%B3%BB%E7%BB%9F%E4%B9%9F%E9%9A%8F%E7%9D%80%E8%8A%AF%E7%89%87%E6%8A%80%E6%9C%AF%E7%9A%84%E5%8F%91%E5%B1%95%E5%AF%B9%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86%E4%B8%8D%E6%96%AD%E4%BC%98%E5%8C%96%EF%BC%8C%E5%85%B7%E4%BD%93%E7%9A%84%E6%BC%94%E8%BF%9B%E5%A6%82%E4%B8%8B%EF%BC%88%E5%8F%82%E8%80%83%E9%9F%A6%E4%B8%9C%E5%B1%B1%E8%80%81%E5%B8%88%EF%BC%89%EF%BC%9A,Linux%EF%BC%884.1.15%E5%86%85%E6%A0%B8%EF%BC%89%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E9%87%8D%E8%A6%81%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%9A%20...%202%20%E6%8C%89%E9%94%AE%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E6%96%87%E4%BB%B6%20button_drv.c%E6%96%87%E4%BB%B6%E4%B8%AD%EF%BC%8Cbutton_drv_read%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8wait_event_interruptible%EF%BC%8C%E5%BD%93%E6%B2%A1%E6%9C%89%E6%8C%89%E9%94%AE%E6%97%B6%E5%B0%86%E8%BF%9B%E5%85%A5%E4%BC%91%E7%9C%A0%EF%BC%9B%E6%9C%89%E6%8C%89%E9%94%AE%E6%97%B6%20%28%E4%B8%8A%E5%8D%87%E6%B2%BF%E3%80%81%E4%B8%8B%E9%99%8D%E6%B2%BF%E6%88%96%E5%8F%8C%E8%BE%B9%E6%B2%BF%E8%A7%A6%E5%8F%91%EF%BC%89%EF%BC%8C%E8%BF%9B%E5%85%A5%E4%B8%AD%E6%96%AD%E6%9C%8D%E5%8A%A1%E5%87%BD%E6%95%B0gpio_btn_isr%EF%BC%8C%E5%9C%A8%E6%AD%A4%E4%B8%AD%E6%96%AD%E6%9C%8D%E5%8A%A1%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8wake_up_interruptible%E5%87%BD%E6%95%B0%E5%94%A4%E9%86%92%E7%AD%89%E5%BE%85%E9%98%9F%E5%88%97%EF%BC%8Cbutton_drv_read%E5%87%BD%E6%95%B0%E5%BE%97%E4%BB%A5%E7%BB%A7%E7%BB%AD%E6%89%A7%E8%A1%8C%EF%BC%8C%E8%BF%94%E5%9B%9E%E6%8C%89%E9%94%AE%E6%95%B0%E6%8D%AE%E7%BB%99%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E3%80%82) 6. [Linux 用户态设置GPIO控制-博客园](https://www.cnblogs.com/lxyd/p/9671673.html) 7. [Linux下对GPIO的操作控制(基于GPIO子系统)-博客园](https://www.cnblogs.com/lidabo/p/17813256.html#:~:text=1%20none%EF%BC%9A%E8%BE%93%E5%85%A5%EF%BC%8C%E9%9D%9E%E4%B8%AD%E6%96%AD%202%20rising%EF%BC%9A%E4%B8%AD%E6%96%AD%E8%BE%93%E5%85%A5%EF%BC%8C%E4%B8%8A%E5%8D%87%E6%B2%BF%E8%A7%A6%E5%8F%91%203%20falling%EF%BC%9A%E4%B8%AD%E6%96%AD%E8%BE%93%E5%85%A5%EF%BC%8C%E4%B8%8B%E9%99%8D%E6%B2%BF%E8%A7%A6%E5%8F%91%204%20both%EF%BC%9A%E4%B8%AD%E6%96%AD%E8%BE%93%E5%85%A5%EF%BC%8C%E8%BE%B9%E6%B2%BF%E8%A7%A6%E5%8F%91,6%20gpio%E8%BE%93%E5%85%A5%E8%BF%98%E6%94%AF%E6%8C%81%E4%B8%AD%E6%96%AD%E5%8A%9F%E8%83%BD%207%20%E4%BD%BF%E7%94%A8gpio%E5%89%8D%EF%BC%8C%E9%9C%80%E8%A6%81%E4%BB%8E%E5%86%85%E6%A0%B8%E7%A9%BA%E9%97%B4%E6%9A%B4%E9%9C%B2%E5%88%B0%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%20%E6%B3%A8%E6%84%8F%20%EF%BC%9A%E5%9C%A8%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E6%8E%A7%E5%88%B6%E4%BD%BF%E7%94%A8gpio%E6%97%B6%EF%BC%8C%E6%B3%A8%E6%84%8F%E4%B8%8D%E8%A6%81%E6%BB%A5%E7%94%A8%E5%92%8C%E5%86%85%E6%A0%B8%E4%B8%80%E4%BA%9B%E7%BB%91%E5%AE%9A%E5%A5%BD%E3%80%81%E5%B7%B2%E7%BB%8F%E6%9C%89%E5%90%88%E9%80%82%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A8%E7%9A%84%E5%BC%95%E8%84%9A%E5%86%B2%E7%AA%81%E3%80%82%20%E5%8F%82%E8%80%83%20Documentation%2Fdriver-api%2Fgpio%2Fdrivers-on-gpio.rst) 8. [linux驱动GPIO中断检测状态-里纽斯小白-CSDN](https://blog.csdn.net/weixin_47822507/article/details/133667852) 9. [Linux无需开发底层驱动,从应用层获取GPIO中断-白菜爱吃白菜-CSDN](https://blog.csdn.net/baicaiaichibaicai/article/details/51187244) 10. [linux用户空间控制gpio的两种方法-Golden_Chen-CSDN](https://blog.csdn.net/Golden_Chen/article/details/107582521) 11. [poll函数详解-青季-CSDN](https://blog.csdn.net/skypeng57/article/details/82743681) 12. [中断深入--> poll机制-鸭鸭打瞌睡-CSDN](https://blog.csdn.net/weixin_43898067/article/details/117886280) --- ### 安装libgpiod库 ```bash #安装libgpiod库及头文件 sudo apt install libgpiod-dev #安装gpiod 命令行工具 sudo apt install gpiod ``` ### /sys/class/gpio的文件解析 ```bash /sys/class/gpio ``` ```bash 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的操作路径 ```bash 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进行配置和控制。 ## 部署 ```bash apt install cmake curl libssl-dev libcurl4-openssl-dev libcurl4 ``` 下载可执行文件 ```bash 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 `` 处解压 ```bash tar -zxvf gpio_control_api_T6_v1.0.0_202312121645.tar.gz ``` ### 打包发行版的方式 ```bash find gpio_control_api/method3 -type f -name 'run_*' | xargs tar -czvf gpio_control_api_T6_v1.0.0_202312121645.tar.gz ```