前言
libgpiod 是用于与 Linux GPIO 字符设备交互的 C 库和工具库;此项目包含六种命令行工具(gpiodetect、gpioinfo、gpioset、gpioget、gpiomon),使用这些工具可以在命令行设置和获取GPIO的状态信息;在程序开发中也可以调用库提供的API接口来控制GPIO。本文内容可适用于RK3566系列开发板 Android11 系统上添加libgpiod库和使用API来测试GPIO。
Purple Pi OH作为一款兼容树莓派的开源主板,采用瑞芯微RK3566 (Cortex-A55) 四核64位超强CPU,主频最高达1.8 GHz,算力高达1Tops,支持INT8/INT16,支持TensorFlow/MXNet/PyTorch/Caffe框架,多路视频输出和输入,支持4K、H.265/H.264视频解码,接口丰富。
玩法丰富,支持Android 11、Debian 10、OpenHarmony3.2、Ubuntu、麒麟OS等多种系统,提供丰富开源资料。
产品规格书查看深圳触觉智能官网-产品中心


Android 移植 libgpiod 库和测试工具
下载源码到 external目录下:
- cd external
- git clone https://github.com/technexion-android/platform_external_libgpiod.git
- #git clone https://kernel.googlesource.com/pub/scm/libs/libgpiod/libgpiod
仓库链接:platform_external_libgpiod
添加到 PRODUCT_PACKAGES
在mk文件中添加编译 libgpiod及工具
- PRODUCT_PACKAGES += \
- RockchipPinnerService \
- gpioset \
- gpiomon \
- gpioinfo \
- gpioget \
- gpiofind \
- gpiodetect \
- libgpiod
源码
命令行工具使用测试
使用gpioget 获取 GPIO0_A6 的电平状态
- # gpioget gpiochip0 6
- 1
程序中调用库的接口使用测试
编写gpiotest.c 实现多组GPIO之间的输入输出对测功能
src/tools/gpiotest.h

src/tools/gpiotest.c 函数简单说明,#define LEN 45需要修改
- #include <stdio.h>
- #include <unistd.h>
- #include <gpiod.h>
- #include "gpiotest.h"
-
- #define LEN 45 // GPIO 数组总数,可以用sizeof获取数组大小
- #define HIGH 1
-
- int main()
- {
-
- struct gpiod_chip *input_chip, *output_chip;
- struct gpiod_line *input_line, *output_line;
-
- bool output_value, input_value;
- int ret,test_res = 0, total = 0;
-
- for (int num = 0; num < 2; num++ ){
- int in_chip = 0;
- int in_line = 1;
- int out_chip = 2;
- int out_line = 3;
-
- // 反转测试,将原来输出改为输入
- if ( 1 == num ){
- in_chip = 2;
- in_line = 3;
- out_chip = 0;
- out_line = 1;
- }
-
- for (int i = 0; i < LEN; i++){
- // 将 GPIO 配置为 输入
- input_chip = gpiod_chip_open_by_number(test_gpio[i][in_chip]);
- if(!input_chip)
- return -1;
-
- input_line = gpiod_chip_get_line(input_chip,test_gpio[i][in_line]);
- if(!input_line){
- gpiod_chip_close(input_chip);
- return -1;
- }
-
- ret = gpiod_line_request_input(input_line,"input");
- if(ret){
- gpiod_chip_close(input_chip);
- return -1;
- }
-
- // 将 GPIO 配置为 输出
- output_chip = gpiod_chip_open_by_number(test_gpio[i][out_chip]);
- if(!output_chip)
- return -1;
-
- output_line = gpiod_chip_get_line(output_chip,test_gpio[i][out_line]);
- if(!output_line){
- gpiod_chip_close(output_chip);
- return -1;
- }
-
- ret = gpiod_line_request_output(output_line,"output",HIGH);
- if(ret){
- gpiod_chip_close(output_chip);
- return -1;
- }
-
- test_res = 1;
- for(int j = 0;j < 2; j++){
- output_value = gpiod_line_get_value(output_line);
-
- //测试拉高、拉低
- gpiod_line_set_value(output_line, !output_value);
- //printf("output gpio[%d]: %d\t",i, !output_value);
- sleep(1);
-
- input_value = gpiod_line_get_value(input_line);
- //printf("input gpio[%d]: %d\n",i, input_value);
-
- //用输入 GPIO 验证拉高、拉低
- if ( output_value != !input_value){
- printf("test fail array [%d]\n",i);
- test_res = -1;
- break;
- }
- }
-
- if ( 1 == test_res ){
- printf("PASS gpio array %d\n",i);
- total += 1;
- }
-
- // release gpio
- gpiod_chip_close(input_chip);
- gpiod_chip_close(output_chip);
- }
- }
-
- printf("total pass gpio number %d\n",total);
- return 0;
- }
程序编译
使用mmm 命令指定目录编译
$ mmm external/libgpiod/
编译完成后,可执行文件产生的路径为out/target/product/rk3566_r/system/bin/gpiotest
将程序push到主板中使用
- adb root
- adb remount
- adb push out/target/product/rk3566_r/system/bin/gpiotest /system/bin
- adb shell chmod +x /system/bin/gpiotest
gpiotest 使用

数组第十项测试失败,其余通过,通过gpiotest.h可以找到对应的 GPIO