簡介¶
GPIO 介面¶
此目錄中的文件提供了關於如何在驅動程式中訪問 GPIO 以及如何為提供 GPIO 的裝置編寫驅動程式的詳細說明。
什麼是 GPIO?¶
“通用輸入/輸出”(GPIO) 是一種靈活的軟體控制數字訊號。 它們由多種晶片提供,並且嵌入式和定製硬體開發的 Linux 開發人員對此很熟悉。 每個 GPIO 代表連線到特定引腳或球柵陣列 (BGA) 封裝上的“球”的一位。 電路板原理圖顯示了哪些外部硬體連線到哪些 GPIO。 可以通用地編寫驅動程式,以便電路板設定程式碼將此類引腳配置資料傳遞給驅動程式。
片上系統 (SOC) 處理器嚴重依賴 GPIO。 在某些情況下,每個非專用引腳都可以配置為 GPIO; 大多數晶片至少有幾十個。 可程式設計邏輯裝置(如 FPGA)可以輕鬆提供 GPIO; 多功能晶片(如電源管理器和音訊編解碼器)通常有一些此類引腳,以幫助解決 SOC 上的引腳稀缺問題; 並且還有使用 I2C 或 SPI 序列匯流排連線的“GPIO 擴充套件器”晶片。 大多數 PC 南橋都有幾十個支援 GPIO 的引腳(只有 BIOS 韌體知道它們是如何使用的)。
GPIO 的確切功能因系統而異。 常見選項
輸出值可寫(高=1,低=0)。 有些晶片還具有關於如何驅動該值的選項,因此例如,可能只驅動一個值,從而支援“線或”以及類似的其他值方案(特別是“開漏”信令)。
輸入值同樣是可讀的(1, 0)。 有些晶片支援回讀配置為“輸出”的引腳,這在“線或”情況下非常有用(以支援雙向信令)。 GPIO 控制器可能具有輸入去毛刺/防抖動邏輯,有時具有軟體控制。
輸入通常可以用作 IRQ 訊號,通常是邊沿觸發,但有時是電平觸發。 此類 IRQ 可以配置為系統喚醒事件,以將系統從低功耗狀態喚醒。
通常,GPIO 可以根據不同產品板的需要配置為輸入或輸出; 也存在單向 GPIO。
大多數 GPIO 可以在持有自旋鎖時訪問,但透過序列匯流排訪問的 GPIO 通常無法訪問。 有些系統同時支援這兩種型別。
在給定的板上,每個 GPIO 都用於一個特定目的,例如監視 MMC/SD 卡的插入/移除、檢測卡防寫狀態、驅動 LED、配置收發器、位敲擊序列匯流排、探測硬體看門狗、感應開關等等。
常見 GPIO 屬性¶
這些屬性透過 GPIO 介面的所有其他文件得到滿足,理解它們很有用,特別是如果您需要定義 GPIO 對映。
高電平有效和低電平有效¶
自然假設 GPIO 在其輸出訊號為 1(“高”)時“有效”,而在其輸出訊號為 0(“低”)時無效。 但是,在實踐中,GPIO 的訊號可能會在到達其目的地之前被反轉,或者裝置可能會決定對“有效”的含義採用不同的約定。 這些決策對於裝置驅動程式應該是透明的,因此可以將 GPIO 定義為高電平有效(“1”表示“有效”,預設值)或低電平有效(“0”表示“有效”),以便驅動程式只需要關心邏輯訊號,而不必關心線路電平上發生的情況。
開漏和開源¶
有時,共享訊號需要使用“開漏”(其中僅實際驅動低訊號電平)或“開源”(其中僅驅動高訊號電平)信令。 該術語適用於 CMOS 電晶體; “開集電極”用於 TTL。 上拉或下拉電阻會導致高或低訊號電平。 這有時稱為“線與”; 或者更實際地,從負邏輯(低=真)的角度來看,這是一個“線或”。
開漏訊號的一個常見示例是共享的低電平有效 IRQ 線。 此外,雙向資料匯流排訊號有時使用開漏訊號。
有些 GPIO 控制器直接支援開漏和開源輸出; 許多不支援。 當您需要開漏信令但您的硬體不直接支援時,您可以使用一個通用的習慣用法,可以透過可用作輸入或輸出的任何 GPIO 引腳來模擬它
低電平:
gpiod_direction_output(gpio, 0)... 這會驅動訊號並覆蓋上拉電阻。高電平:
gpiod_direction_input(gpio)... 這會關閉輸出,因此上拉電阻(或某些其他裝置)控制訊號。
透過驅動高訊號並將 GPIO 配置為低電平輸入,可以將相同的邏輯應用於模擬開源信令。 此開漏/開源模擬可以由 GPIO 框架透明地處理。
如果您“驅動”訊號為高電平,但 gpiod_get_value(gpio) 報告的值為低電平(在適當的上升時間過去後),您就知道某些其他元件正在將共享訊號驅動為低電平。 這不一定是錯誤。 作為一個常見的例子,這就是 I2C 時鐘被拉伸的方式:需要較慢時鐘的從機延遲 SCK 的上升沿,並且 I2C 主機相應地調整其信令速率。