前言
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等多种系统,提供丰富开源资料。
产品规格书:purple pi oh 产品手册
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
#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 使用
数组第十项测试失败,其余通过,通过gpiotest.h可以找到对应的 gpio
CRX工业协作机器人:超越大负载,实现人机协作新高度
反无人机打击系统的有效范围具体是多少
鹏鼎控股近150家合作伙伴齐聚淮安,参加公司全球合作伙伴大会
华为Mate30系列真机谍照疑似曝光 下巴窄的吓人
3G,4G,5G的频率和频段是多少
RK356X Android 使用 libgpiod 测试gpio
交流同步电网的优势是什么
蓝牙耳机性价比高的品牌,高性价比的蓝牙耳机推荐
基于CPLD的LED点阵显示控制器
伺服电机的基本要求_伺服电机的速度怎么控制
vivo NEX双屏版向我们展示了两种全新的真全面屏解法
TOP系列开关电源集成电路
自动驾驶为什么会识别不出静止物体
能源公司采用McDATA大规模IT整合解决方案
2019年医疗数字健康工具将颠覆传统模式
为什么pin实验前后的RCL差值超出了10%?
基于二维轮廓图形的参数化设计方法(CAXA电子图板软件)
三相电压不平衡产生原因/危害/措施
华为开发者大会2023亮点云集 见证鸿蒙生态发展强劲势头
华为MatePad pro平板的拆解及组件发布详解