2009年7月29日 星期三

Linux gpiolib

GPIO 在嵌入式系統中是相當常見的 I/O 裝置,全名為 General Purpose I/O。由於 GPIO 針腳可被個別設定和輸出訊號,因此我們可以利用 GPIO 來驅動 LED、或者實作低速的 I/O 通訊協定(如 I2C、SPI)。也可以利用 GPIO 來做為外部訊號的輸入端,在訊號觸發時,驅動程式中可使用 polling 或中斷方式來獲得通知。在嵌入式 SoC 平台上通常配有大量的 GPIO,且多半會和其他週邊裝置共用針腳,因此在使用時要特別注意,以免發生衝突。

過去在 Linux 上的 GPIO 程式碼大部分是屬平台相依的程式碼,因此 API 的實作也是由各平台的開發者自行設計,但除了 SoC 內建的 GPIO 外,系統設計者也會額外以 FPGA 或 I/O expander 來擴充 GPIO 的數量;因此要設計一種方式,除了能夠使用內建的 GPIO 外,也能使用這些額外的 GPIO,並透過一個統一的介面來存取它們。

gpiolib 的引入為上述的問題提供了一個解決方式。gpiolib 將每個 GPIO 的來源 (SoC、FPGA,或是 I/O expander) 用 gpio_chip 結構來表示,開發者可以定義其 GPIO 的編號、數量,以及相關的回呼函式 (callback function)。開發者需要為這些 gpio_chip 結構定義不同的回呼函式來處理不同的 GPIO 來源。如此一來,使用者只需指定 GPIO 編號,gpiolib 會替我們尋找對應的 GPIO 來源,並呼叫適合的函式來存取它,非常地方便。

PS. 需要注意的是,某些 GPIO 來源(如 I2C 介面的 I/O expander)存取時可能會進入睡眠狀態,因此不能夠使用於 ISR 或 tasklet 等不可睡眠的函式之中。

沒有留言: