簡単な紹介
pinctrlサブシステムの焦点は、
PIN (一部のSOC はPADと呼ばれます)の多重化と電気的特性
を設定することです。
pinctrl サブシステムが PIN を GPIO として多重化する場合
、
次に
gpio
サブ
システムが使用されます。名前が示すように、 gpioサブシステムはGPIO を初期化し、GPIO の設定などの対応するAPI関数を提供するために使用されます。
入出力については
GPIO
などの値を読み出します。
gpioサブシステムの主な目的は、ドライバー開発者が
gpio 、ドライブを
使用できるようにすることです。
開発者はデバイス ツリーに
gpio関連情報を追加すると、
ドライバーの
gpioサブシステム
によって提供される
API を使用できるようになります。
GPIO
を操作する機能により
、
Linux
カーネルはドライバー開発者を
GPIO
設定プロセスから保護し、ドライバー開発を大幅に容易にします。
送信者は
GPIOを使用します
。
1.1 、デバイスツリーのgpio情報
デバイスのノード プロパティを設定したり、カーネル内のドキュメントをクエリしたりするためのルーチンがいくつかあります。Documentation/devicetree/bindings/i2c/i2c-imx.txt には、imx プラットフォームの i2c プロパティ設定方法が説明されています。
I.MX6ULL-ALPHA
開発ボードの
UART1_RTS_B は
SDカードの検出ピン
として使用され
、UART1_RTS_Bコンプレックスは
GPIO1_IO19
として使用され、このGPIO
のハイレベルとローレベルを読み取ることで、
SDカードが挿入されているかどうかを知ることができます。まず第一に、それはそうでなければなりません
UART1_RTS_B
の
PIN を
GPIO1_IO19
として
多重化し、前のセクションで説明した電気的特性を設定します。
pinctrl
ノード。
imx6ull-alientek-emmc.dts
を開くと
、
UART1_RTS_B
PIN
の
pincrtl設定は次のようになります。
示例代码 45.2.2.1 SD 卡 CD 引脚 PIN 配置参数
316 pinctrl_hog_1: hoggrp-1 {
317 fsl,pins = <
318 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
......
322 >;
323 };
pinctrlの設定
後、
gpio
が設定され、
SD
カードドライバーは
GPIO1_IO19の値を読み取ることで
SD カード
を判断します。
カードが挿入されているかどうかはわかりますが、
SD
カード ドライバーは
CDピンが
どの GPIO1_IO19
に接続されているかをどのようにして認識するのでしょうか
? 必ず設定する必要があります
ドライバーに伝えるために木を準備してください!デバイス ツリーの
SDカード ノードの下に属性を追加して、
SDカードのCD ピン
を記述します。
示例代码 45.2.2.2 设备树中 SD 卡节点
760 &usdhc1 {
761 pinctrl-names = "default", "state_100mhz", "state_200mhz";
762 pinctrl-0 = <&pinctrl_usdhc1>;
763 pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
764 pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
765 /* pinctrl-3 = <&pinctrl_hog_1>; */
766 cd-gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;
767 keep-power-in-suspend;
768 enable-sdio-wakeup;
769 vmmc-supply = <®_sd1_vmmc>;
770 status = "okay";
771 };
cd - gpios = <& gpio1 19 GPIO_ACTIVE_LOW >;
属性「
cd-gpios
」は、
SD
カードの
CDピン
でどの
IOが使用されるかを記述します
。属性値は 3 つあります。
これら 3 つの属性値の意味を見てみましょう。「
&gpio1
」は、
CDピン
によって使用される
IO が
GPIO1グループ「19 」
に属していることを意味します。
GPIO1
グループ
の19 番目の
IO
を示します。これら 2 つの値を通じて、SDカード ドライバーはCDピンがGPIO1_IO19を使用していることを認識します。
この
GPIO
。「
GPIO_ACTIVE_LOW
」は低レベル
1
がアクティブであることを意味し、「
GPIO_ACTIVE_HIGH
」に変更された場合はアクティブであることを意味します
高レベル
0
が有効であることを示します。
コード例 45.2.2.2 gpio1 ノード504 gpio1 : gpio@0209c000 {505 互換 = "fsl,imx6ul-gpio" 、 "fsl,imx35-gpio" ;506 reg = < 0x0209c000 0x4000 >;507 割り込み = < GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH >、508 < GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH >;509 gpio - コントローラー ;510 #gpio - セル = < 2 >;511 割り込み コントローラー ; _512 #interrupt - セル = < 2 >;513 };
gpio1
ノード情報には、
GPIO1ペリフェラル レジスタ
のベース アドレスと、 GPIO1コントローラ
のすべての情報が記述されています。
互換性のあるプロパティ。
I.MX
シリーズ
SOC
の
GPIO
コントローラー バインディング情報については、ドキュメントを参照してください。
Documentation/devicetree/bindings/gpio/ fsl-imx-gpio.txt
。
行505
には
、
gpio1
ノードの 2 つの
互換性のある属性
、「
fsl,imx6ul-gpio
」と「
fsl,imx35- 」があります。
gpio
"、
Linuxカーネルでこれら 2 つの文字列を検索すると、
I.MX6ULのGPIOドライバー
を見つけることができます。
行
506 の
reg属性は
、
GPIO1コントローラーのレジスタ ベース アドレスを0X0209C000 に設定します。
行
509 の
「
gpio-controller
」は、
gpio1
ノードが
GPIO
コントローラーであることを示します。
行
510 の
「
#gpio-cells 」属性は「
#address-cells 」
と似ており
、#gpio-cells は2である必要があり、
2 つの
セル
。最初の
セルは
GPIO 番号
です
。たとえば、「&gpio1 3 」はGPIO1_IO03を意味します。2 番目のセルは次のことを表します
GPIO 極性
。
1.2 GPIO ノードをデバイス ツリーに追加する
ルート ノード「/」の下にテスト デバイスのサブノードを作成します。
pinctrl情報を追加
GPIO属性情報の追加
test {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_test>;
gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
}
2 つの GPIOドライバーの紹介
次の図は、gpio および pinctrl サブシステムのアーキテクチャ図です。
2.1 デバイスツリーから GPIO 情報を取得する方法
Linux デバイス ツリーの gpio 情報の読み取りは、Linux デバイス管理の階層化された考え方によって駆動される gpiolib ライブラリを操作することで実現されます。
- まず、gpio が配置されているデバイス ノード of_find_node_by_path を取得します。
- _get_named_gpio の GPIO 番号を取得する
- この番号の gpio gpio_request 関数をリクエストします
- gpio 入力と出力を設定する gpio_direction_input または gpio_direction_outout
- gpio 入出力値設定 gpio_get_value /gpio_set_value
2.2 GPIO API
gpio サブシステムが提供する一般的に使用される API 関数は次のとおりです。
1.
gpio_request関数
_
gpio_request関数は
GPIOピン
を申請するために使用されます
。GPIOを使用する前に必ずgpio_requestを使用してください。
適用する関数のプロトタイプは次のとおりです。
int gpio_request(unsigned gpio, const char *label)
関数のパラメータと戻り値は次の意味を持ちます。
gpio
:適用する
gpioラベル。
of_get_named_gpio関数
を使用して、デバイス ツリーから指定された
GPIO属性情報を取得します。
情報として、この関数はこのGPIO
のラベルを返します
。
label
:
gpioの
名前を設定します。
戻り値:
0
、アプリケーションは成功、その他の値、アプリケーションは失敗します。
2.
gpio_free関数
_
GPIOが使用されていない
場合は、 gpio_free関数を呼び出してGPIO を解放
できます。
関数のプロトタイプは次のとおりです。
void gpio_free(符号なし gpio)
関数のパラメータと戻り値は次の意味を持ちます。
gpio
:解放する
gpioラベル
。
戻り値:
なし。
3.
gpio_direction_input関数
_
この関数はGPIO を入力として
設定するために使用され
、関数のプロトタイプは次のとおりです。
int gpio_direction_input(符号なし gpio)
関数のパラメータと戻り値は次の意味を持ちます。
gpio
:入力として設定する
GPIO
番号。
戻り値:
0
、設定が成功した場合、負の値、設定が失敗した場合。
4.
gpio_direction_output関数
_
この関数は、 GPIO を出力として
設定し、デフォルトの出力値を設定するために使用されます
。関数のプロトタイプは次のとおりです。
int gpio_direction_output(符号なし gpio、int 値)
関数のパラメータと戻り値は次の意味を持ちます。
gpio
:出力として設定する
GPIO
番号。
value
:
GPIO
のデフォルト出力値。
戻り値:
0
、設定が成功した場合、負の値、設定が失敗した場合。
5.
gpio_get_value関数
_
この関数は、
GPIOの
値
(0
または
1)を取得するために使用されます
。定義に示すように、この関数はマクロです。
#define gpio_get_value __gpio_get_value
int __gpio_get_value(符号なし gpio)
関数のパラメータと戻り値は次の意味を持ちます。
gpio
:取得する
GPIO番号
。
戻り値:
非負の値、取得した
GPIO
値、負の値、取得失敗。
6.
gpio_set_value関数
_
この関数はGPIO
の値を設定するために使用されます
。この関数はマクロであり、次のように定義されます。
#define gpio_set_value __gpio_set_value
void __gpio_set_value(符号なし gpio、int 値)
関数のパラメータと戻り値は次の意味を持ちます。
gpio
:設定する
GPIOラベル
。
value
:
設定する値。
戻り値:
なし
これらはgpio サブシステムで一般的に使用されるAPI関数であり、私たちが最もよく使用するものです
。
gpioの動作例はプラットフォームで説明します