Linux內(nèi)核gpio

本文基于RockPI 4A單板Linux 4.4內(nèi)核介紹RK3399 Linux GPIO功能坡疼。

一概作、GPIO介紹

GPIO(General Purpose Input/Output Port):通用輸入輸出端口渊啰。

除作為一般的輸入/輸出功能外憾朴,還可以配置為中斷和模擬PWM倒槐、I2C等接口功能惕艳。

RK3399 GPIO屬性如下:

1锈至、一共有5組GPIO(GPIO0~4)晨缴,每組GPIO為一個(gè)Bank,共32個(gè)引腳峡捡。每個(gè)Bank包括4個(gè)Group (GPIOA(0~7) ~ D(0~7))击碗。不是所有Bank都有GPIOA~D的編號,RK3399共122個(gè)GPIO引腳们拙。

2稍途、所有GPIO都可被配置為CA55或CA53的中斷功能,且GPIO0GPIO1可用于系統(tǒng)低功耗喚醒模式砚婆。

3械拍、在上電復(fù)位后,所有GPIO默認(rèn)輸入狀態(tài)装盯。

4坷虑、軟件可配置GPIO驅(qū)動(dòng)強(qiáng)度。

RK3399引腳在系統(tǒng)中顯示如下:

root@linaro-alip:/sys/kernel/debug/pinctrl/pinctrl# cat pins
registered pins: 160
## GPIO 0_*包括的GPIO
pin 0 (gpio0-0)
pin 1 (gpio0-1)
pin 2 (gpio0-2)
pin 3 (gpio0-3)
pin 4 (gpio0-4)
pin 5 (gpio0-5)
pin 6 (gpio0-6)
pin 7 (gpio0-7)
pin 8 (gpio0-8)
pin 9 (gpio0-9)
pin 10 (gpio0-10)
...
pin 31 (gpio0-31)
...
## GPIO 2_*包括的GPIO
pin 64 (gpio2-0)
pin 65 (gpio2-1)
pin 66 (gpio2-2)
pin 67 (gpio2-3)
pin 68 (gpio2-4)
pin 69 (gpio2-5)
pin 70 (gpio2-6)
pin 71 (gpio2-7)  ## GPIO2_A7
pin 72 (gpio2-8)
pin 73 (gpio2-9)
pin 74 (gpio2-10)
...
pin 95 (gpio2-31)
...
## GPIO 4_*包括的GPIO
pin 128 (gpio4-0)
...
pin 159 (gpio4-31)

RK3399 GPIO引腳號計(jì)算方式:

pins = 32*bank + 8*group + x
bank: 0 ~ 4埂奈,對應(yīng)GPIO 0~4
group: 0 ~ 3迄损,對應(yīng)GPIO A~D

例:

GPIO2_A7 = 32*2 + 8*0 + 7 = 71

二、GPIO配置

ROCKPI 4A單板WIFI 模塊電源(GPIO0_B2)為例账磺,介紹DTSGPIO配置芹敌。

image.png

配置文件:arch/arm64/boot/dts/rockchip/rockpi-4-linux.dtsi,內(nèi)容如下:

    sdio_pwrseq: sdio-pwrseq {
        compatible = "mmc-pwrseq-simple";
        clocks = <&rk808 1>;
        clock-names = "ext_clock";
        ## 1垮抗、配置GPIO0_B2_d的pinmux功能
        pinctrl-names = "default";
        pinctrl-0 = <&wifi_enable_h>;

        /*
         * On the module itself this is one of these (depending
         * on the actual card populated):
         * - SDIO_RESET_L_WL_REG_ON
         * - PDN (power down when low)
         */
        ## 2党窜、配置GPIO0_B2_d默認(rèn)輸出低電平
        reset-gpios = <&gpio0 10 GPIO_ACTIVE_LOW>; 
    };
    ## 3、配置GPIO0_B2_d(WIFI_REG_ON_H)為GPIO功能
    sdio-pwrseq {
        wifi_enable_h: wifi-enable-h {
            rockchip,pins =
                <0 10 RK_FUNC_GPIO &pcfg_pull_none>;
        };
    };

在系統(tǒng)啟動(dòng)后借宵,可以查看GPIO幌衣,命令如下:

root@linaro-alip:/sys/kernel/debug# cat gpio
GPIOs 0-31, platform/pinctrl, gpio0:
 gpio-4   (                    |bt_default_wake_host) out hi
 gpio-9   (                    |bt_default_reset    ) out hi
 gpio-10  (                    |reset               ) out lo    ## 該引腳就是GPIO0_B2_d

GPIOs 32-63, platform/pinctrl, gpio1:
 gpio-35  (                    |vcc5v0_otg          ) out hi
 gpio-46  (                    |vsel                ) out lo
 gpio-49  (                    |vsel                ) out lo

GPIOs 64-95, platform/pinctrl, gpio2:
 gpio-83  (                    |bt_default_rts      ) out lo
 gpio-90  (                    |vcc3v3_pcie         ) out hi
 gpio-91  (                    |bt_default_wake     ) out hi

GPIOs 96-127, platform/pinctrl, gpio3:
 gpio-111 (                    |mdio-reset          ) out hi
 gpio-124 (                    |?                   ) out lo
 gpio-125 (                    |?                   ) out lo

GPIOs 128-159, platform/pinctrl, gpio4:
 gpio-153 (                    |vcc5v0_host         ) out hi

注:

如果debugfs沒有掛載,使用下面命令掛載

mount -t debugfs none /sys/kernel/debug

三壤玫、GPIO驅(qū)動(dòng)

Linux內(nèi)核GPIO主要實(shí)現(xiàn)文件:

drivers/gpio/gpiolib.c         ## 新版API豁护,基于描述符(descriptor-based)
drivers/gpio/gpiolib-legacy.c  ## 舊API
include/linux/gpio.h

GPIO子系統(tǒng)有兩套API

1、基于描述符(descriptor-based)

前綴為:gpiod_欲间。

參考:Documentation/gpio/consumer.txt

2楚里、老版本接口(legacy)

前綴為:gpio_

參考:Documentation/gpio/gpio-legacy.txt

3猎贴、常用API

功能 新版本接口 老版本接口
獲取GPIO gpiod_get() gpio_request()
釋放GPIO gpiod_put() gpio_free()
GPIO方向 設(shè)置為輸入:gpiod_direction_input()設(shè)置為輸出:gpiod_direction_output()獲取方向:gpiod_get_direction() 設(shè)置為輸入:gpio_direction_input()設(shè)置為輸出:gpio_direction_output()
GPIO值 獲取輸入值:gpiod_get_value()設(shè)置輸出值:gpiod_set_value() 獲取輸入值:gpio_get_value()設(shè)置輸出值:gpio_set_value()

GPIO還有很多接口班缎,就不一一列舉了蝴光。

RK3399 GPIO控制器驅(qū)動(dòng)實(shí)現(xiàn)文件:drivers/pinctrl/pinctrl-rockchip.c,涉及主要函數(shù):

static const struct gpio_chip rockchip_gpiolib_chip = {
        .request = gpiochip_generic_request,
        .free = gpiochip_generic_free,
        .set = rockchip_gpio_set,
        .get = rockchip_gpio_get,
        .get_direction  = rockchip_gpio_get_direction,
        .direction_input = rockchip_gpio_direction_input,
        .direction_output = rockchip_gpio_direction_output,
        .to_irq = rockchip_gpio_to_irq,
        .owner = THIS_MODULE,
};

所有GPIO子系統(tǒng)的API最終都會(huì)調(diào)到SOCGPIO控制器驅(qū)動(dòng)函數(shù)达址。

四蔑祟、GPIO調(diào)試

ROCKPi 4A單板有個(gè)40個(gè)引腳的擴(kuò)展口,引用radxa圖片沉唠,見下圖疆虚。

image.png

GPIO2_A7為例,介紹GPIO的一般調(diào)試方法满葛。

1径簿、進(jìn)入測試目錄

root@linaro-alip:/sys/class/gpio# ls
export  gpiochip0  gpiochip128  gpiochip32  gpiochip64  gpiochip96  unexport

2、導(dǎo)出GPIO

在使用GPIO2_A7前嘀韧,需要導(dǎo)出該引腳篇亭。方法:配置export后,會(huì)出現(xiàn)gpio71節(jié)點(diǎn)锄贷。

root@linaro-alip:/sys/class/gpio# echo 71 > export
root@linaro-alip:/sys/class/gpio# ls
export  gpiochip0    gpiochip32  gpiochip96
gpio71  gpiochip128  gpiochip64  unexport

測試時(shí)译蒂,注意不要使用在程序中已經(jīng)申請過或配置為其它功能的GPIO引腳。

3肃叶、配置GPIO方向

設(shè)置GPIO2_A7的輸入/輸出方向。

root@linaro-alip:/sys/class/gpio# cd gpio71/
root@linaro-alip:/sys/class/gpio/gpio71# ls
active_low  device  direction  edge  power  subsystem  uevent  value
root@linaro-alip:/sys/class/gpio/gpio71# cat direction
in
root@linaro-alip:/sys/class/gpio/gpio71# echo out > direction
root@linaro-alip:/sys/class/gpio/gpio71# cat direction
out

in:表示輸入十嘿。

out:表示輸出因惭。

active_low:用于中斷配置中高電平或低電平有效。

edge:用于中斷配置中上升沿或下降沿有效绩衷。

4蹦魔、配置GPIO輸出值

GPIO為輸入時(shí),通過value查詢GPIO的輸入電平(高或低電平)咳燕。

GPIO為輸出時(shí)勿决,通過value配置GPIO的輸出電平(高或低電平)。

root@linaro-alip:/sys/class/gpio/gpio71# cat value
0
root@linaro-alip:/sys/class/gpio/gpio71# echo 1 > value
root@linaro-alip:/sys/class/gpio/gpio71# cat value
1
root@linaro-alip:/sys/class/gpio/gpio71# echo 0 > value
root@linaro-alip:/sys/class/gpio/gpio71# cat value
0

5招盲、查看GPIO

查看已經(jīng)導(dǎo)出的GPIO71低缩。

root@linaro-alip:/sys/kernel/debug# cat gpio
GPIOs 0-31, platform/pinctrl, gpio0:
 gpio-4   (                    |bt_default_wake_host) out hi
 gpio-9   (                    |bt_default_reset    ) out hi
 gpio-10  (                    |reset               ) out lo

GPIOs 32-63, platform/pinctrl, gpio1:
 gpio-35  (                    |vcc5v0_otg          ) out hi
 gpio-46  (                    |vsel                ) out lo
 gpio-49  (                    |vsel                ) out lo

GPIOs 64-95, platform/pinctrl, gpio2:
 gpio-71  (                    |sysfs               ) in  hi   ## GPIO71
 gpio-83  (                    |bt_default_rts      ) out lo
 gpio-90  (                    |vcc3v3_pcie         ) out hi
 gpio-91  (                    |bt_default_wake     ) out hi

GPIOs 96-127, platform/pinctrl, gpio3:
 gpio-111 (                    |mdio-reset          ) out hi
 gpio-124 (                    |?                   ) out lo
 gpio-125 (                    |?                   ) out lo

GPIOs 128-159, platform/pinctrl, gpio4:
 gpio-153 (                    |vcc5v0_host         ) out hi

6、取消導(dǎo)出

使用完GPIO2_A7后曹货,需要進(jìn)行釋放咆繁。方法:配置unexport后,gpio71節(jié)點(diǎn)會(huì)消失顶籽。

root@linaro-alip:/sys/class/gpio/gpio71# cd ..
root@linaro-alip:/sys/class/gpio# ls
export  gpiochip0    gpiochip32  gpiochip96
gpio71  gpiochip128  gpiochip64  unexport
root@linaro-alip:/sys/class/gpio# echo 71 > unexport
root@linaro-alip:/sys/class/gpio# ls
export  gpiochip0  gpiochip128  gpiochip32  gpiochip64  gpiochip96  unexport

注:轉(zhuǎn)載請標(biāo)注出處玩般。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市礼饱,隨后出現(xiàn)的幾起案子坏为,更是在濱河造成了極大的恐慌究驴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匀伏,死亡現(xiàn)場離奇詭異洒忧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帘撰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門跑慕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摧找,你說我怎么就攤上這事核行。” “怎么了蹬耘?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵芝雪,是天一觀的道長。 經(jīng)常有香客問我综苔,道長惩系,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任如筛,我火速辦了婚禮堡牡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杨刨。我一直安慰自己晤柄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布妖胀。 她就那樣靜靜地躺著芥颈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赚抡。 梳的紋絲不亂的頭發(fā)上爬坑,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音涂臣,去河邊找鬼盾计。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赁遗,可吹牛的內(nèi)容都是我干的闯估。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼吼和,長吁一口氣:“原來是場噩夢啊……” “哼涨薪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炫乓,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤刚夺,失蹤者是張志新(化名)和其女友劉穎献丑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侠姑,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡创橄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莽红。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妥畏。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖安吁,靈堂內(nèi)的尸體忽然破棺而出醉蚁,到底是詐尸還是另有隱情,我是刑警寧澤鬼店,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布网棍,位于F島的核電站,受9級特大地震影響妇智,放射性物質(zhì)發(fā)生泄漏滥玷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一巍棱、第九天 我趴在偏房一處隱蔽的房頂上張望惑畴。 院中可真熱鬧,春花似錦航徙、人聲如沸如贷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倒得。三九已至泻红,卻和暖如春夭禽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谊路。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工讹躯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缠劝。 一個(gè)月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓潮梯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惨恭。 傳聞我的和親對象是個(gè)殘疾皇子秉馏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容