Armadillo-640のCON8およびCON9、CON14は、機能拡張用のインターフェースです。
これらのインターフェースには用途によって様々な機能が利用できるように、一つのピンにi.MX6ULLの複数の機能がマルチプレクスされています。
今回は、I2CをCON9に機能割り当てする方法をご紹介します。
作業項目
- 機能割り当てピンの選択
- armadillo-640.dts変更
- u-boot変更
- ATDEでビルドおよびArmadillo-640 eMMCに書き込み
- 動作確認
1. 機能割り当てピンの選択
armadillo-640_multiplex-v1.0.pdfは、Armadillo-640 マルチプレクス表(https://armadillo.atmark-techno.com/files/downloads/armadillo-640/document/armadillo-640_multiplex-v1.0.0.zip)から、CON9部分を抜粋したものです。
この表からここでは、I2Cを以下のピンに割り当てることにします。
● I2C2
● I2C3
2. armadillo-640.dts変更
(1)で選択したピンにI2CおよびUARTを割り当てるために、arch/arm/boot/dts/armadillo-640.dtsの以下の項目を修正します。
- I2CデバイスドライバにMUXの設定を行う記述を追加
- MUXで設定しているレジスタ値0x40010808を追加(外部でプルアップ & オープンドレインされた典型的なI2C接続例を想定)
- UART1とUART5は既にUARTとして使っているため、その参照を削除
以下のパッチをarch/arm/boot/dts/armadillo-640.dtsに適用してください。
diff --git a/arch/arm/boot/dts/armadillo-640.dts b/arch/arm/boot/dts/armadillo-640.dts
index 0f0983cf075e..23d6282aad92 100644
--- a/arch/arm/boot/dts/armadillo-640.dts
+++ b/arch/arm/boot/dts/armadillo-640.dts
@@ -95,24 +95,12 @@
};
};
-&uart1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_uart1>;
- status = "okay";
-};
-
&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart3>;
status = "okay";
};
-&uart5 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_uart5>;
- status = "okay";
-};
-
&usdhc1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>;
@@ -238,6 +226,18 @@
MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
>;
};
+ pinctrl_i2c2: i2c2grp {
+ fsl,pins= <
+ MX6UL_PAD_UART5_RX_DATA__I2C2_SDA 0x40010808
+ MX6UL_PAD_UART5_TX_DATA__I2C2_SCL 0x40010808
+ >;
+ };
+ pinctrl_i2c3: i2c3grp {
+ fsl,pins= <
+ MX6UL_PAD_UART1_RX_DATA__I2C3_SDA 0x40010808
+ MX6UL_PAD_UART1_TX_DATA__I2C3_SCL 0x40010808
+ >;
+ };
};
&usbotg1 {
@@ -286,6 +286,20 @@
status = "okay";
};
+&i2c2 {
+ status = "okay";
+ clock-frequency = <400000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c2>;
+};
+
+&i2c3 {
+ status = "okay";
+ clock-frequency = <400000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_i2c3>;
+};
+
&wdog1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_wdog>;
3. u-boot変更
Armadillo-640はコンソール出力用にデフォルトでCON9 1/3/5/7/9ピンを使用しています。(2)でCON9 3/5をI2C3として割り当てたため、USBシリアル変換アダプタは使えません。コンソール出力を利用するために、CON3/4にコンソール出力されるように以下の手順でu-bootを変更します。
u-bootの変更方法は、Armadillo-640: コンソール出力先をCON9から別のCONに変更する方法を参照してください。
4. ATDEでビルドおよびArmadillo-640 eMMCに書き込み
(2)と(3)で用意したarmadillo-640.dtsとu-bootをATDEでビルドしてください。
ビルド手順は、「Armadillo-640 製品マニュアル」の「第10章 ビルド手順」および「第17章 Howto」を参考にしてください。 また、作成されたイメージファイルの書き換えは、「Armadillo-640 製品マニュアル」の「第11章 イメージファイルの書き換え方法 -> 11.2. 特定のイメージファイルだけを書き換える」を参考にしてください。
5. 動作確認
今回は動作確認に、「アットマークテクノ ユーザーズサイト」の「Armadillo-X1: I2C接続の温度センサーを接続して温度を計測する(https://users.atmark-techno.com/blog/53/2368)」で紹介されている、I2C接続温度センサー(ADT7410)を利用しました。ブレッドボード上にADT7410と最低限必要な部品を配置して、ADT7410をArmadillo-640のCON9に接続しました。
温度計測した結果を以下に示します。
root@armadillo:~/i2c-tsens# ./tsens_adt7410 -d /dev/i2c-1
26.75
root@armadillo:~/i2c-tsens# ./tsens_adt7410 -d /dev/i2c-1
30.56
root@armadillo:~/i2c-tsens# ./tsens_adt7410 -d /dev/i2c-1
27.06
root@armadillo:~/i2c-tsens#
i2c-2でも同様の結果が得られます。