WHAT'S NEW?
Loading...

Logicoolのワイヤレス規格Unifying機器をLinuxで動かそう!

■デバイスなくしてコンピューティング無し!

そう、俺は昔から入力機器、要するに直接手で触るものには非常に強いこだわりがあるんだ。そしてそういったこだわりを持っている素敵な伊達男(ダーティガイ)も沢山知っている。

俺達IT戦士はほぼ毎日、マウスやらキーボードやらタッチパッドやらペンタブレットやらフットスイッチやら、果ては有機的なジョイスティックなどなど、いろいろなデバイスを使ってコンピュータに司令を出している。

自分にフィットしたデバイスであれば、その司令もスムースに進むことうけ合いなし。そして作業効率も断然アップすることまちがいなしだ。

だから命がけで入力デバイスを選んでいきたい。

これはそんな伊達男達(ダンディガイズ)たちの、真実の物語である。


■っていうかLogicoolで良いじゃん

俺の個人的な感覚になるが、キーボードはMicrosoft製かLogicool製、マウスなどのポインティングデバイスはLogicool製と決めている。

だからもうLogicoolで話をすすめるぞ。

何しろ無線規格であるUnifyingはLogicoolだけの規格なんで、ELECOMとかSANWAサプライとかiBuffaroなどのデバイスを買ってしまった君は、枕を濡らすしか無いのだ。

諦めって大事よ。

■ワイヤレスタッチパッドを買ってみた

先日、マウスちゃんのことが突然イヤになってお別れを告げるべく、突き放してみた。

普段キーボードで両手を使っちゃってる俺ちゃんだけど、マウスちゃんったらいちいち手を差し伸べてやらないと何もすることができないダメっ子ちゃん。あまり好きではないのだ。
ひっくり返すとビビー!!と光線で攻撃してきて目がショッボショボになるのよ。もうバイなら三角よ。

そして新しい恋人はAmazonで見つけたLogicoolのワイヤレスタッチパッドちゃん。受け口が広そうで、場所を取らないという素敵なスペックよ。ゴスっぽく白+黒がお似合い。だから早速ポチったわけ。そしてしばらく使ってみた。



■タッチパッドって要するに逃げ道なわけね

その時は職場のWindowsマシンにタッチパッドちゃんを無線で接続して使ったんだけど、しばらく使ってみて、どうしてもマウスちゃんのことが忘れられず、よく考えたらマウスちゃんのほうが作業効率が良かったよなぁ、という事に気がついたので、よりを戻すことにしたんだよね。また来て四角だね。



タッチパッドちゃんには悪いけど、自宅で待っててもらうことにした。

多分しばらくは使わないと思うけど、タッチパッドちゃんも買ってよかったと思う。何しろ持っていればいつでも使えるわけだし、こうやって記事を書くこともできるし。

しかし自宅のメインマシンはLinuxである。HDDの中にWindowsが入っていて、その上でLinuxを動かしているわけでも、OSのローダーでWindowsやLinuxを選択出来るようにしているわけでもない。物理的にHDDの中身全部がLinuxなのだ。

つまりどういうことかというと、専用ソフトであるSetPointが使えないので、細かい制御やデバイスの追加などができないって言うことなわけよ。トホホだわさ。

■ドライバ書けばよい

多分世界のどこかで同じようにLinuxでUnifyingを嗜みたいって思ってる奴がいるはずだ。そんなダンディかつダーティなクソ野郎を探すべく、Google先生にお願いしてみたら、一発で出てきた。

勝手に無許可に無断で無節操にここに掲載しておくので、自己責任で使われるが良い。

このドライバをコンパイルして実行すれば、Unifyingを認識するではないか。
素晴らしい。

unifying_pair.c
  1. /* 
  2.  * Copyright 2011 Benjamin Tissoires <benjamin.tissoi...@gmail.com> 
  3.  * 
  4.  * This program is free software: you can redistribute it and/or modify 
  5.  * it under the terms of the GNU General Public License as published by 
  6.  * the Free Software Foundation, either version 3 of the License, or 
  7.  * (at your option) any later version. 
  8.  * 
  9.  * This program is distributed in the hope that it will be useful, 
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  12.  * GNU General Public License for more details. 
  13.  * 
  14.  * You should have received a copy of the GNU General Public License 
  15.  * along with this program.  If not, see <http://www.gnu.org/licenses/>. 
  16.  */  
  17.    
  18. #include <linux/input.h>  
  19. #include <linux/hidraw.h>  
  20. #include <sys/ioctl.h>  
  21. #include <fcntl.h>  
  22. #include <unistd.h>  
  23. #include <stdio.h>  
  24. #include <errno.h>  
  25.    
  26. #define USB_VENDOR_ID_LOGITECH                  (__u32)0x046d  
  27. #define USB_DEVICE_ID_UNIFYING_RECEIVER         (__s16)0xc52b  
  28. #define USB_DEVICE_ID_UNIFYING_RECEIVER_2       (__s16)0xc532  
  29.    
  30. int main(int argc, char **argv)  
  31. {  
  32.         int fd;  
  33.         int res;  
  34.         struct hidraw_devinfo info;  
  35.         char magic_sequence[] = {0x10, 0xFF, 0x80, 0xB2, 0x01, 0x00, 0x00};  
  36.    
  37.         if (argc == 1) {  
  38.                 errno = EINVAL;  
  39.                 perror("No hidraw device given");  
  40.                 return 1;  
  41.         }  
  42.    
  43.         /* Open the Device with non-blocking reads. */  
  44.         fd = open(argv[1], O_RDWR|O_NONBLOCK);  
  45.    
  46.         if (fd < 0) {  
  47.                 perror("Unable to open device");  
  48.                 return 1;  
  49.         }  
  50.    
  51.         /* Get Raw Info */  
  52.         res = ioctl(fd, HIDIOCGRAWINFO, &info);  
  53.         if (res < 0) {  
  54.                 perror("error while getting info from device");  
  55.         } else {  
  56.                 if (info.bustype != BUS_USB ||  
  57.                     info.vendor != USB_VENDOR_ID_LOGITECH ||  
  58.                     (info.product != USB_DEVICE_ID_UNIFYING_RECEIVER &&  
  59.                      info.product != USB_DEVICE_ID_UNIFYING_RECEIVER_2)) {  
  60.                         errno = EPERM;  
  61.                         perror("The given device is not a Logitech "  
  62.                                 "Unifying Receiver");  
  63.                         return 1;  
  64.                 }  
  65.         }  
  66.    
  67.         /* Send the magic sequence to the Device */  
  68.         res = write(fd, magic_sequence, sizeof(magic_sequence));  
  69.         if (res < 0) {  
  70.                 printf("Error: %d\n", errno);  
  71.                 perror("write");  
  72.         } else if (res == sizeof(magic_sequence)) {  
  73.                 printf("The receiver is ready to pair a new device.\n"  
  74.                 "Switch your device on to pair it.\n");  
  75.         } else {  
  76.                 errno = ENOMEM;  
  77.                 printf("write: %d were written instead of %ld.\n", res,  
  78.                         sizeof(magic_sequence));  
  79.                 perror("write");  
  80.         }  
  81.         close(fd);  
  82.         return 0;  
  83. }  

さて、このファイルを作成したら。コンパイルしよう。

$ gcc -o unifying_pair unifying_pair.c

コンパイルが終わったらバイナリファイルができているので、そのバイナリに引数を当てて実行じゃ!!
※sudoするか、rootで実行する

# ./unifying_pair /dev/hidraw2

もし実行しても『The given device is not a Logitech』などのエラーが出る場合、引数を変えてみよう。

俺の場合、/dev/hidraw4だと認識した。PCの前面パネルだったから5番目、つまり4が正しかったんだと思う。

というわけで、これで無事にLinuxでUnifying機器が使えるようになっった。

■終わりだ

ただ、SetPointが使えないので、1機器に1個、レシーバが必要となる。
これはしゃーないから諦めよう。

■追記!!

2012-08-08

なんと!!Windows側でいくつかのデバイスをペアリングしておけば、あとはLinuxにレシーバさしただけで複数デバイスがそのまま動いたという!!