このエントリはカーネル/VM Advent Calendarの48日目向けです。
2011/1/4にLinuxカーネル2.6.37がリリースされました。BKL(Big Kernel Lock)の除去やファイルシステムのスケーラビリティなど、多くの改善が行われています。
そんな中、カーネルをビルドしようとしてmake oldconfigしていると、
USB YUREX driver support (USB_YUREX) [N/m/y/?] (NEW)
と聞かれてはっと気付いた方もいたかと思います。
そう、あの"貧乏ゆすりを科学する"YUREXに、Linuxカーネル2.6.37で対応したのです。
このエントリでは、このLinuxのYUREXドライバの使い方をご紹介したいと思います。(持ってない人には役に立たない情報ですみません…。既に完売してるので入手困難だし。。)
1. 準備
- 2.6.37以降のカーネルを、make menuconfig等でCONFIG_USB_YUREXをM(Yでもいいけど…)に設定して、ビルド・インストールします。
- YUREXのスイッチを下にスライドし、USBで接続します。*1
- udevによって /dev/yurex0 というデバイスが作られます。
Linux2.6.37以前でも、こちらのドライバをダウンロードしてmake installすれば利用できます。ただし、そのままだとhidrawという別のドライバにUSB接続をとられてしまうため、別途udevの設定が必要です。詳しくは上記githubのREADMEをみてください。
2. 使ってみる
/dev/yurex0 に対して read/write することで、YUREXにアクセスできます。例えば、
- /dev/yurex0 から貧乏ゆすりカウンタの読み出しができます。
# cat /dev/yurex0 12873
- 逆に echo 12345 > /dev/yurex0 とすれば値を書き込めます。
他にも、
- "A" を書き込むとアニメーション表示 (数字を書き込むと停止します)
- "L0" "L1" を書き込むとLEDを付けたり消したりできる
という機能もあります。
こんなちょっとしたプログラムを動かせば、YUREXがお洒落(?)な時計に早変わり。
効果音はなりませんけど。
3. その他の機能
単にカウントの読み出ししかできないと、/dev/yurex0の値をreadし続けないと貧乏ゆすりがあったことが分かりません。それではCPUの無駄遣い。そこでこのドライバではfasyncという機能に対応しています*2。fasyncを使うと、貧乏ゆすりがあったときにシグナルで通知を送ってもらうことができます。
fasyncを有効にするには、fcntlを使って以下のようにします:
fd = open("/dev/yurex0", O_RDONLY); sigaction(SIGIO, &sa, NULL); fcntl(fd, F_SETOWN, getpid()); fcntl(fd, F_SETFL, O_ASYNC);
これで、貧乏ゆすりのたびにこのプロセス宛にSIGIOが送られて来ます。
詳しくはこちらのサンプルを見て下さい。
それと、複数のYUREXを接続した場合には /dev/yurex1 などになります。最大16台まで接続可能。って、そんなにYUREXを持ってる人いるの?
余談
YUREXのUSBベンダーIDは0x0c45、プロダクトIDは0x1010ですが、この番号はGeneralKeysというドイツの会社(?)が作っているワイヤレスプレゼンターと重複してしまっていたようです(Bugzillaに上げられた報告)。こんなことあるんですね…。
そもそもUSB.orgのリストによると、ベンダーID 0x0c45(=3141)って、台湾のSonix Technologyという会社に割り振られているはずなのですよね。どちらもこの会社のUSBチップか何かを使ってて適当なプロダクト番号振ってしまった、とかなのかなあ…?
YUREXドライバの運命や如何に…。