====== DI(ハードウェアカウンタ機能付き)を利用する ======
[[https://www.centurysys.co.jp/products/linuxserver/mae350lad.html|MA-E350/LAD-20]] は、DI/DO/RELAY OUT の端子台は MA-E350/GLAD と同じですが、\\
DI 8channel の前半 4channel 部分(DI0..DI3) に 8bit ハードウェアカウンタ((255までカウント可能))が実装されています。
ハードウェアによる実装なので、本体が Standby による待機中でもパルスをカウントすることができます。
\\
===== ソフトウェア =====
sysfs のノードは下記のようになっています。
root@plum:/sys/class/gpio/DI_03# ls -l
total 0
-rw-r--r-- 1 root root 4096 Dec 24 09:14 active_low
-rw-r--r-- 1 root root 4096 Dec 24 09:14 counter
-rw-r--r-- 1 root root 4096 Dec 24 09:14 debounce
lrwxrwxrwx 1 root root 0 Dec 24 09:14 device -> ../../../gpiochip13
-rw-r--r-- 1 root root 4096 Dec 24 09:14 edge
-rw-r--r-- 1 root root 4096 Dec 24 09:14 hwcounter
-rw-r--r-- 1 root root 4096 Dec 24 09:14 hwcounter_enable
drwxr-xr-x 2 root root 0 Dec 24 09:14 power
lrwxrwxrwx 1 root root 0 Dec 23 20:39 subsystem -> ../../../../../../../../class/gpio
-rw-r--r-- 1 root root 4096 Dec 23 20:39 uevent
-rw-r--r-- 1 root root 4096 Dec 24 09:14 value
-rw-r--r-- 1 root root 4096 Dec 24 09:14 wakeup_enable
\\
他の機種と比べると、下記が追加になっています。
|<35em 4em 12em 20em>|
^ No. ^ Name ^ Info |
| 1|hwcounter|カウント値 R/W|
| 2|hwcounter_enable|ハードウェアカウンタ enable/disable|
| 3|wakeup_enable|割込 enable/disable|
\\
==== hwcounter ====
カウンタ値の読み出しおよび設定を行います。
8bit で 255 までしか記録できないため、
* 定期的に 0 クリアする
* ラップアラウンドをソフトウェアで検知し、上位の桁を補う
などの処理をする必要があります。
root@plum:/sys/class/gpio/DI_03# cat hwcounter
0
root@plum:/sys/class/gpio/DI_03# echo 10 > hwcounter
root@plum:/sys/class/gpio/DI_03# cat hwcounter
10
root@plum:/sys/class/gpio/DI_03#
\\
==== hwcounter_enable ====
ハードウェアカウンタの有効化/無効化を設定します。"1" を書くと有効化、"0" を書くと無効化((v4.4.3まではバグにより無効化ができません、v4.4.4 で修正してあります))します。
root@plum:/sys/class/gpio/DI_03# cat hwcounter_enable
0
root@plum:/sys/class/gpio/DI_03# echo 1 > hwcounter_enable
root@plum:/sys/class/gpio/DI_03# cat hwcounter_enable
1
\\
==== wakeup_enable ====
割込信号を CPU 側に入れるかどうかを設定します。初期状態は『無効』(0) になっています。
※ Standby による低消費電力待機中に、DI の割込により Wakeup しないため。
そのため、これを有効にしない場合、割込により実装されているソフトウェアカウンタ(("counter" というノード))が動作しませんので注意が必要です。
root@plum:/sys/class/gpio/DI_03# cat wakeup_enable
0
root@plum:/sys/class/gpio/DI_03# echo 1 > wakeup_enable
root@plum:/sys/class/gpio/DI_03# cat wakeup_enable
1
root@plum:/sys/class/gpio/DI_03# echo 0 > wakeup_enable
root@plum:/sys/class/gpio/DI_03# cat wakeup_enable
0
\\