Lines Matching full:gpio
1 Chinese translated version of Documentation/admin-guide/gpio
13 Documentation/admin-guide/gpio 的繁體中文翻譯
27 GPIO 接口
37 "通用輸入/輸出口"(GPIO)是一個靈活的由軟體控制的數位訊號。他們可
40 「球珠」的一個位。電路板原理圖顯示了 GPIO 與外部硬體的連接關係。
43 片上系統 (SOC) 處理器對 GPIO 有很大的依賴。在某些情況下,每個
44 非專用引腳都可配置爲 GPIO,且大多數晶片都最少有一些 GPIO。
45 可編程邏輯器件(類似 FPGA) 可以方便地提供 GPIO。像電源管理和
48 晶片。大多數 PC 的南橋有一些擁有 GPIO 能力的引腳 (只有BIOS
51 GPIO 的實際功能因系統而異。通常用法有:
58 「線與」的情況(以支持雙向信號)是非常有用的。GPIO 控制器可能有輸入
64 - 通常一個 GPIO 根據不同產品電路板的需求,可以配置爲輸入或輸出,也有僅
67 - 大部分 GPIO 可以在持有自旋鎖時訪問,但是通常由串行總線擴展的 GPIO
70 對於給定的電路板,每個 GPIO 都用於某個特定的目的,如監控 MMC/SD 卡的
75 GPIO 公約
78 因爲此時可移植性並不重要。GPIO 常用於板級特定的電路邏輯,甚至可能
85 後面會介紹,但作爲 GPIO 接口的客戶端驅動程序必須與它的實現無關。)
89 選項。那些調用標準 GPIO 函數的驅動應該在 Kconfig 入口中聲明依賴GENERIC_GPIO。
92 #include <linux/gpio.h>
94 則 GPIO 函數是可用,無論是「真實代碼」還是經優化過的語句。如果你遵守
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 控制器爲平台特定的實現問題,就像是否可以
126 在 GPIO 編號空間中有「空洞」和是否可以在運行時添加新的控制器一樣。
127 這些問題會影響其他事情,包括相鄰的 GPIO 編號是否存在等。
129 使用 GPIO
131 對於一個 GPIO,系統應該做的第一件事情就是通過 gpio_request()
134 接下來是設置I/O方向,這通常是在板級啓動代碼中爲所使用的 GPIO 設置
138 int gpio_direction_input(unsigned gpio);
139 int gpio_direction_output(unsigned gpio, int value);
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 輸入:返回零或非零 */
168 int gpio_get_value(unsigned gpio);
170 /* GPIO 輸出 */
171 void gpio_set_value(unsigned gpio, int value);
180 安全訪問的 GPIO (譯者註:因爲訪問可能導致休眠)使用這些函數是不合適的
183 在 GPIO 編號(還有輸出、值)爲常數的情況下,鼓勵通過平台特定的實現來優化
184 這兩個函數來訪問 GPIO 值。這種情況(讀寫一個硬體寄存器)下只需要幾條指令
186 函數可以使得模擬接口(譯者注:例如 GPIO 模擬 I2C、1-wire 或 SPI)的
190 訪問可能休眠的 GPIO
192 某些 GPIO 控制器必須通過基於總線(如 I2C 或 SPI)的消息訪問。讀或寫這些
193 GPIO 值的命令需要等待其信息排到隊首才發送命令,再獲得其反饋。期間需要
196 支持此類 GPIO 的平台通過以下函數返回非零值來區分出這種 GPIO。(此函數需要
197 一個之前通過 gpio_request 分配到的有效 GPIO 編號):
199 int gpio_cansleep(unsigned gpio);
201 爲了訪問這種 GPIO,內核定義了一套不同的函數:
203 /* GPIO 輸入:返回零或非零 ,可能會休眠 */
204 int gpio_get_value_cansleep(unsigned gpio);
206 /* GPIO 輸出,可能會休眠 */
207 void gpio_set_value_cansleep(unsigned gpio, int value);
210 訪問這樣的 GPIO 需要一個允許休眠的上下文,例如線程 IRQ 處理例程,並用以上的
213 除了這些訪問函數可能休眠,且它們操作的 GPIO 不能在硬體 IRQ 處理例程中訪問的
216 ** 除此之外 ** 調用設置和配置此類 GPIO 的函數也必須在允許休眠的上下文中,
217 因爲它們可能也需要訪問 GPIO 控制器晶片: (這些設置函數通常在板級啓動代碼或者
233 聲明和釋放 GPIO
237 /* 申請 GPIO, 返回 0 或負的錯誤代碼.
240 int gpio_request(unsigned gpio, const char *label);
242 /* 釋放之前聲明的 GPIO */
243 void gpio_free(unsigned 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'初始化配置,
287 int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
289 /* 在單個函數中申請多個 GPIO
291 int gpio_request_array(struct gpio *array, size_t num);
293 /* 在單個函數中釋放多個 GPIO
295 void gpio_free_array(struct gpio *array, size_t num);
307 * GPIOF_EXPORT_DIR_FIXED - 將 gpio 導出到 sysfs,並保持方向
328 更進一步,爲了更簡單地聲明/釋放多個 GPIO,'struct gpio'被引進來封裝所有
331 struct gpio {
332 unsigned gpio;
339 static struct gpio leds_gpios[] = {
358 GPIO 映射到 IRQ
360 GPIO 編號是無符號整數;IRQ 編號也是。這些構成了兩個邏輯上不同的命名空間
361 (GPIO 0 不一定使用 IRQ 0)。你可以通過以下函數在它們之間實現映射:
363 /* 映射 GPIO 編號到 IRQ 編號 */
364 int gpio_to_irq(unsigned gpio);
366 /* 映射 IRQ 編號到 GPIO 編號 (儘量避免使用) */
370 (例如,某些 GPIO 無法做爲 IRQ 使用。)以下的編號錯誤是未經檢測的:使用一個
371 未通過 gpio_direction_input()配置爲輸入的 GPIO 編號,或者使用一個
396 某些 GPIO 控制器直接支持開漏輸出,還有許多不支持。當你需要開漏信號,但
397 硬體又不直接支持的時候,一個常用的方法是用任何即可作輸入也可作輸出的 GPIO
400 LOW: gpio_direction_output(gpio, 0) ... 這代碼驅動信號並覆蓋
403 HIGH: gpio_direction_input(gpio) ... 這代碼關閉輸出,所以上拉電阻
406 如果你將信號線「驅動」爲高電平,但是 gpio_get_value(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"。
441 作爲一個輔助調試功能,如果 debugfs 可用,就會有一個 /sys/kernel/debug/gpio
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 已經申請過了
477 <asm/gpio.h> 包含 <asm-generic/gpio.h>,同時定義三個方法:
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 用戶接口。
537 臨時解除這個保護:首先導入一個 GPIO,改變其輸出狀態,然後在重新使能防寫
538 前升級代碼。通常情況下,GPIO #23 是不會被觸及的,並且內核也不需要知道他。
540 根據適當的硬體文檔,某些系統的用戶空間 GPIO 可以用於確定系統配置數據,
541 這些數據是標準內核不知道的。在某些任務中,簡單的用戶空間 GPIO 驅動可能是
544 注意:標準內核驅動中已經存在通用的「LED 和按鍵」GPIO 任務,分別是:
545 "leds-gpio" 和 "gpio_keys"。請使用這些來替代直接訪問 GPIO,因爲集成在
551 在/sys/class/gpio 中有 3 類入口:
553 - 用於在用戶空間控制 GPIO 的控制接口;
557 - GPIO 控制器 ("gpio_chip" 實例)。
563 /sys/class/gpio/
566 一個 GPIO 的控制到用戶空間。
568 例如: 如果內核代碼沒有申請 GPIO #19,"echo 19 > export"
569 將會爲 GPIO #19 創建一個 "gpio19" 節點。
576 GPIO 信號的路徑類似 /sys/class/gpio/gpio42/ (對於 GPIO #42 來說),
579 /sys/class/gpio/gpioN/
583 "low" 或 "high" 的電平值應該寫入 GPIO 的配置,作爲初始輸出值。
585 注意:如果內核不支持改變 GPIO 的方向,或者在導出時內核代碼沒有
586 明確允許用戶空間可以重新配置 GPIO 方向,那麼這個屬性將不存在。
588 "value" ... 讀取得到 0 (低電平) 或 1 (高電平)。如果 GPIO 配置爲
609 GPIO 控制器的路徑類似 /sys/class/gpio/gpiochip42/ (對於從#42 GPIO
612 /sys/class/gpio/gpiochipN/
614 "base" ... 與以上的 N 相同,代表此晶片管理的第一個 GPIO 的編號
618 "ngpio" ... 此控制器所管理的 GPIO 數量(而 GPIO 編號從 N 到
621 大多數情況下,電路板的文檔應當標明每個 GPIO 的使用目的。但是那些編號並不總是
624 確定給定信號所用的 GPIO 編號。
629 內核代碼可以明確地管理那些已通過 gpio_request()申請的 GPIO 的導出:
631 /* 導出 GPIO 到用戶空間 */
632 int gpio_export(unsigned gpio, bool direction_may_change);
637 /* 創建一個 sysfs 連接到已導出的 GPIO 節點 */
639 unsigned gpio)
641 在一個內核驅動申請一個 GPIO 之後,它可以通過 gpio_export()使其在 sysfs
648 在 GPIO 被導出之後,gpio_export_link()允許在 sysfs 文件系統的任何地方
649 創建一個到這個 GPIO sysfs 節點的符號連結。這樣驅動就可以通過一個描述性的
650 名字,在 sysfs 中他們所擁有的設備下提供一個(到這個 GPIO sysfs 節點的)接口。