前言
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
源码
libgpiod-git.7z
命令行工具使用测试
使用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