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ピンを「オープンドレイン出力」として設定する必要があります。
この具体的な設定変更の方法について、ご教示いただきたいです。
コメント
masa.yamaguchi
アットマークテクノの下山 様
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
masa.yamaguchi 様
> 上記pinctrlの設定変更のみで、追加したピン(例:90番ピン)のGPIOを操作してオーディオコーデックのリセットは可能になりますでしょうか。
はい、可能になります
> あるいは、上記に加えて、オーディオコーデックのドライバに対し、追加したピンもリセット制御用であることを関連付けるための記述
> (例えば、コーデックデバイスノード内のreset-gpiosプロパティへの追記など)が別途必要となりますでしょうか。
いいえ、必要ありません
reset-gpiosプロパティへ追記してしまうと、結局ドライバがそのgpioを占有してしまいますので、追加したピンもリセット制御用であることを関連付けるための記述は不要です
何かご不明な点がございましたら遠慮なくお聞きください
よろしくお願いします
masa.yamaguchi
アットマークテクノの下山 様
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
masa.yamaguchi 様
情報を詳細にご提示いただきありがとうございます
想定されるgpioinfoの実行結果は、添付いただいたファイルのとおり、
gpiochip0
のline 22
がinput
で、consumer=
もいないはずです。(何のドライバーにも割り当てられていないので)
一方で、ドライバのノードのreset-gpios
で指定したピンについてはconsumer=
が登録されているはずです(添付いただいたファイルのconsumer=tlv320aic3110-reset)
> → オープンドレイン出力(100kΩ内部プルアップ) に設定されていること確認したい為お伺いしております(確認が可能であれば)。
オープンドレイン出力(100kΩ内部プルアップ) に設定されているかをソフトで確認する方法はおそらく無いと思います。
私の方では、オープンドレイン出力(100kΩ内部プルアップ)に設定されたかどうかはハードで確認しました。↓
対象のピンとGNDの間に約7kΩの抵抗を当てて、出力をHighに設定した際の対象のピンの電圧を確認
・期待される電圧
⇒ 100kΩと7kΩによる分圧(約0.2V)
・プッシュプル時の挙動
⇒ 3.3V
前者の電圧を確認できたので、オープンドレイン出力(100kΩ内部プルアップ)に設定できていると断定しました。
よろしくお願いします
at_shota.shimoyama
masa.yamaguchi
アットマークテクノの下山 様
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
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
アットマークテクノの下山 様
masa.yamaguchiです。ご回答ありがとうございます。
上記の変更でgpioinfo -c gpiochip0のline 20にconsumer=...が再び戻るかどうかご確認いただけますでしょうか?
ご提示いただいた修正を適用して確認したところ、上記の変更で
gpioinfo -c gpiochip0のline 20に「consumer=tlv320aic3110-reset」が再び戻るようになったことを確認しました。
詳細は修正後gpioinfo_20250627.txt に記載しております。
現状特に問題が無いと思われますが、気になる点・更なる調査が必要な点等ございましたら、コメントいただけますと幸いです。
ファイル | ファイルの説明 |
---|---|
修正後gpioinfo_20250627.txt |
at_shota.shimoyama
2025年6月19日 19時27分
アットマークテクノの下山です。
例えば、DTS(armadillo-600-customize.dts)に次のように記載すると、CON2のピン63を100kΩ内部プルアップのオープンドレイン出力として設定することができます。
■pinctrl_customizeノード
pinctrl_customize
はarmadillo-610.dts
内で定義されているノードで、pinctrl-0の値として設定されています。ですので、このように
&pinctrl_customize
内にピンのレジスタ設定を記載することで、起動時にその設定が自動的に適用されます。基本的にはこのような形で記載していただき、設定したいピンやレジスタの内容に応じて、
fsl,pins = < ... >
の中身を変更してください。■ピンの指定
fsl,pins = < ... >
の中身は、以下のように左側に対象のピンの指定、右側に PAD Control Register に書き込む値を指定します。左側は使用したいピンに応じて以下の中から選んでください
■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
などを記載してください
よろしくお願いします。