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

一文搞懂 | Linux pinctrl/gpio子系統

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

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

  pinctrl

  數據結構

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

  微信截圖_20221118161827.png

  pins

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

 微信截圖_20221118161933.png

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

  微信截圖_20221118161951.png

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

 微信截圖_20221118162006.png

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

  pin configuration

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

 微信截圖_20221118162048.png

  pin mux

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

  微信截圖_20221118162116.png

  pin state

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

  pin map

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

  微信截圖_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,并在設備驅動的相應的位置,調用 pinctrl subsystem 提供的 API(pinctrl_lookup_state,pinctrl_select_state),active 或者 deactive 這些 state。

  pin controller 驅動初始化

微信截圖_20221118162246.png

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

  struct pinctrl_ops *pctlops

  微信截圖_20221118162336.png

  c微信截圖_20221118162353.png

  微信截圖_20221118162412.png

  pinctrl subsystem 的整體流程

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

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

  微信截圖_20221118162453.png

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

  微信截圖_20221118162516.png

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

  微信截圖_20221118162529.png

  例子

  微信截圖_20221118162701.png

  上圖中,左邊是 pin controller 節點,右邊是 client device 節點 。

  pin state

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

  groups 和 function

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

  sysfs 訪問方法

  gpio

  微信截圖_20221118162726.png

  數據結構

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

  微信截圖_20221118162819.png

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

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

微信截圖_20221118163423.png

  設備樹

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

  微信截圖_20221118163442.png

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

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

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

  微信截圖_20221118163502.png

  gpio controller 驅動

  gpio client 驅動

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

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

  微信截圖_20221118163526.png

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

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

  以上面的設備 max9286_mipi 為例,它的驅動實現如下:

  微信截圖_20221118163541.png

  sysfs 訪問方法

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

  微信截圖_20221118163556.png

  然后進入某個gpiochip目錄,查看文件label的內容,根據 label 的內容對比設備樹,就可以知道這對應哪一個 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 管理系統的所有管腳,GPIO 是這些管腳的用途之一,因此 gpio subsystem 應該是 pinctrl subsystem 的 backend。在使用 GPIO 的時候,都需要向系統的 pinctrl subsystem 申請管腳,并將管腳配置為 GPIO 功能。

  內核也提供了通過 pinctrl 控制 gpio 的接口:

  微信截圖_20221118163712.png

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

  微信截圖_20221118163725.png

  gpio ranges

微信截圖_20221118163743.png

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

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

微信圖片_20210517164139.jpg


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美在线亚洲一区| 国产精品激情偷乱一区二区∴| 亚洲东热激情| 欧美成人国产va精品日本一级| 国产精品男gay被猛男狂揉视频| 亚洲一区二区成人在线观看| 亚洲国产日韩欧美在线图片| 欧美一区二区三区四区高清| 亚洲一区二区三区免费视频| 欧美亚洲在线播放| 亚洲一区二区三区精品在线观看| 一区二区动漫| 99re亚洲国产精品| 久久人人爽人人爽爽久久| 麻豆国产精品va在线观看不卡| 国产精品福利影院| 久久女同互慰一区二区三区| 一区二区激情小说| 亚洲六月丁香色婷婷综合久久| 欧美久久一级| 日韩视频二区| 欧美极品欧美精品欧美视频| 女人天堂亚洲aⅴ在线观看| 久久五月婷婷丁香社区| 欧美大片在线影院| 亚洲人成网在线播放| 好吊色欧美一区二区三区视频| 欧美精品尤物在线| 欧美一区二区精美| 国产一区二区精品丝袜| 国产日韩欧美在线播放| 中文精品视频一区二区在线观看| 久久综合久久美利坚合众国| 国产精品igao视频网网址不卡日韩| 国产精品久久久久久久久久免费看| 亚洲一二三区在线观看| 葵司免费一区二区三区四区五区| 欧美日韩性视频在线| 亚洲一区精品在线| 国产区二精品视| 欧美夫妇交换俱乐部在线观看| 久久国产精品久久久久久电车| 老妇喷水一区二区三区| 午夜在线成人av| 快播亚洲色图| 久久在线视频在线| 亚洲精品小视频在线观看| 国产精品99免视看9| 国内成人自拍视频| 国产偷国产偷精品高清尤物| 久久久久这里只有精品| 一区二区三区欧美成人| 最新日韩欧美| 亚洲综合日韩| 欧美国产另类| 亚洲欧美另类久久久精品2019| 一本色道久久综合亚洲精品小说| 欧美精品在线视频观看| 国产精品香蕉在线观看| 日韩一级欧洲| 在线成人免费观看| 国产精品午夜在线观看| 国产日产精品一区二区三区四区的观看方式| 狂野欧美性猛交xxxx巴西| 国产精品高清网站| 亚洲国产精品久久久久秋霞影院| 香蕉免费一区二区三区在线观看| 91久久精品国产91性色| 99香蕉国产精品偷在线观看| 国产精品白丝黑袜喷水久久久| 欧美视频精品在线| 亚洲一区在线免费观看| 亚洲黄页视频免费观看| 久久综合中文色婷婷| 欧美国产专区| 99国产精品国产精品久久| 久久精品国产99精品国产亚洲性色| 一本色道久久综合亚洲精品高清| 欧美日韩专区| 久久精品动漫| 国产精自产拍久久久久久| 免费观看欧美在线视频的网站| 亚洲精品一区二区在线观看| 伊人精品视频| 欧美精品一区二区三区很污很色的| 欧美一区日韩一区| 亚洲麻豆一区| 国产亚洲一区在线| 99综合精品| 久久aⅴ国产紧身牛仔裤| 亚洲国产精品久久久久秋霞蜜臀| 国精品一区二区三区| 亚洲欧美日韩在线播放| 欧美精品激情blacked18| 欧美色视频一区| 亚洲国产精品小视频| 欧美日韩亚洲一区| 亚洲少妇中出一区| 欧美日韩综合在线免费观看| 亚洲欧美国产另类| 欧美日韩大陆在线| 牛人盗摄一区二区三区视频| 噜噜噜噜噜久久久久久91| 99天天综合性| 久久蜜桃av一区精品变态类天堂| 亚洲国产日韩一级| 国产精品日韩欧美一区二区三区| 黄色成人小视频| 国外成人在线视频| 久久久久青草大香线综合精品| 欧美精品色综合| 久久亚洲捆绑美女| 欧美激情中文字幕在线| 久久激情网站| 欧美大片va欧美在线播放| 国产偷久久久精品专区| 国产视频综合在线| 激情亚洲一区二区三区四区| 午夜在线观看免费一区| 国产欧美日韩专区发布| 一本色道久久综合亚洲二区三区| 亚洲伦理久久| 欧美一级久久久| 一区在线视频观看| 国产精品久久久久久久久动漫| 日韩视频国产视频| 久久精品人人做人人爽| 亚洲激情精品| 免费成人av| 蜜臀99久久精品久久久久久软件| 欧美绝品在线观看成人午夜影视| 亚洲欧美日韩视频二区| 亚洲在线网站| 久久只有精品| 亚洲福利在线看| 久久久久国产一区二区| 久久精品99| 久久成人免费电影| 精品999网站| 一本大道久久a久久精二百| 久久久噜噜噜久久狠狠50岁| 亚洲欧美成人综合| 久色成人在线| 欧美日韩精品在线视频| 国产欧美一区二区色老头| 欧美精品一区在线| 国产精品久久久一区麻豆最新章节| 久久视频一区| 午夜精品久久久久久久久| 国产一区二区三区不卡在线观看| 精品成人国产在线观看男人呻吟| 黄色小说综合网站| 国产精品久久二区二区| 欧美在线观看你懂的| 性久久久久久久久久久久| 狠狠色伊人亚洲综合成人| 亚洲激情图片小说视频| 国内精品久久久久久| 国产精品一区久久久久| 国产精品久久久久久久久借妻| 亚洲一二三区视频在线观看| 欧美日韩国产综合久久| 久久久久88色偷偷免费| 老司机凹凸av亚洲导航| 黄色在线一区| 欧美日韩国产欧美日美国产精品| 国产女精品视频网站免费| 欧美国产日韩一区二区在线观看| 黄色免费成人| 欧美日韩亚洲一区二区| 亚洲成人资源网| 亚洲美女91| 麻豆精品精华液| 樱桃视频在线观看一区| 国模精品一区二区三区| 国产精品综合av一区二区国产馆| 免费看av成人| 久久久久久有精品国产| 亚洲国产精品成人va在线观看| 激情视频亚洲| 亚洲一区二区高清| 99视频热这里只有精品免费| 欧美日本中文| 国产日韩精品一区二区| 久久欧美中文字幕| 久久免费午夜影院| 欧美午夜电影在线| 亚洲欧美另类综合偷拍| 一区在线影院| 免费不卡在线视频| 猛男gaygay欧美视频| 亚洲欧洲综合另类| 久久综合影音| 亚洲大片av| 久久久久国产精品一区三寸| 一区二区电影免费观看| 一区二区三区我不卡| 欧美与欧洲交xxxx免费观看| 国产精品女主播| 国模 一区 二区 三区| 久久精品视频在线免费观看| 欧美激情第3页| 国产精品久久久亚洲一区| 国产精品v欧美精品v日韩精品| 欧美日韩国产色综合一二三四| 欧美日韩一区二区三区高清| 亚洲高清一区二区三区| 亚洲视频播放| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲伦理在线免费看| 久久久精品免费视频| 亚洲午夜精品福利| 一区二区三区日韩| 国产精品一区二区三区观看| 国产精品久久久久久久久久久久久久| 欧美精品久久久久久久久老牛影院| 久久精品国产久精国产思思| 欧美极品在线播放| 亚洲美女黄网| 狠狠综合久久av一区二区老牛| 狠狠色伊人亚洲综合成人| 久久久精品一区| 美女精品在线| 亚洲一卡二卡三卡四卡五卡| 欧美日韩午夜精品| 亚洲欧美日本视频在线观看| 激情婷婷亚洲| 国产精品入口66mio| 国产精品专区第二| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩视频第一区| 亚洲精品中文字| 欧美日韩人人澡狠狠躁视频| 妖精成人www高清在线观看| 亚洲国产一区二区三区在线播| 亚洲国产精品成人综合| 性欧美暴力猛交另类hd| 欧美午夜片在线观看| 久久久久成人精品免费播放动漫| 欧美在线免费看| 欧美精品在线免费播放| 久久久999精品免费| 欧美亚洲系列| 麻豆精品一区二区av白丝在线| 午夜精品久久久久久99热| 在线一区亚洲| 免费成人av在线看| 欧美性jizz18性欧美| 久久久国产精品一区二区三区| 欧美天天在线| 国产午夜久久久久| 欧美日韩在线另类| 日韩小视频在线观看| 亚洲电影第1页| 欧美日韩日韩| 亚洲欧美日韩在线不卡| 久久男人资源视频| 欧美国产视频在线| 欧美a一区二区| 美女精品在线观看| 欧美激情亚洲另类| 国产综合激情| 欧美一区在线看| 欧美喷潮久久久xxxxx| 国产精品一二| 亚洲欧美国产一区二区三区| 亚洲在线一区二区三区| 亚洲欧美制服中文字幕| 欧美在线啊v一区| 久久中文字幕导航| 亚洲精品在线视频观看| 夜色激情一区二区| 国产嫩草一区二区三区在线观看| 欧美手机在线| 久久综合国产精品台湾中文娱乐网| 91久久国产精品91久久性色| 另类人畜视频在线| 亚洲一区二区在线观看视频| 午夜精品一区二区三区在线播放| 在线日韩成人| 午夜激情亚洲| 欧美18av| 欧美国产一区在线| 亚洲另类视频| 精品二区久久| 国产在线不卡精品| 国产色产综合色产在线视频| 亚洲自拍偷拍麻豆| 午夜精品久久久久久久蜜桃app| 亚洲新中文字幕| 亚洲人成人77777线观看| 国产精品九色蝌蚪自拍| 亚洲麻豆视频| 亚洲国产成人不卡| 久久aⅴ乱码一区二区三区| 国产精品久久网站| 99国产一区二区三精品乱码| 国产精品久久久久久久久果冻传媒| 91久久久亚洲精品| 欧美视频一区在线| 亚洲自拍啪啪| 精品成人在线| 最新日韩在线| 国产精品成av人在线视午夜片| 欧美视频在线观看免费| 国产精品久久久久久久久免费| 99国产精品久久久久久久久久| 亚洲婷婷综合色高清在线| 欧美视频在线一区| 在线观看91精品国产麻豆| 黄色影院成人| 亚洲精品免费在线| 蜜臀久久99精品久久久画质超高清| 久久综合伊人77777尤物| 黄色成人av网| 亚洲一区二区三区乱码aⅴ| 久久国产精品久久久久久电车| 欧美成人黄色小视频| 六月天综合网| 亚洲人成网在线播放| 久久激五月天综合精品| 国产精品麻豆成人av电影艾秋| 国产精品成人免费精品自在线观看| 欧美天天在线| 裸体丰满少妇做受久久99精品| 国产欧美日韩麻豆91| 国产精品麻豆va在线播放| 亚洲一卡二卡三卡四卡五卡|