Monday, November 03, 2008

Hacking gspca for Logitech QuickCam E1000 support.

Hop, je fais le saut: j'achète une webcam. Pas chère (25 francs) avec oreillette inclue "für skype" ... Mon choix s'est arrêté sur la QuickCam E1000 de Logitech, dans un rayon qui semble comporter une douzaine d'autres webcam qui se ressemblent toutes, en ce qui me concerne, hormis peut-être leur prix.

Je branche ça sur mon portable linux ... et évidemment ça ne marche pas tout seul. Le CD ne comporte que des drivers pour windows, ce qui n'est pas une surprise non-plus. Haa... on a pas encore fini de changer le monde.

Bref. Un petit tour de google, et je tombe là-dessus : http://doc.kubuntu-fr.org/spca5xx "installer gspca sous ubuntu, la version facile" ... je prends. je suis les instructions à la lettre, le module (comprenez "le driveur" pour les windoziens) s'installe. c'est bien. Sauf que point de webcam.

I just blindly bought the Logitech QuickCam E1000 this week-end (since it was the cheapest webcam around) and of course realised that it did not came with any Linux driver (not that it's surprising in any way) nor does it seems to be supported by any "out-of-the-box" driver for Ubuntu gutsy (unless i'm proved wrong). Hacking around, checking lsusb and reading the sources of the gspca driver, i figured out that it was yet-another-generic-driver that has a "white list" of supported devices. I thus added the product-id to that white list and now proudly have a working webcam. See compiled driver (which might no longer work with Labtec Webcam Pro, because i've really been *hacking* instead of *patching*) and modified sources down the page.

Un petit "lsusb" me donne au moins la référence "technique" du produit : Bus 001 Device 012: ID 046d:08af Logitech, Inc.

Ces deux numéros magiques (vendor-id=046d et product-id=08af) me permettent de voir (dans les sources du driver, en bas à gauche de l'image) que si pas mal d'autres webcam logitech sont supportées, par contre, la mienne n'est visiblement pas là. Comme le "gspca" est un driver "générique" (à savoir qu'il est en fait valide avec toutes les webcams 'standard'), j'ai 9 chances sur 10 pour que le code puisse effectivement faire fonctionner la webcam si j'arrive à expliquer au driver que "si, si, je t'assure, tu la connais aussi, celle-là". Un peu comme si votre clé-télécommande devait reconnaître la plaque minéralogique de votre voiture pour pouvoir la faire démarrer.

Bref. Premier jeu, donc, ajouter dans gspca_core.c l'identité de notre caméra. Perso, je parasite n'importe quelle entrée dans device_table[], mais il serait plus propre d'y ajouter {USB_DEVICE(0x046d, 0x08af)}, /* Logitech QuickCam E1000*/ et d'éditer en conséquence clist[] et l'énumération des caméras.

Avec ça, le driver peut dire au noyau que la webcam est pour lui, mais ça ne suffit pas. La fonction spcaDetectCamera() est appelée chaque fois qu'une nouvelle webcam est branchée, histoire de lui souhaiter la bienvenue, de prendre un verre avec les autres périphériques USB ... euh ... ou pas. C'est là que l'on va retrouver un gros "switch" qui va règler les options de notre driver générique pour chaque modèle de caméra (peut-être pas si générique que ça, donc, en fait :P) Je fais bêtement le pari que ma caméra "8af" sera probablement juste une réédition de la "8ae" (QuickCam for Notebooks), et donc :

   case 0x08ae:
case 0x08af: // uber-experimental.
    spca50x->desc = QuickCamNB;
    spca50x->bridge = BRIDGE_ZC3XX;
    spca50x->sensor = SENSOR_HDCS2020;
    break;
Et hop! ça marche! J'adore linux!

le module recompilé pour gutsy : gspca_e1000.ko le fichier gspca_core modifié pour la QuickCam E1000 : gspca_core_e1000.c (soyons open-source jusqu'au bout ;)

Et pour ceux qui trouvent que "Aarhgh! Skype, c'est le mal", je propose la lecture de l'édifiant "Castle in the Skype" de Fabrice DESCLAUX, puis je leur dirai que MSN, c'est pas forcément mieux ;)

edit: cette manipulation est valable sur Gutsy uniquement. Sous Hardy Heron (et probablement les versions ultérieures), les drivers pré-compilés supportent directement la caméra.

13 comments:

Anonymous said...

bon.. je te rassure, c'est même pas toujours plus facile sous Windows... à niveau de compétence similaire !

Anonymous said...

Un petit bonjour en passant...Je dois bien avouer que je ne comprenais pas bien de quoi tu parlais ici avant d'acheter ma petite DS. Maintenant, j'ai découvert "le monde merveilleux des homebrews" :))
Je suis particulièrement attiré par les petites applications (genre musicales, dessin, agendas, et autres utilitaires). J'ai découvert pocket physics que mon gamin adore, il fait ses petites experimentations et il m'épate. J'ai essayé de télécharger ta demo, je l'ai patché mais elle ne veut pas démarrer, il faut faire un truc spécial, ou c'est moi qui n'ai pas encore tout compris?
Ps: une question en passant, hier je telechargeais des homebrews (légaux) sur un site de téléchargement, et le site m'a déconnecté "your computer is monitored", ça veut dire que je suis surveillé ? c'est dangereux? c'est repèrable?
Allez, bonne journée à toi...

PypeBros said...

attention, je tente le diable : faire tourner le même driver sous un x86-64 ...

Pour info, le module dépend de :
usbcore (of course)
compat_ioctl32
videodev

/usr/src/modules/gspca/gspca_core.c:2656:
le module utilise apparemment la mauvaise structure pour un l'attribut class_device_attribute de video_device_create_file
(maintenant "device_attribute")

Le problème, c'est que les méthodes "show" et "store" ont apparamment changé également ...

ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);

à la place de

ssize_t (*show)(struct class_device *, char * buf);

benkoi said...

Bonjour,

merci pour cet article.
Il se trouve que je rencontre le même problème avec une E 1000 à installer sur mon PC qui tourne sous hardy.
J'ai suivi pas à pas le protocole indiqué dans ton post. Hélas: toujours les mêmes messages d'erreur de cheese ou camorama.
Quant à easycam2, il ne propose que la QuickCam Cool dans sa "liste".
J'ai testé au boulot ma E1000 sur un poste windaube. Elle a fonctionné normalement et n'est donc pas en cause.

Là, n'étant pas fute-fute en informatique, je ne sais plus très bien quoi tenter.

Qu'en penses-tu?

amicalement

PypeBros said...

@benkoi: as-tu réussi à identifier ta webcam dans la sortie de lsusb (qui est un programme en ligne de commande, donc) ?

De mémoire, hardy supportait la webcam E1000 d'emblée, sans qu'il ne soit nécessaire de bricoler autant qu'ici, mais je vais refaire des tests.

PypeBros said...

oh, autre chose.
tu peux aussi voir comment le système a réagi à l'insertion de ta caméra en comparant la sortie de lsmod avant et après insertion.

benkoi said...

@ sylvainulg :
Oui le lsusb donne ceci:
"Bus 001 Device 004: ID 046d:08af Logitech, Inc." et (petite précision) le voyant de la camera est allumé et clignote quand je la solicite avec cheese ou autres logiciels.

En effet la E 1000 est listée comme étant supportée sous hardy.

Je n'ai pas pris note du contenu de lsmod avant mes bidouillages. Ci-dessous, voici quand même des extraits actuels, en espérant que cela puisse te mettre sur une piste...
Merci et à+ !

video 19984 0
output 4736 1 video
container 5760 0
sbs 15368 0
sbshc 7808 1 sbs
dock 11564 0

0
gspca 644304 0
snd_seq_oss 35968 0
snd_seq_midi 9376 0
ueagle_atm 35128 0
videodev 29696 1 gspca
usbatm 20864 2 ueagle_atm
snd_rawmidi 25632 1 snd_seq_midi
v4l2_common 18432 1 videodev
psmouse 41104 0
v4l1_compat 15492 1 videodev
wmi_acer 9772 0
serio_raw 7940 0
snd_seq_midi_event 8576 2 snd_seq_oss,snd_seq_midi
nvidia 7826784 34
snd_seq 54992 7 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_seq_midi_event
snd_timer 24836 4 snd_rtctimer,snd_pcm,snd_seq
snd_seq_device 9612 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_rawmidi,snd_seq
snd 57636 23 snd_rtctimer,snd_hda_intel,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_hwdep,snd_seq_dummy,snd_seq_oss,snd_rawmidi,snd_seq,snd_timer,snd_seq_device
agpgart 34900 1 nvidia
parport_pc 36516 1
shpchp 34708 0
button 9232 0
k8temp 6656 0
pci_hotplug 31776 1 shpchp
parport 38600 3 ppdev,lp,parport_pc
soundcore 9312 1 snd
i2c_core 25392 1 nvidia
evdev 13312 3
pcspkr 4224 0
ext3 137864 3
jbd 49044 1 ext3
mbcache 9856 1 ext3
sg 36824 0
sr_mod 18084 0
cdrom 37152 1 sr_mod
sd_mod 31152 8
usb_storage 73792 1
libusual 19392 1 usb_storage
ahci 28804 0
pata_amd 14340 5
8139too 27520 0
ata_generic 8452 0
f 6400 2 8139too,8139cp
pata_acpi 8320 0
libata 160496 4 ahci,pata_amd,ata_generic,pata_acpi
scsi_mod 153324 5 sg,sr_mod,sd_mod,usb_storage,libata
forcedeth 51340 0
ehci_hcd 37772 0
ohci_hcd 26512 0
usbcore 147372 8 gspca,ueagle_atm,usbatm,usb_storage,libusual,ehci_hcd,ohci_hcd

benkoi said...

@ sylvainulg : j'avais mal compris ta question.
Après vérification il n'y a aucune différence entre lsmod avant et après insertion de la webcam.

PypeBros said...

je confirme: sous hardy, la caméra est supportée automatiquement, en témoigne le fait qu'elle clignote, et tout ça. Du côté des applications, j'utilise "camgrab" appelé en boucle pour me faire ma petite webcam perso (il modifie le fichier "shot.jpg", sauf si tu lui donne d'autres instructions) et pour les tests, le mieux, c'est encore de démarrer kopete.

une fois Kopete lancé, je vais dans settings > configure Kopete > Devices. Ma webcam y est listée sous "device: Logitech QuickCam Cool", "Input: ZC301-2", "Standard: None".

benkoi said...

Dans kopete -> device, ma webcam est bien reconnue comme "usb camera (046d:08af)", .
La ligne "imput" (en dessous) indique "zc3xx".
la ligne "standar" est vide.
Par ailleurs le témoin de camera monitor s'est ouvert dans le tableau de bord "camera is on
video device: /dev/video0/.

On approche, mais toujours pas d'image!

J'ai installé camgrab mais n'ai pas réussi à le lancer. Message d'erreur: "No supported palette found."

PypeBros said...

ce serait un bête problème de droits d'accès ? que dit "ls -l /dev/video0" ? et que dit "id" ?

Ici, mon utilisateur est notamment dans les groupes "audio" et "video", et quand je branche ma webcam, /dev/video0 est renseigné comme "root:video" avec les droits de lecture/écriture aussi bien pour le groupe que pour le propriétaire (root).

benkoi said...

Cà donne ceci:
"pluc@pluc:~$ ls -l /dev/video0
crw-rw----+ 1 root video 81, 0 2009-10-30 17:55 /dev/video0
pluc@pluc:~$ id
uid=1000(pluc) gid=1000(pluc) groupes=4(adm),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),107(fuse),109(lpadmin),115(admin),125(mythtv),128(sambashare),1000(pluc)
"
Malheureusement un peu du charabia pour moi!

PypeBros said...

@benkoi: Moui. on y voit que tu es bien dans le groupe vidéo, et que la caméra peut bien être utilisée par les membres de ce groupe.

A regarder d'un peu plus prêt le fonctionnement de camgrab, on dirait que le problème vient de ce que la caméra ne connaît pas les formats connus par les programmes (YUV420 et RGB24).

Malheureusement, là, on dépasse le niveau de problème qui peut être investigué à distance. Il va falloir que tu te trouves un guru local qui puisse creuser les logs où un "strace -eioctl camgrab" pour voir comment arranger ça.

A défaut, peut-être que le problème est résolu dans une des mises à jour ou dans une des distributions plus récentes. Un p'tit live CD pourrait peut-être te tirer d'affaire.