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

news2024/11/27 21:19:54

前言

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 库和测试工具

  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

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1168073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python库学习(十二):数据分析Pandas[下篇]

接着上篇《Python库学习(十一):数据分析Pandas[上篇]》,继续学习Pandas 1.数据过滤 在数据处理中&#xff0c;我们经常会对数据进行过滤&#xff0c;为此Pandas中提供mask()和where()两个函数&#xff1b; mask(): 在 满足条件的情况下替换数据&#xff0c;而不满足条件的部分…

BUUCTF 另外一个世界 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;解压得到一个.jpg图片。 密文&#xff1a; 解题思路&#xff1a; 1、这道题我尝试了很多方法&#xff0c;知道看了别人的wp才知道flag在我忽略的地方。将图片在010 Editor中打开&#xff0c;从…

Redis学习系统(持续更新中)

RedisExample 课程介绍 目标是提供一个高效、可靠的学习和实践Redis的环境。我们将通过搭建Redis集群、实现缓存数据的持久化存储、制定缓存数据的淘汰策略以及同步缓存数据等步骤来深入了解和学习Redis的特性和功能。通过这个项目&#xff0c;你可以掌握Redis的核心概念和技…

vue+asp.net Web api前后端分离项目发布部署

一、前后端项目介绍 1.前端项目是使用vue脚手架进行创建的。 脚手架版本&#xff1a;vue/cli 5.0.8 编译器版本&#xff1a;vs code 1.82.2 2.后端是一个asp.net Core Web API 项目 后端框架版本&#xff1a;.NET 6.0 编译器版本&#xff1a;vs 2022 二、发布部署步骤 第…

预处理详解(二)

1.宏和函数对比 宏通常被应用于执行简单的运算。 比如在两个数中找出较大的一个。 #define MAX(a, b) ((a)>(b)?(a):(b)) 那为什么不用函数来完成这个任务&#xff1f; 原因有二&#xff1a; 1. 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所…

C++笔记之实现多态的所有方法

C笔记之实现多态的所有方法 文章目录 C笔记之实现多态的所有方法1.C中多态是是什么&#xff1f;请用简洁准确的话描述2.虚函数实现多态2.1.虚函数&#xff08;Virtual Functions&#xff09;2.2.纯虚函数&#xff08;Pure Virtual Functions&#xff09;2.3.虚析构函数&#xf…

lesson3-C++类和对象(下)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 再谈构造函数 构造函数体赋值 初始化列表 explicit关键字 Static成员 概念 特性 友元 友元函数 友元类 内部类 匿名对象 拷贝对象时的一些编译器优化 再次理解封装 练习题 再谈构造函数 构造函数体赋值…

瑞禧生物分享~普鲁士蓝纳米酶 Prussian Blue PB

名称&#xff1a;普鲁士蓝纳米酶&#xff1a;Fe4[Fe(CN)6]3、KFe[Fe(CN)6] NZs 包装&#xff1a;1mg/ml 应用领域&#xff1a;可作为抗氧化、抗炎新材料&#xff0c;同时具有载药、光热疗、炎症组织成像、构建生物传感器件等领域。 普鲁土蓝(Prusian Blue)&#xff0c;是一种…

gma 2 教程(三)坐标参考系统:3.投影方法

安装 gma&#xff1a;pip install gma 地图投影是利用一定数学法则把地球表面的经、纬线转换到平面上的理论和方法。由于地球是一个赤道略宽两极略扁的不规则的梨形球体&#xff0c;故其表面是一个不可展平的曲面&#xff0c;所以运用任何数学方法进行这种转换都会产生误差和变…

tbh常用的绘图快捷键

1、Altb -> 笔刷 2、Alt/ -> 画笔 3、按住Shift 绘出的线条是直线 4、按住shiftalt 绘出来的线条是水平线或垂直线 5、alte ->橡皮擦 6、alts ->选择工具 7、altq -> 轮廓编辑器 以下操作都是在选中轮廓编辑器下操作的&#xff1a; 按住alt…

高效管理:在文件夹名称左边添加关键字,实现批量重命名

在高效的文件管理中&#xff0c;对文件夹进行合理命名和重命名是十分关键的。有时候&#xff0c;我们可能需要在一批文件夹的名称左边添加特定的关键字&#xff0c;以便更好地组织和管理这些文件夹。为了实现这个目标&#xff0c;我们可以使用云炫文件管理器一些简单的步骤来实…

Java配置47-Spring Eureka 未授权访问漏洞修复

文章目录 1. 背景2. 方法2.1 Eureka Server 添加安全组件2.2 Eureka Server 添加参数2.3 重启 Eureka Server2.4 Eureka Server 升级版本2.5 Eureka Client 配置2.6 Eureka Server 添加代码2.7 其他问题 1. 背景 项目组使用的 Spring Boot 比较老&#xff0c;是 1.5.4.RELEASE…

云栖侧记:3点感悟…

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 2023年10月30日-11月2日&#xff0c;4天时间&#xff0c;我有幸参加了阿里云一年一度最重要的云栖大会&#xff0c;不过今天才写了个侧记文章&#xff0c;因为都拍视频去了&#xff0c;先说说参会感…

推广产品难?媒介盒子分享如何在软文中植入产品信息

产品想要卖得好&#xff0c;商家除了保证产品质量外&#xff0c;还需要善用推广&#xff0c;将产品打出知名度&#xff0c;软文推广就是很不错的方式&#xff0c;但是企业在推广时经常无法做到自然融入产品信息&#xff0c;导致推广没啥效果&#xff0c;今天媒介盒子就来告诉大…

uniapp小程序九宫格抽奖

定义好奖品下标&#xff0c;计时器开始抽奖&#xff0c;请求接口&#xff0c;出现中奖奖品之后&#xff0c;获取中奖商品对应的奖品下标&#xff0c;再次计时器判断当前移动的小标是否为中奖商品的下标&#xff0c;并且是否转到3圈&#xff08;防止转1圈就停止&#xff09;&…

3 数据库系统核心知识点

一、事务 先回顾一下事务的概念&#xff1a; 事务指的是满足 ACID 特性的一组操作&#xff0c;可以通过 Commit 提交一个事务&#xff0c;也可以使用 Rollback 进行回滚ACID 1. 原子性(Atomicity) 1.事务被视为不可分割的最小单元&#xff0c;事务的所有操作要么全部提交成…

【算法】背包问题——01背包

题目 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&#xff0…

算法通关村第六关|青铜|树通过序列构造二叉树

1.二叉树的性质 1.在二叉树的第 i 层上至多有 2^(i-1) 个结点。 2.深度为 k 的二叉树至多有 2^k - 1 个结点。 3.对于任意一棵二叉树&#xff0c;如果叶节点数为 N0 &#xff0c;度数为 2 的结点总数为 N2 &#xff0c;则 N0N21 。 4.具有 n 个结点的完全二叉树的深度为 lo…

uniapp原生插件之安卓华为统一扫码HMS Scan Kit

插件介绍 华为统一扫码服务&#xff08;Scan Kit&#xff09;提供便捷的条形码和二维码扫描、解析、生成能力 插件地址 安卓华为统一扫码HMS Scan Kit - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 详细使用文档 插件申请权限 android.permi…

Uniapp中使用Echarts

在小程序中使用echarts 我直接调用了HbuilderX的百度图表进行使用 LimeUi - 多端uniapp组件库 (qcoon.cn) 通用代码去官网找一下就好了赋值进去第一个柱状图表就可以显示了 地图的使用 <template><view style"height: 750rpx"><l-echart ref"…