LoginSignup
0
1

More than 5 years have passed since last update.

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

Posted at

ファイルパス: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()などの一連の関数を使用して作業できます
新しい記述子指向のインタフェース

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1