i.MX6ULL(19) linux gpio サブシステム

簡単な紹介

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 = <&reg_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.MX6ULGPIOドライバー を見つけることができます。
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 サブシステムのアーキテクチャ図です。 

画像-20230415163259138

2.1 デバイスツリーから GPIO 情報を取得する方法

Linux デバイス ツリーの gpio 情報の読み取りは、Linux デバイス管理の階層化された考え方によって駆動される gpiolib ライブラリを操作することで実現されます。

  1.  まず、gpio が配置されているデバイス ノード of_find_node_by_path を取得します。
  2.  _get_named_gpio の GPIO 番号を取得する 
  3.  この番号の gpio gpio_request 関数をリクエストします
  4.  gpio 入力と出力を設定する gpio_direction_input または gpio_direction_outout
  5.  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の動作例はプラットフォームで説明します

おすすめ

転載: blog.csdn.net/TyearLin/article/details/131949306
おすすめ