OrangePi-PCを使ってみる

stretchのインストール


jessieの通常サポートが2018年6月17日で切れたので、
長年愛用していたjessie(Debian 8)からstretch(Debian 9)に切り替えてみました。
色々とjessieから変わっていて戸惑います。
分かる範囲でjessieと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]が関係しているみたいですが、読み込まれているドライバーにもそれらしい物もなく、
これらが何者なのかよくわかりません。
また、PA12とPA11(/dev/i2c-0)に0.96インチのOLEDを繋げて、デバイスをスキャンしてもi2cアドレス(0x3c)が 表示されません。

[DesignWare HDMI]に関してはこちらに 情報があり、[sun8i H3 HDMI glue driver for DW HDMI]だそうです。
ドライバーとしては[sun8i_dw_hdmi]かな...と思うのですが、何をするものなのか不明です。
$ 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

[/boot/armbianEnv.txt]に以下の変更を加えてrebootするとi2cデバイスは以下のように4つになります。
$ sudo vi /boot/armbianEnv.txt

verbosity=1
logo=disabled
console=both
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
rootdev=UUID=2ac9db07-e151-4b1b-9e56-2cce7e8a24f7
rootfstype=ext4
overlays=i2c0 i2c1
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u

PA12(TWI0 SDA)とPA11(TWI0 SCK)に0.96インチのOLEDを繋げて、/dev/i2c-0をスキャンすると、i2cアドレス(0x3c)が正しく表示されます。
$ ls -l /dev/i2c*
crw-rw---- 1 root i2c 89, 0 Jul  9 12:39 /dev/i2c-0
crw-rw---- 1 root i2c 89, 1 Jul  9 12:39 /dev/i2c-1
crw-rw---- 1 root i2c 89, 2 Jul  9 12:39 /dev/i2c-2
crw-rw---- 1 root i2c 89, 3 Jul  9 12:39 /dev/i2c-3

$ sudo i2cdetect -l
i2c-3   i2c             DesignWare HDMI                         I2C adapter
i2c-1   i2c             mv64xxx_i2c adapter                     I2C adapter
i2c-2   i2c             mv64xxx_i2c adapter                     I2C adapter
i2c-0   i2c             mv64xxx_i2c adapter                     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: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

PA19(TWI1 SDA)とPA18(TWI1 SCK)に0.96インチのOLEDを繋げて、/dev/i2c-1をスキャンすると、こちらでもi2cアドレス(0x3c)が正しく表示されます。
$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

stretchではi2cやSPIのドライバーはoverlayモジュールとして提供されています。
overlayモジュールの詳細は[/boot/dtb-4.14.14-sunxi/overlay/README.sun8i-h3- overlays]に詳しく記載されています。
これによるとi2c2はPE12とPE13ですが、このポートはカメラ用に使われているようです。

これで/dev/i2c-0と/dev/i2c-1が使えるようになります。
なお、WiringOPは内部で/dev/i2c-0にデバイスが固定されています。
こちらのツールでi2cの OLEデバイスへの表示ができることを確認しました。
デフォルトで表示される /dev/i2c-1 /dev/i2c-2 について何か分かりましたら追記します。



SPIデバイス

stretchではSPIデバイスがありません。
$ ls -l /dev/spi*
ls: cannot access '/dev/spi*': No such file or directory

[/boot/armbianEnv.txt]に以下の変更を加えるとi2cデバイスとSPIデバイスの両方が有効になります。
$ sudo vi /boot/armbianEnv.txt

verbosity=1
logo=disabled
console=both
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
rootdev=UUID=2ac9db07-e151-4b1b-9e56-2cce7e8a24f7
rootfstype=ext4
overlays=i2c0 i2c1 spi-spidev
param_spidev_spi_bus=0
param_spidev_spi_cs=0
param_spidev_max_freq=1000000

usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u

変更後にrebootするとSPIデバイスが出現します。
$ ls -l /dev/spi*
crw------- 1 root root 153, 0 Jul  8 09:16 /dev/spidev0.0

これで/dev/spedev0.0が使えるようになりますが、どうもjessieと完全な互換性がありません。
こちらのツールでSPIの OLEデバイスへの表示ができることを確認しましたが、表示が一部おかしいです。
こちらのツールも stretchでは全く動きません。
SPIに関してはもう少し調べてみます。



USB Wifiデバイス

USB Wifiドングルを追加すると、stretchでは以下の名前のデバイスが出現します。
$ sudo ifconfig -a
[sudo] password for orangepi:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.135  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::81:48ff:fe3e:ae19  prefixlen 64  scopeid 0x20<link>
        ether 02:81:48:3e:ae:19  txqueuelen 1000  (Ethernet)
        RX packets 969  bytes 1242998 (1.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 670  bytes 50879 (49.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 38

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlx0013efc30bb7: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 00:13:ef:c3:0b:b7  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

どうも、外付けインタフェースの名前の付け方が変わったみたいです。
有線LAN  enx+MacAddress
無線LAN wlx+MacAddress

[/boot/armbianEnv.txt]に以下の変更を加えてrebootすると、見慣れたwlan0が現れます。
この技はこ ちらにひっそりと書かれています。
verbosity=1
logo=disabled
console=both
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
rootdev=UUID=2ac9db07-e151-4b1b-9e56-2cce7e8a24f7
rootfstype=ext4
overlays=i2c0
#overlays=spi-spidev
overlays=w1-gpio spi-spidev
param_spidev_spi_bus=0
param_spidev_max_freq=32000000
extraargs=net.ifnames=0
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u

$ sudo ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.135  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::81:48ff:fe3e:ae19  prefixlen 64  scopeid 0x20<link>
        ether 02:81:48:3e:ae:19  txqueuelen 1000  (Ethernet)
        RX packets 89  bytes 9587 (9.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 74  bytes 6796 (6.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 38

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 32  bytes 2592 (2.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32  bytes 2592 (2.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 00:13:ef:c3:0b:b7  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

OPI-Liteの様に有線LANを持っていないモデルでは、jessieの頃から[/etc/network/interface]は空っぽ で、
NwteorkManagerでWifiの設定を行いますが、このモデルでは相変わらず[/etc/network/interface]でも Wifiの設定が可能です。
もちろんNetworkManagerで設定することもできます。



lirc

lircのセットアップも随分と変わりました。
まずlircをインストールします。
$ sudo apt-get insatll lirc

今まではhardware.confにドライバーやデバイスを設定していましたが、stretchではlirc_options.confにこれ らの情報を設定します。
$ sudo vi /etc/lirc/lirc_options.conf
[lircd]
nodaemon        = False
driver          = default
device          = /dev/lirc0
output          = /var/run/lirc/lircd
pidfile         = /var/run/lirc/lircd.pid
plugindir       = /usr/lib/arm-linux-gnueabihf/lirc/plugins
permission      = 666
allow-simulate  = No
repeat-max      = 600

ここでリブートします。
再起動後に一旦lircサービスを止め、mode2コマンドを実行します。
mode2コマンド実行中にリモコンを発射し、ずらずらコードが表示されればドライバーとデバイスの登録は完了です。
$ sudo service --status-all | grep lirc
[sudo] password for orangepi:
 [ + ]  lircd
 [ + ]  lircmd

$ sudo systemctl stop lircd
Warning: Stopping lircd.service, but it can still be activated by:
  lircd.socket

$ sudo service --status-all | grep lirc
 [ - ]  lircd
 [ - ]  lircmd

$ mode2 -d /dev/lirc0
Using driver default on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0

ここでリモコンを発射!!
すらずらコードが表示されればOK

pulse 8984
space 4488
pulse 560
space 576
pulse 568
space 552

次に学習結果のファイルを作ります。
私はjessieで作ったファイルをそのまま使いましたが、新規の学習方法は(おそらく)jessieと同じだと思います。
学習結果のファイルは/etc/lirc/lircd.conf.dの下にmy.confの名前で作ります。
ファイル名はxxx.confなら何でもOKです。
また、最初からあるdevinput.lircd.confはどのようなリモコンのコードなのか不明なので、消してしまいます。
$ cd /etc/lirc/lircd.conf.d
$ sudo vi my.conf


$ sudo rm devinput.lircd.conf

ここまで来たらlircdを再起動し、irsendで登録内容を確認します。
$ sudo systemctl start lircd

$ irsend LIST "" ""

KODAC

$ irsend LIST KODAC ""

000000000000a857 OK
00000000000002fd UP
0000000000009867 DOWN
000000000000e01f LEFT
000000000000906f RIGHT
000000000000a25d TOP-LEFT
000000000000629d TOP-CENTER
000000000000e21d TOP-RIGHT

irwコマンドを起動し、コマンド実行中にリモコンを発射します。
登録されているコードが表示されれば、学習結果の登録もOKです。
$ irw
0000000000ff02fd 00 UP KODAC
0000000000ff02fd 01 UP KODAC
0000000000ffa857 00 OK KODAC
0000000000ffa857 01 OK KODAC
0000000000ff9867 00 DOWN KODAC
0000000000ff9867 01 DOWN KODAC
0000000000ffe01f 00 LEFT KODAC
0000000000ffe01f 01 LEFT KODAC
0000000000ffe01f 02 LEFT KODAC

最後に[/etc/lirc/irexec.lircrc]を作成して完了です。
button=XXXXの部分は「/etc/lirc/lircd.conf.d/my.conf」に定義したボタン名称
config=XXXXの部分はそのボタン が押されたときに、実行するコマンドです。
begin
 button = TOP-LEFT
 prog   = irexec
 config = sudo shutdown -h now
end

begin
 button = TOP-CENTER
 prog   = irexec
 config = sudo shutdown -r now
end

再起動時に、[/etc/lirc/irexec.lircrc]が有ると、irexecが自動的にデーモンで起動します。
$ ps -ef | grep irexec
root       550     1  0 23:20 ?        00:00:00 /usr/bin/irexec /etc/lirc/irexec.lircrc
orangepi  1876  1586  0 23:33 ttyS0    00:00:00 grep irexec

リモコンを操作すると、irexecデーモンがボタンに応じたコマンドを実行してくれます。
ただし、実行するコマンドによっては、パスワードなしでsudoできるようにしておく必要があります。
これをしないと、sudoコマンドを実行したときにパスワード入力待ちになってしまいます。
/etc/sudoersの末尾に、
ユーザ名 ALL=(ALL) NOPASSWD: ALL
を加えます。
なお、/etc/sudoersの修正には専用のコマンド(visudo)を使います。

例えば、orangepiユーザに、パスワードなしでsudoできる権限を与える場合は
orangepi ALL=(ALL) NOPASSWD: ALL
をファイルに末尾に追加します。

色々と紹介してきましたが、こちらでOrangePi-PCの個人的な評価 を紹介します。