Registrare video 4K a 60 fps via USB su Linux diventa molto più semplice

Una patch introdotta nel kernel Linux corregge un difetto della Elgato 4K X durante l'enumerazione USB a 10 Gbps, permettendo finalmente acquisizione 4K a 60 fps senza driver esterni. L'intervento riguarda anche dispositivi di altri produttori.

Registrare in 4K a 60 fps su Linux non è mai stato semplice: chi utilizza schede di acquisizione USB avanzate conosce bene il problema. Sebbene l’hardware sia teoricamente compatibile con lo standard UVC (USB Video Class), che consente il riconoscimento automatico delle periferiche video senza driver specifici, e i driver necessari siano già inclusi nel kernel Linux, i risultati ottenuti sono spesso insoddisfacenti. In molti casi si riscontrano limitazioni nelle risoluzioni disponibili, assenza di alcune modalità video e un riconoscimento solo parziale delle funzionalità del dispositivo. È una problematica che per anni ha interessato streamer, creatori di contenuti e sviluppatori che utilizzano sistemi Linux.

Una vicenda recente legata alla Elgato 4K X mostra però quanto possa essere efficace il modello di sviluppo del kernel del pinguino. Un bug apparentemente marginale, nascosto nella fase iniziale di enumerazione USB, impediva alla scheda di funzionare alla massima velocità disponibile: la correzione è arrivata direttamente nel kernel principale e oggi permette di acquisire video 4K a 60 fps senza driver proprietari, software aggiuntivi o patch esterne.

La modifica è entrata in Linux 6.19 e successivamente è stata applicata anche nei rami stabili più utilizzati. Il caso è interessante non solo per chi utilizza hardware Elgato, ma anche perché evidenzia alcuni aspetti poco conosciuti del funzionamento interno dello stack USB Linux e delle procedure di enumerazione dei dispositivi ad alta velocità.

Un problema che si manifestava solo a 10 Gbps

La Elgato 4K X utilizza una connessione USB 3.2 Gen 2 da 10 Gbps e supporta acquisizione e passthrough fino a 4K144 tramite interfaccia HDMI 2.1. Sulla carta si tratta di un dispositivo perfettamente compatibile con il driver Linux uvcvideo, presente nel kernel da anni e utilizzato da webcam e dispositivi video USB.

Il comportamento osservato dagli utenti era però anomalo. Durante il collegamento a una porta USB SuperSpeed Plus, il dispositivo iniziava correttamente la negoziazione del link a 10 Gbps ma pochi secondi dopo si disconnetteva. A quel punto effettuava una nuova enumerazione a 5 Gbps, presentandosi con un identificativo hardware differente.

La conseguenza pratica era immediata: il sistema vedeva la scheda, OBS Studio la riconosceva correttamente, ma le modalità video disponibili si fermavano a 4K a 30 fps. Le opzioni 4K 60 fps sparivano del tutto.

Come spiega Johannes Brüderl, autore della patch per il kernel Linux, il problema non riguardava la cattura video in sé: il dispositivo non riusciva a completare la fase iniziale di identificazione quando operava alla massima velocità prevista dal controller USB.

Due Product ID per la stessa scheda e ruolo del BOS Descriptor

Uno degli elementi che ha complicato l’analisi riguarda il comportamento insolito della scheda durante l’enumerazione. Elgato 4K X espone infatti due differenti identificativi USB a seconda della velocità negoziata. Quando il collegamento resta attivo a 10 Gbps il dispositivo appare con Vendor ID 0fd9 e Product ID 009b. Se invece qualcosa interrompe la procedura iniziale e costringe la periferica a tornare a 5 Gbps, l’identificativo diventa 009c.

Per Brüderl questo dettaglio è risultato fondamentale: il cambio di Product ID ha permesso di capire immediatamente se la scheda stesse lavorando in modalità ottimale oppure se fosse già ricaduta nella modalità limitata.

Analizzando i log del kernel emergeva sempre lo stesso schema: negoziazione iniziale corretta, richiesta di alcuni descrittori USB, timeout di comunicazione e successiva riconnessione del dispositivo a velocità inferiore.

La causa reale era nascosta in un componente poco noto della specifica USB chiamato Binary Object Store, generalmente indicato con l’acronimo BOS.

Si tratta di un “descrittore” che contiene informazioni avanzate sulle capacità del dispositivo: supporto SuperSpeed, funzionalità SuperSpeed Plus (denominazioni che oggi non si usano praticamente più… tanto che si parla di USB Gen 1 e USB Gen 2), gestione energetica, modalità di risparmio energia e altre caratteristiche che il sistema operativo può utilizzare durante l’inizializzazione.

Linux richiede il BOS descriptor molto presto nella fase di enumerazione tramite la funzione usb_get_bos_descriptor(); la scheda Elgato, operando a 10 Gbps, smetteva però di rispondere proprio durante questa richiesta.

Perché Windows non mostrava il problema

Molti utenti si sono chiesti come fosse possibile che il dispositivo funzionasse correttamente su Windows pur manifestando problemi evidenti su Linux.

La spiegazione non riguarda una maggiore compatibilità hardware o una differenza nelle specifiche USB: semplicemente Windows segue una sequenza di enumerazione differente e non innesca la condizione che porta il firmware della scheda al blocco. Non esiste ancora una documentazione completa della sequenza utilizzata dal sistema operativo Microsoft e nessuno ha identificato con precisione quale passaggio eviti il problema.

Per risolvere la situazione su Linux, Brüderl ha introdotto il flag USB_QUIRK_NO_BOS, che permette di saltare completamente la richiesta del BOS descriptor per dispositivi specifici. Adesso, quando il kernel rileva la Elgato 4K X con Product ID 009b, evita la richiesta incriminata e prosegue normalmente con l’enumerazione.

Il risultato è immediato: la scheda resta collegata a 10 Gbps, mantiene il Product ID corretto e rende disponibili tutte le modalità video supportate, comprese le acquisizioni 3840×2160 a 60 fps.

Dal punto di vista tecnico si tratta di una modifica minima: poche righe di codice all’interno del sottosistema USB. Eppure l’impatto pratico è enorme perché elimina la necessità di driver esterni, workaround artigianali e configurazioni particolari.

Una correzione che riguarda anche altre schede di acquisizione

Durante la revisione della patch è emerso un dettaglio interessante. La Elgato 4K X non rappresenta un caso isolato.

Diversi produttori utilizzano infatti controller video USB derivati dalla stessa base hardware. Dopo la pubblicazione della correzione, altri sviluppatori hanno inserito ulteriori dispositivi nella tabella delle quirk del kernel. Le quirk sono regole specifiche utilizzate per gestire comportamenti particolari o anomalie note di determinati dispositivi.

Tra i modelli interessati figurano ASUS TUF 4K PRO, AverMedia Live Gamer Ultra 2.1, UGREEN 35871 ed ezcap401. Tutti manifestavano sintomi molto simili: blocco durante la lettura del BOS descriptor a 10 Gbps e successivo downgrade a 5 Gbps.

Il fenomeno suggerisce che il problema non sia limitato a un singolo firmware ma coinvolga una famiglia di controller video USB ad alte prestazioni.

Come verificare se la correzione è attiva

Le distribuzioni che utilizzano kernel Linux 6.19 o successivi includono già la modifica. Come accennato in precedenza, la patch risulta oggetto di backporting sui rami stabili 6.1, 6.6, 6.12 e 6.18, rendendo il supporto disponibile anche su molte distribuzioni enterprise e LTS.

Gli utenti possono controllare il corretto funzionamento osservando il dispositivo tramite sysfs: la presenza del valore 0x20000 nel file delle quirk indica che il flag USB_QUIRK_NO_BOS è correttamente applicato.

Un ulteriore controllo può essere effettuato tramite lsusb -t: se il dispositivo appare a 10000M e utilizza il driver uvcvideo, significa che il collegamento SuperSpeed Plus è attivo. In quel caso OBS dovrebbe mostrare senza limitazioni tutte le modalità 4K.

Questo articolo contiene link di affiliazione: acquisti o ordini effettuati tramite tali link permetteranno al nostro sito di ricevere una commissione nel rispetto del codice etico. Le offerte potrebbero subire variazioni di prezzo dopo la pubblicazione.

Ti consigliamo anche

Link copiato negli appunti