1. GPIO簡介
1.1 硬件接線原理圖
注意:雖然GPIO可以熱插拔,但在沒給底板加裝外殼保護的情況下,很容易觸碰到底板上的器件,甚至板卡附近有金屬零件很容易造成板卡短路。因此也建議在插拔外設時,最好確保電源已經完全切斷。
GPIO的輸入/輸出電壓為3.3V,注意電平匹配,否則會損壞芯片引腳或接入設備。
1.2 GPIO硬件資源分布介紹
gpiod庫:需要使用上表的【Chip對象名】和【Line偏移量】。
sysfs訪問方式:需要使用上表的【GPIO系統(tǒng)節(jié)點路徑】。
1.3 gpiod 簡介
在Linux 4.8開始,加入了libgpiod的支持,而原有基于sysfs的訪問方式,將被逐步放棄。因此本文對應的demo主要采用了gpiod方式控制GPIO。gpiod庫通過操作chip對象以及l(fā)ine對象,來達到控制GPIO引腳輸出電平,或者讀取GPIO引腳電平的目的。
Chip對象名:在調用gpiod_chip_open_by_name獲取chip對象時,作為傳入?yún)?shù)使用。
Line偏移量:在調用gpiod_chip_get_line獲取line對象時,作為傳入?yún)?shù)使用。
以GPIO1_C4為例,【引腳名稱】【Chip對象名】【Line偏移量】三者之間的關系如下方公式所示。
1.4 sysfs訪問方式簡介
sysfs控制gpio的方式主要基于內核提供的gpio控制接口文件。也就是通過讀寫/sys/class/gpio目錄下的文件來控制對應的gpio接口。
pin腳編號:sysfs訪問方式均以pin腳編號作為操作依據(jù)。
GPIO系統(tǒng)節(jié)點路徑:具體的GPIO引腳所對應的節(jié)點路徑。
【引腳名稱】【GPIO系統(tǒng)節(jié)點路徑】兩者之間的關系如下方公式所示。
引腳的導出申請:某一引腳在使用前,需要手動向gpio管理器申請導出該引腳資源。
echo 52 > /sys/class/gpio/export ## gpio_request 申請導出相應的gpio
設置該引腳的工作模式:輸入或者輸出。
echo in > /sys/class/gpio/gpio52/direction ## gpio_direction_output 設置相應gpio為輸入方向 ## 或者 echo out > /sys/class/gpio/gpio52/direction ## gpio_direction_output 設置相應gpio為輸出方向
根據(jù)引腳的工作模式,做相應的控制:寫入電平或讀取電平。
cat /sys/class/gpio/gpio52/value ## gpio_get_value 獲取gpio當前狀態(tài)值 ## 或者 echo 0 > /sys/class/gpio/gpio52/value ## gpio_set_value 設置輸出低電平 echo 1 > /sys/class/gpio/gpio52/value ## gpio_set_value 設置輸出高電平
引腳的釋放申請:引腳使用完畢后,需要手動向gpio管理器申請釋放該引腳資源。
echo 52 > /sys/class/gpio/unexport ## gpio_free 釋放申請的gpio
2. 快速上手
2.1 例程源碼下載
到【百度網(wǎng)盤】上下載相關的單例程序:
鏈接:https://pan.baidu.com/s/1RXHMGpmGSEfFy0rb1VkXSg?pwd=1234
提取碼: 1234
比如在windows環(huán)境中,就把單例程序下載到:此電腦D:BaiduNetdisk (無規(guī)定,用戶可自主選擇),如下圖所示。
然后把例程【復制粘貼】到nfs掛載目錄中。(不清楚目錄如何構建的,可以參考《入門指南/開發(fā)環(huán)境準備/nfs服務搭建與掛載》)
2.2 例程編譯&運行
通過adb shell進入開發(fā)板環(huán)境(不清楚如何通過adb進行調試,可以參考《入門指南/開發(fā)板調試方式介紹/adb調試》),執(zhí)行下方命令定位到demo目錄,并且執(zhí)行編譯操作。
cd /home/orin-nano/Desktop/nfs/09_GPIO/ ./build.sh

編譯成功后,相關的demo會生成在Release目錄下。
執(zhí)行下方命令以運行demo,如下所示。
sudo ./Release/test-gpio
執(zhí)行效果如下所示。
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 = "GPIO0_A0", .direction = DIR_OUTPUT, .val = 0, }, { .pinName = "GPIO0_A5", .direction = DIR_INPUT, .val = 0, }, { .pinName = "GPIO1_C4", .direction = DIR_OUTPUT, .val = 0, }, { .pinName = "GPIO1_C5", .direction = DIR_INPUT, .val = 0, } }; int main(int argc, char **argv) { gpio_init(gpioCfg_tab, ARRAY_SIZE(gpioCfg_tab)); pin_out_val("GPIO0_A0", 0); pin_out_val("GPIO1_C4", 0); int val = read_pin_val("GPIO0_A5"); printf("GPIO0_A5 val : %dn", val); val = read_pin_val("GPIO1_C5"); printf("GPIO1_C5 val : %dn", val); return 0; }
其中gpio_init(),pin_out_val(),read_pin_val()是基于libgpiod的易用化封裝。具體實現(xiàn)于09_GPIO/commonApi/gpio.c
若用戶需要如demo一樣地引用libgpiod,需要注意以下兩點。
* 需要包含頭文件:#include 。
* 編譯時,需要加上-lgpiod作為編譯參數(shù)。
審核編輯 黃宇
-
開發(fā)板
+關注
關注
25文章
5415瀏覽量
101095 -
GPIO
+關注
關注
16文章
1243瀏覽量
53349 -
rk3576
+關注
關注
1文章
117瀏覽量
494
發(fā)布評論請先 登錄
米爾RK3576開發(fā)板特惠活動!

基于RK3576開發(fā)板的MIPI-DSI使用

評論