モルフィー企画より発売されていた「汎用USB-IO」の同等品(以下、USB-IO)を*BSDで使おうというページです。
USB接続の小型で安価なI/Oボードとして、モルフィー企画から以前「汎用USB-IO」というものが販売されていました。その後モルフィー企画という会社はなくなってしまいましたが、現在は、Km2Netさんやテクノキットさんで同等品(?)が入手可能です。
uhidデバイスとして認識されます。(私の持っているKm2Net製USB-IOの例)
uhidev1 at uhub1 port 2 configuration 1 interface 0 uhidev1: Km2Net Km2Net USB-IO Ver1.0, rev 1.10/0.01, addr 4, iclass 3/0 uhid1 at uhidev1: input=8, output=8, feature=0
出力を行うプログラム(の一部)です。
#include <dev/usb/usb.h> #include <dev/usb/usbhid.h> struct usb_ctl_report ucr; int fd, i; char buf[1024]; :(略) /* Open the device */ if ((fd = open("/dev/uhid0", O_RDWR)) < 0) { perror("/dev/uhid0"); exit(1); } /* Clear */ ucr.ucr_report = UHID_OUTPUT_REPORT; for (i = 0; i < 8; i++) ucr.ucr_data[i] = 0x00; /* Set data; Example: write 0xaa to port#0 */ ucr.ucr_data[0] = 0x01; /* Command: Write port#0 */ ucr.ucr_data[1] = 0xaa; /* Argument: Output Data */ /* Output */ if (ioctl(fd, USB_SET_REPORT, &ucr) < 0) { perror("USB_SET_REPORT"); exit(1); } close(fd);ucr.ucr_data[0]にMorphy USB-IOの仕様の「コマンド」に記載されている値、ucr.ucr_data[1]〜ucr.ucr_data[8]に引数を入れてioctl(2)でUSB_SET_REPORTすればいいようです。
動作確認環境
リモートで屋根裏部屋のLUNA-88K2の電源を入れられるようにしようと考えていましたが、LUNA-88K2本体が起動しなくなってしまいましたので別の応用例を考え中です。