投稿日: Feb 15, 2017 1:13:53 PM
そんなにこまってないから放置していたってのはあるんだけど。
使っているMicrosoftのmultimedia keyboardもElecomのDEFTトラックボールも、標準のままだと反応しないキーがある。
単に機能が割り振られていないだけでシステムでは認識しているってあたりで。すこしだけ探ってみよう。
今回はElecomのトラックボール。
dmesg
[95580.306303] usb 1-1.5.4.4: USB disconnect, device number 11
[95583.025402] usb 1-1.5.4.4: new low-speed USB device number 16 using dwc_otg
[95583.159065] usb 1-1.5.4.4: New USB device found, idVendor=056e, idProduct=00fe
[95583.159093] usb 1-1.5.4.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[95583.159106] usb 1-1.5.4.4: Product: ELECOM TrackBall Mouse
[95583.159117] usb 1-1.5.4.4: Manufacturer: ELECOM
[95583.176149] input: ELECOM ELECOM TrackBall Mouse as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.4/1-1.5.4.4/1-1.5.4.4:1.0/0003:056E:00FE.0006/input/input6
[95583.236505] hid-generic 0003:056E:00FE.0006: input,hiddev0,hidraw4: USB HID v1.11 Mouse [ELECOM ELECOM TrackBall Mouse] on usb-3f980000.usb-1.5.4.4/input0
dmesgの直近でデバイスの抜き差しをすると探しやすい。
みるべきところは色かえたところね。
このあたり見れば何となくなにか解る。
試しに
sudo hexdump /dev/hidraw4
などとする。
0000000 2001 0000 0000 0000 0001 0000 0000 0000
0000010 4001 0000 0000 0000 0001 0000 0000 0000
0000020 8001 0000 0000 0000 0001 0000 0000 0000
普段反応しないキーでなにやらログが出てくる。
見るべきところはその機能によって違うけどこれの場合 2byte x 4 の羅列になっているようだ?
2001、4001、8001 っていうのがそれぞれのキーを押したときに出てくるやつ。これだけでいいんだけどほかに2byte x 7 のデータがついてくるし、この2001だのいうデータが9byteめにくることもある。
/dev/hidrawの知識が不足しているのでとりあえずこんなもんだということで。
認識してるのを確認して今回はこんなもん?
ちなみに、二回ボタンをクリックすると
0000000 2001 0000 0000 0000 0001 0000 0000 0000
*
このようになる。
別の操作をはさまない限りデータがこない。
謎。
ついでに。
cat /sys/class/hidraw/hidraw4/device/uevent
DRIVER=hid-generic
HID_ID=0003:0000056E:000000FE
HID_NAME=ELECOM ELECOM TrackBall Mouse
HID_PHYS=usb-3f980000.usb-1.5.4.4/input0
HID_UNIQ=
MODALIAS=hid:b0003g0001v0000056Ep000000FE
これの意味するところが何であるか、というのはいずれ役に立つかもしれないってことで。
これで終わらせるのもなんなので。
とりあえず解ってること、0x01の次の1byteに0x20、0x40、0x80が出現したとき、エレコムのトラックボールのFn1、Fn2、Fn3がクリックされた状態だということ。(hexdumpはbyteの並びをひっくり返してくるのに注意)
0x01、0x20 という並びでデータが出現するのは、16byte中,0byteめ、または8byteめからの2byteだということ。
てなこんなで反映したのがこちらのソース。
#include <linux/hidraw.h> #include <stdio.h> #include <fcntl.h> int main(int argc, char **argv){ char *dev = "/dev/hidraw4"; int fd,dt,i; char buf[256]; fd = open(dev,O_RDWR|O_NONBLOCK); if(fd<0){ printf("error"); return 0; } while(1){ dt = read(fd,buf,16); for(i=0;i<2;i++){ if(buf[i*8] == 0x01){ if(buf[i+1] & 0x20){ printf("Fn1\n"); } if(buf[i+1] & 0x40){ printf("Fn2\n"); } if(buf[i+1] & 0x80 ){ printf("Fn3\n"); } } } } close(fd); return 0; }
最後のfcloseが呼ばれることはないであろうこととかいろいろ気になるんだけど、とりあえずこれで押されてることを判定出来ているのと他の操作でつられて動くことがないのも確認できてる風なので、それぞれのボタンの判定のところに処理でもいれれば便利にマルチボタンマウス(トラックボール)として利用できそうですね?
/dev/hidrawは権限ユーザじゃないと見えないので当然このコードもsudoで実行しないとエラーで止まる。