需要的 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 使用
之後 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)
#echo 1 > gpio202/value
設定 gpio202 為 Highecho 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:
- http://www.support.emtrion.de/doku.php?id=linux:linux_gpio-emdist-23
- http://brew-j2me.blogspot.tw/2010/03/linux-accessing-gpio-from-user-space.html
- http://armbedded.eu/node/258
- https://developer.ridgerun.com/wiki/index.php/How_to_use_GPIO_signals
- http://www.linux.com/learn/tutorials/765810-beaglebone-black-how-to-get-interrupts-through-linux-gpio
沒有留言:
張貼留言