Fala galera,
Quem usa notebooks, sabe que o gerenciamento de energia do Linux às vezes briga com o firmware da fabricante. O problema clássico: você suspende o notebook, ele volta, o mouse acende a luz, mas o cursor não se mexe. Só volta se tirar e colocar o cabo.
Depois de debugar o comportamento do kernel e do xHCI, cheguei a uma solução definitiva que faz um “re-plug lógico” via software.
O Problema
O controlador USB entra em estado D3 (power saving) e, ao retornar, o driver usbhid não consegue restabelecer o handshake de dados com o mouse, embora a porta forneça energia.
A Solução: Script de Re-inicialização via Systemd
Passo 1: O Script de Reset
Vamos criar um script que força a energia da porta para “sempre ligado” e reinicia o hub USB logicamente.
-
No terminal, crie a pasta de scripts (se não tiver):
mkdir -p ~/.scripts -
Crie o arquivo:
nano ~/.scripts/fix-mouse-usb.sh -
Cole o conteúdo abaixo:
Bash
#!/bin/bash
# Aguarda o hardware estabilizar após o wake
sleep 2
# Força todos os controladores USB para o estado 'on'
for dev in /sys/bus/usb/devices/*/power/control; do
echo "on" > "$dev" 2>/dev/null
done
# O Pulo do Gato: Re-plug lógico no hub 1-1
# Isso força o kernel a redescobrir os dispositivos sem tocar no cabo
if [ -f /sys/bus/usb/devices/1-1/authorized ]; then
echo 0 > /sys/bus/usb/devices/1-1/authorized
sleep 0.5
echo 1 > /sys/bus/usb/devices/1-1/authorized
fi
# Reinicia o driver HID para garantir o funcionamento do cursor
/usr/sbin/modprobe -r usbhid && /usr/sbin/modprobe usbhid
-
Dê permissão de execução:
chmod +x ~/.scripts/fix-mouse-usb.sh
Passo 2: O Gatilho do Systemd
Agora, vamos fazer o Ubuntu rodar esse script automaticamente toda vez que você abrir a tampa do note ou acordá-lo.
-
Crie o arquivo de serviço (como root):
sudo nano /etc/systemd/system/fix-mouse-resume.service -
Cole a configuração:
Code snippet
[Unit]
Description=Fix USB Mouse on Resume
After=suspend.target hibernate.target
[Service]
Type=oneshot
ExecStart=/home/SEU_USUARIO/.scripts/fix-mouse-usb.sh
RemainAfterExit=yes
[Install]
WantedBy=suspend.target hibernate.target
Nota: Substitua
SEU_USUARIOpelo seu nome de usuário no caminho acima!
-
Ative o serviço:
Bash
sudo systemctl daemon-reload sudo systemctl enable fix-mouse-resume.service
Dicas Extras
-
Identificando sua porta: No tutorial usei o hub
1-1. Se o seu mouse estiver em outra porta, use o comandolsusb -tpara ver onde ele está pendurado e ajuste o script se necessário. -
Log de Debug: Se quiser saber se o script rodou mesmo, você pode ver os logs com:
journalctl -u fix-mouse-resume.service. -
Segurança: Colocar o script na sua
HOMEfacilita a edição, mas garanta que o arquivo tenha permissões755para que o sistema (root) consiga executá-lo sem erros.
Espero que ajude quem estiver passando por esse estresse!