几分钟不活动(1000 万?)后,我的键盘进入睡眠状态。我必须按一个键,然后等待 5 秒才能再次使用它......
首先,一些技术细节:
- Linux Mint 20 ulyana - 肉桂 (Ubuntu 20.04)
- TP-Link UB400
- 蓝牙 USB 适配器 Microsoft Surface 人体工学键盘
我使用 bluetoothctl 配对键盘。这是我发现输入密码的唯一方法,因为 blueman-mananger 不要求输入密码。
我尝试过的:
- 1 - 检查 BIOS(主板:Asus H87-PLUS C2)的 USB 电源管理选项。我什么也没找到
- 2 - grub 设置。没有改变。
命令:
sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-z ]*/& usbcore.autosuspend=-1/' /etc/default/grub
sudo update-grub2
reboot
cat /sys/module/usbcore/parameters/autosuspend
-1
配置+重启:
AutoEnable=true
FastConnectable=true
还有其他想法吗?蓝牙选项? USB 选项?键盘选项?也许某种不干扰脚本+ cron 来保持它的活力?
(我知道“Mint 不是 Linux”,但我希望你们比 askubuntu Stack Exchange 社区更加开放:-))
编辑:我连接了蓝牙耳机。看起来只有键盘在睡觉。耳机保持唤醒状态。当键盘处于睡眠状态时,我无法从blueman管理器(右键单击+连接)手动连接键盘,但我可以连接耳机。
答案1
我有相同的键盘,相同的操作系统和相同的问题。对此有很多抱怨,但几乎没有解决方案。
我做了很多研究,我认为最好的方法是将蓝牙适配器设置为键盘专用HID模式。您基本上可以将与键盘的配对“上传”到适配器上。然后,适配器将自行管理与键盘的连接,将其自身显示为系统的常规 USB 键盘。您的 TP-Link 适配器似乎具有应该可以工作的 CSR 8150 芯片组。缺点:该适配器将是任何一个在 HID 模式下或者在常规 HCI 模式下,它充当通用蓝牙适配器。
你可以看到这是一个回购协议有人对另一个键盘做了类似的事情。他们的设置要求您设置虚拟机;我认为这可以更容易完成:
兼容性测试
运行bccmd psget 0x3cd
(也许使用 sudo)并查看是否出现错误。如果没有,您的蓝牙适配器应该兼容。我的适配器出现故障(尽管据说有 CSR8150 芯片组)。没有破坏任何东西,但也没有修复它。
提取键盘和适配器 MAC
激活键盘连接后,运行hcitool con
以获取键盘的 MAC 地址。接下来,使用 获取蓝牙适配器的 MAC 地址hcitool dev
。
编辑脚本
将以下脚本(取自链接的存储库并进行修改)保存为文本文件,并将两个 MAC 地址放在第一行中:
#!/bin/sh
MAC=your_adapter_MAC
DEV=hci0
CTRL=your_keyboard_MAC
function die() {
echo "FATAL: $@" 1>&2
exit 1
}
function readKeys() {
export Key= EDiv= Rand=
export t= $(cat "/var/lib/bluetooth/$CTRL/$MAC/info" | sed -n -e '/^\[LongTermKey/,/^\[/p' | grep -E '^(Key|EDiv|Rand)=[A-F0-9]+$')
if [ -z "$Key" ] || [ -z "$EDiv" ] || [ -z "$Rand" ]; then
return 1
fi
return 0
}
function toHex() { echo "obase=16; $1" | bc; }
function revbytes(){ local b=""; for ((i=2;i<=${#1};i+=2)); do b=$b${1: -i:2}; done; echo $b; }
function rev16(){ local b=""; for ((i=0;i<${#1};i+=4)); do b=$b${1: i+2:2}${1: i:2}; done; echo $b; }
function pad() { local b=000000000000000000000000000000000000000000000000000000$1; echo ${b: -$2*2:$2*2}; }
function makeToken() { echo $(echo $MAC|tr -d : )1482$(rev16 $(pad $(toHex $EDiv) 2))$(revbytes $(pad $(toHex $Rand) 8))$(rev16 $(pad $Key 16)); }
function formatToken() { local b=""; for ((i=0;i<${#1};i+=4)); do b="$b${1: i:4} "; done; echo $b | tr A-Z a-z; }
readKeys || die "Could not extract pairing keys"
token=$(formatToken $(makeToken))
[ ${#token} -eq 84 ] || die "Token $token has incorrect length"
echo "Writing $token to /dev/$DEV"
bccmd psload -s 0 /dev/stdin <<-EOF
// PSKEY_USR42
&02b4 = $token
// PSKEY_INITIAL_BOOTMODE
&03cd = 0002
&04b0 = 03c0 03cc 22c0
&04b1 = 01f9 0042
&04b2 = 02bf 03c0 03cc 02bd 000d 000e 215f
&04b8 = 0000
&04b9 = 0000
&04ba = 0001
&04f8 = 0000
&04f9 = 0001
&0538 = 100b
&0539 = 0001
&053a = 0001
&053b = 0000 0000 0000
&053c = 0002
&053d = 0000
&053e = 0002 0001 000a 0008 0010 0008 0020 0008 0040 0004 0080 0002 0140 0001 0200 0002
EOF
if [ $? -ne 0 ]; then
die 'write failed :-('
fi
bccmd psread | grep '&02b4'
echo "Make sure the above output is $token"
运行脚本
以 root 身份运行该脚本,您的适配器应设置为 HID 模式,不仅可以修复重新连接问题,还可以在 BIOS 启动时处理 HDD 加密密码等问题。