Linux GPIO Driver 框架範例

現在 Linux GPIO 框架應用上已經很方便了,只要將要使用的 GPIO PIN number 寫入到 /sys/class/gpio/export 內,就會產生一個 gpioXXX 的目錄,裡面可以設定其方向 (direction) 與讀寫值 (value)。
而若有依照 Linux GPIO 框架的 driver,會在 /sys/class/gpio/ 產生一個 gpiochipXXX 的檔案。假設要使用其第 5 根 PIN,就只要寫入該數字到 export 即可。舉例來說,若存在一個 /sys/class/gpio/gpiochip256 的 GPIO driver,要使用其第 5 pin, 就下達 “echo 261 > /sys/class/gpio/export”,就會產生目錄 /sys/class/gpio/gpio261。 若不使用了,則下達 “echo 261 > /sys/class/gpio/unexport” 即可。

撰寫自己的 GPIO Driver

自己在工作上會利用到 FPGA 的腳位來當做 GPIO 的功能,雖然搭著 character device 也能辦到操控的功能,不過感覺用標準的框架會更帥一些,所以就研究了一下用法。

Makefile

Makefile 這部份沒什麼特別的。

主程式(gpiochip.c)

行 4: 這邊假設有支援到 128 個 GPIO Pins ,這個其實要設多少都可以,就看自己實際上要用到多少
行 5: 由於這邊是一個模擬範例,就將輸出的值存在一個 array
行 9: vgpio_gpio_get() 當讀取 GPIO value 時所使用的 function. 其中的 offset 也就是代表要讀取哪1根 GPIO 的值,以本例來說,範圍就是 0 ~127.
行14: vgpio_gpio_set() 設定 GPIO value 時所使的 function. 其中 offset 指定哪1個 GPIO,而 value 是其值。
行22: 此 module 的 probe function,在裡面做 GPIO driver 的註冊動作。
行25: 設定一共有幾根 GPIO PIN 可以用
行28: 設定此 driver 所用到的 memory base,由於這邊是虛擬的,所以可以隨便設。如果我們設定 0x100,就會產生 /sys/class/gpio/gpiochip256這樣一個名稱的目錄。
行29~30: 就是指定 get/set 時要呼叫的function, 也就是剛提到的 vgpio_gpio_get() / vgpio_gpio_set() 。

編譯與載入

將2個檔案放在一起後,執行 make 就可以編出 vgpio.ko 的 module 了。文末會附上檔案,方便直接使用。本文是在 Ubuntu 20.04 上測試的,舊一點的版本應該也可以用。

編譯 module

載入後就可以看到 gpiochip256 了,並下達 “echo 261 > /sys/class/gpio/export” 來指定要存取其 PIN5。

載入

與實體裝置連結

本範例只是一個框架,若要與實體裝置互動,可以在 probe 裡對硬體做設定,而在 vgpio_gpio_get() / vgpio_gpio_set() 對值做讀寫。另外這邊沒有提到的是設定 GPIO 的方向,因為實際上我沒用到,有需要的人可能需要自行查詢。

附近

GPIO Driver 範例

Leave a Reply