Armadilloフォーラム

OP-A600-BTTHMOD-01が占有しているCON9の3と5のピンヘッダをI2Cで使いたい件

furuta

2022年2月28日 17時30分

いつも大変お世話になっております。

ピンヘッダの設定についてご質問があります。
 
 
ただいまArmadillo-640+OP-A600-BTTHMOD-01で無線LAN通信を行うようにしています。
環境は次のようになっています。
 
①armadillo-640_con9_thread-v4.14-at38.dtbを書き込みました
②CON14とCON9の1~24がOP-A600-BTTHMOD-01でふさがってます
③以前uart2.dtsiをいただいてCON9の25と26ピンのUART2を使用できるようになりました。
https://armadillo.atmark-techno.com/forum/armadillo/10827
 
 
今回I2C接続が必要になりました。
OP-A600-BTTHMOD-01でふさがっているCON9の3と5は使われていないから
これを利用してI2C接続を行うことになりました。
 
そこで以前いただいたuart2.dtsiをサンプルにして理解しようとしています。
一応armadillo-640_product_manual_ja-2.3.0.pdfの85ページあたりかと思っていますが・・・
これを参考にi2c.dtsiなるものを作成するのか??まずどこから手を着けていこうか??と悩んでいます。
 
ちなみにいただいたuart2.dtsiは以下のようになっています。
&iomuxc {
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6UL_PAD_NAND_DATA05__UART2_DCE_RX 0x1b0b1 // CON9_26
MX6UL_PAD_NAND_DATA04__UART2_DCE_TX 0x00008 // CON9_25
>;
};
};

&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart2>;
status = "okay";
};
 
OP-A600-BTTHMOD-01+CON9の3と5でI2C通信が可能になる設定の
修正情報をもらえないかと思い質問しました。
お手数をおかけしますがよろしくお願いいたします。
 
 

コメント

at_akihito.irie

2022年3月1日 12時57分

入江です。

以下が参考になると思います。
https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-st…

上記を参考にi2cを有効にするdtsiファイルを作成し、uart2.dtsi同様
linux-4.14-at/arch/arm/boot/dts/armadillo-640_con9_thread.dtsにて
includeしてご使用ください。

手順を進めていく中で躓いた箇所等ございましたら、またこのフォーラムにて
ご質問ください。

以上、よろしくお願いいたします。

入江様、お返事ありがとうございます。

リンク先の情報をもとにi2c3.dtsiを作成しています。
ご質問が2点あります。
 
i2c3.dtsi
------------------------------------------------------------------------------------------------------- 
&iomuxc {
 pinctrl_i2c3: i2c3grp { // 他のiomuxcノードと重複しない名前
  fsl,pins= <
  // MX6UL_PAD_AAAAAAAAAAAAA__BBBBBBBB 0xCCCCCCCC // 説明のため
    MX6UL_PAD_UART1_RX_DATA__I2C3_SDA 0x40010808 // SDAピンの設定 マルチプレクス表CON9 3ピン
    MX6UL_PAD_UART1_TX_DATA__I2C3_SCL 0x40010808 // SCLピンの設定 マルチプレクス表CON9 5ピン
    >;
 };
};
 
 
&i2c3 {
 status = "okay"; // okayで上書きする
 clock-frequency = <100000>; // クロック周波数(100kHz)
 pinctrl-names = "default";
 pinctrl-0 = <&pinctrl_i2c3>; // 先ほど作成したiomuxcノード
 
 // ここにスレーブデバイスのノードを記述
 pcf8591@48 { // スレーブのデバイス名@デバイスアドレス・・・①
  #address-cells = <1>;
  #size-cells = <0>;
  compatible = "nxp,pcf8591"; // 文字列が一致するデバイスドライバが使用される・・・②
  reg = <0x48>; // スレーブのデバイスアドレス
 
  input_mode = <0>; // デバイス固有のプロパティー(あれば)
 
 };
};
------------------------------------------------------------------------------------------------------- 
今上のようにファイルを作成しました。
 
質問1 
①で{デバイス名}@{アドレス}が記述されていますが、
ここのデバイス名はデバイスで決まっている固有のデバイス名ですか?
デバイス名を間違うと正常に動作しないのかなと思って質問しました。
※アドレスはデバイスで決まっている固有のアドレスと思っています。
 
質問2
②のcompatibleですが、これもデバイスできまっている固有の文字列ですか?
これも文字列の内容を間違うと正常に動作しないかもと思って質問しました。
 
わかりにくい文章ですみません。
お手数をおかけします。宜しくお願いいたします。
 

at_akihito.irie

2022年3月4日 17時33分

入江です。

> ①で{デバイス名}@{アドレス}が記述されていますが、
> ここのデバイス名はデバイスで決まっている固有のデバイス名ですか?

こちらは、デバイスノード名を指定しているだけであり、他と重複していなけ
ればある程度自由に命名して問題ありません。
以下に情報があります。
https://elinux.org/Device_Tree_Usage#Node_Names

> ②のcompatibleですが、これもデバイスできまっている固有の文字列ですか?
> これも文字列の内容を間違うと正常に動作しないかもと思って質問しました。

こちらについては決められています。
各種デバイスドライバのドキュメントやソースコードに指定すべきcompatible
が記載されています。

つまり、Linuxカーネルソースコード内に使用したいデバイスのドライバがあ
れば、先の手順でDeviceTreeを作成していけば良いのですが、ドライバがない
場合、自分でドライバを作成するか、アプリケーションからデバイスを操作す
る必要があります。

そのため最初にお聞きするべきだったのですが、ご使用になるI2Cデバイスの
詳細を教えていただけますでしょうか。

入江様

お返事ありがとうございます。

> ~使用になるI2Cデバイスの詳細~
回路側から言われたのはLTC2301/LTC2305でした。

前回教えていただいたページでcompatibleはメーカー名とデバイス名を設定している
と思ったのですが、自分で勝手にそれっぽい文字を設定するのもおかしいなと思ってご質問しました。
自分でドライバを作成ですか・・。
LTC2301/LTC2305の資料を添付いたします。
デバイスのドライバの有無の調べ方などポイントを教えていただけないでしょうか。
ドライバがあればいいのですが。
お手数をおかけしますがよろしくお願いいたします。

ファイル ファイルの説明
ltc2301-ltc2305.pdf 連携されたファイルです。

at_akihito.irie

2022年3月7日 18時18分

入江です。

> 回路側から言われたのはLTC2301/LTC2305でした。

色々と探してみましたがLinux向けのドライバは見つかりませんでした。

> デバイスのドライバの有無の調べ方などポイントを教えていただけないでしょうか。

LinuxカーネルソースコードのdriversディレクトリやDocumentationディレクト
リ内をデバイス名でgrepしてみたり、Google検索などで調べることが出来ます。

LTC2301/LTC2305を使用するのであれば、ドライバを使用せずにアプリケーショ
ン内でI2C制御処理を行い、デバイスを直接操作することをお勧めします。

その場合、dtsにI2Cスレーブデバイスノードを記述しないことで、デバイスド
ライバをロードせずに、Armadilloの特定のピンにI2Cの機能をもたせることが
出来ます。
この状態で当該ピンにI2Cデバイスを接続することでI2C通信が出来るようにな
ります。

デバイスとのI2C通信の仕様については、データシートをご確認ください。

以上、よろしくお願いいたします。

入江様
お返事とお礼が遅くなりました。

&iomuxc {
    pinctrl_i2c3: i2c3grp {          // 他のiomuxcノードと重複しない名前
        fsl,pins= <
        //   MX6UL_PAD_AAAAAAAAAAAAA__BBBBBBBB 0xCCCCCCCC // 説明のため
            MX6UL_PAD_UART1_RX_DATA__I2C3_SDA 0x40010808 // SDAピンの設定 マルチプレクス表CON9 3ピン
            MX6UL_PAD_UART1_TX_DATA__I2C3_SCL 0x40010808 // SCLピンの設定 マルチプレクス表CON9 5ピン
        >;
    };
};

&i2c3 {
    status = "okay";        // okayで上書きする
    clock-frequency = <100000>;  // クロック周波数(100kHz)
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c3>;  // 先ほど作成したiomuxcノード

    // ここにスレーブデバイスのノードを記述

};

でノードは未記載でCON9 3ピンと5ピンのI2Cの設定をおこないました。
i2c-toolsで情報を取得することができました。
有難うございました。

デバイスドライバを実装しなくてもi2c-toolsで、コマンドラインから簡単に
i2cにアクセスすることができるので、必ずしもデバイスドライバの実装は
必要無いと思います。

(上のスレッドでi2c3を使っているので、I2CBUSの指定を3としています)
 
i2cset -y 3 [チップアドレス] [データアドレス] [書き込みデータ] 
i2cget -y 3 [チップアドレス] [データアドレス]
 
(どちらも i2cget --helpのようにするとコマンドのヘルプを出力します。helpより詳しい例があります)

at_ohsawa様
お返事とお礼が遅くなりました。

i2cdetectコマンドでI2CBUS=2で値を取得できることがわかりました。
しかしながらなぜI2CBUS=2なのだろう・・・という疑問が、、自分ではI2CBUS=3のつもりでした。

チップアドレスはわかったのですがデータアドレスがデータシートを確認してもなかなかわからず。
なんとか自分の意図するように取得値が変化するアドレスがわかり、無事完了させることができました。
有難うございました。

溝渕です。

> i2cdetectコマンドでI2CBUS=2で値を取得できることがわかりました。
> しかしながらなぜI2CBUS=2なのだろう・・・という疑問が、、自分ではI2CBUS=3のつもりでした。

i.MX6ULLのI2Cコアのインデックスと、LinuxのI2Cデバイスのインデックスは開始が異なります。

i.MX6ULLは、I2C1, I2C2...
に対し、
Linuxでは、/dev/i2c0, /dev/i2c1...

となります。その為、Linuxから扱う場合はインデックスを1減算する必要があります。