1.GPIO簡介
1.1 硬件接線原理圖

注意:雖然GPIO可以熱插拔,但在沒給底板加裝外殼保護的情況下,很容易觸碰到底板上的器件,甚至板卡附近有金屬零件很容易造成板卡短路。因此也建議在插拔外設時,最好確保電源已經完全切斷。
GPIO的輸入/輸出電壓為3.3V,注意電平匹配,否則會損壞芯片引腳或接入設備。
1.2 GPIO硬件資源分布介紹

gpiod庫:需要使用上表的【Chip對象名】和【Line偏移量】。
sysfs訪問方式:需要使用上表的【GPIO系統節點路徑】。
1.3 gpiod 簡介
在Linux 4.8開始,加入了libgpiod的支持,而原有基于sysfs的訪問方式,將被逐步放棄。因此本文對應的demo主要采用了gpiod方式控制GPIO。gpiod庫通過操作chip對象以及line對象,來達到控制GPIO引腳輸出電平,或者讀取GPIO引腳電平的目的。
Chip對象名:在調用gpiod_chip_open_by_name獲取chip對象時,作為傳入參數使用。
Line偏移量:在調用gpiod_chip_get_line獲取line對象時,作為傳入參數使用。
以GPIO5_C0為例,【引腳名稱】【Chip對象名】【Line偏移量】三者之間的關系如下方公式所示。

1.4 sysfs訪問方式簡介
sysfs控制gpio的方式主要基于內核提供的gpio控制接口文件。也就是通過讀寫/sys/class/gpio目錄下的文件來控制對應的gpio接口。
pin腳編號:sysfs訪問方式均以pin腳編號作為操作依據。
GPIO系統節點路徑:具體的GPIO引腳所對應的節點路徑。
【引腳名稱】【GPIO系統節點路徑】兩者之間的關系如下方公式所示。

引腳的導出申請:某一引腳在使用前,需要手動向gpio管理器申請導出該引腳資源。
echo 176 > /sys/class/gpio/export ## gpio_request 申請導出相應的gpio
設置該引腳的工作模式:輸入或者輸出。
echo in > /sys/class/gpio/gpio176/direction ## gpio_direction_output 設置相應gpio為輸入方向 ## 或者 echo out > /sys/class/gpio/gpio176/direction ## gpio_direction_output 設置相應gpio為輸出方向
根據引腳的工作模式,做相應的控制:寫入電平或讀取電平。
cat /sys/class/gpio/gpio176/value ## gpio_get_value 獲取gpio當前狀態值 ## 或者 echo 0 > /sys/class/gpio/gpio176/value ## gpio_set_value 設置輸出低電平 echo 1 > /sys/class/gpio/gpio176/value ## gpio_set_value 設置輸出高電平
引腳的釋放申請:引腳使用完畢后,需要手動向gpio管理器申請釋放該引腳資源。
echo 176 > /sys/class/gpio/unexport ## gpio_free 釋放申請的gpio
2. 快速上手
2.1 開發環境準備
如果您初次閱讀此文檔,請閱讀《入門指南/開發環境準備/Easy-Eai編譯環境準備與更新》,并按照其相關的操作,進行編譯環境的部署。
在PC端Ubuntu系統中執行run腳本,進入EASY-EAI編譯環境,具體如下所示。
cd ~/develop_environment ./run.sh

2.2 源碼下載以及例程編譯
首先,在虛擬機后臺終端,執行以下命令,創建外設單例源碼管理目錄:
cd /opt mkdir -p EASY-EAI-Nano-TB/demo
首先,到【百度網盤】上下載相關的單例程序:
鏈接:https://pan.baidu.com/s/1Br608Hiff2Xs65PzWO_qWQ?pwd=1234
提取碼:1234
比如把單例程序下載到:此電腦\D:\BaiduNetdisk (無規定,用戶可自主選擇),如下圖所示。

再將下載好的單例復制進入虛擬機的文件系統,過程如下圖所示。



最后,進入到對應的例程目錄執行編譯操作,具體命令如下所示:
cd EASY-EAI-Nano-TB/demo/09_GPIO ./build.sh
注:
* 由于依賴庫部署在板卡上,因此交叉編譯過程中必須保持/mnt掛載。

編譯成功后,相關的demo會生成在Release目錄下,并會自動部署到開發板的/userdata/目錄中。
2.3 例程運行
通過串口調試或ssh調試,進入板卡后臺,定位到例程部署的位置,如下所示:
cd /userdata

執行例程命令,如下所示。
sudo ./test-gpio
執行效果如下所示。

再把【GPIO5_C0】和【GPIO5_C1】用導線短接起來,就能從【GPIO5_C1】引腳讀到從【GPIO5_C0】輸出的【高電平】,如下所示。

3. C語言使用案例
GPIO的C語言使用案例,代碼地址為09_GPIO/test-gpio/main.c,供用戶編碼參考。以下代碼展示了對GPIO操作流程:
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) static const GPIOCfg_t gpioCfg_tab[] = { { .pinName = "GPIO5_C0", .direction = DIR_OUTPUT, .val = 0, }, { .pinName = "GPIO5_C1", .direction = DIR_INPUT, .val = 0, /* }, { .pinName = "GPIO5_C2", .direction = DIR_OUTPUT, .val = 0, }, { .pinName = "GPIO5_C6", .direction = DIR_INPUT, .val = 0, */ } }; int main(int argc, char **argv) { gpio_init(gpioCfg_tab, ARRAY_SIZE(gpioCfg_tab)); pin_out_val("GPIO5_C0", 1); // pin_out_val("GPIO5_C2", 0); int val = read_pin_val("GPIO5_C1"); printf("GPIO5_C1 val : %d\n", val); // val = read_pin_val("GPIO5_C6"); // printf("GPIO5_C6 val : %d\n", val); return 0; }
其中gpio_init(),pin_out_val(),read_pin_val()是基于libgpiod的易用化封裝。具體實現于09_GPIO/commonApi/gpio.c
若用戶需要如demo一樣地引用libgpiod,需要注意以下兩點。
* 需要包含頭文件:#include 。
* 編譯時,需要加上-lgpiod作為編譯參數。
-
Linux
+關注
關注
88文章
11758瀏覽量
219008 -
瑞芯微
+關注
關注
27文章
792瀏覽量
54288 -
EASY-EAI靈眸科技
+關注
關注
4文章
67瀏覽量
3611 -
RV1126B
+關注
關注
0文章
54瀏覽量
178
發布評論請先 登錄
瑞芯微(EASY EAI)RV1126B 音頻輸入
瑞芯微(EASY EAI)RV1126B PWM使用
【EASY EAI Nano-TB(RV1126B)開發板試用】+初識篇
【EASY EAI Nano-TB(RV1126B)開發板試用】命令行功能測試-shell腳本進行IO控制-燈閃
【EASY EAI Nano-TB(RV1126B)開發板試用】命令行功能測試-shell腳本進行IO控制-紅綠燈項目
【EASY EAI Nano-TB(RV1126B)開發板試用】命令行功能測試-shell腳本進行IO控制-紅綠燈按鈕項目
請問各位大佬,如何解決,瑞芯微 RV1126B 使用 mpp 自帶工具 調試時,內核直接報錯崩潰!
【EASY EAI Nano-TB(RV1126B)開發板試用】+1、開箱上電
【EASY EAI Nano-TB(RV1126B)開發板試用】+3、GPIO操作
【EASY EAI Nano-TB(RV1126B)開發板試用】介紹、系統安裝
RV1126系列選型指南:從RV1126到RV1126B,一文看懂升級差異
【免費試用】EASY EAI Nano-TB(RV1126B)開發套件評測
替代升級實錘!實測RV1126B,CPU性能吊打RV1126
瑞芯微(EASY EAI)RV1126B 人體關鍵點識別
瑞芯微(EASY EAI)RV1126B GPIO使用
評論