新的键盘 & usbhidaction

从同学那边借了一个键盘用,反正他有好几个键盘,这个放在旁边也不用。型号是 Microsoft Natural Ergonomic Keyboard 4000,很大的一个键盘,还是人体工程学设计的。
装载ukbd和uhid模块,插上键盘,显示出来两个设备: ukbd0 和 uhid0。
貌似ukbd0马上就被Xorg接受了,插上后按键就能够被Xorg接收到。
而那个uhid0,貌似就是用来发送特殊键的了。这个键盘上有不少特殊键,比如一对滚轮一样的Zoom键,Back/Forward, 控制音量和播放器的,启动程序的,以及可以自定义的特殊键。
研究了一下,有两个现成的工具。usbhidctl能够接受并显示 uhid 设备发过来的信息,而 usbhidaction 能够根据预先指定的配置文件,在接收到 uhid 设备的时候,执行对应的程序。
其实 FreeBSD 自带的 usbhidctl 和 usbhidaction 都有问题,他们对于 Report ID 这个HID设备的参数没有处理好。
一个HID设备允许其上的各个组件利用同一个接口发送信息,而这些信息就通过 Report ID 区分。在信息格式描述符中提到 Report ID 的设备,在发出来的数据包的前面会多一个字节,就是这个数据包所属部分的Report ID。
usbhidaction没有处理这个多出来的字节,导致它每次都少收一个字节,然后再收一个一字节的包…… 改了就好了。但是这个修改其实涉及到libusbhid,因此光修改usbhidaction还不行。但是要把这整个需要修改的地方做成patch提交,还要花一些功夫。
于是我改了一下 usbhidaction 和 usbhidctl,还有libusbhid,临时把 Report ID 指定为1,并且根据描述符的处理结果决定接受的字节数。原来的 usbhidaction 默认的 Report ID 是用一个ioctl获取的,这个令我难以理解…… 不是可以有不止一个么…… 关于这个,我发了封信给freebsd-stable,但是没人回…… 看来还是需要完整的patch才比较容易得到接受。
顺便贴一下我现在用的 usbhidaction 的配置文件。我改了devd.conf使得插入键盘的时候自动运行之,效果还是不错的。
 1 # Volume Control: Up, Down & Mute
 2 Consumer:Unassigned     233  0   /usr/sbin/mixer vol +3
 3 Consumer:Unassigned     234  0   /usr/sbin/mixer vol -3
 4 Consumer:Unassigned     226  0   /usr/sbin/mixer vol 0
 5 # Pause or Play
 6 Consumer:Unassigned     205  0   /usr/local/bin/mpc toggle &
 7 #                                alt+F11
 8
 9 # Calculator
10 Consumer:Unassigned     402  0   su henryhu -c “/usr/bin/env DISPLAY=:0 tiemu &”
11
12 # Back & Forward
13 Consumer:Unassigned     548  0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool key alt+Left”
14 Consumer:Unassigned     549  0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool key alt+Right”
15
16 # Zoom Up & Down
17 Consumer:Unassigned     557  0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool click 4”
18 Consumer:Unassigned     558  0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool click 5”
19
20 # 1 .. 5
21 Consumer:Consumer_Control.Microsoft:0xff05  1   0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool key ctrl+Up”
22 Consumer:Consumer_Control.Microsoft:0xff05  2   0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool key ctrl+a 1”
23 Consumer:Consumer_Control.Microsoft:0xff05  4   0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool key ctrl+a 2”
24 Consumer:Consumer_Control.Microsoft:0xff05  8   0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool key ctrl+a 3”
25 Consumer:Consumer_Control.Microsoft:0xff05  16  0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xdotool key ctrl+Down”
26
27 # My Favorites
28 Consumer:Unassigned     386  0   su henryhu -c “/usr/bin/env DISPLAY=:0 /usr/local/bin/xscreensaver-command -lock”
29 #/usr/local/bin/sudo -u henryhu /usr/local/bin/xdotool key ctrl+alt+l >& /var/log/xdotool.log
30
31 # Web/Home, Search & Mail
32 Consumer:Unassigned     547  0   su henryhu -c “/usr/bin/env DISPLAY=:0 firefix &”
33 Consumer:Unassigned     545  0   su henryhu -c “/usr/bin/env DISPLAY=:0 firefox http://www.google.com &”
34 Consumer:Unassigned     394  0   su henryhu -c “/usr/bin/env DISPLAY=:0 firefox http://www.gmail.com &”
35

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.