Как приостановить работу/спать, когда Bluetooth активен?

Вчера возникла временная проблема с DNS Fedora — проблема с DNSSEC — как раз в то время, когда у вас возникла эта проблема. Теперь эта проблема решена.

2
09.09.2019, 10:36
1 ответ

Причина

Ядро Ошибка 200039 -Пакет рекламы BT пробуждает систему от S3 и приостанавливает -до -бездействия .

Это влияет на Intel(8087:0aaa)и Atheros(0cf3:e005)(0cf3:e007)bluetooth:

  • Acer Swift SF314 -55
  • Asus UX333FA
  • Asus UX433FN
  • Асус UX533FD

Обходной путь

Обходным решением является автоматическая деавторизация USB-устройства Bluetooth перед переходом в спящий режим/приостановку, а затем повторная авторизация после пробуждения.

Для systemdработа -заключается в использовании следующего:

/etc/systemd/system/bluetooth-disable-before-sleep.service(обратите внимание на строки CHANGE ME):

[Unit]
Description=disable bluetooth for systemd sleep/suspend targets
Before=sleep.target
Before=suspend.target
Before=hybrid-sleep.target
Before=suspend-then-hibernate.target
StopWhenUnneeded=yes

[Service]
Type=oneshot
RemainAfterExit=yes

# Usage: bluetooth-sleep (start|stop) <vendor> <product>
# Get values from `lsusb`:
# eg: Bus 001 Device 003: ID 8087:0aaa Intel Corp.
# Usage: bluetooth-sleep (start|stop) 8087 0aaa

##### CHANGE ME: (the two hex values at end of next line) ###
ExecStart=/usr/local/bin/bluetooth-sleep start 8087 0aaa
##### CHANGE ME: (the two hex values at end of next line) ###
ExecStop=/usr/local/bin/bluetooth-sleep  stop  8087 0aaa

[Install]
WantedBy=sleep.target
WantedBy=suspend.target
WantedBy=hybrid-sleep.target
WantedBy=suspend-then-hibernate.target

/usr/local/bin/bluetooth-sleep:

#!/bin/bash

# Disable bluetooth given first argument "start"
# Re-enable bluetooth given first argument "stop"
# Expects vendor and product as 2nd and 3rd arguments

set -eu

usage() {
  script_name=${0##*/}
  printf '%s: de-authorise bluetooth during sleep/suspend\n' "$script_name" >&2
  printf 'Usage: %s (start|stop) <vendor> <product>\n' "$script_name" >&2
  exit 1
}

case "${1:-}" in
  start) value=0 ;;
  stop)  value=1 ;;
  *)     usage   ;;
esac

[ $# -ne 3 ] && usage
vendor=$2
product=$3

shopt -s nullglob
for dir in /sys/bus/usb/devices/*; do
  if [[ -L "$dir" && -f $dir/idVendor && -f $dir/idProduct &&
        $(cat "$dir/idVendor")  == "$vendor" &&
        $(cat "$dir/idProduct") == "$product" ]]; then
    echo "$value" > "$dir/authorized"
    echo "echo $value > $dir/authorized"
  fi
done

Кредит этому сообщению .

6
27.01.2020, 22:02

Теги

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