Il diritto alla riparazione nasce da un principio: chi acquista un oggetto dovrebbe poterlo mantenere, riparare e usare più a lungo possibile. Con l'elettronica attuale molte funzioni dipendono da firmware, app ufficiali e programmi di configurazione. Il caso in questione è questo: una funzione esiste ancora nel dispositivo, ma il software ufficiale non ti permette più di usarla.
La funzionalità di macro onboard, in passato, era supportata dal software Logitech. Ad esempio nel modello G700 si poteva configurare una macro e caricarla direttamente in memoria tramite il tool ufficiale. Con G700s e con i client successivi il modello è cambiato: per usare certe macro serve il software Logitech sul PC. In modalità onboard, le opzioni di repeat, per qualche motivo, non sono più disponibili.
Il quadro giuridico non risolve automaticamente casi come questo, ma ci passa vicino. Nel 2024 il Parlamento europeo ha approvato regole che vietano, per le categorie coperte, l'uso di tecniche hardware o software pensate per ostacolare la riparazione.
Sul G604 il lavoro è questo: ripristinare una funzionalità ancora supportata dal firmware, ma non più disponibile nella UI ufficiale in modalità onboard. In questo esempio scriveremo nella memoria del mouse una macro che ripete il click sinistro mentre si tiene premuto un tasto laterale. Senza G HUB aperto, senza script in background, senza AutoHotkey. La procedura consiste nel leggere il profilo via HID++, salvare un backup, scrivere il bytecode macro in un settore libero e cambiare il binding del tasto.
Provato su Logitech G604 LIGHTSPEED con hidapi, potrebbe non funzionare allo stesso modo su tutti i modelli.
La macro finale
Tenendo premuto il tasto G11, il mouse dovrebbe
- inviare click sinistro down per 15 ms
- aspettare 15 ms
- inviare click sinistro up
- ricominciare finché G11 resta premuto
Ricerca & Sviluppo
Per recuperare i dati prima abbiamo usato i progetti pubblici come mappa: libratbag per il dizionario degli opcode macro, Solaar per capire lettura, scrittura e CRC dei profili onboard. Poi siamo passati al G604: discovery HID++, dump dei settori, scrittura di una macro minima di prova. Solo a quel punto aveva senso comporre il loop: click giù, delay, click su, delay, ripeti finché il tasto resta premuto.
41 00 01 BUTTON_DOWN sinistro
40 00 0F DELAY 15ms
42 00 01 BUTTON_UP sinistro
40 00 0F DELAY 15ms
02 REPEAT_WHILE_PRESSED
FF END Solo 14 byte, la macro completa in esadecimale, è: 41000140000f42000140000f02ff
Ambiente usato
Il test è stato fatto in questo contesto. Non è una garanzia di compatibilità universale, ma aiuta a capire dove finisce il lavoro sul formato e dove iniziano le variabili del singolo dispositivo.
- Logitech G604 acceso e collegato con ricevitore LIGHTSPEED USB.
- G HUB chiuso durante backup, anteprima e scrittura.
- Python 3.
- Tools sviluppti: TheTrigger/logitech-mouse-mod-firmware.
Il repository contiene il codice Python per parlare con il mouse via HID++, leggere i profili onboard e preparare la macro. Il comando di installazione rende disponibile il pacchetto Python direttamente dalla cartella appena clonata.
git clone https://github.com/TheTrigger/logitech-mouse-mod-firmware.git
cd logitech-mouse-mod-firmware
python -m pip install -e .Backup della memoria onboard
Just in case.
python -m g604macro backupIl restore usa un backup pre-scrittura e riscrive il settore del profilo attivo. È il motivo per cui il backup resta una parte importante del lavoro, anche quando tutto sembra banale.
python -m g604macro restore .\backups\pre-write-YYYYMMDD-HHMMSS.json --commitProfilo attivo e settore macro
Qui servono due controlli prima della scrittura: quale profilo onboard è attivo e quali settori macro risultano già usati. Se copi questi valori da un esempio, rischi di modificare il profilo sbagliato o sovrascrivere una macro esistente.
python -m g604macro infoG604 alive — HID++ 4.2
onboard feature 0x8100 at index 9
profile_format=3 macro_format=1 buttons=16
sectors=16 x 255 bytes
mode=1 current_profile=(0, 2) Nel G604 usato per il test l'output diceva: HID++ 4.2, feature onboard 0x8100 all'indice runtime 9, formato profilo 3, formato macro 1, 16 settori da 255 byte e profilo attivo (0, 2). In pratica, il profilo attivo era nel settore 0x0002. È un dato osservato, non una costante del tool.
Il settore della macro è un'altra scelta separata. Nel test è stato usato 0x06, dopo aver controllato che non fosse già referenziato dai profili presenti nel backup.
python -m g604macro decode Nel test il decode ha letto il backup più recente, ha mostrato il profilo 0x0002 e alla fine ha stampato referenced macro sectors: NONE. Da lì la scelta di 0x06. Se un settore compare già tra quelli referenziati, usarlo come destinazione significa sovrascrivere qualcosa che il profilo sta già usando.
Mappatura dei tasti
Lo script non ragiona sul nome commerciale del tasto, ma sull'indice onboard passato a --button. Per i tasti etichettati come G-key la regola rilevata è G(n) -> n-1: G11 diventa quindi --button 10.
| Tasto sul mouse | Parametro | Note |
|---|---|---|
| G4 | --button 3 | tasto laterale |
| G11 | --button 10 | tasto usato nell'esempio |
Per i tasti non chiari o rimappati c'è python -m g604macro find-button: attiva lo spy HID++, osserva il tasto premuto e stampa l'indice rilevato. È read-only, quindi torna utile come strumento di ricognizione.
Anteprima della scrittura
A questo punto il comando ha bisogno di tre valori espliciti:
--button: l'indice del tasto trigger. G11, nel mio caso, è10.--macro-sector: un settore libero o comunque scelto dopo aver letto il backup.--downe--up: i tempi del click, in millisecondi.
Senza --commit, flash diventa una preview del settore macro e del binding che verrebbe scritto nel profilo.
python -m g604macro flash --button 10 --macro-sector 0x06 --down 15 --up 15active profile = sector 0x0002, sector_size=255
--- MACRO (sector 0x0006) ---
bytecode: 41000140000f42000140000f02ff (14 bytes)
sector (first 16B): 41000140000f42000140000f02ff0000 ... crc=9da9
--- BINDING (profile 0x0002, button idx 10 @off72) ---
old: 00060000 -> new: 00060000
new profile CRC: 5a86
[DRY-RUN] nothing written. Add --commit to apply.In questa modalità il comando non scrive nulla nel mouse. Legge il profilo onboard attivo, costruisce la macro, calcola il settore macro con CRC, legge il binding attuale del tasto scelto e mostra come diventerebbe il nuovo binding. Nel pratico è il controllo finale prima di toccare la memoria: profilo, settore, tasto e byte generati devono tornare.
La variante con --commit è la stessa operazione, ma applicata davvero:
python -m g604macro flash --button 10 --macro-sector 0x06 --down 15 --up 15 --commit--button 10sceglie G11 come tasto trigger.--macro-sector 0x06usa il settore 6 per la macro: è il valore del mio test, non una regola.--down 15tiene premuto il sinistro per 15 ms.--up 15aspetta 15 ms prima del click successivo.
Dopo la scrittura
Se la scrittura e il read-back non danno errori, la macro è nel mouse. Tenendo premuto G11, il click sinistro dovrebbe ripetersi senza G HUB aperto e senza processi di supporto sul PC.
Limite del tool
La repo si può esplorare e modificare: il formato permette di costruire anche macro diverse. Il comando mostrato qui, però, non è un registratore di macro e non offre una UI per comporle. In questa versione genera solo una macro specifica: click sinistro ripetuto finché il tasto scelto resta premuto.
Repo pubbliche utili
- TheTrigger/logitech-mouse-mod-firmware: il tool usato per backup, anteprima, scrittura e restore.
- libratbag/libratbag: riferimento per HID++ e per gli opcode macro Logitech.
- shundhammer/solaar: riferimento pratico per lettura e scrittura dei profili onboard Logitech.
- cvuchener/hidpp: riferimento per il formato macro HID++ e l'encoding degli opcode.
- libusb/hidapi: libreria HID usata dal pacchetto Python.
