Lines Matching refs:GPIO

27 GPIO 接口
29 本文檔提供了一個在Linux下訪問GPIO的公約概述。
35 什麼是GPIO?
37 "通用輸入/輸出口"(GPIO)是一個靈活的由軟體控制的數位訊號。他們可
39 比較熟悉。每個GPIO 都代表一個連接到特定引腳或球柵陣列(BGA)封裝中
40 「球珠」的一個位。電路板原理圖顯示了 GPIO 與外部硬體的連接關係。
43 片上系統 (SOC) 處理器對 GPIO 有很大的依賴。在某些情況下,每個
44 非專用引腳都可配置爲 GPIO,且大多數晶片都最少有一些 GPIO
45 可編程邏輯器件(類似 FPGA) 可以方便地提供 GPIO。像電源管理和
47 匱乏的 SOC。同時還有通過 I2C 或 SPI 串行總線連接的「GPIO擴展器」
48 晶片。大多數 PC 的南橋有一些擁有 GPIO 能力的引腳 (只有BIOS
51 GPIO 的實際功能因系統而異。通常用法有:
58 「線與」的情況(以支持雙向信號)是非常有用的。GPIO 控制器可能有輸入
64 - 通常一個 GPIO 根據不同產品電路板的需求,可以配置爲輸入或輸出,也有僅
67 - 大部分 GPIO 可以在持有自旋鎖時訪問,但是通常由串行總線擴展的 GPIO
70 對於給定的電路板,每個 GPIO 都用於某個特定的目的,如監控 MMC/SD 卡的
75 GPIO 公約
78 因爲此時可移植性並不重要。GPIO 常用於板級特定的電路邏輯,甚至可能
83 訪問晶片寄存器的內聯函數來實現它,其他平台可能通過委託一系列不同的GPIO
85 後面會介紹,但作爲 GPIO 接口的客戶端驅動程序必須與它的實現無關。)
89 選項。那些調用標準 GPIO 函數的驅動應該在 Kconfig 入口中聲明依賴GENERIC_GPIO。
94GPIO 函數是可用,無論是「真實代碼」還是經優化過的語句。如果你遵守
100 標識 GPIO
102 GPIO 是通過無符號整型來標識的,範圍是 0 到 MAX_INT。保留「負」數
106 平台會定義這些整數的用法,且通常使用 #define 來定義 GPIO,這樣
108 啓動代碼傳遞過來的 GPIO 編號,使用 platform_data 保存板級特定
111 例如一個平台使用編號 32-159 來標識 GPIO,而在另一個平台使用編號0-63
112 標識一組 GPIO 控制器,64-79標識另一類 GPIO 控制器,且在一個含有
114 使用編號2000-2063來標識一個 I2C 接口的 GPIO 擴展器中的 GPIO
116 如果你要初始化一個帶有無效 GPIO 編號的結構體,可以使用一些負編碼
118 是否關聯一個 GPIO,你可使用以下斷言:
122 如果編號不存在,則請求和釋放 GPIO 的函數將拒絕執行相關操作(見下文)。
125 一個平台是否支持多個 GPIO 控制器爲平台特定的實現問題,就像是否可以
126GPIO 編號空間中有「空洞」和是否可以在運行時添加新的控制器一樣。
127 這些問題會影響其他事情,包括相鄰的 GPIO 編號是否存在等。
129 使用 GPIO
131 對於一個 GPIO,系統應該做的第一件事情就是通過 gpio_request()
134 接下來是設置I/O方向,這通常是在板級啓動代碼中爲所使用的 GPIO 設置
143 你應該在進程上下文中調用這些函數。然而,對於自旋鎖安全的 GPIO,在板子
146 對於作爲輸出的 GPIO,爲其提供初始輸出值,對於避免在系統啓動期間出現
149 爲了與傳統的 GPIO 接口兼容, 在設置一個 GPIO 方向時,如果它還未被申請,
150 則隱含了申請那個 GPIO 的操作(見下文)。這種兼容性正在從可選的 gpiolib
153 如果這個 GPIO 編碼不存在,或者特定的 GPIO 不能用於那種模式,則方向
156 將這個復用的引腳設置爲 GPIO,並正確地配置上拉/下拉電阻。)
159 訪問自旋鎖安全的 GPIO
161 大多數 GPIO 控制器可以通過內存讀/寫指令來訪問。這些指令不會休眠,可以
164 對於那些用 gpio_cansleep()測試總是返回失敗的 GPIO(見下文),使用
167 /* GPIO 輸入:返回零或非零 */
170 /* GPIO 輸出 */
173 GPIO值是布爾值,零表示低電平,非零表示高電平。當讀取一個輸出引腳的值時,
178 其是否爲「無效GPIO」。此外,還需要注意的是並不是所有平台都可以從輸出引腳
180 安全訪問的 GPIO (譯者註:因爲訪問可能導致休眠)使用這些函數是不合適的
183GPIO 編號(還有輸出、值)爲常數的情況下,鼓勵通過平台特定的實現來優化
184 這兩個函數來訪問 GPIO 值。這種情況(讀寫一個硬體寄存器)下只需要幾條指令
186 函數可以使得模擬接口(譯者注:例如 GPIO 模擬 I2C、1-wire 或 SPI)的
190 訪問可能休眠的 GPIO
192 某些 GPIO 控制器必須通過基於總線(如 I2C 或 SPI)的消息訪問。讀或寫這些
193 GPIO 值的命令需要等待其信息排到隊首才發送命令,再獲得其反饋。期間需要
196 支持此類 GPIO 的平台通過以下函數返回非零值來區分出這種 GPIO。(此函數需要
197 一個之前通過 gpio_request 分配到的有效 GPIO 編號):
201 爲了訪問這種 GPIO,內核定義了一套不同的函數:
203 /* GPIO 輸入:返回零或非零 ,可能會休眠 */
206 /* GPIO 輸出,可能會休眠 */
210 訪問這樣的 GPIO 需要一個允許休眠的上下文,例如線程 IRQ 處理例程,並用以上的
213 除了這些訪問函數可能休眠,且它們操作的 GPIO 不能在硬體 IRQ 處理例程中訪問的
216 ** 除此之外 ** 調用設置和配置此類 GPIO 的函數也必須在允許休眠的上下文中,
217 因爲它們可能也需要訪問 GPIO 控制器晶片: (這些設置函數通常在板級啓動代碼或者
233 聲明和釋放 GPIO
237 /* 申請 GPIO, 返回 0 或負的錯誤代碼.
242 /* 釋放之前聲明的 GPIO */
245 將無效的 GPIO 編碼傳遞給 gpio_request()會導致失敗,申請一個已使用這個
246 函數聲明過的 GPIO 也會失敗。gpio_request()的返回值必須檢查。你應該在
247 進程上下文中調用這些函數。然而,對於自旋鎖安全的 GPIO,在板子啓動的早期、
250 這個函數完成兩個基本的目標。一是標識那些實際上已作爲 GPIO 使用的信號線,
251 這樣便於更好地診斷;系統可能需要服務幾百個可用的 GPIO,但是對於任何一個
254 某個已激活信號的驅動是安全的。也就是說,申請 GPIO 的作用類似一種鎖機制。
256 某些平台可能也使用 GPIO 作爲電源管理激活信號(例如通過關閉未使用晶片區和
259 對於 GPIO 使用 pinctrl 子系統已知的引腳,子系統應該被告知其使用情況;
265 任何須將 GPIO 信號導向適當引腳的引腳復用硬體的編程應該發生在 GPIO
267 任何輸出 GPIO 值的設置之後。這樣可使從引腳特殊功能到 GPIO 的轉換
268 不會在引腳產生毛刺波形。有時當用一個 GPIO 實現其信號驅動一個非 GPIO
271 某些平台允許部分或所有 GPIO 信號使用不同的引腳。類似的,GPIO 或引腳的
272 其他方面也需要配置,如上拉/下拉。平台軟體應該在對這些 GPIO 調用
274 使得 GPIO 的用戶無須關注這些細節。
276 還有一個值得注意的是在釋放 GPIO 前,你必須停止使用它。
279 注意:申請一個 GPIO 並沒有以任何方式配置它,只不過標識那個 GPIO 處於使用
280 狀態。必須有另外的代碼來處理引腳配置(如控制 GPIO 使用的引腳、上拉/下拉)。
281 考慮到大多數情況下聲明 GPIO 之後就會立即配置它們,所以定義了以下三個輔助函數:
283 /* 申請一個 GPIO 信號, 同時通過特定的'flags'初始化配置,
289 /* 在單個函數中申請多個 GPIO
293 /* 在單個函數中釋放多個 GPIO
328 更進一步,爲了更簡單地聲明/釋放多個 GPIO,'struct gpio'被引進來封裝所有
358 GPIO 映射到 IRQ
360 GPIO 編號是無符號整數;IRQ 編號也是。這些構成了兩個邏輯上不同的命名空間
361 (GPIO 0 不一定使用 IRQ 0)。你可以通過以下函數在它們之間實現映射:
363 /* 映射 GPIO 編號到 IRQ 編號 */
366 /* 映射 IRQ 編號到 GPIO 編號 (儘量避免使用) */
370 (例如,某些 GPIO 無法做爲 IRQ 使用。)以下的編號錯誤是未經檢測的:使用一個
371 未通過 gpio_direction_input()配置爲輸入的 GPIO 編號,或者使用一個
396 某些 GPIO 控制器直接支持開漏輸出,還有許多不支持。當你需要開漏信號,但
397 硬體又不直接支持的時候,一個常用的方法是用任何即可作輸入也可作輸出的 GPIO
417 幾個引腳中的任何一個作爲給定的 GPIO。(是的,這些例子都來自於當前運行
425 可配置引腳和 GPIO 之間(沒)有一一對應的關係。
428 選項。硬體可能支持批量讀或寫 GPIO,但是那一般是配置相關的:對於處於同一
429 塊區(bank)的GPIO。(GPIO 通常以 16 或 32 個組成一個區塊,一個給定的
430 片上系統一般有幾個這樣的區塊。)某些系統可以通過輸出 GPIO 觸發 IRQ,
431 或者從並非以 GPIO 管理的引腳取值。這些機制的相關代碼沒有必要具有可移植性。
433 當前,動態定義 GPIO 並不是標準的,例如作爲配置一個帶有某些 GPIO 擴展器的
436 GPIO 實現者的框架 (可選)
439 不同種類的 GPIO 控制器。這個框架稱爲"gpiolib"。
442 文件。通過這個框架,它可以列出所有註冊的控制器,以及當前正在使用中的 GPIO
448 在框架中每個 GPIO 控制器都包裝爲一個 "struct gpio_chip",他包含了
451 - 設置 GPIO 方向的方法
452 - 用於訪問 GPIO 值的方法
457 也包含了來自 device.platform_data 的每個實例的數據:它第一個 GPIO
458 編號和它可用的 GPIO 的數量。
461 配置每個 gpio_chip,並發起gpiochip_add()。卸載一個 GPIO 控制器很少見,
464 大部分 gpio_chip 是一個實例特定結構體的一部分,而並不將 GPIO 接口單獨
465 暴露出來,比如編址、電源管理等。類似編解碼器這樣的晶片會有複雜的非 GPIO
468 任何一個 debugfs 信息導出方法通常應該忽略還未申請作爲 GPIO 的信號線。
469 他們可以使用 gpiochip_is_requested()測試,當這個 GPIO 已經申請過了
480 它也應提供一個 ARCH_NR_GPIOS 的定義值,這樣可以更好地反映該平台 GPIO
481 的實際數量,節省靜態表的空間。(這個定義值應該包含片上系統內建 GPIO
482 GPIO 擴展器中的數據。)
489 如果這些選項都沒被選擇,該平台就不通過 GPIO-lib 支持 GPIO,且代碼不可以
499 基於特定片上系統的 GPIO。例如,若引用的 GPIO (寄存器位偏移)是常量「12」,
501 那些函數必須使用框架提供的代碼,那就至少要幾十條指令才可以實現。對於用 GPIO
504 對於片上系統,平台特定代碼爲片上 GPIO 每個區(bank)定義並註冊 gpio_chip
505 實例。那些 GPIO 應該根據晶片廠商的文檔進行編碼/標籤,並直接和電路板原理圖
506 對應。他們應該開始於零並終止於平台特定的限制。這些 GPIO(代碼)通常從
507 arch_initcall()或者更早的地方集成進平台初始化代碼,使這些 GPIO 總是可用,
512 對於外部 GPIO 控制器(例如 I2C 或 SPI 擴展器、專用晶片、多功能器件、FPGA
514 gpiochip_add()所使用的 GPIO 編號。他們的起始編號通常跟在平台特定的 GPIO
517 例如板級啓動代碼應該創建結構體指明晶片公開的 GPIO 範圍,並使用 platform_data
518 將其傳遞給每個 GPIO 擴展器晶片。然後晶片驅動中的 probe()例程可以將這個
521 初始化順序很重要。例如,如果一個設備依賴基於 I2C 的(擴展)GPIO,那麼它的
522 probe()例程就應該在那個 GPIO 有效以後才可以被調用。這意味著設備應該在
523 GPIO 可以工作之後才可被註冊。解決這類依賴的的一種方法是讓這種 gpio_chip
525 資源可用之後,這些板級特定的回調函數將會註冊設備,並可以在這些 GPIO 控制器
531 使用「gpiolib」實現框架的平台可以選擇配置一個 GPIO 的 sysfs 用戶接口。
532 這不同於 debugfs 接口,因爲它提供的是對 GPIO方向和值的控制,而不只顯示
533 一個GPIO 的狀態摘要。此外,它可以出現在沒有調試支持的產品級系統中。
537 臨時解除這個保護:首先導入一個 GPIO,改變其輸出狀態,然後在重新使能防寫
538 前升級代碼。通常情況下,GPIO #23 是不會被觸及的,並且內核也不需要知道他。
540 根據適當的硬體文檔,某些系統的用戶空間 GPIO 可以用於確定系統配置數據,
541 這些數據是標準內核不知道的。在某些任務中,簡單的用戶空間 GPIO 驅動可能是
544 注意:標準內核驅動中已經存在通用的「LED 和按鍵」GPIO 任務,分別是:
545 "leds-gpio" 和 "gpio_keys"。請使用這些來替代直接訪問 GPIO,因爲集成在
553 - 用於在用戶空間控制 GPIO 的控制接口;
557 - GPIO 控制器 ("gpio_chip" 實例)。
566 一個 GPIO 的控制到用戶空間。
568 例如: 如果內核代碼沒有申請 GPIO #19,"echo 19 > export"
569 將會爲 GPIO #19 創建一個 "gpio19" 節點。
576 GPIO 信號的路徑類似 /sys/class/gpio/gpio42/ (對於 GPIO #42 來說),
583 "low" 或 "high" 的電平值應該寫入 GPIO 的配置,作爲初始輸出值。
585 注意:如果內核不支持改變 GPIO 的方向,或者在導出時內核代碼沒有
586 明確允許用戶空間可以重新配置 GPIO 方向,那麼這個屬性將不存在。
588 "value" ... 讀取得到 0 (低電平) 或 1 (高電平)。如果 GPIO 配置爲
609 GPIO 控制器的路徑類似 /sys/class/gpio/gpiochip42/ (對於從#42 GPIO
614 "base" ... 與以上的 N 相同,代表此晶片管理的第一個 GPIO 的編號
618 "ngpio" ... 此控制器所管理的 GPIO 數量(而 GPIO 編號從 N 到
621 大多數情況下,電路板的文檔應當標明每個 GPIO 的使用目的。但是那些編號並不總是
622 固定的,例如在擴展卡上的 GPIO會根據所使用的主板或所在堆疊架構中其他的板子而
624 確定給定信號所用的 GPIO 編號。
629 內核代碼可以明確地管理那些已通過 gpio_request()申請的 GPIO 的導出:
631 /* 導出 GPIO 到用戶空間 */
637 /* 創建一個 sysfs 連接到已導出的 GPIO 節點 */
641 在一個內核驅動申請一個 GPIO 之後,它可以通過 gpio_export()使其在 sysfs
648GPIO 被導出之後,gpio_export_link()允許在 sysfs 文件系統的任何地方
649 創建一個到這個 GPIO sysfs 節點的符號連結。這樣驅動就可以通過一個描述性的
650 名字,在 sysfs 中他們所擁有的設備下提供一個(到這個 GPIO sysfs 節點的)接口。