Raspberrypi3のカーネルソース内のDocumentを読む

ファイルパス：linux/Documentation/gpio
ファイル名：board.txt

GPIOマッピング
=============

このドキュメントでは、特定のデバイスや機能にGPIOを割り当てる方法について説明します。
新しいディスクリプタベースのインターフェイスにのみ適用されることに注意してください。のために
推奨されていない整数ベースのGPIOインタフェースの説明を参照してください。
gpio-legacy.txt（実際には、古いものと実際にマッピングすることはできません
インタフェース;あなたはちょうどどこかから整数を取り出し、
対応するGPIO）。

すべてのプラットフォームでGPIOライブラリを有効にできますが、プラットフォームが厳密に
GPIO機能が必要ですが、GPIOLIBを
Kconfig。次に、GPIOがどのようにマッピングされるかは、プラットフォームが
そのハードウェアレイアウトについて説明します。現在、デバイスを介してマッピングを定義することができます
ツリー、ACPI、およびプラットフォームのデータです。

デバイスツリー
-----------
GPIOは、デバイスツリー内のデバイスや機能に簡単にマッピングできます。ザ
それを行う正確な方法は、GPIOを提供するGPIOコントローラに依存します。
あなたのコントローラのデバイスツリーバインディング

GPIOマッピングは、コンシューマデバイスのノード内で、
<function> -gpios、<function>はドライバが要求する関数です
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>;
	};

<function> -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接尾辞の<function> -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（）などの一連の関数を使用して作業できます
新しい記述子指向のインタフェース