Armadillo-900 が採用している SoC i.MX8ULP では、
ほとんどのピンの機能が固定されておらず、
いくつかの機能から 1 つを選択して使用できるようになっています。
そのため、設計したハードウェアに合わせて、
各 I/O ピンの設定を適切に行う必要があります。
ここでは、 Device Tree をカスタマイズする手順の内、
I/O ピンの設定を行うための手順にしぼって説明します。
Device Tree をカスタマイズする手順全般については
「Device Treeをカスタマイズする」 を参照してください。
Armadillo-900 では I/O ピンの設定を適用するために
armadillo_900-customize.dtbo を使用します。
ここでは、どのような DTS を作成すれば良いのかを具体例を示して説明します。
armadillo_900-customize.dtbo のビルド手順や
armadillo_900-customize.dtbo の適用手順については
「独自の DTS overlay を追加する」 を参照してください。
また、 DTS の読み方については 「Device Tree Source (DTS) の読み方」 を参照してください。
PTC16 を GPIO, pull-up, オープンドレイン, slow スルーレート, standard ドライブストレングス、
PTF6 を LPUART7_TX, pull なし, プッシュプル, standard スルーレート, standard ドライブストレングス、
PTF7 を LPUART7_RX, pull なし, プッシュプル, standard スルーレート, standard ドライブストレングスに設定する場合の
DTS は以下のとおりです。
/dts-v1/;
/plugin/;
dtbo としてビルドする DTS には /plugin/; を書きます。
#include "imx8ulp-pinfunc-m33.h"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/leds/common.h>
#include "imx8ulp-pinfunc.h"
よく利用されるマクロの定義を含むヘッダーファイルを #include しています。
この例の DTS では不要なものも含まれています。
&iomuxc1 {
pinctrl-0 = <&pinctrl_customize>;
Armadillo-900 開発セット本体でもこの armadillo_900-customize.dts
を利用できるようにしています。
Armadillo-900 開発セット本体で使用される armadillo_900-evaboard.dts では
pinctrl-0 = <&pinctrl_customize>, <&pinctrl_con10_gpio>; となっており、
pinctrl_con10_gpio によって PTF6 と PTF7 が GPIO に設定されます。
1 つのピンに複数の機能を設定してはいけないため、
pinctrl-0 から pinctrl_con10_gpio を除外しています。
/* pinctrl memo
* 0x7c00000 deglitch window
* 0x200000 digital filter clock select (0=PCTL*, 1=RTC 1kHz)
* 0x100000 digital filter
* 0x20000 output buffer enable
* 0x10000 input buffer enable
* 0x40 high drive strength
* 0x20 open drain
* 0x4 slew rate
* 0x2 pull-up enable
* 0x1 pull-up selection (0=pull down)
*/
pinctrl_lpuart7: lpuart7_pingrp {
fsl,pins = <
MX8ULP_PAD_PTF6__LPUART7_TX 0x0
MX8ULP_PAD_PTF7__LPUART7_RX 0x0
>;
};
I/O ピンの設定として pinctrl_lpuart7 ノードを定義しています。
また、設定の各ビットの意味をコメントで残しています。
MX8ULP_PAD_PTF6__LPUART7_TX, MX8ULP_PAD_PTF7__LPUART7_RX は
linux-5.10/arch/arm64/boot/dts/freescale/imx8ulp-pinfunc.h
に定義されています。
&lpuart7 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lpuart7>;
status = "okay";
};
lpuart7 の pinctrl-0 に pinctrl_lpuart7 を渡して
I/O ピンの設定を使われるようにし、
lpuart7 を有効化しています。
lpuart7 は linux-5.10/arch/arm64/boot/dts/freescale/imx8ulp.dtsi
に定義されており、
aliases に serial3 = &lpuart7; として設定されているため、
Armadillo-900 上では /dev/ttyLP3 として認識されます。
&rpmsg_gpioc {
mygpio {
imx-rpmsg,pins = <
IOMUXC_PTC16_PTC16 (IOMUXC_PCR_PS_MASK | IOMUXC_PCR_PE_MASK | IOMUXC_PCR_ODE_MASK | IOMUXC_PCR_SRE_MASK)
>;
};
};
PTC16 の I/O ピンの設定として mygpio ノードを定義しています。
IOMUXC_PTC16_PTC16 や IOMUXC_PCR_PS_MASK は
linux-5.10/arch/arm64/boot/dts/freescale/imx8ulp-pinfunc-m33.h
に定義されています。
mygpio は他のノードの pinctrl には渡されていないため、
gpioset コマンド、 gpioget コマンド等によって
PTC16 が実際に GPIO として使われるまでは I/O ピンの設定が適用されません。