前言
libgpiod 是用于與 Linux GPIO 字符設備交互的 C 庫和工具庫;此項目包含六種命令行工具(gpiodetect、gpioinfo、gpioset、gpioget、gpiomon),使用這些工具可以在命令行設置和獲取GPIO的狀態(tài)信息;在程序開發(fā)中也可以調(diào)用庫提供的API接口來控制GPIO。本文內(nèi)容可適用于RK3566系列開發(fā)板 Android11 系統(tǒng)上添加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等多種系統(tǒng),提供豐富開源資料。
產(chǎn)品規(guī)格書:Purple Pi OH 產(chǎn)品手冊
Android 移植 libgpiod 庫和測試工具
cdexternal
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 的電平狀態(tài)
#gpioget gpiochip0 6
1
程序中調(diào)用庫的接口使用測試
編寫gpiotest.c 實現(xiàn)多組GPIO之間的輸入輸出對測功能
src/tools/gpiotest.h
src/tools/gpiotest.c 函數(shù)簡單說明,#define LEN 45需要修改
#include
#include
#include
#include"gpiotest.h"
#defineLEN 45 // GPIO 數(shù)組總數(shù),可以用sizeof獲取數(shù)組大小
#defineHIGH 1
intmain()
{
structgpiod_chip*input_chip, *output_chip;
structgpiod_line*input_line, *output_line;
booloutput_value, input_value;
intret,test_res = 0, total = 0;
for(intnum = 0; num < 2; num++ ){
intin_chip = 0;
intin_line = 1;
intout_chip = 2;
intout_line = 3;
// 反轉(zhuǎn)測試,將原來輸出改為輸入
if( 1== num ){
in_chip = 2;
in_line = 3;
out_chip = 0;
out_line = 1;
}
for(inti = 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(intj = 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);
return0;
}
程序編譯
使用mmm 命令指定目錄編譯
$mmm external/libgpiod/
編譯完成后,可執(zhí)行文件產(chǎn)生的路徑為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 shellchmod +x/system/bin/gpiotest
gpiotest 使用
數(shù)組第十項測試失敗,其余通過,通過gpiotest.h可以找到對應的 GPIO
-
主板
+關(guān)注
關(guān)注
53文章
1887瀏覽量
70888 -
開源
+關(guān)注
關(guān)注
3文章
3358瀏覽量
42523 -
RK3566
+關(guān)注
關(guān)注
0文章
146瀏覽量
4850
發(fā)布評論請先 登錄
相關(guān)推薦
評論