====== 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 \\