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