【技术分享】RK356X Android 使用 libgpiod 测试gpio

前言

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等多种系统,提供丰富开源资料。

产品规格书查看深圳触觉智能官网-产品中心

【技术分享】RK356X Android 使用 libgpiod 测试gpio_第1张图片

【技术分享】RK356X Android 使用 libgpiod 测试gpio_第2张图片

Android 移植 libgpiod 库和测试工具

  1. 下载源码到 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

  1. 添加到 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

【技术分享】RK356X Android 使用 libgpiod 测试gpio_第3张图片

  • src/tools/gpiotest.c 函数简单说明,#define LEN 45需要修改

#include 
#include 
#include 
#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 使用

【技术分享】RK356X Android 使用 libgpiod 测试gpio_第4张图片

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

你可能感兴趣的:(android,嵌入式硬件)