Armadillo-640: 機能拡張用インターフェース(CON9)の使用例 ~ I2Cへの割り当て ~

Armadillo-640のCON8およびCON9、CON14は、機能拡張用のインターフェースです。
これらのインターフェースには用途によって様々な機能が利用できるように、一つのピンにi.MX6ULLの複数の機能がマルチプレクスされています。
今回は、I2CをCON9に機能割り当てする方法をご紹介します。

作業項目

  1. 機能割り当てピンの選択
  2. armadillo-640.dts変更
  3. u-boot変更
  4. ATDEでビルドおよびArmadillo-640 eMMCに書き込み
  5. 動作確認

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に接続しました。

I2C接続温度センサー(ADT7410)実験基板 circuit

温度計測した結果を以下に示します。

    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でも同様の結果が得られます。

製品: 
Armadillo-640
タグ: 
Armadillo-640
TIPS