トロ HUB と遊ぼう 参考。 パロディ版 BSD MAGAZINE http://www.ascii.co.jp/BSDmag/parody/index.html 環境。 ようするに GENERIC 。 rin@maaya[~]% uname -a FreeBSD maaya.moe.or.jp 4.4-RELEASE FreeBSD 4.4-RELEASE #0: \ Tue Sep 18 11:57:08 PDT 2001 \ murray@builder.FreeBSD.org:/usr/src/sys/compile/GENERIC i386 おもむろに USB ポートにさしてみる。 uhub1: DreamsComeTrue CO.,LTD HubCot 2Port HUB, class 9/1, rev 1.10/1.00, addr 2 uhub1: 3 ports with 3 removable, self powered ugen0: DreamsComeTrue CO.,LTD HubCot, rev 1.00/1.00, addr 3 抜く。 uhub1: at uhub0 port 1 (addr 2) disconnected ugen0: detached uhub1: detached uhub_explore: port=1 reset failed /dev/ugen0 で使えるみたい。 /deb/ugen0 はこんな感じ。 rin@maaya[~/work/toro]% ls -l /dev/ugen0 crw-rw---- 1 root operator 114, 0 6/12 15:19 /dev/ugen0 rin を operator にする。 rin@maaya[~]% grep operator /etc/group operator:*:5:root,rin usbdevs を実行してみる。 rin@maaya[~]% usbdevs addr 1: OHCI root hub, AcerLabs addr 2: HubCot 2Port HUB, DreamsComeTrue CO.,LTD addr 3: HubCot, DreamsComeTrue CO.,LTD プログラムはこう。 パロディ版 BSD MAGAZINE からそのまま。 #include #include #include #include #include int main( int ac, char** av ) { struct usb_ctl_request r; int fd; int req; int val; int idx; fd = open( av[ 1 ], O_RDWR ); if( fd < 0 ) { perror( "open()" ); exit( 1 ); } req = atoi( av[ 2 ] ); val = atoi( av[ 3 ] ); idx = atoi( av[ 4 ] ); r.request.bmRequestType = UT_WRITE_VENDOR_DEVICE; r.request.bRequest = req; USETW( r.request.wValue, val ); USETW( r.request.wIndex, idx ); USETW( r.request.wLength, 0 ); r.data = 0; r.flags = 0; if( ioctl( fd, USB_DO_REQUEST, &r ) < 0 ) { perror( "ioctl()" ); exit( 1 ); } return 0; } 実行。 これだとトロが両手でキーボードをバシバシ叩く動作。 rin@maaya[~/work/toro]% ./a.out /dev/ugen0 5 100 0