mercoledì 5 novembre 2008

How to - webcam & scheda tv in contemporanea su Ubuntu 8.10


Avete una scheda tv e siete impazziti a farla andare d'accordo con la vostra webcam fino ad ora? Per fortuna Ubuntu 8.10 (e in particolare il nuovo kernel 2.6.27 integrato in questa distribuzione) ha grosse novità al riguardo!



Una gestione più razionale dei moduli relativi alle periferiche di input video, con conseguente creazione dei nodi corretti in /dev/video da parte del kernel, permette infatti di compilare e caricare (e usare!) contemporaneamente i driver per vari dispositivi video, nel mio caso una webcam integrata sul portatile Asus, perfettamente funzionante coi driver syntek che si trovano di default in questa release di Ubuntu e una scheda tv della Terratec, modello Cinergy Hybrid T usb XS, che funziona con i moduli em28xx-dvb.

Siccome su internet è abbastanza difficile trovare una guida completa (io non ne ho trovate...) ho pensato di scrivere due righe per tutti...

Il procedimento su cui mi baso è tratto principalmente da mcentral.de e poi da un po' di sano Googling alla ricerca di possibili soluzioni agli errori.

Premetto che la procedura qui riportata funziona alla perfezione per il mio hardware, ma che non ho eseguito nessun test al di fuori della configurazione descritta sopra, non è detto quindi che sia valida per tutti... sarò però lieto di cercare di riolvere assieme a voi eventuali problemi che dovessero capitare e sarò ancora più felice se vorrete postare le configurazioni funzionanti con la procedura.

3,2,1...Si comincia!

Prima di tutto dovete installare alcuni componenti base sulla vostra linux box: cheese per la webcam, kaffeine per usare la scheda tv (per le trasmissioni dvb-t, ossia il digitale terrestre, per la precisione), mercurial per scaricare i sorgenti dei driver e build-essential per avere tutti gli strumenti base per la compilazione.

Nota: Kaffeine non è l'unico programma in grado di usare il flusso video proveniente dalla scheda tv, ma, a mio avviso, è quello più semplice, intuitivo e funzionale!

Per installarli tutti in un solo colpo, aprite un terminale e digitate:

sudo apt-get install kaffeine build-essential cheese mercurial

A questo punto, sempre da terminale, scaricate i sorgenti dei driver per la scheda tv con

hg clone http://mcentral.de/hg/~mrec/v4l-dvb-experimental

e posizionatevi nella directory appena scaricata con

cd v4l-dvb-experimental

Potremmo adesso procedere con la solita compilazione manuale a base di make e make install, ma uno script già bello e pronto (build.sh) permette di installare facilmente i driver, scegliete voi quale strada preferite seguire.

Con lo script (che ovviamente necessita dei privilegi di amministratore per funzionare) servono questi comandi:

sudo ./build.sh build

per compilare i moduli e, successivamente

sudo ./build.sh install
sudo ./build.sh load


per caricarli nel kernel.

Purtroppo, sia che stiate usando il tradizionale make, sia che abbiate deciso per lo script, qui arrivano i problemi: al momento della compilazione, viene restituito un messaggio di errore di cui riporto solo le ultime righe:

...

make: *** [default] Error 2
cp: cannot stat `drx3973d/drx3973d.ko': No such file or directory
cp: cannot stat `tvp5150/tvp5150.ko': No such file or directory
cp: cannot stat `lgdt3304/lgdt3304.ko': No such file or directory
cp: cannot stat `zl10353/zl10353.ko': No such file or directory
cp: cannot stat `cx25843/em28xx-cx25843.ko': No such file or directory
cp: cannot stat `xc3028/tuner-xc3028.ko': No such file or directory
cp: cannot stat `xc5000/tuner-xc5000.ko': No such file or directory
cp: cannot stat `em28xx.ko': No such file or directory
cp: cannot stat `em28xx-audio.ko': No such file or directory
cp: cannot stat `em28xx-aad.ko': No such file or directory
cp: cannot stat `em28xx-audioep.ko': No such file or directory
cp: cannot stat `em28xx-dvb.ko': No such file or directory
cp: cannot stat `qt1010/qt1010.ko': No such file or directory
cp: cannot stat `mt2060/mt2060.ko': No such file or directory


Fortunatamente, cercando un po' in rete, la soluzione si riduce a copiare un paio di file dal sorgente del kernel.

Scarichiamo quindi i sorgenti del kernel con

sudo apt-get install linux-source

a questo punto spostiamoci in /usr/src e scompattiamo l'archivio compresso appena scaricato (io lo faccio da nautilus con privilegi di amministratore per abitudine, ma anche il buon vecchio tar -xjvf va benissimo!)

Una volta estratto l'archivio contenente i sorgenti, copiamo i tre file necessari alla corretta compilazione

sudo cp linux-source-2.6.27/drivers/media/dvb/dvb-core/*.h linux-headers-2.6.27-7-generic/drivers/media/dvb/dvb-core/
sudo cp linux-source-2.6.27/drivers/media/dvb/frontends/lgdt330x.h linux-headers-2.6.27-7/drivers/media/dvb/frontends/
sudo cp linux-source-2.6.27/drivers/media/video/msp3400-driver.h linux-headers-2.6.27-7/drivers/media/dvb/frontends/


(naturalmente la versione del kernel può variare da quella specificata!)

e, dopo essere ritornati nella directory contenente i driver (v4l-experimental), eseguiamo nuovamente i passaggi di compilazione.

Una volta fatto controllate che il modulo sia correttamente installato nel kernel con

lsmod | grep em28xx

Se non compare nulla, basta caricare il modulo con

sudo modprobe em28xx

Abbiamo quasi finito... si tratta ora di scaricare il firmware corretto (che verrà salvato su hard disk, non scritto nella periferica!) per la vostra scheda tv...
Spostiamoci quindi in /lib/firmware

e scarichiamo il firmware corretto con

sudo wget http://konstantin.filtschew.de/v4l-firmware/FIRMWARE

dove, al posto di FIRMWARE dovrete inserire il nome del firmware corretto per la vostra periferica.
Esistono, ad oggi, quattro firmware scaricabili: firmware_v1.tgz, firmware_v2.tgz, firmware_v3.tgz e firmware_v4.tgz.
In linea di principio quello con il numero più alto è il più recente e quindi teoricamente il migliore, ma le schede tv serie Cinergy hybrid T XS hanno bisogno del firmware versione 3 (e un sottogruppo di queste schede, principalmente destinate al mercato francese, riconoscibili per l'ID 0ccd:005e con il comando lsusb, necessitano della versione 2).
In ogni caso non farete un gran danno a provare un firmware ed eventualmente a sostituirlo con un altro.

A questo punto basta attaccare la scheda tv (nel mio caso usb) e in kaffeine troverete un bottone extra preposto alla tv digitale (e premendo "C" potrete passare alla sintonizzazione dei canali, pratica da effettuare la prima volta).

Questi sono i risultati di tail -f /var/log/messages quando la periferica viene connessa dopo che i moduli sono stati caricati:


... em28xx: new video device (0ccd:005e): interface 0, class 255
... em28xx: device is attached to a USB 2.0 bus
...
... attach_inform: tvp5150 detected.
... tvp5150 3-005c: tvp5150am1 detected.
... successfully attached tuner
... em28xx #0: V4L2 VBI device registered as /dev/vbi0
... V4L2 device registered as /dev/video1
... em28xx-audio.c: probing for em28x1 non standard usbaudio
... em28xx-audio.c: Copyright (C) 2006 Markus Rechberger
... em2880-dvb.c: DVB Init
... register disabled
... DVB: registering new adapter (em2880 DVB-T)
... DVB: registering frontend 0 (Zarlink ZL10353 DVB-T)...
... input: em2880/em2870 remote control as /devices/virtual/input/input10
... em28xx-input.c: remote control handler attached
... em28xx #0: Found Empia Hybrid ATSC (em2882)

Presto una guida per l'uso della parte di ricezione analogica di questa scheda (appena trovo tutte le informazioni per farla funzionare correttamente!)
---
M

12 commenti:

  1. Bellissima guida!!! Grazie mille!! dopo una lunga guerra con questa scheda tv finalmente funziona perfettamente..un solo problemino nell'audio della tv analogica ma aspetto la tua prossima guida..ricordo solo di riavviare il sistema dopo avere seguito alla lettera tutta la guida...Ciao ciao!!

    RispondiElimina
  2. Ciao,

    ho seguito, con entusiasmo, la tua guida.
    Tutto fila alla perfezione fino a quando do':

    sudo ./build.sh load

    a quel punto pare che le cose non vadano come previsto:

    ERROR: Module s921 does not exist in /proc/modules
    ERROR: Module em28xx_aad does not exist in /proc/modules
    ERROR: Module em28xx_dvb does not exist in /proc/modules
    ERROR: Module em28xx_audio does not exist in /proc/modules
    ERROR: Module em28xx does not exist in /proc/modules
    insmod: error inserting 'em28xx.ko': -1 Unknown symbol in module
    insmod: error inserting 'em28xx-audio.ko': -1 Unknown symbol in module
    insmod: error inserting 'em28xx-aad.ko': -1 Unknown symbol in module
    insmod: error inserting 'em28xx-dvb.ko': -1 Unknown symbol in module


    Idee?

    RispondiElimina
  3. Quale kernel stai usando? Credo che il problema sia nella fase di compilazione, che dovrebbe aver sputato fuori qualche errore o warning... posta l'output di "./build build"

    ciao,
    Marco

    RispondiElimina
  4. Ciao,

    - il kernel e' quello di default in Kubuntu Intrepid Ibex: il 2.6.27-7-generic

    -------L'OUTPUT di sudo ./build build e':------------

    rm -rf Module.symvers;
    make -C /lib/modules/`if [ -d /lib/modules/2.6.21.4-eeepc ]; then echo 2.6.21.4-eeepc; else uname -r; fi`/build SUBDIRS=`pwd` modules
    make[1]: Entering directory `/usr/src/linux-headers-2.6.27-7-generic'
    CC [M] /home/deadlinx/v4l-dvb-experimental/em2880-dvb.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-video.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-i2c.o
    /home/deadlinx/v4l-dvb-experimental/em28xx-i2c.c:681: warning: ‘inc_use’ defined but not used
    /home/deadlinx/v4l-dvb-experimental/em28xx-i2c.c:688: warning: ‘dec_use’ defined but not used
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-cards.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-core.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-input.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-webcam.o
    LD [M] /home/deadlinx/v4l-dvb-experimental/em28xx.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-aad.o
    /home/deadlinx/v4l-dvb-experimental/em28xx-aad.c: In function ‘em28xx_aad_register’:
    /home/deadlinx/v4l-dvb-experimental/em28xx-aad.c:341: warning: format not a string literal and no format arguments
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-audio.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/em28xx-audioep.o
    LD [M] /home/deadlinx/v4l-dvb-experimental/em28xx-dvb.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/adimtv102/adimtv102.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_demod.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.o
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c:6059:8: warning: "COMPILE_FOR_QT" is not defined
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c:6068:7: warning: "COMPILE_FOR_QT" is not defined
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c:6085:8: warning: "COMPILE_FOR_QT" is not defined
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c:7726:8: warning: "COMPILE_FOR_QT" is not defined
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c: In function ‘DRX3973D_Open’:
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c:7799: warning: enumeration value ‘DRX3973D_SPIN_UNKNOWN’ not handled in switch
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c:7915:8: warning: "COMPILE_FOR_QT" is not defined
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c:7927:8: warning: "COMPILE_FOR_QT" is not defined
    /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_core.c:7933:8: warning: "COMPILE_FOR_QT" is not defined
    CC [M] /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d_i2c.o
    LD [M] /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/lgdt3304/lgdt3304.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/mt2060/mt2060.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/mt352/mt352.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/qt1010/qt1010.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/sharp/s921_module.o
    LD [M] /home/deadlinx/v4l-dvb-experimental/sharp/s921.o
    CC [M] /home/deadlinx/v4l-dvb-experimental/zl10353/zl10353.o
    Building modules, stage 2.
    MODPOST 17 modules
    LD [M] /home/deadlinx/v4l-dvb-experimental/adimtv102/adimtv102.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/drx3973d/drx3973d.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/em28xx-aad.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/em28xx-audio.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/em28xx-audioep.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/em28xx-dvb.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/em28xx.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/lgdt3304/lgdt3304.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/mt2060/mt2060.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/mt352/mt352.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/qt1010/qt1010.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/sharp/s921.ko
    LD [M] /home/deadlinx/v4l-dvb-experimental/zl10353/zl10353.ko
    make[1]: Leaving directory `/usr/src/linux-headers-2.6.27-7-generic'



    -------L'OUTPUT di sudo ./build install -------------
    Non c'e' alcun output, probabilmente per gli errori con le QT di cui sopra


    -------L'OUTPUT di sudo ./build load e':-------------

    ERROR: Module s921 does not exist in /proc/modules
    ERROR: Module em28xx_audioep does not exist in /proc/modules
    ERROR: Module em28xx_aad does not exist in /proc/modules
    ERROR: Module em28xx_dvb does not exist in /proc/modules
    ERROR: Module em28xx_audio does not exist in /proc/modules
    ERROR: Module em28xx does not exist in /proc/modules
    ERROR: Module drx3973d does not exist in /proc/modules
    ERROR: Module lgdt3304 does not exist in /proc/modules
    ERROR: Module mt352 does not exist in /proc/modules
    ERROR: Module zl10353 does not exist in /proc/modules
    ERROR: Module em28xx_cx25843 does not exist in /proc/modules
    ERROR: Module tuner_xc3028 does not exist in /proc/modules
    ERROR: Module tuner_xc5000 does not exist in /proc/modules
    ERROR: Module tvp5150 does not exist in /proc/modules
    ERROR: Module qt1010 does not exist in /proc/modules
    ERROR: Module mt2060 does not exist in /proc/modules
    insmod: error inserting 'em28xx.ko': -1 Unknown symbol in module
    insmod: error inserting 'em28xx-audio.ko': -1 Unknown symbol in module
    insmod: error inserting 'em28xx-aad.ko': -1 Unknown symbol in module
    insmod: error inserting 'em28xx-dvb.ko': -1 Unknown symbol in module








    Sinceramente non saprei dove sbattere la testa,
    ho anche provato a rimuovere il kernel con tutti gli annessi e connessi, e poi reinstallarlo, in modo da lavorare su un kernel *certamente* pulito, ma non cambia nulla.

    RispondiElimina
  5. Prova a installare gli header con
    sudo apt-get install linux-headers-`uname -r`
    Fammi sapere, in caso lo aggiungo alla guida!

    ciao,
    M

    RispondiElimina
  6. erano gia' installati prima di iniziare la procedura

    RispondiElimina
  7. E il comando
    sudo modprobe em28xx
    immagino che continui a non funzionare, vero?
    Per curiosità, che scheda video stai usando?

    Prometto di provare a compilare nel week end su virtual machine con kubuntu, per vedere se è questo che crea problemi, anche se non dovrebbe, dal momento che il kernel è assolutamente il medesimo.

    ciao,
    Marco

    RispondiElimina
  8. ...che scheda video...

    EDIT: intendevo che scheda TV :)

    ciao,
    Marco

    RispondiElimina
  9. Ciao,

    la procedura che consigli *non e' corretta* per il kernel 2.6.27, che e' presente di default su Intrepid Ibex; tale kernel dispone, gia' nel vanilla, del driver per il supporto alla scheda ibrida, quindi e' meglio non pasticciare in compilazioni non necessarie.

    Lo sviluppatore ha indicato, ****diversi anni fa****,
    la scheda come "hardware supportato", e...
    da allora non ha praticamente mai piu' messo mano al driver, lasciando con palmo di naso tutti quelli che avevano comprato quella scheda proprio per vedere la tv analogica e digitale in GNU/Linux!!

    Inoltre sembra che non si sia nemmeno granche' dedicato alla documentazione, visto che, come avrete potuto constatare, quella presente sul sito ufficiale e' frammentaria e pure obsoleta, quindi confusionaria, incompleta, ma, soprattutto,
    inutilizzabile per chiunque abbia un kernel recente!!

    Qualcuno ha anche contattato lo sviluppatore per fargli presente che, almeno per i newbies,
    e' veramente un casino riuscire a fare funzionare la Hauppauge WinTV HVR 900,
    anche per via delle sue ****numerose varianti**** che ne comportano diversi funzionamenti;
    non e' raro riscontrare persone che, ad esempio, riescono *solo* a vedere la tv analogica,
    ma non riescono a sentire l'audio ****nonostante le mille soluzioni provate.****
    In breve l'atteggiamento dello sviluppatore e' stato quello di rispondere che, dal suo punto di vista, va tutto bene cosi', quindi i geek possono fruire appieno della tv analogica e digitale e il resto del mondo chi se ne frega.

    Gli sviluppatori di Free Software hanno tutti la mia stima, detto questo,
    mi pare che questo atteggiamento sia ****perlomeno incoerente**** col principio di ****libera condivisione del sapere**** su cui si fonda
    il movimento del Free Software ...
    o forse abbiamo capito male noi ...

    In ogni caso mi pare poco corretto indurre la gente ad acquistare dell'hardware, spacciandolo per supportato, quando poi,
    ****DOPO ANNI****
    ****la PIENA FRUIZIONE****
    della scheda rimane appannaggio dello 0.000001 per miliardo dei suoi possessori, rendendo, nei fatti, la scheda come "PLURI_parzialmente supportata",
    in quanto solo alcuni sono in grado di farla funzionare e, questi, spesso, riescono ad usare solo la parte analogica, sempre che riescano ad incanalare il flusso audio per sentire qualcosa...

    Sono i progetti come questo a screditare tutto il mondo Free ed Open Source e a disincentivare molti potenziali "migranti": la gente si domanda che hardware acquistare, se non ci si puo' fidare nemmeno di quello dato per ***SUPPORTATO DA ANNI***

    Questo driver e' quello che gli sviluppatori di FreeBSD definirebbero:"a hack, not a solution"!!
    FreeBSD supportera' meno hardware, ma quando ti dicono che funziona ti ci puoi giocare una mano!!!

    RispondiElimina
  10. I moduli presenti nel kernel 2.6.27 *non funzionano* con un enorme numero di dispositivi (compreso il mio!) quindi è obbligatorio compilarsi la versione scaricata con mercurial!

    La pagina che ospita il progetto è stata ****aggiornata il 6 novembre scorso****, gli ultimi aggiornamenti ai driver risalgono a ****pochi mesi fa**** (febbraio, se non erro) mostrando, contrariamente a quanto affermi, che il progetto è seguito.

    La documentazione presente sul sito ufficiale potrebbe probabilmente essere più completa, ma mi sembra che cercando un po' si trovi tutto (visto che, personalmente, ho cercato e trovato...)

    Ai newbies bisognerebbe insegnare fin da subito che ***prima*** si cerca su forum, internet e amici una scheda pienamente compatibile e ***poi*** si procede con l'acquisto! Nel bene o nel male così funziona il mondo gnu/linux (per ora), se a qualcuno non piace, ci sono sempre gli ottimi prodotti della Apple! (e lo dico senza il minimo sarcasmo!)

    Per quanto riguarda la scheda che hai menzionato, non l'ho mai avuta tra le mani, quindi non ho esperienze dirette... vedo molte guide in giro... se però la Hauppage marchia con lo stesso nome schede con componenti molto diversi, mi pare chiaro che ci siano problemi di installazione, non mi sembra imputabile ai driver! (ed è il motivo per cui si va a vedere gli id delle schede sputati da un semplice lsusb prima di acquistare... io l'ho fatto in negozio!)

    Per quanto riguarda il numero di utenti soddisfatti, non ti preoccupare ce ne sono moltissimi ;)
    I possessori di Eeepc e schede Terratec trovano addirittura gli script autoinstallanti sul sito del produttore...
    Per quanto riguarda l'audio analogico... se, invece di ****provare mille soluzioni**** avessero cercato 15 secondi su Google, avrebbero visto che esiste sox che funziona perfettamente e che, per alcuni, si può anche compilare l'ultima versione di tvtime...

    Ce ne fossero di progetti come questo, visto che mi ha permesso di usare qualcosa che altrimenti non funzionava!

    Se poi non ti sta bene, usa FreeBSD!

    ciao,
    Marco

    RispondiElimina
  11. Ciao,

    Il driver per la mia scheda e' nel kernel, ma e' sostanzialmente quello di due anni fa...

    A dire il vero io ho acquistato la scheda *solo* perche' era gia' data per supportata...

    Quello che sto cercando di spiegare e' che questo progetto e' (tra i pochi) a non contribuire affatto a rendere Linux alla portata dei newbies.

    E per dirla tutta mentre ti scrivo mi sto godendo C.S.I. con la mia scheda, in versione digitale anche se potrei anche vederla in analogico...giusto per "mettere i puntini sulle i"...


    My 2 cents


    Marco (deadlinx)

    RispondiElimina
  12. Forse non ho capito bene... ti lamenti di questo progetto e contemporaneamente lo usi per guardare la tv analogica e digitale sul computer?! Quale sarebbe esattamente il problema, dal momento che funziona (previo comperare una scheda data per funzionante controllando l'output di lsusb)?

    Se dovessimo fare l'elenco di tutto quello che non è a prova di newbe su linux, potremmo fare notte... è per questo che esistono le guide... il newbe legge, impara e diventa pian piano meno newbe e più esperto!

    Se uno vuole tutto funzionante subito, senza sbattimenti (ma anche senza la possibilità di coustomizzazioni), lo ripeto, può tranquillamente comperarsi un mac (lo consiglio a molti che dicono chiaramente di non avere tempo e/o voglia di mettersi a leggere manuali e guide per usare un computer).

    Tra l'altro ti posso assicurare che è pieno di progetti che non contribuiscono affatto a rendere linux a portata di newbe... non è mica l'obiettivo primario di tutti i programmatori...ciascuno scrive il codice che gli pare...fa parte del gioco!

    ciao,
    Marco

    RispondiElimina

commentando accetti implicitamente le regole del blog, leggile!