OrangePi-PCを使ってみる

Debian Stretchでのi2c通信

Debian Stretchでのi2c通信を紹介します。
Stretchでは最初から2つのi2cデバイスが存在していますが、これらをユーザーが使うことはできません。
$ ls -l /dev/i2c*
crw------- 1 root root 89, 0 Jul  8 09:06 /dev/i2c-0
crw------- 1 root root 89, 1 Jul  8 09:06 /dev/i2c-1

i2c-toolsをインストールしてデバイスの詳細を確認してみました。
$ sudo apt update

$ sudo apt install i2c-tools

$ sudo i2cdetect -l
i2c-0   i2c             mv64xxx_i2c adapter                     I2C adapter
i2c-1   i2c             DesignWare HDMI                         I2C adapter

$ sudo i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- UU -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: 30 31 32 -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

[mv64xxx_i2c adapter]と[DesignWare HDMI]が関係しているみたいです。
Marvell MV64XXX I2C controller はどうやら、i2cデバイスの親分のようなものだと思います。
[DesignWare HDMI]に関してはこちらに 情報があり、[sun8i H3 HDMI glue driver for DW HDMI]となっています。

Debian Jessie(Debian 8)ではHDMIモニターの扱いに難が有りましたが、
Debian Stretch(Debian9)では問題なく動くようになっています。
このドライバーが関係しているのかもしれません。

ユーザーが利用できるi2cの有効化はarmbian-configを使って行います。
armbian-configを起動し以下の手順で進めます。




ここでi2c0 i2c1 i2c2を有効にします。


< Save > を押して < Exit >を押すと以下のスクリーンになります。


ここで<Reboot>を選ぶとリブートします。
armbian-configは[/boot/armbianEnv.txt]に以下の変更を加えます。
エディターを使って直接このファイルを編集してもOKです。
$ cat /boot/armbianEnv.txt
verbosity=1
logo=disabled
console=both
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
rootdev=UUID=3d863bb3-b616-4229-94e7-8c92ac95501a
rootfstype=ext4
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
overlays=i2c0 i2c1 i2c2

再起動が完了するとi2cデバイスは以下のようになります。
$ ls /dev/i2c*
/dev/i2c-0  /dev/i2c-1  /dev/i2c-2  /dev/i2c-3  /dev/i2c-4

$ sudo i2cdetect -l
i2c-3   i2c             mv64xxx_i2c adapter                     I2C adapter
i2c-1   i2c             mv64xxx_i2c adapter                     I2C adapter
i2c-4   i2c             DesignWare HDMI                         I2C adapter
i2c-2   i2c             mv64xxx_i2c adapter                     I2C adapter
i2c-0   i2c             mv64xxx_i2c adapter                     I2C adapter

これで/dev/i2c-0と/dev/i2c-1が使えるようになります。
/dev/i2c-0 はPin#3/#5を使います。
/dev/i2c-1 はPin#27/#28を使います。

Stretchではi2cやSPIのドライバーはoverlayモジュールとして提供されています。
overlayモジュールの詳細はこ ちらに詳しく記載されています。
I2C2はPE12とPE13のポートにアサインされていますが、このポートはピンヘッダーにはなく、カメラソケット用に使われているようで す。
I2C2 pins (SCL, SDA): PE12, PE13

On most board this bus is wired to Camera (CSI) socket

こちらで紹介しているプログラムでパラレルI/Oのパ フォーマンスを計ってみました。
$ sudo ./mcp23017w
time:195.0Sec

30000回のパラレルI/Oの時間比較。

wiringPiライブラリ bcm2835ライブラリ
RPi(Raspbian)+MCP23017 209秒 145秒
OPi(Jessie)+MCP23017 114秒 サポートしていない
OPi(Stretch)+MCP23017 195秒 サポートしていない

次回は2つのポートを使ったi2c通信を紹介します。