原文地址:www.trial-n-error.de/posts/2012/…
原文作者:www.trial-n-error.de
发布时间:2012年12月31日
最近我买了一个罗技K810键盘。这款小巧的蓝牙键盘可以无线连接电脑或其他设备,如手机。它配备了背光,支持3个设备的配对连接。
要使用这些扩展功能和在配置文件之间切换,功能键(F键)具有双重意义。
购买后我发现,默认的配置是使用F键直接按键的扩展功能。为了使用常规的F键,用户必须另外按住FN键。由于我想主要在普通PC上使用键盘,我无法忍受。幸运的是,罗技为微软Windows系统提供了一个名为 "SetPoint "的鼠标和键盘配置工具。
然而,当我发现配置并不是永久存储在键盘中,而是必须在每次打开键盘时发送时,我感到很失望。由于我更喜欢使用Linux作为操作系统,并且不使用微软Windows,所以我无法使用罗技的软件。我分析了与HID设备的通信,并创建了一个小软件来发送配置信息到键盘。为了追踪蓝牙信息,我在VirtualBox环境中执行SetPoint。虚拟机可以通过一个蓝牙USB加密狗连接到键盘上。在Linux主机上,我加载了usbmon内核模块,以便追踪USB层的所有信息到CSR蓝牙芯片。
$ mount -t debugfs none_debugs /sys/kernel/debug
$ modprobe usbmon
由于我的蓝牙加密狗0a12:0001连接到第3条总线上,我执行了以下命令。
cat /sys/kernel/debug/usb/usbmon/3u
当我在SetPoint中切换标志 "交换F键功能"。我发现信息的有效载荷在一个固定的位置发生了变化 --> 找到了! # Disable - Swap F key functions:
# Disable - Swap F key functions. -> use regular F key directly (OUT)
ffff8803ea0853c0 3469985170 S Bo:3:003:2 -115 16 = 47000c00 08004200 a210ff06 15000000
# Response from Keyboard (IN)
ffff8803e6c36980 3470086675 C Bi:3:003:2 0 29 = 47201900 15004100 a111ff06 15000100 00000000 00000000 00000000 00
# Enable - Swap F key functions. -> use regular F key together with FN key (OUT)
ffff8803277b0480 3483623889 S Bo:3:003:2 -115 16 = 47000c00 08004200 a210ff06 15010000
# Response from Keyboard (IN)
ffff8803e6c36980 3483991655 C Bi:3:003:2 0 29 = 47201900 15004100 a111ff06 15010100 00000000 00000000 00000000 00
接下来的步骤很简单。每当键盘连接到Linux中的BlueZ堆栈时,就会创建一个 "hidraw "设备。
[ 65.632036] input: Logitech K810 as /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.4/3-1.4:1.0/bluetooth/hci0/hci0:11/input18
[ 65.632268] generic-bluetooth 0005:046D:B319.0001: input,hidraw0: BLUETOOTH HID v12.01 Keyboard [Logitech K810] on XX:XX:XX:XX:XX:XX
因此我写了一个小程序k810_conf,将消息序列0x10、0xff、0x06、0x15、0x00、0x00、0x00发送到键盘的 "hidraw "设备上。我的系统配置为每当键盘连接时自动执行k810_conf。
k810_conf的源码是在Debian GNU Linux(Wheezy)上测试的,可以在这里找到。
2014-02-10更新。
为了在每次键盘连接时自动运行配置,可以使用以下udev规则。
$ cat /etc/udev/rules.d/00-k810.rules
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{address}=="00:1F:AA:BB:CC:DD", \
RUN+="/path/to/script/k810.sh %p"
你需要将00:1F:AA:BB:CC:DD与你的蓝牙键盘ID交换。
脚本k810.sh可以是这样的。
#!/bin/sh
if [ "$ACTION" == "add" ];
then
# configure k810 ($DEVPATH) at $DEVNAME.
/path/to/bin/k810_conf -d $DEVNAME -f on
fi
$DEVNAME会自动被UDEV替换成正确的键盘hidraw设备路径。
通过www.DeepL.com/Translator(免费版)翻译