Skip to content

Instantly share code, notes, and snippets.

@ao-kenji
Last active December 20, 2018 11:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ao-kenji/57e49dcc4a3f24c6751fc995f99251b5 to your computer and use it in GitHub Desktop.
Save ao-kenji/57e49dcc4a3f24c6751fc995f99251b5 to your computer and use it in GitHub Desktop.
VIR-USB赤外線学習リモコンキットとOpenBSD/NetBSD

VIR-USB赤外線学習リモコンキットとOpenBSD/NetBSD

0. 概要

Ogaki Mini Maker Faireでファンアウト仙台 http://purose.net/fanout/ さんのVIR-USB 赤外線学習リモコンキットを入手しました。 Linux/FreeBSDでも動くそうなので、OpenBSD/NetBSDで動作するか試してみます。

VIR-USB赤外線学習リモコンキット

NetBSD/amd64で動作することを確認しました。(要カーネルパッチ) (2018/12/13)

OpenBSD/amd64で、一部エラーになりますが動作することを確認しました。(要カーネルパッチ) (2018/12/19)

1. NetBSD編

  • OS: NetBSD/amd6.4 8.0-RELEASE

後述のOpenBSD同様、マザーボード(USBチップ?)によって認識できる機種とできない機種があるかもしれません。 NetBSD 用に使用した以下のマシンでの結果を記載しています。

  • 本体: & Dell Optiplex 740

1.1 デバイスの認識

USBハブ経由、かつUSBハブ本体装着後にVIR-USBを装着しないと認識されませんでした。 一旦、ugen(4)と認識された後改めてuhid(4)に変わるようです。

本体USBコネクタに直接装着した場合

(認識せず)

USBハブにVIR-USBを装着し、そのUSBハブを本体に装着した場合

uhub2 at uhub1 port 2: vendor 05e3 (0x5e3) USB2.0 Hub (0x608), class 9/0, rev 2.00/32.98, addr 2
uhub2: single transaction translator
uhub2: 4 ports with 4 removable, self powered
uhub2: device problem, disabling port 2

USBハブを本体に装着し、そのUSBハブにVIR-USBを装着した場合

uhub2 at uhub1 port 2: Genesys Logic (0x5e3) USB2.0 Hub (0x608), class 9/0, rev 2.00/32.98, addr 2
uhub2: single transaction translator
uhub2: 4 ports with 4 removable, self powered
ugen0 at uhub2 port 2
ugen0: vendor 16d0 (0x16d0) product 0753 (0x753), rev 1.10/1.06, addr 3
ugen0: detached
ugen0: at uhub2 port 2 (addr 3) disconnected
uhidev2 at uhub2 port 2 configuration 1 interface 0
uhidev2: Fanout_sendai (0x20a0) VIR (0x427e), rev 1.10/1.00, addr 3, iclass 3/0
uhidev2: no input interrupt endpoint

1.2 制御ソフトの実行(1回め敗退編)

先に、devel/libusb1-1.0.22 を pkg_add しておきます。

ファンアウト仙台さんのページから、制御ソフトのソースコード (V-IR-src-27.zip)をダウンロードして解凍し、以下のパッチをあてます。

--- /dev/null	2018-12-12 22:05:39.530202719 +0900
+++ UNIX/Makefile.NetBSD	2018-12-11 22:04:37.363625335 +0900
@@ -0,0 +1,17 @@
+#
+# Makefile for NetBSD
+#
+# before use, pkg_add libusb-1.0
+#
+
+V-IR: v-ir.c
+#	echo === Make on 32bit machine. ===
+	gcc v-ir.c -I/usr/pkg/include -L/usr/pkg/lib -lusb-1.0 -static -lpthread -o V-IR -DNetBSD=1
+
+clean:
+	touch V-IR
+	rm    V-IR
+	touch \#dummyfile
+	touch dummyfile~
+	rm \#* *~
+	perl -e 'use Cwd; $$_=getcwd(); /(\d+)/; print "#define VERSION \"$$1\"\n"' > version.h
--- UNIX/v-ir.c.orig	2018-12-11 21:46:39.396603384 +0900
+++ UNIX/v-ir.c	2018-12-11 22:11:56.812046318 +0900
@@ -26,6 +26,10 @@
 #include <libusb.h>  // FreeBSD ではこれだけをインクルードする
 #endif
 
+#if NetBSD
+#include <libusb-1.0/libusb.h>  // NetBSD では事前に pkg_add libusb-1.0 する
+#endif
+
 #if MINGW32
 #include <libusb.h>  // MING ではこれだけをインクルードする
 #endif

UNIXディレクトリに移動し、上記のMakefile.NetBSDを使ってmakeします。

% make -f Makefile.NetBSD
gcc v-ir.c -I/usr/pkg/include -L/usr/pkg/lib -lusb-1.0 -static -lpthread -o V-IR -DNetBSD=1
% 

できあがったV-IRを実行してみましたが、デバイスが認識されませんでした。(dmesgでは認識されている)

% uname -a
NetBSD kalgan.in.nk-home.net 8.0 NetBSD 8.0 (GENERIC) #0: Tue Jul 17 14:59:51 UTC 2018  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC amd64
% dmesg | grep VIR
uhidev2: Fanout_sendai (0x20a0) VIR (0x427e), rev 1.10/1.00, addr 3, iclass 3/0
% ls -l ./V-IR
-rwxr-xr-x  1 aoyama  10  398184 Dec 12 22:28 ./V-IR
% su
Password:
# ./V-IR V
Searching a USB device (VENDOR_ID=16C0H, PRODUCT_ID=05DFH)... not found.
Searching a USB device (VENDOR_ID=20A0H, PRODUCT_ID=0001H)... not found.
Searching a USB device (VENDOR_ID=20A0H, PRODUCT_ID=427EH)... not found.
Please run this command as a root user.
# 

1.3 制御ソフトの実行(敗者復活編)

NetBSD(OpenBSDも?)では libusb は ugen(4) でないと使えないそうですので、ソースに以下のパッチをあてます。

Index: dev/usb/usb_quirks.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/usb_quirks.c,v
retrieving revision 1.86
diff -u -r1.86 usb_quirks.c
--- dev/usb/usb_quirks.c        4 Dec 2016 10:12:35 -0000       1.86
+++ dev/usb/usb_quirks.c        15 Dec 2018 00:36:52 -0000
@@ -69,6 +69,8 @@
  { USB_VENDOR_WELTREND, USB_PRODUCT_WELTREND_HID,   ANY,   { UQ_HID_IGNORE }},
  { USB_VENDOR_SILABS, USB_PRODUCT_SILABS_EC3,       ANY,   { UQ_HID_IGNORE }},
  { USB_VENDOR_TI, USB_PRODUCT_TI_MSP430,            ANY,   { UQ_HID_IGNORE }},
+ { USB_VENDOR_FANOUTSENDAI, USB_PRODUCT_FANOUTSENDAI_VIR,
+                                                   ANY,   { UQ_HID_IGNORE }},
 
  { USB_VENDOR_KYE, USB_PRODUCT_KYE_NICHE,          0x100, { UQ_NO_SET_PROTO}},
  { USB_VENDOR_INSIDEOUT, USB_PRODUCT_INSIDEOUT_EDGEPORT4,
Index: dev/usb/usbdevs
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/usbdevs,v
retrieving revision 1.736
diff -u -r1.736 usbdevs
--- dev/usb/usbdevs     30 May 2017 20:13:35 -0000      1.736
+++ dev/usb/usbdevs     15 Dec 2018 00:36:52 -0000
@@ -552,6 +552,7 @@
 vendor PLANEX2         0x2019  Planex Communications
 vendor ENCORE          0x203d  Encore
 vendor HAUPPAUGE2      0x2040  Hauppauge Computer Works
+vendor FANOUTSENDAI    0x20a0  Fanout Sendai
 vendor PARA            0x20b8  PARA Industrial
 vendor TRENDNET                0x20f4  TRENDnet
 vendor RTSYS           0x2100  RT Systems
@@ -1710,6 +1711,9 @@
 product HAUPPAUGE2 WINTV_NOVAT_7700PC  0x7060  WinTV Nova-T DVB-T
 product HAUPPAUGE2 WINTV_NOVAT_7070P   0x7070  WinTV Nova-T DVB-T
 
+/* Fanout Sendai */
+product FANOUTSENDAI VIR       0x427e  VIR-USB IR remote controller
+
 /* Hawking Technologies products */
 product HAWKING RT2870_1       0x0001  RT2870
 product HAWKING RT2870_2       0x0003  RT2870

パッチ適用後 sys/dev/usb ディレクトリで make -f Makefile.usbdevs を実行し、その後カーネルを再構築してください。

パッチをあてたカーネルで起動したところ、今度はデバイスが ugen(4) として認識されました。

% uname -a
NetBSD kalgan.in.nk-home.net 8.0 NetBSD 8.0 (GENERIC) #1: Thu Dec 13 22:39:30 JST 2018  aoyama@kalgan.in.nk-home.net:/usr/src/sys/arch/amd64/compile/GENERIC amd64
% dmesg | grep VIR
ugen0: Fanout_sendai (0x20a0) VIR (0x427e), rev 1.10/1.00, addr 3
% 

気をよくしてそのまま制御ソフトを実行してみたら、ちゃんと動作しているようです:-)

% su
Password:
# ./V-IR V    (ファームウェアのバージョン表示)
32
# ./V-IR l    (事前に手動登録した電源ONコマンドが送信されてTV電源が入りました)
# ./V-IR P
#,01,D9,81,00,7D,1F,1F,1E,5F,1E,1F,1E,5F,1F,1E,1F,5E,1F,1E,C1,5F,C1,1F,C1,5F,C1,1F,C1,5F,C3,1F,C1,5F,C1,1E,C1,5E,C7,1F,C5,5F,C1,1F,C1,60,C1,1F,C3,5F,C1,1F,C7,5F,C3,1F,C1,5F,C1,1E,C5,5F,C1,1F,C5,5E,C1,1F,C1,5F,C3,94,C4,80,FF,7D,1F,1F,C1,5F,C1,1F,C1,5F,C1,1F,C1,5E,C1,1F,C1,5E,C1,1F,C1,5F,C1,1F,C1,5F,C3,1F,C1,5F,C1,1F,C1,5E,C7,1F,C5,5E,C1,1E,C1,5E,C1,20,C3,5F,C1,1F,C7,5F,C3,20,C1,5F,C1,1F,C5,5F,C1,1F,C5,5F,C1,20,C1,5F,C3,94,C6,80,FF,7E,1E,1F,C1,5F,C1,1F,C1,5E,C1,1F,C1,5F,C1,1F,C1,5F,C1,1F,C1,5E,C1,1F,C1,5E,C3,1F,C1,5E,C1,1F,C1,5F,C7,1F,C5,5F,C1,1F,C1,5E,C1,1F,C3,5F,C1,20,C7,5F,C3,1F,C1,5F,C1,20,C5,5E,C1,1F,C5,5F,C1,1F,C1,5E,C3
# 

2. OpenBSD編

  • OS: OpenBSD/amd64 6.4-RELEASE

マザーボード(USBチップ?)によって認識できる機種とできない機種があるようです。 手元のマシンでは、

  • Dell Inspiron 530s ... 認識せず
  • Dell OptiPlex 740 ... 下記の状態で認識
  • Lenovo ThinkPad R61 ... 下記の状態で認識
  • Lenovo ThinkPad X61 ... 下記の状態で認識

という結果でした。認識されない機種では、以下のいずれのパターンも認識されませんでした。

  • 本体USBコネクタに直接装着した場合
  • USBハブにVIR-USBを装着し、そのUSBハブを本体に装着した場合
  • USBハブを本体に装着し、そのUSBハブにVIR-USBを装着した場合

これ以降の記載は、Dell OptiPlex 740 での状況です。

2.1 デバイスの認識

USBハブ経由、かつUSBハブ本体装着後にVIR-USBを装着しないと認識されませんでした。 一旦、ugen(4)と認識された後改めてuhid(4)に変わるようです。

本体USBコネクタに直接装着した場合

(認識せず)

USBハブにVIR-USBを装着し、そのUSBハブを本体に装着した場合

uhub2 at uhub0 port 7 configuration 1 interface 0 "Genesys Logic USB2.0 Hub" rev 2.00/32.98 addr 2
uhub2: device problem, disabling port 2

USBハブを本体に装着し、そのUSBハブにVIR-USBを装着した場合

uhub2 at uhub0 port 8 configuration 1 interface 0 "Genesys Logic USB2.0 Hub" rev 2.00/32.98 addr 2
ugen0 at uhub2 port 2 "vendor 0x16d0 product 0x0753" rev 1.10/1.06 addr 3
ugen0 detached
uhidev2 at uhub2 port 2 configuration 1 interface 0 "Fanout_sendai VIR" rev 1.10/1.00 addr 3
uhidev2: no input interrupt endpoint

2.2 制御ソフトの実行

libusb は NetBSD と同じく ugen(4) でないと使えないため、NetBSD と同じ方法で対応することにします。

あらかじめ、pkg_add libusb1 しておきます。

次に、デバイスがugen(4)として認識されるようにカーネルソースに以下のパッチをあてます。

Index: dev/usb/usb_quirks.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/usb_quirks.c,v
retrieving revision 1.75
diff -u -r1.75 usb_quirks.c
--- dev/usb/usb_quirks.c        10 Jul 2018 09:46:18 -0000      1.75
+++ dev/usb/usb_quirks.c        19 Dec 2018 11:54:43 -0000
@@ -126,6 +126,8 @@
  { USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_SISPM_OLD,  ANY,    { UQ_BAD_HID }},
  { USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_SISPM,      ANY,    { UQ_BAD_HID }},
  { USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_SISPM_FLASH,        ANY,    { UQ_BAD_HID }},
+ { USB_VENDOR_FANOUTSENDAI, USB_PRODUCT_FANOUTSENDAI_VIR,
+                                                       ANY,    { UQ_BAD_HID }},
  { USB_VENDOR_MICROCHIP, USB_PRODUCT_MICROCHIP_USBLCD20x2,     ANY,    { UQ_BAD_HID }},
  { USB_VENDOR_MICROCHIP, USB_PRODUCT_MICROCHIP_USBLCD256x64,   ANY,    { UQ_BAD_HID }},
  { USB_VENDOR_MECANIQUE, USB_PRODUCT_MECANIQUE_WISPY,  ANY,    { UQ_BAD_HID }},
Index: dev/usb/usbdevs
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.692
diff -u -r1.692 usbdevs
--- dev/usb/usbdevs     22 Aug 2018 15:30:20 -0000      1.692
+++ dev/usb/usbdevs     19 Dec 2018 11:54:45 -0000
@@ -615,6 +615,7 @@
 vendor DLINK           0x2001  D-Link
 vendor PLANEX2         0x2019  Planex Communications
 vendor ENCORE          0x203d  Encore
+vendor FANOUTSENDAI    0x20a0  Fanout Sendai
 vendor PARA            0x20b8  PARA Industrial
 vendor TRENDNET                0x20f4  TRENDnet
 vendor RTSYSTEMS       0x2100  RT Systems
@@ -1760,6 +1761,9 @@
 /* Falcom Wireless Communications GmbH products */
 product FALCOM TWIST           0x0001  Twist
 product FALCOM SAMBA           0x0005  Samba
+
+/* Fanout Sendai */
+product FANOUTSENDAI VIR       0x427e  VIR-USB IR remote controller

 /* FeiXun Communication products */
 product FEIXUN RTL8188CU       0x0090  RTL8188CU

パッチ適用後 sys/dev/usb ディレクトリで make を実行し、その後カーネルを再構築してください。

再構築したカーネルでは、以下の用にデバイスが ugen(4) として認識されます。

ugen0 at uhub2 port 2 "vendor 0x16d0 product 0x0753" rev 1.10/1.06 addr 3
ugen0 detached
ugen0 at uhub2 port 2 "Fanout_sendai VIR" rev 1.10/1.00 addr 3

次にに制御ソフトをコンパイルします。 ファンアウト仙台さんのページからダウンロードした制御ソフトのソースコード (V-IR-src-27.zip)を解凍し、以下のパッチをあてます。

--- /dev/null   Wed Dec 19 21:03:13 2018
+++ UNIX/Makefile.OpenBSD       Wed Dec 19 21:03:07 2018
@@ -0,0 +1,16 @@
+#
+# Makefile for OpenBSD
+#
+# do pkg_add libusb1 before make
+#
+
+V-IR: v-ir.c
+       cc v-ir.c -I/usr/local/include -L/usr/local/lib -lusb-1.0 -static -lpthread -o V-IR -DOpenBSD=1
+
+clean:
+       touch V-IR
+       rm    V-IR
+       touch \#dummyfile
+       touch dummyfile~
+       rm \#* *~
+       perl -e 'use Cwd; $$_=getcwd(); /(\d+)/; print "#define VERSION \"$$1\"\n"' > version.h
--- UNIX/v-ir.c.orig    Tue Dec 11 21:46:39 2018
+++ UNIX/v-ir.c Tue Dec 18 21:33:51 2018
@@ -26,6 +26,10 @@
 #include <libusb.h>  // FreeBSD ではこれだけをインクルードする
 #endif

+#if NetBSD || OpenBSD
+#include <libusb-1.0/libusb.h>  // NetBSD/OpenBSD では事前に pkg_add libusb-1.0 する
+#endif
+
 #if MINGW32
 #include <libusb.h>  // MING ではこれだけをインクルードする
 #endif

UNIXディレクトリに移動し、上記のMakefile.OpenBSDを使ってmakeします。(元ソースがsprintf()を使っているためwarningが出ます)

% make -f Makefile.OpenBSD
cc v-ir.c -I/usr/local/include -L/usr/local/lib -lusb-1.0 -static -lpthread -o V-IR -DOpenBSD=1
/tmp/v-ir-6994d9.o: In function `main':
v-ir.c:(.text+0xfde): warning: sprintf() is often misused, please use snprintf()
% 

できあがったバイナリを実行したところ、事前に手動登録したコマンドは送信できましたが、RAMのデータ表示はうまくいきませんでした。

% su
Password:
# ./V-IR V    (ファームウェアのバージョン表示)
32
# ./V-IR l    (事前に手動登録した電源ONコマンドが送信されてTV電源が入りました)
# ./V-IR P
Control IN error: LIBUSB_ERROR_IO
#,0#

3. 謝辞

@oshimyja さん: NetBSD インストールと libusb のアドバイスありがとうございました。

4. 作者

Kenji Aoyama / 青山 健治 / Twitter: @ao_kenji

ABSOLUTELY NO WARRANTY

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment