GPIOとは
GPIO(General-Purpose Input/Output)は、SoCとデバイスをつなげる信号線であり、基本的にHighとLowの2値のみ持ちます。LEDの点灯を出力High/Lowで制御したり、ボタンが押されたことを入力High/Lowで検出したりするのに使用されます。照度センサデバイスドライバでは使われて無さそうですが、最も基本的な信号線であり、コメントアウトされている箇所には制御している記載もあるので、その点を中心に説明します。尚、GPIOの信号線は、モードを切り替えることで、I2C等の他の用途の信号線としても使えるようになっていることが一般的です。
GPIOには、入出力High/Lowの制御を行うgpiolibと、モード等の設定変更を行うpinctrlの2種類のAPI群が用意されているので、それぞれについて説明します。
gpiolibの使い方
gpiolibは、High/Lowの制御を行うAPI群です。照度センサデバイスドライバでは、コメントアウトされてますが、以下に使用箇所があります。
kernel/mediatek/4.4/drivers/misc/mediatek/sensors-1.0/alsps/ltr578/ltr578.c
gpio_request(ints[0], "p-sensor");
この関数は以下に定義があります。
kernel/mediatek/4.4/drivers/gpio/gpiolib-legacy.c
int gpio_request(unsigned gpio, const char *label)
第2引数の任意の文字列にて、第1引数のGPIOポートに対して、占有権を取得します。その他のgpiolibの主要な関数には、以下のようなものがあります。
kernel/mediatek/4.4/include/asm-generic/gpio.h
static inline int gpio_direction_input(unsigned gpio)
第1引数のGPIOポートの向きを入力に設定します。
static inline int gpio_get_value(unsigned int gpio)
第1引数のGPIOポートの値(High/Low)を読み込みます。
static inline int gpio_direction_output(unsigned gpio, int value)
第1引数のGPIOポートの向きを出力に設定の上、第2引数の値(High/Low)の設定をします。
pinctrlの使い方
pinctrlはGPIOの設定変更を行うAPI群です。照度センサデバイスドライバでは、コメントアウトされてますが、以下に使用箇所があります。
kernel/mediatek/4.4/drivers/misc/mediatek/sensors-1.0/alsps/ltr578/ltr578.c
pins_cfg = pinctrl_lookup_state(pinctrl, "pin_cfg");
この関数は以下に定義があります。
kernel/mediatek/4.4/drivers/pinctrl/core.c
/**
* pinctrl_lookup_state() - retrieves a state handle from a pinctrl handle
* @p: the pinctrl handle to retrieve the state from
* @name: the state name to retrieve
*/
struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p,
const char *name)
5.10 で説明した設定値を持っているdevicetreeから、第2引数の文字列にマッチした設定値を読み込みます。この読み込んだ設定値を実際に設定する関数が以下になります。
/**
* pinctrl_select_state() - select/activate/program a pinctrl state to HW
* @p: the pinctrl handle for the device that requests configuration
* @state: the state handle to select/activate/program
*/
int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
尚、devicetreeに設定する名前が以下に定義されている名称の場合は、5.2 で説明しているprobeの前の、pinctrl_bind_pins
等で設定されるケースがあるので注意が必要です。
kernel/mediatek/4.4/include/linux/pinctrl/pinctrl-state.h
#define PINCTRL_STATE_DEFAULT "default"
#define PINCTRL_STATE_INIT "init"
#define PINCTRL_STATE_IDLE "idle"
#define PINCTRL_STATE_SLEEP "sleep"
最後に
High/Lowの制御を行うgpiolibと、モード等の設定変更を行うpinctrlについて説明しました。どちらのAPIからでも同じことができる被っている所も実はあります。こういったときは、設定をしているのか制御をしているのかをベースに、使い分けするのをおすすめします。
コメント