Armadilloフォーラム

GPIO関連のデバイスツリーの変更方法について

masa.yamaguchi

2025年6月19日 16時37分

==========
製品型番:
Debian/ABOSバージョン:3.21.3-at.12
カーネルバージョン:5.10.237-at0
3G/LTE モジュール情報 (Debianのみ):
その他:
==========

■ 概要
オーディオコーデック(TLV320AIC3110)のハードウェアリセットを行うため、
デバイスツリーの修正によりGPIOピンの機能設定を変更する方法についてご教示ください。

■ 課題の背景
現状: 特定のGPIOピンが、オーディオコーデック:TLV320AIC3110のリセット用として割り当てられています。
課題: このリセット用GPIOピンは、既存のドライバによって制御されているため、それとは独立したリセット手段を確保したいと考えています。
対応案: 現在使用しているピンとは別に、追加のGPIOピンをリセット用として割り当て、
    既存のピンの操作に影響されずにオーディオコーデックのリセットを実現したいです。

■ ご教示いただきたい内容
上記の対応案を実現するため、デバイスツリーを修正し、新たに追加するGPIOピンを「オープンドレイン出力」として設定する必要があります。
この具体的な設定変更の方法について、ご教示いただきたいです。

コメント

at_shota.shimoyama

2025年6月19日 19時27分

アットマークテクノの下山です。

例えば、DTS(armadillo-600-customize.dts)に次のように記載すると、CON2のピン63を100kΩ内部プルアップのオープンドレイン出力として設定することができます。

// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/*
 * Copyright (C) 2023 Atmark Techno, Inc. All Rights Reserved.
 */
 
/dts-v1/;
/plugin/;
 
#include <dt-bindings/clock/imx6ul-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
 
#include "imx6ul-pinfunc.h"
#include "imx6ull-pinfunc.h"
#include "imx6ull-pinfunc-snvs.h"
 
&pinctrl_customize {
	fsl,pins = <
		MX6UL_PAD_CSI_DATA03__GPIO4_IO24    0x4000b8b0 // CON2_63
	>;
};

■pinctrl_customizeノード
pinctrl_customizearmadillo-610.dts内で定義されているノードで、pinctrl-0の値として設定されています。
ですので、このように&pinctrl_customize内にピンのレジスタ設定を記載することで、起動時にその設定が自動的に適用されます。

基本的にはこのような形で記載していただき、設定したいピンやレジスタの内容に応じて、fsl,pins = < ... > の中身を変更してください。

■ピンの指定
fsl,pins = < ... > の中身は、以下のように左側に対象のピンの指定、右側に PAD Control Register に書き込む値を指定します。

MX6UL_PAD_CSI_DATA03__GPIO4_IO24    0x4000b8b0 // CON2_63

左側は使用したいピンに応じて以下の中から選んでください

MX6UL_PAD_UART1_RTS_B__GPIO1_IO19    // CON2_11
MX6UL_PAD_CSI_MCLK__GPIO4_IO17       // CON2_12
MX6UL_PAD_GPIO1_IO04__GPIO1_IO04     // CON2_14
MX6UL_PAD_GPIO1_IO03__GPIO1_IO03     // CON2_15
MX6UL_PAD_GPIO1_IO02__GPIO1_IO02     // CON2_16
MX6UL_PAD_GPIO1_IO01__GPIO1_IO01     // CON2_17
MX6UL_PAD_LCD_DATA00__GPIO3_IO05     // CON2_18
MX6UL_PAD_LCD_DATA01__GPIO3_IO06     // CON2_19
MX6UL_PAD_LCD_DATA02__GPIO3_IO07     // CON2_20
MX6UL_PAD_LCD_DATA03__GPIO3_IO08     // CON2_21
MX6UL_PAD_LCD_DATA04__GPIO3_IO09     // CON2_22
MX6UL_PAD_LCD_DATA05__GPIO3_IO10     // CON2_23
MX6UL_PAD_LCD_DATA06__GPIO3_IO11     // CON2_24
MX6UL_PAD_LCD_DATA07__GPIO3_IO12     // CON2_25
MX6UL_PAD_LCD_DATA08__GPIO3_IO13     // CON2_26
MX6UL_PAD_LCD_DATA09__GPIO3_IO14     // CON2_27
MX6UL_PAD_LCD_DATA10__GPIO3_IO15     // CON2_28
MX6UL_PAD_LCD_DATA11__GPIO3_IO16     // CON2_29
MX6UL_PAD_LCD_DATA12__GPIO3_IO17     // CON2_30
MX6UL_PAD_LCD_DATA13__GPIO3_IO18     // CON2_31
MX6UL_PAD_LCD_DATA14__GPIO3_IO19     // CON2_32
MX6UL_PAD_LCD_DATA15__GPIO3_IO20     // CON2_33
MX6UL_PAD_LCD_DATA16__GPIO3_IO21     // CON2_34
MX6UL_PAD_LCD_DATA17__GPIO3_IO22     // CON2_35
MX6UL_PAD_LCD_CLK__GPIO3_IO00        // CON2_37
MX6UL_PAD_LCD_HSYNC__GPIO3_IO02      // CON2_38
MX6UL_PAD_LCD_VSYNC__GPIO3_IO03      // CON2_39
MX6UL_PAD_LCD_ENABLE__GPIO3_IO01     // CON2_40
MX6UL_PAD_NAND_DQS__GPIO4_IO16       // CON2_41
MX6UL_PAD_CSI_VSYNC__GPIO4_IO19      // CON2_55
MX6UL_PAD_CSI_HSYNC__GPIO4_IO20      // CON2_56
MX6UL_PAD_CSI_DATA04__GPIO4_IO25     // CON2_57
MX6UL_PAD_CSI_DATA05__GPIO4_IO26     // CON2_58
MX6UL_PAD_CSI_DATA06__GPIO4_IO27     // CON2_59
MX6UL_PAD_CSI_DATA07__GPIO4_IO28     // CON2_60
MX6UL_PAD_CSI_DATA02__GPIO4_IO23     // CON2_61
MX6UL_PAD_CSI_DATA01__GPIO4_IO22     // CON2_62
MX6UL_PAD_CSI_DATA03__GPIO4_IO24     // CON2_63
MX6UL_PAD_CSI_DATA00__GPIO4_IO21     // CON2_64
MX6UL_PAD_CSI_PIXCLK__GPIO4_IO18     // CON2_65
MX6UL_PAD_NAND_DATA07__GPIO4_IO09    // CON2_66
MX6UL_PAD_NAND_DATA06__GPIO4_IO08    // CON2_67
MX6UL_PAD_NAND_DATA05__GPIO4_IO07    // CON2_68
MX6UL_PAD_NAND_DATA04__GPIO4_IO06    // CON2_69
MX6UL_PAD_LCD_DATA23__GPIO3_IO28     // CON2_70
MX6UL_PAD_LCD_DATA22__GPIO3_IO27     // CON2_71
MX6UL_PAD_LCD_DATA21__GPIO3_IO26     // CON2_72
MX6UL_PAD_LCD_DATA20__GPIO3_IO25     // CON2_73
MX6UL_PAD_LCD_DATA19__GPIO3_IO24     // CON2_74
MX6UL_PAD_LCD_DATA18__GPIO3_IO23     // CON2_76
MX6UL_PAD_GPIO1_IO08__GPIO1_IO08     // CON2_80
MX6UL_PAD_GPIO1_IO05__GPIO1_IO05     // CON2_81
MX6UL_PAD_UART5_TX_DATA__GPIO1_IO30  // CON2_82
MX6UL_PAD_UART1_TX_DATA__GPIO1_IO16  // CON2_83
MX6UL_PAD_UART5_RX_DATA__GPIO1_IO31  // CON2_84
MX6UL_PAD_UART1_RX_DATA__GPIO1_IO17  // CON2_85
MX6UL_PAD_UART2_RTS_B__GPIO1_IO23    // CON2_86
MX6UL_PAD_UART2_CTS_B__GPIO1_IO22    // CON2_87
MX6UL_PAD_UART2_RX_DATA__GPIO1_IO21  // CON2_88
MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20  // CON2_89
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00     // CON2_90
MX6UL_PAD_UART3_CTS_B__GPIO1_IO26    // CON2_91
MX6UL_PAD_UART3_RTS_B__GPIO1_IO27    // CON2_92
MX6UL_PAD_UART3_RX_DATA__GPIO1_IO25  // CON2_93
MX6UL_PAD_UART3_TX_DATA__GPIO1_IO24  // CON2_94

■PAD Control Registerに書き込む値の指定
PAD Control Register のフィールドの詳細はNXPの i.MX 6ULL Applications Processor Reference Manual に記載があります。

例えばCON2のピン63の場合、SoCのCSI_DATA03と繋がっているので、SW_PAD_CTL_PAD_CSI_DATA03 SW PAD Control Register (IOMUXC_SW_PAD_CTL_PAD_CSI_DATA03)の項目のところにフィールドの詳細が記載されています。
ただ、ピンごとにPAD Control Registerは異なるのですが、フィールドの内容は上記のピン全てにおいて共通です。

PAD Control Registerのデフォルトの値は0x000010b0(0b 0...0 0001 0000 1011 0000)になっていて、
オープンドレイン出力を有効にするためには、Field 11 (ODE) を1にします ⇒ 0b 0...0 0001 1000 1011 0000

もし、内部プルアップを有効にする場合は、Field 13 (PUE) を1にします ⇒ 0b 0...0 0011 1000 1011 0000
プルアップ・プルダウン抵抗はField 15-14 (PUS) で設定します ↓
00: 100kΩプルダウン
01: 47kΩプルアップ
10: 100kΩプルアップ
11: 22kΩプルアップ
例えば100kΩプルアップの場合は、⇒ (0x0000b8b0)0b 0...0 1011 1000 1011 0000

上の例では0x4000b8b0と記載していますが、0x4...はPAD Control Registerに書き込む値ではなく、SIONの機能を有効にするためのものです
基本的にはSIONを有効にすることを推奨します

もし、内部プルアップを使わない場合は、Keeperを無効にするためにField 12 (PKE) を0にしてください ⇒ 0b 0...0 0000 1000 1011 0000
Keeperはピンの電圧をHighかLowかに固定する(中間の電位を作らない)ための機能なのですが、外部プルアップ抵抗が大きすぎると勝手にLowに引き下げようとするなどの妨げになりますので、無効にすることを推奨します。

まとめると、右側の PAD Control Register に書き込む値は、
オープンドレイン出力(通常)         ⇒ 0x400008b0
オープンドレイン出力(100kΩ内部プルアップ) ⇒ 0x4000b8b0
などを記載してください

よろしくお願いします。

アットマークテクノの下山 様

masa.yamaguchiです。ご回答ありがとうございます。

ご回答いただいた内容につきまして、以下お伺いしたいことがございます。

【現状と目的】
現状、オーディオコーデックのリセット信号用に、特定のGPIOピン(例:89番ピン)を使用しています。
この度、ハードウェアの構成変更に伴い、新たにもう一つのGPIOピン(例:90番ピン)を追加し、
これら2つのピン(89番、90番)を同時にリセット制御に使用したいと考えております。
( 両ピンの電気的仕様は、オープンドレイン出力(100kΩ内部プルアップ)とすることを想定 )

【質問事項】
この変更を実現するため、デバイスツリーのpinctrlノードを以下のように修正することを検討しています。

&pinctrl_customize {
	fsl,pins = <
		/* CON2_89: 既存のリセット用ピン */
		MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20      0x4000b8b0 
 
		/* CON2_90: 追加するリセット用ピン */
		MX6UL_PAD_UART2_CTS_B__GPIO1_IO22        0x4000b8b0 
	>;
};

上記pinctrlの設定変更のみで、追加したピン(例:90番ピン)のGPIOを操作してオーディオコーデックのリセットは可能になりますでしょうか。

あるいは、上記に加えて、オーディオコーデックのドライバに対し、追加したピンもリセット制御用であることを関連付けるための記述
(例えば、コーデックデバイスノード内のreset-gpiosプロパティへの追記など)が別途必要となりますでしょうか。

at_shota.shimoyama

2025年6月23日 14時23分

masa.yamaguchi 様

> 上記pinctrlの設定変更のみで、追加したピン(例:90番ピン)のGPIOを操作してオーディオコーデックのリセットは可能になりますでしょうか。
はい、可能になります

> あるいは、上記に加えて、オーディオコーデックのドライバに対し、追加したピンもリセット制御用であることを関連付けるための記述
> (例えば、コーデックデバイスノード内のreset-gpiosプロパティへの追記など)が別途必要となりますでしょうか。

いいえ、必要ありません
reset-gpiosプロパティへ追記してしまうと、結局ドライバがそのgpioを占有してしまいますので、追加したピンもリセット制御用であることを関連付けるための記述は不要です

何かご不明な点がございましたら遠慮なくお聞きください

よろしくお願いします

アットマークテクノの下山 様

masa.yamaguchiです。ご回答ありがとうございます。

以下デバイスツリー修正を実施してカーネルswuを作成しました。
---------
 ・オープンドレイン出力(100kΩ内部プルアップ)のデバイスツリー修正(87/89番号PIN)→上記で確認させて頂いた分
 ・追加修正した87番PINが別途定義ししてあったため、定義箇所の削除を行いました。(armadillo-610-at-dtweb.dts )
---------
上記につきまして以下お伺いしたいがございます。
修正後のカーネルswuを書き込んだ後の、gpioinfo実行結果はどのようになるのが想定通りかご教示頂きたいです。
→ オープンドレイン出力(100kΩ内部プルアップ) に設定されていること確認したい為お伺いしております(確認が可能であれば)。
→ 尚、こちらで実行した結果は、添付資料:デバイスツリー修正20250624_01.txt に記載ししております。

ファイル ファイルの説明
デバイスツリー修正20250624_01.txt

at_shota.shimoyama

2025年6月24日 15時34分

masa.yamaguchi 様

情報を詳細にご提示いただきありがとうございます
想定されるgpioinfoの実行結果は、添付いただいたファイルのとおり、
gpiochip0line 22inputで、consumer=もいないはずです。(何のドライバーにも割り当てられていないので)
一方で、ドライバのノードのreset-gpiosで指定したピンについてはconsumer=が登録されているはずです(添付いただいたファイルのconsumer=tlv320aic3110-reset)

> → オープンドレイン出力(100kΩ内部プルアップ) に設定されていること確認したい為お伺いしております(確認が可能であれば)。
オープンドレイン出力(100kΩ内部プルアップ) に設定されているかをソフトで確認する方法はおそらく無いと思います。

私の方では、オープンドレイン出力(100kΩ内部プルアップ)に設定されたかどうかはハードで確認しました。↓

対象のピンとGNDの間に約7kΩの抵抗を当てて、出力をHighに設定した際の対象のピンの電圧を確認
・期待される電圧
 ⇒ 100kΩと7kΩによる分圧(約0.2V)
・プッシュプル時の挙動
 ⇒ 3.3V

前者の電圧を確認できたので、オープンドレイン出力(100kΩ内部プルアップ)に設定できていると断定しました。

よろしくお願いします

at_shota.shimoyama

2025年6月24日 15時58分

すみません、追記です。

添付いただいたファイルの修正後を見ると、本来消えてはいけないはずなのですが、line 20のconsumer=が消えていますね…

既に他の箇所でMX6UL_PAD_UART2_TX_DATA__GPIO1_IO20の記述はないでしょうか?

アットマークテクノの下山 様

masa.yamaguchiです。ご回答ありがとうございます。

添付いただいたファイルの修正後を見ると、本来消えてはいけないはずなのですが、line 20のconsumer=が消えていますね…
 
既に他の箇所でMX6UL_PAD_UART2_TX_DATA__GPIO1_IO20の記述はないでしょうか?

確認したところ、同じファイルに 「MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20」がありました。
リセットPINの定義と思われますが、ここでは 想定する オープンドレイン出力(100kΩ内部プルアップ) とは異なる値(0x400010b0)
が設定してありました。
この場合、 両方値をそろえるのでしょうか(どちらも 0x4000b8b0 で統一)。
それとも「pinctrl_tlv320aic3110_reset: tlv320aic3110_reset_grp{ ...};」の個所を丸ごと消したほうがよろしいでしょうか。

&iomuxc {
・・・・・・・・・・
	pinctrl_tlv320aic3110_reset: tlv320aic3110_reset_grp {
		fsl,pins = <
			MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0x400010b0
		>;
	};
};

上記以外にも「MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20」はございましたが対象外と判断いたしまいた。
詳細については添付資料「dtsファイル定義重複確認_20250626.txt」に記載しております。
→内容にこちらの誤認識がございましたら、コメント頂けますと幸いです。

ファイル ファイルの説明
dtsファイル定義重複確認_20250626.txt

at_shota.shimoyama

2025年6月26日 10時23分

masa.yamaguchi 様

fsl,pins = < ... >;の設定で同じピンの重複があると、それらが競合してしまいドライバー側がそのピンを取得できなくなってしまいます。
ですので、特定のピンに対するfsl,pins = < ... >;の設定は1つだけになるようにする必要があります。

今回の場合は、既に記載のあるpinctrl_tlv320aic3110_reset: tlv320aic3110_reset_grp { ... };に加えて、&pinctrl_customize { ... };で同じピンに対する設定がされたため、競合してオーディオコーデックドライバーがそのピンを取得できなかった(consumer=が消えた)のだと思います。

「現在使用しているピンとは別に、追加のGPIOピンをリセット用として割り当て、既存のピンの操作に影響されずにオーディオコーデックのリセットを実現」という観点では、既に記載のあるピンの設定内容だけオープンドレインに変更するのが妥当だと思いますので、

pinctrl_tlv320aic3110_reset: tlv320aic3110_reset_grp { ... };については数値の部分だけ変えて、

&iomuxc {
・・・・・・・・・・
	pinctrl_tlv320aic3110_reset: tlv320aic3110_reset_grp {
		fsl,pins = <
			MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0x4000b8b0
		>;
	};
};

&pinctrl_customizeについては、追加するリセット用ピンだけにしてください

&pinctrl_customize {
	fsl,pins = <
		/* CON2_90: 追加するリセット用ピン */
		MX6UL_PAD_UART2_CTS_B__GPIO1_IO22        0x4000b8b0 
	>;
};

上記の変更でgpioinfo -c gpiochip0のline 20にconsumer=...が再び戻るかどうかご確認いただけますでしょうか?

よろしくお願いします。

アットマークテクノの下山 様

masa.yamaguchiです。ご回答ありがとうございます。

上記の変更でgpioinfo -c gpiochip0のline 20にconsumer=...が再び戻るかどうかご確認いただけますでしょうか?

ご提示いただいた修正を適用して確認したところ、上記の変更で
gpioinfo -c gpiochip0のline 20に「consumer=tlv320aic3110-reset」が再び戻るようになったことを確認しました。

詳細は修正後gpioinfo_20250627.txt に記載しております。
現状特に問題が無いと思われますが、気になる点・更なる調査が必要な点等ございましたら、コメントいただけますと幸いです。

ファイル ファイルの説明
修正後gpioinfo_20250627.txt