Problemi con mouse Bluetooth Trust su Ubuntu con chip Realtek RTL8821CE: analisi e soluzione


Negli ultimi giorni ho avuto problemi intermittenti con un mouse Bluetooth Trust (modello 24059-02) connesso al mio HP con Ubuntu. Il mouse ha funzionato regolarmente per un paio di giorni, poi improvvisamente ha smesso di connettersi, pur comparendo tra i dispositivi già accoppiati.

Questo è il resoconto del problema e della soluzione adottata, nella speranza che possa essere utile anche ad altri.

Il contesto hardware e software

  • Sistema operativo: Ubuntu 24.04 LTS
  • Scheda wireless integrata: Realtek RTL8821CE (Wi-Fi + Bluetooth combo)
  • Mouse: Trust Puck Bluetooth Mouse (codice 24059-02)
  • Stack Bluetooth: bluez, bluetoothd, modulo rtw_8821ce

Il dispositivo viene riconosciuto da lsusb come:

Bus 001 Device 003: ID 0bda:b00e Realtek Semiconductor Corp. Bluetooth Radio

e da lspci come:

01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8821CE 802.11ac PCIe Wireless Network Adapter

Il problema

Dopo qualche tempo di funzionamento corretto, il mouse ha smesso di connettersi. L’indagine non è banale. A volte premere il pulsantino rosso sul retro – fino a che si vede una sequenza di led blu che scorre – è sufficiente per riattivare il mouse ma a volte non c’è nulla da fare: neppure spegnedo e riaccendendo il mouse, né staccando e ricollegando l’antennina.

Inizialmente mi sono chiesto se l’antenna fosse solo Wi-Fi o anche Bluetooth. Il chip Realtek RTL8821CE integra entrambi i protocolli e utilizza una sola antenna condivisa. Questo è tipico dei moduli combo wireless presenti nei portatili moderni: lo stesso circuito RF gestisce sia la trasmissione dati Wi-Fi che il canale BLE del mouse Bluetooth.

In questi moduli combo, l’alternanza tra Wi-Fi e Bluetooth avviene tramite una tecnica chiamata Time Division Multiplexing (TDM) per condividere il front-end RF, in modo da evitare interferenze interne.

Qui ho chiesto all’oracolo di San Gpt per ottenere lumi sulla questione. In breve la soluzione è il controller del Blutooth, bluetoothctl

Bluetoothctl

bluetoothctl è un tool da riga di comando per gestire dispositivi Bluetooth in ambiente Linux. Permette di accoppiare, connettere, scollegare e monitorare dispositivi direttamente dal terminale. È un client testuale che interagisce con il demone bluetoothd tramite il sistema D-Bus. Fa parte del pacchetto bluez, lo stack ufficiale per la gestione del Bluetooth su Linux.
In pratica, è il comando testuale che consente di “parlare” direttamente con il sistema Bluetooth. Anche se spartano, è spesso più affidabile delle interfacce grafiche, specialmente quando i dispositivi fanno i capricci.

Un altro problema è stato reperire l’indirizzo MAC del device, ma ci si può arrivare facilemnte utilizzando i comandi sopra (lscpi o lsusb).

Al comando bluetoothctl connect <MAC> ricevevo messaggi come:

Failed to connect: org.bluez.Error.Failed Operation already in progress
Failed to connect: org.bluez.Error.Failed le-connection-abort-by-local

Nei log del kernel:

Bluetooth: hci0: unexpected cc 0x0c7c length: 1 < 3
bluetoothd[1152]: profiles/battery/battery.c:parse_battery_level() Trying to update an unregistered battery

Questi errori sono noti nel contesto dei dispositivi Bluetooth LE con chip Realtek. Il modulo rtw_8821ce presenta instabilità nella gestione della modalità a basso consumo (LPS) e problemi nel completare la connessione GATT con alcuni dispositivi.

La causa

Il mouse si accoppia correttamente ma, per motivi legati al driver o al timing del demone bluetoothd, la connessione BLE può venire interrotta dal sistema locale (errore le-connection-abort-by-local) oppure avviata quando i servizi del dispositivo non sono ancora completamente esposti. Ne consegue il mancato completamento della fase ServicesResolved.

La scheda Realtek è notoriamente sensibile a questi problemi, specialmente dopo resume da sospensione o dopo un pairing precedente lasciato in stato incoerente.

Soluzione adottata

Per ristabilire una connessione pulita al mouse, ho scritto uno script mouse_connect.sh da lanciare ogni volta che il mouse “si pianta”.

Il contenuto dello script

#!/bin/bash

# MAC del mouse Trust
MOUSE_MAC="CB:4C:45:8F:97:4C"

echo "Tentativo di riconnessione al mouse Trust ($MOUSE_MAC)..."

if ! systemctl is-active --quiet bluetooth.service; then
    echo "Il servizio bluetooth non è attivo. Lo riavvio..."
    sudo systemctl restart bluetooth.service
    sleep 2
fi

bluetoothctl <<EOF
power on
agent on
default-agent
trust $MOUSE_MAC
connect $MOUSE_MAC
EOF

echo "Comando inviato. Verifica se il mouse si è riconnesso."

Lo script va salvato nella home directory e reso eseguibile con:

chmod +x ~/mouse_connect.sh

Può poi essere lanciato con:

./mouse_connect.sh

oppure si può creare un alias nel .bashrc:

alias reconn-mouse="~/mouse_connect.sh"

Considerazioni finali

Questo approccio ha permesso di aggirare il problema senza dover reinstallare driver o riavviare il sistema. Tuttavia, se il problema si ripresentasse con regolarità dopo ogni riavvio o sospensione, prenderò in considerazione:

  • L’installazione di un driver migliorato da https://github.com/tomaspinho/rtl8821ce
  • L’aggiunta di uno script automatico al resume (/lib/systemd/system-sleep)
  • La disattivazione del plugin battery nel file main.conf di bluetoothd, per evitare log ripetitivi

Per ora, lo script manuale è una soluzione efficace e veloce.


Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.