精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

GPIO到底該如何控制

原創 精選
系統 Linux
希望大家通過本文,可以了解內核中GPIO的機制并掌握其操作方法,但需要說明的是在內核之前的階段也會進行引腳的配置,比如我們使用串口來打印bootloader階段的日志,這種情況下串口引腳一定是在內核之前的階段進行配置的。

作者 | 趙青窕

隨著Linux內核代碼的逐步完善,其GPIO口的操作接口也在不斷完善。內核中存在多種GPIO API接口,我們該如何使用這些API接口呢?我們又該如何在設備樹中配置GPIO呢?

目前的內核中提供了三種版本的API接口供我們使用,分別是Pinctrl子系統對應的API接口和GPIO子系統對應的API接口(GPIO子系統提供了兩種類型的API接口),在本文中我將會通過內核中GPIO架構的角度來說明這三類API接口;我們對GPIO的控制,除了合適的API接口外,還需要通過設備樹對GPIO進行配置,雖然不同架構中設備樹的配置方式不同,但本文中也會舉例說明設備樹如何配置,對應的代碼中如何使用API接口;最后說明我們可以用到的調試手段。

1.內核GPIO架構

下圖是內核中,GPIO架構中的核心部分框架圖(暫時不考慮GPIO架構對應的sysfs和debugfs):

圖 1:GPIO架構

從上圖中的上半部分可以看出以下關鍵信息:

  • 內核提供了兩種控制引腳的方式,一種是采用Pinctrl子系統,一種是采用GPIO子系統(該系統又有兩種方式,后面小節中會進行說明),用戶編寫驅動時可以調用這兩個子系統提供的API接口來達到控制GPIO口的目的;
  • GPIO子系統的功能是通過Pinctrl子系統來實現的。雖然從圖中看出,Pinctrl子系統和GPIO子系統并存,但內核需要對所有的GPIO口進行管理,因此就需要一個統一的管理接口或者模塊,Pinctrl就完成這種統一管理的目標,比如我們采用GPIO子系統的API接口gpio_request來申請GPIO口時,內核需要記錄哪些GPIO口已經申請過了,若Pinctrl子系統和GPIO子系統各維護一套GPIO管理策略,那就可能導致Pinctrl子系統和GPIO子系統同時操作同一個GPIO口的情況,這種顯然是不可行的,且從高通平臺內核代碼中可以看出gpio_request有如下的調用關系:

gpio_request--->gpiod_request----> gpiod_request_commit---->chip->request(系統啟動時設置為gpopchip_generic_request) ---->pinctrl_gpio_request

該調用關系從GPIO子系統的API函數gpio_request最后調用了Pinctrl子系統的函數pinctrl_gpio_request,這種調用關系,也證實了Pinctrl和GPIO子系統的關系。對于其他接口,如gpio_direction_input,gpio_set_value等函數的調用,同gpio_request相似,其最后均是調用到對應的chip->direction_input,chip->set,進而調用pinctrl_gpio_direction_input,等函數,由于這類API函數比較多,在此就不展示其調用關系了;

  • 內核采用結構體struct pinctrl_dev來表示一個控制器,所有的pinctrl_dev會形成鏈表,鏈表頭就是pinctrldev_list,在函數pinctrl_gpio_request內部,會調用函數pinctrl_get_device_gpio_range來根據GPIO號,遍歷鏈表pinctrldev_list來查找該GPIO口對應的pinctrl_dev,當然這部分工作均是由系統來維護,我們只需知道整個框架,并如何使用GPIO的整個子系統即可。

注意:目前從我看到的代碼中發現,有些廠家在實現GPIO子系統時,并非所有的功能均通過Pinctrl子系統,但gpio_request是會通過Pinctrl子系統,因為Pinctrl子系統中會標記哪些GPIO已經request了,這樣后續模塊采用request繼續申請該資源時就會失敗;不過大家放心,即使其部分功能不通過Pinctrl子系統,但其對驅動模塊提供的API接口不受其影響。

2.用戶驅動中控制GPIO

在編寫驅動時,可以采用以下兩種方式來設置:

  • Pinctrl方式,該方式最終是采用Pinctrl子系統來實現各項功能的;
  • 采用GPIO子系統接口的方式,該方式其實有兩種,分別是legacy和gpio description的方式。但目前的內核中,legacy內部會調用gpio description的方式,后面內容中,我會以legacy的方式來說明使用方法。

Pinctrl控制引腳方式

下面,我以高通平臺Pinctrl的方式來說明其代碼和設備樹的配置。

我們先來看一下設備樹:

&tlmm{
client1_state1: client1_state1 {
mux {
pins = "gpio0";
function = "gpio";
};
config {
pins = "gpio0";
bias-disable;
drive-strength =<2> ;
input-enable;
};
};
client1_state2: client1_state2 {
mux {
pins = "gpio0";
function = "gpio";
};
config {
pins = "gpio0";
bias-disable;
drive-strength = <2>;
output-high;
};
};
};

&soc {
client1 {
pinctrl-names = "state1", "state2";
pinctrl-0 = <&client1_state1 >;
pinctrl-1 = <&client1_state2>;
};
};

上面是典型的設備樹的配置,其中包含兩個節點,分別是tlmm中的引腳配置和我們的設備client1。

tlmm中定義了兩種GPIO狀態,分別是作為輸入功能的GPIO0和作為輸出功能的GPIO0。不同平臺的設備樹中的配置方法不同,但均需要像上面設備樹那樣,配置兩部分:

引腳功能配置,是作為普通的GPIO口,還是復用為其他的功能;

引腳驅動配置,包括引腳內部的上拉或者下拉,驅動能力等。

接下來,一起看下代碼中如何進行操作,其操作需要按照下面的順序:

  • 先調用devm_pinctrl_get或者pinctrl_get函數獲取對應的struct pinctrl*;
  • 緊接著調用pinctrl_lookup_state(struct pinctrl *p, const char *name)來根據name獲取對應的配置;
  • 最后我們采用函數pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)來進行狀態的選擇。選擇某一狀態,就是設置了對應的引腳,且引腳的request操作是在該函數內部完成的,該函數內部會調用pin_request來進行申請,且調用該函數后,引腳的狀態就是設備樹中設備的狀態,如上面設備樹中,client1_state1對應的引腳使用了其GPIO功能,且配置為輸入(設備樹中是通過input-enable進行配置的),client1_state2對應的引腳也使用了其GPIO的功能,且配置為輸出高(設備樹中是通過out-high進行配置的)。

采用GPIO子系統


&soc {
client1 {
qcom,gpio-client1 = <&tlmm 100 0>; //100就是GPIO號
}

這種方式在設備樹的配置方式上比較簡單,其代碼操作如下:

  • 使用函數of_get_named_gpio(node, " qcom,gpio-client1", 0)獲取GPIO號。
  • 接下來是最重要的一步,調用函數gpio_request來進行GPIO的request操作。該函數最后會通過Pinctrl接口間接調用pin_request來進行引腳的申請操作。之前有一次工作中粗心,忘記request操作,但發現該GPIO可能也會正常操作,但會有工作不穩定的情況發生;
  • 接下來可以調用函數gpio_direction_input或者gpio_direction_output來進行GPIO輸入或者輸出模式的配置,gpio_direction_output調用的同時,可以設置輸出高或者輸出低;
  • 如果配置位輸入模式,則可以使用函數gpio_get_value來獲取GPIO口的狀態。

如果需要把引腳配置為中斷功能,則我們需要使用函數irq = gpio_to_irq(gpio)來獲得irq號,根據irq號來進行適當的中斷配置。

通過上面兩種方式,我們可以發現Pinctrl的方式,其設備樹復雜,但API接口簡單,只需要通過函數pinctrl_select_state選擇設備樹中某一配置即可。GPIO子系統的方式是設備樹簡單,但代碼復雜,設備樹中只配置了GPIO號,其余的如GPIO的方向及輸出信號均需要通過代碼來進行設置,這正是不同API接口及其設備樹的優缺點。

3.GPIO調試

不同平臺的調試方式可能會存在一些差異,比如MTK的不同平臺間都會有差異,在此我就介紹一種常見的需要debugfs支持的方式。

我們在編譯內核時,需要配置相應的debugfs宏來打開該功能,只有配置相應宏后,我們就可以進入機器的/sys/class/gpio下對GPIO口進行操作,下面是對應的操作順序:

  • cd /sys/class/gpio/
  • echo 99 > export(此處99代表引腳號,確切地說echo時,應采用對應引腳gpio_request獲得到的數值)
  • cd gpio99
  • echo in/out > direction //設置GPIO輸入或輸出
  • cat direction //獲取GPIO輸入輸出狀態
  • echo 0/1 > value //拉低或者拉高對應的GPIO口
  • cat value //查看GPIO口的高低狀態

4.總結

希望大家通過本文,可以了解內核中GPIO的機制并掌握其操作方法,但需要說明的是在內核之前的階段也會進行引腳的配置,比如我們使用串口來打印bootloader階段的日志,這種情況下串口引腳一定是在內核之前的階段進行配置的。

作者介紹

趙青窕,51CTO社區編輯,從事多年驅動開發。研究興趣包含安全OS和網絡安全領域,發表過網絡相關專利。

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2021-01-15 19:10:32

日志打印原則

2022-06-14 21:14:18

5.5GAI數字化

2021-07-08 21:51:03

5G技術Wi-Fi 6

2024-01-25 18:00:56

微服務系統KafkaRabbitMQ

2019-08-20 09:16:39

6G網絡1G

2022-02-23 21:08:53

數字4G5G

2015-06-02 11:26:29

產品團隊

2020-07-14 14:40:05

激光噴墨打印

2011-07-28 20:32:51

2011-07-29 10:51:26

2025-10-09 02:00:00

CPUMySQLJava

2020-06-02 14:40:42

5G邊緣計算物聯網

2025-03-31 08:04:50

MySQLCPU內存

2020-12-30 09:00:00

安全工具攻擊

2017-01-06 14:57:02

2009-04-24 08:26:02

Mobile Mark移動OS

2017-04-05 21:43:08

MQ互聯網架構

2021-07-19 18:05:46

網絡安全APT攻擊網絡攻擊

2023-03-15 08:42:06

form表單設計接口
點贊
收藏

51CTO技術棧公眾號

日韩在线国产| 久久综合亚洲社区| 日本a视频在线观看| 蜜桃av中文字幕| 久久久久久网| 中文字幕日韩综合av| 午夜激情影院在线观看| 伊人网av在线| 国产美女精品视频国产| 天天射天天色天天干| 黄色免费成人| 亚洲另类图片色| 亚洲综合欧美在线| 丁香花电影在线观看完整版| 久久中文娱乐网| 国产欧美 在线欧美| 免费毛片在线播放免费| 欧美激情在线免费| 91精品欧美久久久久久动漫| 人人妻人人添人人爽欧美一区| 久久免费看视频| 国产精品资源站在线| 日韩av电影院| 国产亚洲欧美久久久久| 日韩理论电影| 精品一区电影国产| 波多野结衣在线免费观看| 久久男人av资源站| 亚洲伦在线观看| 久久久久久久久久久久久久久久av| 97免费观看视频| 久久亚洲精品伦理| 久久久久久久影院| 老熟妇高潮一区二区三区| 神马电影久久| 日韩成人av一区| 97免费公开视频| 99久久久国产精品免费调教网站| 亚洲一区二区三区视频在线播放| 在线观看亚洲视频啊啊啊啊| 毛片在线能看| 不卡一区二区三区四区| 91探花福利精品国产自产在线| 国产精品自拍第一页| 亚洲黄色一区| 欧美激情奇米色| 久久免费看少妇高潮v片特黄| 亚洲电影一级片| 亚洲第一天堂av| 国模大尺度视频| 99综合久久| 欧美裸体一区二区三区| 亚洲男人天堂色| 色综合一本到久久亚洲91| 午夜激情久久久| 2018中文字幕第一页| gogo在线高清视频| 国产精品成人午夜| 在线观看日韩片| 蜜芽在线免费观看| 亚洲视频免费看| 五码日韩精品一区二区三区视频| 精品资源在线看| 久久久91精品国产一区二区精品 | 日韩欧美国产三级| 天天综合天天添夜夜添狠狠添| 精品国产黄a∨片高清在线| 欧美亚洲国产一区二区三区| 国产嫩草在线观看| www.国产精品| 在线成人免费观看| 久久精品无码一区二区三区毛片| 久久gogo国模啪啪裸体| 日韩欧美国产小视频| 亚洲美女在线播放| 日韩欧美美女在线观看| 亚洲视频日韩精品| 99久久久无码国产精品不卡| 一区二区三区四区日韩| 欧美乱大交做爰xxxⅹ性3| 久久免费在线观看视频| 妖精视频成人观看www| 欧洲一区二区视频| 91精品中文字幕| 国产高清不卡一区二区| 韩日午夜在线资源一区二区| 黄色影院在线播放| 国产精品久久久久久久久免费樱桃| 在线无限看免费粉色视频| 日本动漫同人动漫在线观看| 日韩欧美国产一区二区| 中文字幕第17页| 亚洲2区在线| 亚洲精品自拍第一页| 国产欧美小视频| 欧美一区二区三区另类| 午夜精品蜜臀一区二区三区免费| 国产精品va无码一区二区三区| 免费在线成人网| 97se国产在线视频| 免费a在线观看| 亚洲免费观看高清完整版在线观看| 欧美一级视频在线播放| 本网站久久精品| 日韩欧美国产一区在线观看| 午夜理伦三级做爰电影| 在线精品视频在线观看高清| 欧美一级黄色网| 国产suv精品一区二区69| www国产精品av| 国产又粗又大又爽的视频| 一本大道色婷婷在线| 51久久夜色精品国产麻豆| 日本黄色网址大全| 欧美日韩国产一区精品一区| 国产精品久久久久久久久久尿 | 欧美少妇精品| 欧美一区二区三区视频免费 | 一级黄色大毛片| av电影在线观看一区| 在线视频欧美一区| 日韩免费电影| 亚洲成人亚洲激情| 北条麻妃在线观看视频| 亚洲专区一区二区三区| 亚洲精品免费在线视频| 成人p站proumb入口| 亚洲成人免费看| 性生活在线视频| 久久精品国产www456c0m| 欧美影院久久久| 亚洲精品视频网| 亚洲免费大片在线观看| 国产三级三级看三级| 蜜桃成人av| 午夜精品久久久久久99热软件| www.五月婷| 亚洲精品一卡二卡| 天天摸天天舔天天操| 日韩av密桃| 国产精品久久久久久影视| 丁香六月天婷婷| 一区二区三区在线观看欧美| 国产欧美一区二| 日韩在线视频精品| 国产精品久久中文| 久久精品蜜桃| 色婷婷综合久久久久中文一区二区| 香港三日本8a三级少妇三级99| 欧美午夜不卡影院在线观看完整版免费| 国产综合视频在线观看| 在线观看a视频| 欧美日韩成人综合在线一区二区| 中文字幕免费在线看线人动作大片| 久久久噜噜噜| 欧美一区少妇| www.一区| 久久影院在线观看| 99精品在线视频观看| 一区二区激情小说| 亚洲精品久久一区二区三区777| 午夜亚洲福利| 国产一区福利视频| 日韩脚交footjobhdboots| 亚洲毛片在线免费观看| 久久久久久亚洲av无码专区| 国产精品无人区| 国产福利精品一区二区三区| 中文字幕亚洲精品乱码| 99久久精品免费看国产四区| www.九色在线| 亚洲欧洲在线免费| 亚洲无码精品在线观看| 亚洲男人天堂av网| 中文字幕在线视频播放| 久久亚洲图片| 日本黄色a视频| 99re8这里有精品热视频8在线 | 精品国产一区二区三区久久久蜜月 | 久久新电视剧免费观看| 亚洲一区在线不卡| 综合久久99| 你懂的网址一区二区三区| 色婷婷综合久久久中字幕精品久久| 最近2019好看的中文字幕免费| 国产老女人乱淫免费| 亚洲国产美女搞黄色| 成人片黄网站色大片免费毛片| 久久精品99国产国产精| 国产精品国产三级国产专区51| 亚洲图片久久| 91啪国产在线| 亚洲校园激情春色| 久久精品国产69国产精品亚洲 | 国产精品一卡二卡在线观看| 99精品人妻少妇一区二区| 日本不卡二三区| 懂色一区二区三区av片| 午夜欧美巨大性欧美巨大| 不卡av日日日| 偷拍精品一区二区三区| 3751色影院一区二区三区| 日本少妇裸体做爰| 国产精品毛片a∨一区二区三区| 91亚洲一线产区二线产区| 日韩精品一二三| 国产日韩亚洲欧美在线| 久久在线免费| 欧美高清性xxxxhd| 麻豆国产一区| 国产精品日日摸夜夜添夜夜av| 男女视频在线| 深夜精品寂寞黄网站在线观看| 欧美一区,二区| 欧美日韩的一区二区| 午夜精品一区二| 精品国产乱码久久久久久虫虫漫画| 韩国一级黄色录像| 久久久久国产精品厨房| 国产a级片视频| 蜜臀av国产精品久久久久| 久久久亚洲精品无码| 欧美88av| 亚洲国产一区二区三区在线播| 亲子伦视频一区二区三区| 成人在线视频网站| 日韩不卡视频在线观看| 8x海外华人永久免费日韩内陆视频| 91麻豆免费在线视频| 一区二区福利视频| 内衣办公室在线| 亚洲成人激情在线| 国产高清在线免费| 欧美日韩国产美| 亚洲 小说区 图片区| 日韩欧美一区二区在线| 国产午夜精品无码| 一区二区激情小说| 久草视频免费在线| 一区二区在线观看av| 国产尤物在线播放| 国产精品久久久久精k8 | 久久99精品久久久久久园产越南| 国产伦精品一区二区三毛| 欧美午夜一区二区福利视频| 久久综合免费视频影院| 999在线视频| 国产视频精品在线| 无套内谢的新婚少妇国语播放| 欧美一区二区在线免费播放| 中文字幕一区二区三区波野结| 91官网在线观看| 天堂网av手机版| 黄色精品在线看| 日韩 欧美 亚洲| 亚洲一区二区在线免费观看视频| 国模无码国产精品视频| 一区二区视频在线看| 欧美爱爱小视频| 一区二区三区国产| 国产精彩视频在线观看| 亚洲国产一区二区三区青草影视| 欧美精品一区二区蜜桃| 亚洲综合成人在线| 国产亚洲欧美久久久久| 偷拍与自拍一区| 久久久久久久久影院| 91国产成人在线| 一级黄色免费看| 欧美一级久久久久久久大片| 国产高清免费观看| 亚洲成人av在线| 久久国产精品高清一区二区三区| 亚洲片在线观看| 大地资源中文在线观看免费版| 中文字幕精品一区久久久久| 日本在线天堂| 欧美大片在线影院| 女海盗2成人h版中文字幕| 国产91精品青草社区| 五月激情久久| 5g国产欧美日韩视频| 六月丁香久久丫| 日韩av不卡在线播放| 99久久精品网| 国产一线二线三线女| 久久黄色网页| 亚洲a级黄色片| 波多野结衣亚洲一区| 蜜桃传媒一区二区亚洲| 亚洲欧洲三级电影| 日本熟妇乱子伦xxxx| 色视频成人在线观看免| 国产又黄又爽视频| 精品一区二区三区电影| 超碰porn在线| 欧美一级片一区| 国产欧美88| 欧美一区二区视频在线| 午夜日韩电影| 欧美精品成人网| 国产成人无遮挡在线视频| 真实乱视频国产免费观看| 一区二区三区高清在线| 免费精品一区二区| 精品久久久久久久人人人人传媒| 国产精品久久久久久久龚玥菲| 九九热这里只有精品免费看| 在线成人视屏| 国产伦一区二区三区色一情| 天天av综合| 久久精品99国产| 国产精品乡下勾搭老头1| xxxx日本黄色| 五月天婷婷综合| 国产免费黄色录像| 亚洲午夜精品久久久久久久久久久久| 欧美大胆的人体xxxx| 国产精品久久久久久久久久久久久| 国产劲爆久久| 91精品国产吴梦梦| 久久精品免费观看| 美女100%无挡| 亚洲成人动漫一区| av无码精品一区二区三区宅噜噜| 色av中文字幕一区| 成人做爰视频www网站小优视频| 国产欧美韩日| 欧美国产高清| 日韩av自拍偷拍| 中文欧美字幕免费| 在线观看污污网站| 精品亚洲一区二区三区在线观看| 日本www.色| 国产麻豆精品视频| 北条麻妃在线观看视频| 91久久精品网| 免费黄色片在线观看| 91福利视频网| 日韩mv欧美mv国产网站| 国产va亚洲va在线va| 成人手机在线视频| 免费一级片在线观看| 日韩欧美国产三级| 天堂av资源在线观看| 97自拍视频| 激情另类综合| 国产艳妇疯狂做爰视频| 亚洲一级二级在线| 亚洲国产av一区二区| 色综合久久天天综线观看| 人人九九精品视频| 97在线免费视频观看| 国产成人小视频| 国产精彩视频在线| 亚洲国产中文字幕久久网| 欧美家庭影院| 国产一区二区三区黄| 午夜亚洲性色福利视频| 亚洲午夜福利在线观看| 色一情一伦一子一伦一区| 搞黄视频免费在线观看| 国产精品视频自在线| 国产精品久久久久无码av| 超碰在线免费av| 樱花影视一区二区| 免费看国产片在线观看| 777精品视频| 成人aaaa| 国产精品久久久久久9999| 一区二区三区产品免费精品久久75| 亚洲av永久纯肉无码精品动漫| 午夜精品久久久久久久久久久久久| 亚洲激情77| 亚洲视频一二三四| 一区二区三区在线视频免费观看| 蜜桃在线一区二区| 欧美做受高潮1| 色999日韩| 波多野结衣三级视频| 欧美午夜激情小视频| 91欧美在线视频| 亚洲xxx自由成熟| 一本色道久久综合一区| 色撸撸在线视频| 欧美白人最猛性xxxxx69交| 中文字幕在线看片| 一区二区三区久久网| 成人一区二区三区| 无码无套少妇毛多18pxxxx| 久久久精品亚洲| 欧美变态网站| 色播五月综合网| 亚洲成人av中文| 三区四区电影在线观看| 国产伦精品一区二区三区照片 | 乱亲女秽乱长久久久| 日本妇女一区| 色18美女社区| 欧美日韩国产在线播放|