O atual obstáculo com links OP, comentários de acompanhamento e respostas propostas é que o ID do produto é estático 1b1a:7001
, mas os números de barramento e dispositivo continuam mudando.
A solução
Crie um script (qualquer nome que você quiser) no diretório /etc/pm/sleep.d/
e coloque o seguinte:
#!/bin/bash
ZeroBUS=$(lsusb | grep 1b1a:7001 | cut -c 5-7 )
# Strip leading zeros
BUS=$(echo $ZeroBUS | sed 's/^0*//')
# Build "usbX" usb number
USB=usb$BUS
case $1 in
suspend|suspend_hybrid|hibernate)
echo "Powering off: " $USB
echo $USB | sudo tee /sys/bus/usb/drivers/usb/unbind
;;
resume|thaw)
# No need to do anything here, kernel unsuspends USB devices
# Show how to power on for interest sake but since device is
# powered off the usb number will be blank.
echo "Powering on: " $USB
echo $USB | sudo tee /sys/bus/usb/drivers/usb/bind
;;
esac
Marque o arquivo como executável com sudo chmod +x file_name
, em que "file_name" é o nome que você escolheu.
A explicação
Esta solução desliga todo o hub USB, que no meu caso significava telefone, mouse sem fio, teclado sem fio, etc. Ao chamar o script do terminal, a senha do sudo precisa ser digitada. Esperemos que, quando chamados de poderes sudo systemd, sejam herdados. Eu não pude testar isso, porque eu não tenho um mouse com fio. Portanto, um refinamento adicional pode ser necessário para os poderes do sudo.
A energia não é cortada fisicamente quando a BIOS está fornecendo uma fonte de alimentação constante de 5V, e os dispositivos no barramento são instruídos a se desligarem. No meu caso, o teclado e o mouse sem fio pararam de funcionar e tiveram que recorrer ao teclado do laptop e ao touchpad para voltar a ligá-lo.
Você pode testar isso manualmente chamando o script e passando os parâmetros "suspender". Passar o parâmetro "resume" não faz nada porque o dispositivo está desligado, não tem ID de dispositivo para ligá-lo novamente.
Solução mais fácil para desligar todas as portas USB
Recentemente encontrei um problema em que uma porta desconhecida estava impedindo o laptop de ser suspenso. Eu encontrei esta solução (crédito em código) que eu modifiquei.
Crie o arquivo /lib/systemd/system-sleep/custom-xhci_hcd
usando sudo
powers e insira este código:
#!/bin/bash
# Original script was using /bin/sh but shellcheck reporting warnings.
# NAME: custom-xhci_hcd
# PATH: /lib/systemd/system-sleep
# CALL: Called from SystemD automatically
# DESC: Suspend broken for USB3.0 as of Oct 25/2018 various kernels all at once
# DATE: Oct 28 2018.
# NOTE: From comment #61 at: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/522998
TMPLIST=/tmp/xhci-dev-list
# Original script was: case "${1}" in hibernate|suspend)
case $1/$2 in
pre/*)
echo "$0: Going to $2..."
echo -n '' > $TMPLIST
for i in 'ls /sys/bus/pci/drivers/xhci_hcd/ | egrep '[0-9a-z]+\:[0-9a-z]+\:.*$''; do
# Unbind xhci_hcd for first device XXXX:XX:XX.X:
echo -n "$i" | tee /sys/bus/pci/drivers/xhci_hcd/unbind
echo "$i" >> $TMPLIST
done
;;
post/*)
echo "$0: Waking up from $2..."
for i in 'cat $TMPLIST'; do
# Bind xhci_hcd for first device XXXX:XX:XX.X:
echo -n "$i" | tee /sys/bus/pci/drivers/xhci_hcd/bind
done
rm $TMPLIST
;;
esac