PICKUP
ピックアップ製品
Variscite製i.MXプロセッサ搭載System on Module(SoM)ベースのカスタム
キャリアボードを設計・製造した後の、ソフトウェアチームの最初のタスクの1つは、
Linuxカーネル用の新しいデバイスツリーファイルを作成することです。
デバイスツリーは、各ピンの機能や設定など、カーネルにハードウェア構成を
記述する役割を果たします。
ほとんどのi.MXのSoCのピンはマルチプレクスされており、最大8つのピンの
機能切り替えることができます。
さらに、ほとんどのピンには、内部プルアップ、プルダウンなどの設定が可能です。
ここでは、Variscite製i.MXプロセッサ搭載SoMのLinuxのデバイスツリーで
ピン機能とデバイスの設定を構成する方法について説明します。
ピンマルチプレクスの設定
I2C、PWM、UARTなど、ピンを物理的に制御する必要のあるデバイスノードを
追加する場合は、各ピンの機能と設定を指定する必要があります。これには
2つの重要なステップがあります。
今回は、VAR-SOM-MX8XのSoMでのUART3のピンマルチプレクス構成を紹介します。
ステップ1: ピングループノードをiomuxcノードに追加
VAR-SOM-MX8Xの場合、UART3ピングループノードはimx8qxp-var-som.dtsiで定義されています。
&iomuxc {
…
pinctrl_lpuart3: lpuart3grp {
fsl,pins = <
IMX8QXP_SCU_GPIO0_00_ADMA_UART3_RX 0x06000020
IMX8QXP_SCU_GPIO0_01_ADMA_UART3_TX 0x06000020
>;
};
};
iomuxcは、imx8qxppinctrlドライバーのデバイスノードで、imx8qxp.dtsiで定義されています。
このノードのドキュメントは、Linuxカーネルソースツリーの次の場所にあります。
Documentation/devicetree/bindings/arm/freescale/fsl,scu.txt
Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
pinctrl_lpuart3は、UART3ピングループの名前を提供するために使用されるラベルです。
次のステップでこのラベルを使用します。
“fsl、pins”は、UART3で使用されるピンとその構成のリストです。
各エントリは、ピンマルチプレクス(pinmux)のマクロと、パッド設定(内部プルアップ、プルダウンなど)の整数で構成されます。
ピン機能:
各ピンには、最大8つのマルチプレクスされている機能があります。
ピン機能の選択を簡素化するために、NXPは各SOCに次の命名規則のマクロを提供しています。
< SOC >_< ピン名 >_< ピン機能 >
この例では、”fsl,pins”には2つのピンエントリがあります。ピンSCU_GPIO0_00は機能ADMA_UART3_RX用に構成され、ピンSCU_GPIO0_01は機能ADMA_UART3_TX用に設定されています。
注意:pinmuxの競合を回避するには、各ピンを1つの機能のみに設定し、各機能を1つのピンのみに割り当てる必要があります。
各i.MXSoCには、ピン関数マクロ定義を含むピン構成ファイルと、デバイスツリーバインディングディレクトリのドキュメントがあります。
ピン機能マクロの値の詳細については、特定のSoCのドキュメントを参照してください。
i.MX8Xおよびi.MX8QMの場合、ピンヘッダーファイルは”include/dt-bindings/pinctrl/”にあり、前述の通りドキュメントは”Documentation/devicetree/bindings/arm/freescale/”にあります。
i.MX6/i.MX6UL/i.MX7ファミリの場合、pinfuncファイルは”arch/arm/boot/dts/”にあり、ドキュメントは”Documentation/devicetree/bindings/pinctrl/”にあります。
端子設定:
ピン機能マクロに加えて、各”fsl,pins”エントリには端子設定の値が必要です。
この場合、0x06000020は、ピンのプルアップ、ドライブ強度などを構成する端子設定値です。各ピンの構成オプションは、i.MX 8QuadXPlusリファレンスマニュアルに記載されています。
以下は、i.MX 8QuadXPlusリファレンスマニュアルRev. 0、05 / 2020、957ページのUART3_RXピンのパッド/マルチプレクサ制御レジスタです。
この例においては、当該レジスタの値が0x06000020(ビット5、25、26がイネーブル)であることを考慮すると、すべての構成は下記の通りとなります。
update_mux_mode: value 0
update_pad_ctl: value 0
mux_mode: value 0 (Configured by the pin function macro)
sw_config: value 0b11
lp_config: value 0
enable_wakeup_change: value 0
wakeup_ctrl: value 0
pull: value 0b01: Internal pull up resistor selected.
DSE: value 0b000: Drive Strength of 1mA selected.
詳細はi.MX 8QuadXPlusリファレンスマニュアルを参照ください。
ステップ2: デバイスノード内のそのピングループノードを参照
ピングループノード(lpuart3grp)をiomuxcに追加したら、次のステップはこれらのピンを使用するデバイスノードへの参照を提供することです。
この例はlpuart3の例になり、imx8-ss-dma.dtsiで定義され、Varisciteによってimx8qxp-var-som-symphony.dtsiで構成されています。
/* Console */
&lpuart3 {
pinctrl-names = “default”;
pinctrl-0 = <&pinctrl_lpuart3>;
…
};
lpuart3の初期化中に、Linuxデバイスコアはlpuart3ドライバのプローブ関数を呼び出す前にpinctrl_bind_pinsを呼び出します。
次に、pinctrlドライバはi.MX固有のレジスタに書き込み、pinctrl_lpuart3の各エントリーのデフォルトのピン状態を構成します。
ピンのステート
一部のデバイスは、複数のピンのステートをサポートしています。
たとえば、MMCデバイスは次のとおりです。
&usdhc1 {
pinctrl-names = “default”, “state_100mhz”, “state_200mhz”;
pinctrl-0 = <&pinctrl_usdhc1>;
pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
…
};
この例では、usdhc1には、デフォルト、100mhz、および200mhzの3つのpinctrl状態があります。
Linuxデバイスコアは、プラットフォームドライバープローブ関数を呼び出す前にデフォルト状態を初期化します。
ただし、ドライバには、MMCモードに応じてピン設定を変更するオプションもあります。
このテーマの詳細については、カーネルソースツリーの次のドキュメントファイルを参照ください。
“Documentation / devicetree / bindings / pinctrl /pinctrl-bindings.txt”
まとめ
ピン構成が必要なデバイスノードには、iomuxcで定義されたピングループノードへの参照が必要です。
ピングループノードは、関連する各ピンのピン機能と設定を定義します。
詳細については、カーネルソースツリーの「Documentation/devicetree/bindings/pinctrl/」にあるドキュメントを参照してください。
半導体流通市場も大きく広がっていき、さらに成長を続けています。
自分の能力を存分に発揮したいという方、
エレクトロニクス分野で活躍したい方 企業家・事業化精神に
あふれた方、想いにお応えできるフィールドがあります。
製品の他にも、サービスに関する事、PRに関するご質問等、
承っております。みなさまからのお問合せについては、
以下の窓口よりお受けしております。
お気軽にご連絡ください。
© 2024 Arrow Electronics Japan KK. All Rights Reserved