前言
libgpiod 是用于與 Linux GPIO 字符設(shè)備交互的 C 庫(kù)和工具庫(kù);此項(xiàng)目包含六種命令行工具(gpiodetect、gpioinfo、gpioset、gpioget、gpiomon),使用這些工具可以在命令行設(shè)置和獲取GPIO的狀態(tài)信息;在程序開(kāi)發(fā)中也可以調(diào)用庫(kù)提供的API接口來(lái)控制GPIO。本文內(nèi)容可適用于RK3566系列開(kāi)發(fā)板 Android11 系統(tǒng)上添加libgpiod庫(kù)和使用API來(lái)測(cè)試GPIO。
Purple Pi OH作為一款兼容樹(shù)莓派的開(kāi)源主板,采用瑞芯微RK3566 (Cortex-A55) 四核64位超強(qiáng)CPU,主頻最高達(dá)1.8 GHz,算力高達(dá)1Tops,支持INT8/INT16,支持TensorFlow/MXNet/PyTorch/Caffe框架,多路視頻輸出和輸入,支持4K、H.265/H.264視頻解碼,接口豐富。????
玩法豐富,支持Android 11、Debian 10、OpenHarmony3.2、Ubuntu、麒麟OS等多種系統(tǒng),提供豐富開(kāi)源資料。
產(chǎn)品規(guī)格書(shū)查看深圳觸覺(jué)智能官網(wǎng)-產(chǎn)品中心
Android 移植 libgpiod 庫(kù)和測(cè)試工具
-
下載源碼到?
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
倉(cāng)庫(kù)鏈接:platform_external_libgpiod
-
添加到?
PRODUCT_PACKAGES
在mk文件中添加編譯 libgpiod及工具
PRODUCT_PACKAGES?+= \
????RockchipPinnerService \
???????gpioset \
???????gpiomon \
???????gpioinfo \
???????gpioget \
???????gpiofind \
???????gpiodetect \
???????libgpiod
源碼
libgpiod-git.7z
命令行工具使用測(cè)試
使用gpioget 獲取 GPIO0_A6 的電平狀態(tài)
#?gpioget gpiochip0 6
1
程序中調(diào)用庫(kù)的接口使用測(cè)試
編寫(xiě)gpiotest.c 實(shí)現(xiàn)多組GPIO之間的輸入輸出對(duì)測(cè)功能
-
src/tools/gpiotest.h
-
src/tools/gpiotest.c
?函數(shù)簡(jiǎn)單說(shuō)明,#define LEN 45
需要修改
#include?<stdio.h>
#include?<unistd.h>
#include?<gpiod.h>
#include?"gpiotest.h"
#define?LEN 45?// GPIO 數(shù)組總數(shù),可以用sizeof獲取數(shù)組大小
#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;
??????// 反轉(zhuǎn)測(cè)試,將原來(lái)輸出改為輸入
????????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);
??????????????
??????????????//測(cè)試?yán)?、拉???????????????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 驗(yàn)證拉高、拉低
??????????????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/
編譯完成后,可執(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?shell?chmod +x?/system/bin/gpiotest
gpiotest 使用
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-742679.html
-
數(shù)組第十項(xiàng)測(cè)試失敗,其余通過(guò),通過(guò)
gpiotest.h
可以找到對(duì)應(yīng)的 GPIO文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-742679.html
到了這里,關(guān)于【技術(shù)分享】RK356X Android 使用 libgpiod 測(cè)試gpio的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!