android 查看gpio状态_GPIO子系统重要概念
來源:百問網(wǎng)
作者:韋東山
本文字?jǐn)?shù):3161,閱讀時(shí)長:5分鐘
1.1 引入
- 要操作GPIO引腳,先把所用引腳配置為GPIO功能,這通過Pinctrl子系統(tǒng)來實(shí)現(xiàn)。
- 然后就可以根據(jù)設(shè)置引腳方向(輸入還是輸出)、讀值──獲得電平狀態(tài),寫值──輸出高低電平。
- 以前我們通過寄存器來操作GPIO引腳,即使LED驅(qū)動(dòng)程序,對(duì)于不同的板子它的代碼也完全不同。
- 當(dāng)BSP工程師實(shí)現(xiàn)了GPIO子系統(tǒng)后,我們就可以:
a. 在設(shè)備樹里指定GPIO引腳
b. 在驅(qū)動(dòng)代碼中:
使用GPIO子系統(tǒng)的標(biāo)準(zhǔn)函數(shù)獲得GPIO、設(shè)置GPIO方向、讀取/設(shè)置GPIO值。
這樣的驅(qū)動(dòng)代碼,將是單板無關(guān)的。
1.2 在設(shè)備樹中指定引腳
在幾乎所有ARM芯片中,GPIO都分為幾組,每組中有若干個(gè)引腳。所以在使用GPIO子系統(tǒng)之前,就要先確定:它是哪組的?組里的哪一個(gè)?
在設(shè)備樹中,“GPIO組”就是一個(gè)GPIO Controller,這通常都由芯片廠家設(shè)置好。我們要做的是找到它名字,比如“gpio1”,然后指定要用它里面的哪個(gè)引腳,比如。
有代碼更直觀,下圖是一些芯片的GPIO控制器節(jié)點(diǎn),它們一般都是廠家定義好,在xxx.dtsi文件中:
我們暫時(shí)只需要關(guān)心里面的這2個(gè)屬性:
gpio-controller;#gpio-cells = <2>;“gpio-controller”表示這個(gè)節(jié)點(diǎn)是一個(gè)GPIO Controller,它下面有很多引腳。
“#gpio-cells = <2>”表示這個(gè)控制器下每一個(gè)引腳要用2個(gè)32位的數(shù)(cell)來描述。
為什么要用2個(gè)數(shù)?其實(shí)使用多個(gè)cell來描述一個(gè)引腳,這是GPIO Controller自己決定的。比如可以用其中一個(gè)cell來表示那是哪一個(gè)引腳,用另一個(gè)cell來表示它是高電平有效還是低電平有效,甚至還可以用更多的cell來示其他特性。
普遍的用法是,用第1個(gè)cell來表示哪一個(gè)引腳,用第2個(gè)cell來表示有效電平:
GPIO_ACTIVE_HIGH : 高電平有效GPIO_ACTIVE_LOW : 低電平有效定義GPIO Controller是芯片廠家的事,我們?cè)趺匆媚硞€(gè)引腳呢?在自己的設(shè)備節(jié)點(diǎn)中使用屬性"[-]gpios",示例如下:
上圖中,可以使用gpios屬性,也可以使用name-gpios屬性。
1.3 在驅(qū)動(dòng)代碼中調(diào)用GPIO子系統(tǒng)
在設(shè)備樹中指定了GPIO引腳,在驅(qū)動(dòng)代碼中如何使用?
也就是GPIO子系統(tǒng)的接口函數(shù)是什么?
GPIO子系統(tǒng)有兩套接口:基于描述符的(descriptor-based)、老的(legacy)。前者的函數(shù)都有前綴“gpiod_”,它使用gpio_desc結(jié)構(gòu)體來表示一個(gè)引腳;后者的函數(shù)都有前綴“gpio_”,它使用一個(gè)整數(shù)來表示一個(gè)引腳。
要操作一個(gè)引腳,首先要get引腳,然后設(shè)置方向,讀值、寫值。
驅(qū)動(dòng)程序中要包含頭文件,#include // descriptor-based或#include // legacy
下表列出常用的函數(shù):
有前綴“devm_”的含義是“設(shè)備資源管理”(Managed Device Resource),這是一種自動(dòng)釋放資源的機(jī)制。它的思想是“資源是屬于設(shè)備的,設(shè)備不存在時(shí)資源就可以自動(dòng)釋放”。
比如在Linux開發(fā)過程中,先申請(qǐng)了GPIO,再申請(qǐng)內(nèi)存;如果內(nèi)存申請(qǐng)失敗,那么在返回之前就需要先釋放GPIO資源。
如果使用devm的相關(guān)函數(shù),在內(nèi)存申請(qǐng)失敗時(shí)可以直接返回:設(shè)備的銷毀函數(shù)會(huì)自動(dòng)地釋放已經(jīng)申請(qǐng)了的GPIO資源。
建議使用“devm_”版本的相關(guān)函數(shù)。
舉例,假設(shè)備在設(shè)備樹中有如下節(jié)點(diǎn):
foo_device {compatible = "acme,foo";...led-gpios = , /* red */ , /* green */ ; /* blue */power-gpios = ;};那么可以使用下面的函數(shù)獲得引腳:
struct gpio_desc *red, *green, *blue, *power;red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);要注意的是,gpiod_set_value設(shè)置的值是“邏輯值”,不一定等于物理值。
什么意思?
舊的“gpio_”函數(shù)沒辦法根據(jù)設(shè)備樹信息獲得引腳,它需要先知道引腳號(hào)。
引腳號(hào)怎么確定?
在GPIO子系統(tǒng)中,每注冊(cè)一個(gè)GPIO Controller時(shí)會(huì)確定它的“base number”,那么這個(gè)控制器里的第n號(hào)引腳的號(hào)碼就是:base number + n。
但是如果硬件有變化、設(shè)備樹有變化,這個(gè)base number并不能保證是固定的,應(yīng)該查看sysfs來確定base number。
1.4 sysfs中的訪問方法
在sysfs中訪問GPIO,實(shí)際上用的就是引腳號(hào),老的方法。
a. 先確定某個(gè)GPIO Controller的基準(zhǔn)引腳號(hào)(base number),再計(jì)算出某個(gè)引腳的號(hào)碼。方法如下:
② 然后進(jìn)入某個(gè)gpiochip目錄,查看文件label的內(nèi)容
③ 根據(jù)label的內(nèi)容對(duì)比設(shè)備樹
label內(nèi)容來自設(shè)備樹,比如它的寄存器基地址。用來跟設(shè)備樹(dtsi文件)比較,就可以知道這對(duì)應(yīng)哪一個(gè)GPIO Controller。
下圖是在100asK_imx6ull上運(yùn)行的結(jié)果,通過對(duì)比設(shè)備樹可知gpiochip96對(duì)應(yīng)gpio4:
所以gpio4這組引腳的基準(zhǔn)引腳號(hào)就是96,這也可以“cat base”來再次確認(rèn)。① 先在開發(fā)板的/sys/class/gpio目錄下,找到各個(gè)gpiochipXXX目錄:
② 然后進(jìn)入某個(gè)gpiochip目錄,查看文件label的內(nèi)容
③ 根據(jù)label的內(nèi)容對(duì)比設(shè)備樹
label內(nèi)容來自設(shè)備樹,比如它的寄存器基地址。用來跟設(shè)備樹(dtsi文件)比較,就可以知道這對(duì)應(yīng)哪一個(gè)GPIO Controller。
下圖是在100asK_imx6ull上運(yùn)行的結(jié)果,通過對(duì)比設(shè)備樹可知gpiochip96對(duì)應(yīng)gpio4:
所以gpio4這組引腳的基準(zhǔn)引腳號(hào)就是96,這也可以“cat base”來再次確認(rèn)。
b. 基于sysfs操作引腳:
以100ask_imx6ull為例,它有一個(gè)按鍵,原理圖如下:
那么GPIO4_14的號(hào)碼是96+14=110,可以如下操作讀取按鍵值:
echo 110 > /sys/class/gpio/exportecho in > /sys/class/gpio/gpio110/directioncat /sys/class/gpio/gpio110/valueecho 110 > /sys/class/gpio/unexport注意:如果驅(qū)動(dòng)程序已經(jīng)使用了該引腳,那么將會(huì)export失敗,會(huì)提示下面的錯(cuò)誤:
對(duì)于輸出引腳,假設(shè)引腳號(hào)為N,可以用下面的方法設(shè)置它的值為1:
echo N > /sys/class/gpio/exportecho out > /sys/class/gpio/gpioN/directionecho 1 > /sys/class/gpio/gpioN/valueecho N > /sys/class/gpio/unexport可以點(diǎn)擊“了解更多”與韋東山老師交流
總結(jié)
以上是生活随笔為你收集整理的android 查看gpio状态_GPIO子系统重要概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ptp精准时间协议_PTP协议时间同步精
- 下一篇: linux手动生成dump文件权限不足_