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デバイスを、だれがどのタイミングで作るのか現時点で分かっていません。
[mv64xxx_i2c adapter]と[DesignWare HDMI]が関係しているみたいです。

Marvell MV64XXX I2C controller はどうやら、i2cデバイスの親分のようなものだと思います。

[DesignWare HDMI]に関してはこちらに 情報があり、[sun8i H3 HDMI glue driver for DW HDMI]なので、
HDMI関連のドライバーだと思います。
jessie(Debian 8)ではHDMI-DVI変換ケーブルを経由したコンソールは動きませんでしたが、
stretch(Debian9)では動くようになっています。

$ 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: -- -- -- -- -- -- -- --

$ lsmod
Module                  Size  Used by
snd_soc_hdmi_codec     16384  1
rc_cec                 16384  0
dw_hdmi_i2s_audio      16384  0
dw_hdmi_cec            16384  0
evdev                  20480  0
rt2800usb              24576  0
rt2800lib              77824  1 rt2800usb
rt2x00usb              16384  1 rt2800usb
rt2x00lib              40960  3 rt2800lib,rt2800usb,rt2x00usb
ir_lirc_codec          16384  0
lirc_dev               16384  1 ir_lirc_codec
sun8i_codec_analog     24576  1
mac80211              446464  3 rt2800lib,rt2x00lib,rt2x00usb
sun4i_i2s              16384  2
snd_soc_simple_card    16384  0
sun4i_codec            32768  3
snd_soc_simple_card_utils    16384  1 snd_soc_simple_card
snd_soc_core          118784  6 sun4i_codec,sun4i_i2s,sun8i_codec_analog,snd_soc_hdmi_codec,snd_soc_simple_card_utils,snd_soc_simple_card
sun8i_dw_hdmi          16384  0
cfg80211              376832  2 rt2x00lib,mac80211
dw_hdmi                28672  2 dw_hdmi_i2s_audio,sun8i_dw_hdmi
cec                    40960  2 dw_hdmi_cec,dw_hdmi
sunxi_cir              16384  0
rfkill                 20480  3 cfg80211
sun4i_gpadc_iio        16384  0
snd_pcm_dmaengine      16384  1 snd_soc_core
snd_pcm                65536  4 sun4i_i2s,snd_pcm_dmaengine,snd_soc_hdmi_codec,snd_soc_core
snd_timer              24576  1 snd_pcm
snd                    45056  4 snd_soc_hdmi_codec,snd_timer,snd_soc_core,snd_pcm
soundcore              16384  1 snd
sun8i_mixer            16384  0
sun4i_tcon             20480  1 sun8i_dw_hdmi
uio_pdrv_genirq        16384  0
sun4i_drm              16384  0
uio                    16384  1 uio_pdrv_genirq
ip_tables              20480  0
x_tables               20480  1 ip_tables
sy8106a_regulator      16384  1

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






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


ここで<Reboot>を選ぶとリブートします。
再起動が完了するとi2cデバイスは以下のようになります。
これで/dev/i2c-0と/dev/i2c-1が使えるようになります。
stretchではi2cやSPIのドライバーはoverlayモジュールとして提供されています。
overlayモジュールの詳細は[/boot/dtb-4.14.xx-sunxi/overlay/README.sun8i-h3- overlays]に詳しく記載されています。
これによるとi2c2はPE12とPE13ですが、このポートはカメラ用に使われているようです。
$ 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

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

こちらで紹介しているmcp23017のプログラムが動きました。
こちらのツールでも、 i2cのOLEデバイスへの表示ができることを確認しました。
こちらで紹介しているプログラムでパラレルI/Oのパ フォーマンスを計ってみました。
$ sudo ./mcp23017w
time:195.0Sec

Jessieよりもかなり遅いです。
30000回のパラレルI/Oの時間比較。

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

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