Предотвращение перехода клавиатуры Bluetooth в спящий режим

Баш 4:mplayer file &> /dev/null

3
03.01.2021, 12:46
2 ответа

У меня такая же клавиатура, та же ОС и та же проблема. Есть много жалоб на это, но вряд ли решение.

Я провел много исследований и думаю, что лучше всего было бы выделить bluetooth-ключ для клавиатуры, установив его в HID-режиме . Вы бы в основном «загрузили» сопряжение с клавиатурой на адаптер. В этом случае адаптер будет управлять подключением к клавиатуре самостоятельно, отображая себя в системе как обычную USB-клавиатуру. Похоже, ваш адаптер TP -Link имеет набор микросхем CSR 8150, который должен работать. Недостаток :Этот адаптер будет либо в режиме HID , либо в обычном режиме HCI, где он служит в качестве обычного адаптера Bluetooth.

Вы можете увидеть здесь репозиторий человека, который сделал что-то подобное для другой клавиатуры. Их установка требует от вас настройки виртуальных машин; Я думаю, что это можно сделать гораздо проще:

Тест на совместимость

Запустите bccmd psget 0x3cd(, возможно, с помощью sudo )и посмотрите, не появится ли ошибка. Если нет, ваш адаптер Bluetooth должен быть совместим. Мой адаптер вышел из строя (, несмотря на предположительно наличие чипсета CSR8150 ). Ничего не ломал, но и не чинил.

Извлечь MAC-адрес клавиатуры и адаптера

При активном подключении клавиатуры запустите hcitool con, чтобы получить MAC-адрес вашей клавиатуры. Затем получите MAC-адрес вашего адаптера Bluetooth с помощью 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.

1
18.03.2021, 22:40

Пользовательский интерфейс для управления динамическим РМ находится в подкаталоге power/каталога sysfs каждого USB-устройства, то есть в /sys/bus/usb/devices/.../power/, где ...— идентификатор устройства.

Соответствующие файлы атрибутов: :wakeup, controlи autosuspend_delay_ms. Также может быть файл с именем level; это файл был объявлен устаревшим в ядре 2.6.35 и заменен файлом controlфайл.

В версии 2.6.38 файл autosuspendбудет объявлен устаревшим и заменен файлом autosuspend_delay_ms. Единственное отличие состоит в том, что в более новом файле задержка выражается в миллисекундах, тогда как в старом файле используются секунды. Как ни странно, оба файла присутствуют в версии 2.6.37, но работает только autosuspend.)

  • power/wakeup

    Этот файл пуст, если устройство не поддерживает удаленное пробуждение. В противном случае файл содержит либо слово enabled, либо слово disabled, и вы можете записать эти слова в файл. Этот параметр определяет, будет ли включено удаленное пробуждение, когда устройство будет в следующий раз приостановлено.

    (Если настройка изменена во время приостановки работы устройства, изменение не вступит в силу до следующей приостановки.)

  • power/control

    Этот файл содержит одно из двух слов:onили auto. Вы можете записать эти слова в файл, чтобы изменить настройку устройства.

    onозначает, что устройство должно быть возобновлено, а автоприостановка запрещена. (Конечно, приостановка работы системы по-прежнему разрешена.)

    auto— это нормальное состояние, в котором ядру разрешено автоматически приостанавливать и автоматически возобновлять работу устройства.
    (В ядрах до 2.6.32 можно было также указать suspend, что означает, что устройство должно оставаться приостановленным, а автовозобновление не разрешено. Этот параметр больше не поддерживается.)

  • power/autosuspend_delay_ms

    Этот файл содержит целочисленное значение, которое представляет собой количество миллисекунд, в течение которых устройство должно оставаться бездействующим, прежде чем ядро ​​автоматически приостановит его (время простоя -задержки ). По умолчанию 2000. 0означает автоматическую приостановку, как только устройство становится бездействующим,а отрицательные значения означают, что автоприостановка никогда не будет выполняться. Вы можете записать число в файл, чтобы изменить время задержки автоматического приостановки простоя -.

Запись -1в power/autosuspend_delay_msи запись onв power/controlделают по существу одно и то же --обе они предотвращают автоматическую приостановку устройства. Да, это избыточность в API.

В 2.6.21 запись 0в power/autosuspendпредотвратила бы автоматическую приостановку устройства; поведение было изменено в 2.6.22. Атрибут power/autosuspendне существовал до версии 2.6.21, а атрибут power/levelне существовал до версии 2.6.22. power/controlбыл добавлен в 2.6.34, а power/autosuspend_delay_msбыл добавлен в 2.6.37, но не работал до 2.6.38.

1
18.03.2021, 22:40

Теги

Похожие вопросы