Immagine di copertina: Logitech G604: macro onboard senza G HUB

Logitech G604: macro onboard senza G HUB

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

  1. inviare click sinistro down per 15 ms
  2. aspettare 15 ms
  3. inviare click sinistro up
  4. 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.

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 backup

Il 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 --commit

Profilo 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 info
G604 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 mouseParametroNote
G4--button 3tasto laterale
G11--button 10tasto 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.
  • --down e --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 15
active 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 10 sceglie G11 come tasto trigger.
  • --macro-sector 0x06 usa il settore 6 per la macro: è il valore del mio test, non una regola.
  • --down 15 tiene premuto il sinistro per 15 ms.
  • --up 15 aspetta 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