ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2013年6月4日 星期二

worklog: linux gpiolib, interface between kernel and user space

不知道幾版的 linux kernel 開始有 gpiolib 的 support。
需要的 kernel configs:
CONFIG_ARCH_REQUIRE_GPIOLIB
CONFIG_GPIOLIB
CONFIG_GPIO_SYSFS
這樣的 kernel (加上 chip 有 implement 自己的 gpio driver),就可以使用一般化的 gpio function 控制 gpio。

Kernel document gpio.txt 有使用說明。

這個 driver 的名稱叫 gpiolib (driver/gpio/gpiolib.c)

driver 分成 kernel 使用 和 user space 使用。


kernel 使用: #define nLCD0_EN (6*32 + 10) /* GPIO_7_10 */ gpio_request(nLCD0_EN, "nLCD0_EN"); gpio_direction_output(nLCD0_EN, 0); gpio_set_value(nLCD0_EN,0); gpio_export(nLCD0_EN,0);
gpio 用數字來代表,所以implement gpio driver 時,要把chip 的 gpio pin 一般化成數字 index。

之後,就是用..
  • request : 向 driver 要求使用 gpio
  • direction : 設定 gpio input or output
  • set_value : 設定 gpio high/low
  • export : 設定該 gpio 可以 export 到 user space (sysfs) 讓 user space 使用
當然,這些code 只有包含 software 層,實際上 gpio pin 如果是多工,kernel 就要自己設定好 pin 的 multiplex。

之後 kernel 的使用就可以用 gpio_set_value(-number-,value) 來設定。


User Space 使用:
這是用 sysfs 提供 user space 控制的 interface。
/sys/class/gpio/

這個 目錄 ls 會是:
export
unexport
gpiochip0
gpiochip32
gpiochip64
gpiochip96
gpiochip128
gpiochip160
gpiochip192
gpio202
gpio198
gpio201
其中:
  • export : 把數字寫入這裡,就可以作 request 的動作
  • unexport : 和 export 相反,把數字寫進入,就會 unregister 該 gpio
  • gpiochipXXX : 有些 gpio 的 控制是 chip(group) 的,就用這個 interface
  • gpioXXX : kernel 或 user export 出來的 gpio,每個gpio 會有一個 node (folder)
gpio 的控制就要經由 gpioXXX 目錄來作:
#echo 1 > gpio202/value 設定 gpio202 為 High

echo 0 就是 low。


如果gpio 在 kernel request,但是 kernel 沒有呼叫 export 把該 gpio export 出來,在 /sys/class/gpio 下就不會出現。
同時,user space 要利用 export 把該 gpio export 也不可能 (因為kernel 已經用了)。

所以 kernel, user space 要共同控制 gpio 的話,就要由 kernel 作 gpio_request,同時要呼叫 gpio_export 把 該 gpio export 出來。


ref:

沒有留言:

標籤

網誌存檔