《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 其他 > 一文搞懂 | Linux pinctrl/gpio子系統(tǒng)

一文搞懂 | Linux pinctrl/gpio子系統(tǒng)

2022-11-18
作者:布道師Peter
來源:電子技術應用專欄作家 一口Linux
關鍵詞: Linux pinctrl GPIO

  pinctrl 子系統(tǒng)和 gpio 子系統(tǒng)雖然難度不大,但在內(nèi)核里的使用率非常高,本文爭取一次性把相關內(nèi)容介紹一遍。

  pinctrl

  數(shù)據(jù)結構

  使用 struct pinctrl_desc 抽象一個 pin controller,該結構的定義如下:

  微信截圖_20221118161827.png

  pins

  變量 pins 和 npins 把系統(tǒng)中所有的 pin 描述出來,并建立索引。驅動為了和具體的 pin 對應上,再將這些描述的這些 pin 組織成一個 struct pinctrl_pin_desc 類型的數(shù)組,該類型的定義為:

 微信截圖_20221118161933.png

  SoC中,有時需要將很多 pin 組合在一起,以實現(xiàn)特定的功能,例如 uart 接口、i2c 接口等。因此 pin controller 需要以 group 為單位,訪問、控制多個 pin,這就是 pin groups。

  微信截圖_20221118161951.png

  pinctrl core在struct pinctrl_ops中抽象出三個回調(diào)函數(shù),用來獲取pin groups相關信息,如下:

 微信截圖_20221118162006.png

  group 的組織方式是由驅動決定的。

  pin configuration

  除了上面的 pin 和 pin group,有些管腳可以配置,比如上拉,下拉,高阻等。pin configuration 來封裝這些功能,具體體現(xiàn)在 struct pinconf_ops 數(shù)據(jù)結構中,如下:

 微信截圖_20221118162048.png

  pin mux

  為了兼容不同的應用場景,有很多管腳可以配置為不同的功能,例如A和B兩個管腳,既可以當作普通的GPIO使用,又可以配置為I2C的的SCL和SDA,也可以配置為UART的TX和RX,這稱作管腳的復用(簡稱 pin mux)。使用 struct pinmux_ops 來抽象 pin mux 有關的操作,如下:

  微信截圖_20221118162116.png

  pin state

  根據(jù)前面的描述,pinctrl driver 抽象出來了一些離散的對象:pin(pin group)、function、configuration,并實現(xiàn)了這些對象的控制和配置方式。然后我們回到某一個具體的 device 上(如 lpuart,usdhc)。一個設備在某一狀態(tài)下(如工作狀態(tài)、休眠狀態(tài)、等等),所使用的pin(pin group)、pin(pin group)的 function 和 configuration,是唯一確定的。所以固定的組合可以確定固定的狀態(tài),在設備樹里用 pinctrl-names 指明狀態(tài)名字,pinctrl-x 指明狀態(tài)引腳。

  pin map

  pin state 有關的信息是通過 pin map 收集,相關的數(shù)據(jù)結構如下:

  微信截圖_20221118162153.png      微信截圖_20221118162209.png

  pinctrl driver 確定了 pin map 各個字段的格式之后,就可以在 dts 文件中維護 pin state 以及相應的 mapping table。pinctrl core 在初始化的時候,會讀取并解析 dts,并生成 pin map。

  而各個 consumer,可以在自己的 dts node 中,直接引用 pinctrl driver 定義的 pin state,并在設備驅動的相應的位置,調(diào)用 pinctrl subsystem 提供的 API(pinctrl_lookup_state,pinctrl_select_state),active 或者 deactive 這些 state。

  pin controller 驅動初始化

微信截圖_20221118162246.png

  pin 控制器描述符中包括了三類操作函數(shù):pctlops 是一些全局的控制函數(shù);pmxops 是復用引腳相關的操作函數(shù);confops操作函數(shù)是用來配置引腳的特性。pin 控制器驅動的初始化主要是注冊這三類函數(shù)的回調(diào)。

  struct pinctrl_ops *pctlops

  微信截圖_20221118162336.png

  c微信截圖_20221118162353.png

  微信截圖_20221118162412.png

  pinctrl subsystem 的整體流程

  pinctrl driver 根據(jù) pin controller 的實際情況,定義 struct pinctrl_desc(包括pin/pin group 的抽象,function 的抽象,pinconf、pinmux 的 operation API 實現(xiàn),dt_node_to_map 的實現(xiàn),等等),并注冊到 kernel 中。

  pinctrl driver 在 pin controller的 dts node 中,根據(jù)自己定義的格式,描述每個 device 的所有 pin state。如下所示:

  微信截圖_20221118162453.png

  相應的 consumer driver 可以在自己的 dts node 中,引用 pinctrl driver 所定義的 pin state,如下所示:

  微信截圖_20221118162516.png

  consumer driver 在需要的時候,可以調(diào)用 pinctrl_get/devm_pinctrl_get 接口,獲得一個 pinctrl handle(struct pinctrl類型的指針)。在 pinctrl get 的過程中,解析 consumer device 的 dts node,找到相應的 pin state,進行調(diào)用 pinctrl driver 提供的 dt_node_to_map 接口,解析 pin state 并轉換為 pin map。

  微信截圖_20221118162529.png

  例子

  微信截圖_20221118162701.png

  上圖中,左邊是 pin controller 節(jié)點,右邊是 client device 節(jié)點 。

  pin state

  對于一個“client device”來說,比如對于一個 UART 設備,它有多個“狀態(tài)”:default、sleep 等,那對應的引腳也有這些狀態(tài)。比如當這個設備處于 default 狀態(tài)時,pinctrl 子系統(tǒng)會自動根據(jù)上述信息把所用引腳復用為 uart0 功能。當這這個設備處于 sleep 狀態(tài)時,pinctrl 子系統(tǒng)會自動根據(jù)上述信息把所用引腳配置為高電平。

  groups 和 function

  一個設備會用到一個或多個引腳,這些引腳就可以歸為一組 group。這些引腳可以復用為某個功能 function。當然,一個設備可以用到多組多功能引腳,比如A1、A2兩組引腳,A1組復用為F1功能,A2組復用為F2功能。

  sysfs 訪問方法

  gpio

  微信截圖_20221118162726.png

  數(shù)據(jù)結構

  每個 GPIO 控制器用一個 gpio_device 來表示:

  微信截圖_20221118162819.png

  用 gpio_chip 來定義控制引腳和中斷相關的函數(shù):

 微信截圖_20221118163336.png   微信截圖_20221118163404.png

微信截圖_20221118163423.png

  設備樹

  GPIO一般都分為幾組,每組中有若干個引腳。所以在使用GPIO子系統(tǒng)之前,就要先確定它所在的組以及在組中的哪一個。在設備樹中,“GPIO組” 就是一個 GPIO Controller,這通常都由芯片廠家設置好。我們要做的是找到它的名字,比如“gpio1”,然后指定要用它里面的哪個引腳,比如 <&gpio1 0>。

  微信截圖_20221118163442.png

  “gpio-controller”表示這個節(jié)點是一個GPIO Controller,它下面有很多引腳。

  “#gpio-cells = <2>”表示這個控制器下每一個引腳要用2個32位的數(shù)(cell)來描述。用第1個cell來表示哪一個引腳,用第2個cell來表示有效電平:GPIO_ACTIVE_HIGH(高電平有效),GPIO_ACTIVE_LOW(低電平有效)。

  怎么引用某個引腳呢?在自己的設備節(jié)點中使用屬性"[name]-gpios",示例如下:

  微信截圖_20221118163502.png

  gpio controller 驅動

  gpio client 驅動

  GPIO 子系統(tǒng)有兩套接口:基于描述符的(descriptor-based)、老的(legacy)。前者的函數(shù)都有前綴 “gpiod_”,它使用 gpio_desc 結構體來表示一個引腳;后者的函數(shù)都有前綴 “gpio_”,它使用一個整數(shù)來表示一個引腳。

  要操作一個引腳,首先要 get 引腳,然后設置方向,讀值、寫值。

  微信截圖_20221118163526.png

  建議使用“devm_”版本的相關函數(shù)。有前綴“devm_”的含義是“設備資源管理”(Managed Device Resource),這是一種自動釋放資源的機制。它的思想是“資源是屬于設備的,設備不存在時資源就可以自動釋放”。

  比如在 Linux 開發(fā)過程中,先申請了GPIO,再申請內(nèi)存;如果內(nèi)存申請失敗,那么在返回之前就需要先釋放GPIO資源。如果使用devm的相關函數(shù),在內(nèi)存申請失敗時可以直接返回:設備的銷毀函數(shù)會自動地釋放已經(jīng)申請了的GPIO資源。

  以上面的設備 max9286_mipi 為例,它的驅動實現(xiàn)如下:

  微信截圖_20221118163541.png

  sysfs 訪問方法

  先確定某個GPIO Controller的基準引腳號(base number),再計算出某個引腳的號碼。

  微信截圖_20221118163556.png

  然后進入某個gpiochip目錄,查看文件label的內(nèi)容,根據(jù) label 的內(nèi)容對比設備樹,就可以知道這對應哪一個 GPIO Controller。比如用上面的例子,通過對比設備樹可知 gpiochip448 對應 gpio1。

  微信截圖_20221118163615.png

  因為 pin number = base + offset,所以 GPIO1_27 的號碼是 448 + 27 = 475,那么通過 sys 可以做如下操作。

  微信截圖_20221118163632.png

  pinctrl subsystem 和 gpio subsysem 之間的耦合

  微信截圖_20221118163653.png

  pinctrl subsystem 管理系統(tǒng)的所有管腳,GPIO 是這些管腳的用途之一,因此 gpio subsystem 應該是 pinctrl subsystem 的 backend。在使用 GPIO 的時候,都需要向系統(tǒng)的 pinctrl subsystem 申請管腳,并將管腳配置為 GPIO 功能。

  內(nèi)核也提供了通過 pinctrl 控制 gpio 的接口:

  微信截圖_20221118163712.png

  pinctrl subsystem會維護一個gpio number到pin number的map(gpio range),將gpio subsystem傳來的gpio number轉換為pin number之后,調(diào)用struct pinmux_ops中有關的回調(diào)函數(shù)即可:

  微信截圖_20221118163725.png

  gpio ranges

微信截圖_20221118163743.png

  當 gpio driver 需要使用某一個 gpio 的時候,可以在 struct gpio_chip 的 request 函數(shù)中,調(diào)用 pinctrl core 提供的 pinctrl_request_gpio 接口(參數(shù)是gpio編號),然后 pinctrl core 會查尋 gpio ranges 鏈表,將 gpio 編號轉換成 pin 編號,然后調(diào)用 pinctrl 的相應接口(參數(shù)是pin編號),申請該 pin 的使用。

 更多信息可以來這里獲取==>>電子技術應用-AET<<  

微信圖片_20210517164139.jpg


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權者。如涉及作品內(nèi)容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品区一区二区三| 精品盗摄一区二区三区| 久久久综合激的五月天| 亚洲影院在线| 正在播放欧美视频| 日韩网站在线| 亚洲三级影片| 日韩一级黄色片| 亚洲人成网站影音先锋播放| 亚洲电影激情视频网站| 久久精品午夜| 亚洲大胆av| 久久精品亚洲精品| 亚洲国产婷婷综合在线精品| 亚洲国产免费| 亚洲精品视频二区| 亚洲经典视频在线观看| 亚洲激情一区二区| 亚洲精选大片| 日韩性生活视频| 日韩性生活视频| 亚洲无人区一区| 亚洲男女自偷自拍| 午夜久久久久| 久久精品久久99精品久久| 久久精品一二三| 每日更新成人在线视频| 欧美成人一区二区在线| 欧美日本一道本| 国产精品扒开腿做爽爽爽视频| 欧美先锋影音| 国产欧美日韩中文字幕在线| 国内视频一区| 亚洲国产天堂网精品网站| 亚洲人成在线影院| 一本色道久久综合精品竹菊| 亚洲综合日韩| 久久9热精品视频| 亚洲黄网站在线观看| 日韩一级大片在线| 亚洲一二三级电影| 性色av一区二区三区| 久久精品国产一区二区三区免费看| 久久理论片午夜琪琪电影网| 另类图片综合电影| 欧美人与性禽动交情品| 国产精品免费观看在线| 国产一区日韩一区| 最新国产成人av网站网址麻豆| 一本一本久久| 欧美在线亚洲在线| 亚洲精品日韩精品| 亚洲女人av| 久久综合五月天婷婷伊人| 欧美日韩精品免费观看视一区二区 | 欧美一区二区三区四区夜夜大片| 91久久久亚洲精品| 亚洲欧美日韩综合一区| 美乳少妇欧美精品| 国产精品国产三级国产专播精品人| 国产日产亚洲精品系列| 亚洲国产专区校园欧美| 亚洲欧美一区二区三区在线| 亚洲欧洲一区二区三区在线观看| 亚洲免费在线观看视频| 免费成人在线视频网站| 国产精品麻豆欧美日韩ww| 尤妮丝一区二区裸体视频| 中文国产成人精品| 亚洲精品久久久久中文字幕欢迎你 | 亚洲国产精品综合| 亚洲欧美日本另类| 欧美激情偷拍| 国产亚洲精品aa| av成人手机在线| 亚洲激情在线播放| 欧美资源在线观看| 欧美视频精品在线| 亚洲国产成人久久| 欧美一级播放| 亚洲一级免费视频| 嫩草影视亚洲| 国产在线欧美日韩| 亚洲午夜视频在线| 一区二区不卡在线视频 午夜欧美不卡'| 久久精品国产77777蜜臀| 欧美三级特黄| 亚洲欧洲精品成人久久奇米网| 欧美在线亚洲在线| 欧美在线观看视频在线| 欧美性色视频在线| 亚洲欧洲另类| 亚洲国产专区校园欧美| 久久精品一区四区| 国产精品一区二区久久久久| 亚洲精品中文在线| 亚洲精品一区二区三| 久久婷婷亚洲| 国产亚洲欧美一区| 午夜视频在线观看一区| 午夜精品国产更新| 国产精品久线观看视频| 99精品国产99久久久久久福利| 亚洲精选久久| 欧美大片免费观看| 在线观看亚洲a| 亚洲电影免费观看高清完整版在线观看 | 久久综合色一综合色88| 国产亚洲观看| 性视频1819p久久| 午夜精品久久久久久久99樱桃| 欧美日韩中文在线| 日韩午夜精品| 亚洲天堂黄色| 欧美日韩一区二区三区免费看 | 国产精品久久久久久久久久久久久 | 久久久www免费人成黑人精品 | 国产一区二区三区久久悠悠色av | 欧美一区二区三区四区在线| 欧美一级日韩一级| 国产精品免费观看视频| 亚洲一区二区三区精品动漫| 亚洲一品av免费观看| 欧美日韩亚洲一区二区三区在线观看 | 99精品热6080yy久久 | 国产精品黄视频| 一区二区欧美视频| 亚洲一区二区三区涩| 国产精品成人v| 亚洲一区二区三区色| 欧美一区二区高清| 国产欧美高清| 久久精品国产欧美亚洲人人爽| 老牛影视一区二区三区| 永久91嫩草亚洲精品人人| 最新国产の精品合集bt伙计| 欧美国产在线电影| 亚洲精品永久免费| 亚洲一区bb| 国产欧美 在线欧美| 欧美在现视频| 欧美成人免费播放| 亚洲日本va午夜在线影院| 一区二区三区欧美激情| 国产精品高潮呻吟视频| 欧美在线视频免费| 欧美91大片| 99精品久久久| 欧美在线观看视频一区二区| 国产自产v一区二区三区c| 亚洲日本va午夜在线影院| 欧美日韩午夜剧场| 午夜精品区一区二区三| 麻豆精品国产91久久久久久| 亚洲精品中文字幕女同| 欧美亚洲免费在线| 在线观看欧美日韩| 亚洲一级在线| 国产综合视频| 一本色道久久88精品综合| 国产精品一区二区三区成人| 亚洲第一区色| 欧美日韩国产精品成人| 亚洲欧美精品在线| 欧美1区免费| 亚洲影院在线观看| 免费的成人av| 制服诱惑一区二区| 久久亚洲私人国产精品va| 亚洲开发第一视频在线播放| 欧美一区二区视频在线观看2020| 在线欧美小视频| 亚洲女性裸体视频| 亚洲成人在线网| 亚洲综合精品| 亚洲高清自拍| 性欧美1819sex性高清| 在线免费日韩片| 篠田优中文在线播放第一区| 亚洲黄色片网站| 久久aⅴ乱码一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 欧美在线观看网站| 亚洲精品少妇30p| 久久久www成人免费精品| 99精品国产热久久91蜜凸| 久久这里有精品视频| 一区二区欧美在线观看| 久久综合九色综合欧美狠狠| 在线亚洲精品| 欧美电影免费观看高清| 亚洲专区在线| 欧美日韩国产三级| 久久国产精品一区二区三区四区| 欧美日韩一区二区三区在线看| 亚洲电影在线播放| 国产日韩成人精品| 亚洲一区www| 亚洲片区在线| 鲁大师成人一区二区三区|