ファイルパス:linux/Documentation/gpio
ファイル名:board.txt
GPIOマッピング
このドキュメントでは、特定のデバイスや機能にGPIOを割り当てる方法について説明します。
新しいディスクリプタベースのインターフェイスにのみ適用されることに注意してください。のために
推奨されていない整数ベースのGPIOインタフェースの説明を参照してください。
gpio-legacy.txt(実際には、古いものと実際にマッピングすることはできません
インタフェース;あなたはちょうどどこかから整数を取り出し、
対応するGPIO)。
すべてのプラットフォームでGPIOライブラリを有効にできますが、プラットフォームが厳密に
GPIO機能が必要ですが、GPIOLIBを
Kconfig。次に、GPIOがどのようにマッピングされるかは、プラットフォームが
そのハードウェアレイアウトについて説明します。現在、デバイスを介してマッピングを定義することができます
ツリー、ACPI、およびプラットフォームのデータです。
デバイスツリー
GPIOは、デバイスツリー内のデバイスや機能に簡単にマッピングできます。ザ
それを行う正確な方法は、GPIOを提供するGPIOコントローラに依存します。
あなたのコントローラのデバイスツリーバインディング
GPIOマッピングは、コンシューマデバイスのノード内で、
-gpios、はドライバが要求する関数です
gpiod_get()を使用します。例えば:
foo_device {
compatible = "acme,foo";
...
led-gpios = <&gpio 15 GPIO_ACTIVE_HIGH>, /* red */
<&gpio 16 GPIO_ACTIVE_HIGH>, /* green */
<&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */
power-gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
};
-gpioという名前のプロパティも有効とみなされ、古いバインディングが使用されます
それは互換性の理由でのみサポートされているため、
より新しいバインディングは推奨されなくなりました。
このプロパティは、GPIO 15,16、および17を
"led"関数、GPIO 1は "power" GPIO:
struct gpio_desc * red、* green、* blue、* power;
赤= gpiod_get_index(dev、 "led"、0、GPIOD_OUT_HIGH);
緑= gpiod_get_index(dev、 "led"、1、GPIOD_OUT_HIGH);
青= gpiod_get_index(dev、 "led"、2、GPIOD_OUT_HIGH);
パワー= gpiod_get(dev、 "power"、GPIOD_OUT_HIGH);
LEDのGPIOはアクティブハイになり、一方、パワーGPIOはアクティブローになります(つまり、
gpiod_is_active_low(power)がtrueになります)。
gpiod_get()関数の2番目のパラメータであるcon_id文字列は、
GPIO接尾辞の -prefix( "gpios"または "gpio"、自動的に
デバイスツリーで使用されるgpiod関数を内部的に参照)。上記の
"led-gpios"の例では、con_idパラメータに " - "を付けずにプレフィックスを使用します: "led"。
内部的に、GPIOサブシステムはGPIOサフィックス( "gpios"または "gpio")
結果の文字列を得るために文字列をcon_idで渡します
(snprintf(... "%s-%s"、con_id、gpio_suffixes [])。
ACPI
ACPIは、DTと同様にGPIOの関数名もサポートしています。
上記のDTの例は、同等のACPI記述に変換することができます
ACPI 5.1で導入された_DSD(Device Specific Data)の助けを借りて、
Device (FOO) {
Name (_CRS, ResourceTemplate () {
GpioIo (Exclusive, ..., IoRestrictionOutputOnly,
"\\_SB.GPI0") {15} // red
GpioIo (Exclusive, ..., IoRestrictionOutputOnly,
"\\_SB.GPI0") {16} // green
GpioIo (Exclusive, ..., IoRestrictionOutputOnly,
"\\_SB.GPI0") {17} // blue
GpioIo (Exclusive, ..., IoRestrictionOutputOnly,
"\\_SB.GPI0") {1} // power
})
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {
"led-gpios",
Package () {
^FOO, 0, 0, 1,
^FOO, 1, 0, 1,
^FOO, 2, 0, 1,
}
},
Package () {
"power-gpios",
Package () {^FOO, 3, 0, 0},
},
}
})
}
ACPI GPIOバインディングの詳細については、
Documentation / acpi / gpio-properties.txt。
プラットフォームデータ
最後に、GPIOはプラットフォームデータを使用してデバイスや機能に結合することができます。 ボード
そうしたいファイルには、次のヘッダーを含める必要があります。
#include <linux/gpio/machine.h>
GPIOはルックアップのテーブルによってマップされ、
gpiod_lookup構造体。 このようなマッピングを宣言するのに役立つ2つのマクロが定義されています。
GPIO_LOOKUP(chip_label, chip_hwnum, con_id, flags)
GPIO_LOOKUP_IDX(chip_label, chip_hwnum, con_id, idx, flags)
where
- chip_labelは、GPIOを提供するgpiod_chipインスタンスのラベルです
- chip_hwnumは、チップ内のGPIOのハードウェア番号です
- con_idは、デバイスの観点からみたGPIO関数の名前です。 それ NULLにすることができます。その場合は、すべての関数に一致します。
- idxは、関数内のGPIOのインデックスです。
- flagsは以下のプロパティを指定するために定義されます:
- GPIOF_ACTIVE_LOW - GPIOをアクティブローに設定する
- GPIOF_OPEN_DRAIN - GPIOピンはオープンドレインタイプです。
- GPIOF_OPEN_SOURCE - GPIOピンはオープンソースタイプです。
将来、これらのフラグを拡張してより多くのプロパティをサポートすることができます。
GPIO_LOOKUP()はGPIO_LOOKUP_IDX()のidx = 0へのショートカットです。
次にルックアップテーブルを次のように定義することができます。
終わり。 テーブルの 'dev_id'フィールドは、デバイスの識別子です。
これらのGPIOを利用する。 NULLにすることもできます。その場合は、
NULLデバイスでgpiod_get()を呼び出します。
struct gpiod_lookup_table gpios_table = {
.dev_id = "foo.0",
.table = {
GPIO_LOOKUP_IDX("gpio.0", 15, "led", 0, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP_IDX("gpio.0", 16, "led", 1, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP_IDX("gpio.0", 17, "led", 2, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio.0", 1, "power", GPIO_ACTIVE_LOW),
{ },
},
};
テーブルはボードコードで次のように追加することができます:
gpiod_add_lookup_table(&gpios_table);
"foo.0"を制御するドライバは、次のようにGPIOを取得することができます:
struct gpio_desc *red, *green, *blue, *power;
red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);
blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);
power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);
「導かれた」GPIOはアクティブハイとしてマップされるので、この例では、
信号を1に、すなわちLEDをイネーブルにする。 また、マップされた「電源」GPIO
アクティブローとして、このコードの後、その実際の信号は0になります。 これとは対照的に
レガシー整数GPIOインタフェースでは、アクティブローのプロパティは、
GPIOコンシューマにとって透過的です。
gpiod_set_value()などの一連の関数を使用して作業できます
新しい記述子指向のインタフェース