kategorie:

menu:


Webová kamera m5602 pod Linuxem

13.09.2008   ::    téma: Linux

Když jsem si pořizoval notebook, tak nějak jsem tušil, že na něm budu mít i Linux. V té době jsem ale tučňáka ještě tak dobře neznal, nepočítal jsem že jednou bude můj primární OS a už vůbec mě nenapadlo se při výběru hardwaru starat o dostupnost a kvalitu linuxových ovladačů. Tak jsem si pořídil Acer s integrovanou Ati grafikou, pochybnou PCI čtečkou paměťových karet, wifi kartou Atheros a webovou kamerou od ALi Corporation (0402:5602).

Cesta za systémem s fungujícím hardwarem byla dlouhá. Wifi jsem rozchodil podle návodu asi po měsíci experimentování s Linuxem, podpora pro čtečku karet přišla tuším někdy kolem 2.6.22 jaderného času, na 3D akceleraci jsem ještě donedávna musel používat fglrx, ale fungovala… Posledním kouskem železa které jsem měl „jen pro okrasu“ byla usb kamera. Tento týden jsem se jí věnoval na plný úvazek a i díky mě je teď ovladač pro ní zas o trošku použitelnější.

detail kamery

Teď trochu zpátky v čase…

Léto 2007

Při hledání ovladačů bylo pro mě klíčové ID z výpisu příkazu lsusb

karry@myKubuntu:~$ lsusb | grep Camera
Bus 003 Device 002: ID 0402:5602 ALi Corp. Video Camera Controller

po chvilce googlení jsem našel projekt m560× na sourceforge.net který má za cíl napsat ovladače pro kamery fungující na čipech m5603 a m5602. Projekt byl založen v lednu 2007. Po půl roce jeho existence, kdy jsem jej zkoušel poprvné, s mojí kamerou nepracoval. Tak jsem si jej přidal do záložek a čas od času jej kontroloval.

Listopad 2007

Jeden den jsem se v ovladačích trochu povrtal. Pochopil jsem že čip m5602 je „pouze“ usb most, na který je přes sběrnici I2C připojen samotný CCD snímač. Pro každý takový snímač musí být samostatný kód v ovladači. Po chvíli experimentování jsem zjistil že snímač v mojí kameře má I2C adresu 0×5A. Toto zjištění jsem reportoval do mailing listu projektu.

Květen 2008

Marek došel ke stejnému zjištění jako já a společně s Erikem začali pomocí usb „snoopů“ (odchycení komunikace) z windows dávat dohromady branch prozatím pojmenovaný m5602-unknown. Jak se později ukázalo, za adresou 0×5A se skrývá sensor s5k83a od Samsungu. K tomuto sensoru bohužel není nikde k dispozici datasheet, takže jsme nadále odsouzeni k reverznímu inženýrstvý. Ke konci května se chlapcům podařilo z kamery dostat konečně nějaká data a poté i „použitelný“ obraz. Marek o tom píše ve svém blogu: Dostávám stream :-)

Červen 2008

Pro snažší vývoj byly sjednoceny jednotlivé branche s m5602 můstkem. S tím souvisela nutná detekce používaného sensoru, která nebyla zprvu bezproblémová. Markův komentář.

Září 2008 (současnost)

Na konci prázdnin jsem neměl nic co na práci a já se doma skoro začal nudit. Tak jsem se v ovladači zas trochu povrtal. Nakonec z toho byl týden programování v céčku a testování různých registrů kamery.

Nejdřív jsem se musel naučit jak správně číst usb snoop a jak potom stejná data odeslat/přijmout v jaderném modulu na Linuxu. Ve widnows se na zachytvávání usb komunikace výborně hodí prográmek SniffUSB. Jedná se ostandartní widlí klikátko, takže práci s ním zde popisovat nebudu. Abych si ověřil jak vypadá komunikace v linuxu, hledal jsem podobný nástroj i pro Linux. V Linuxu stačí mít v konfiguraci jádra povolenu volbu CONFIG_DEBUG_FS, poté jen tento virtuální fs připojit a zavést modul usbmon

mount -t debugfs none_debugs /sys/kernel/debug
modprobe usbmon

Pro lidsky čitelnou formu výtupu se hodí mít po ruce prográmek usbmon od Petera Zaitceva z Red Hatu.Krátce po té co jsem se naučil co který byte v komunikaci znamená, padl přesně na toto dotaz v mailové konferenci k projektu m5602. Proto jsem sepsal kratičké howto jak usb snoop číst (v „angličtině“).

První věcí na kterou jsem se zaměřil u kamery bylo ovládání jasu. Sensor totiž sám od sebe neupravuje jas (čas expozice), takže za horších světelných podmínek nebylo na obrazu z kamery téměř nic vidět. Ve snoopu z windows jsem našel prapodivnou sekvenci zápisů do registrů sensoru, která se v různých obměnách během streamu opakovala. A skutečně. Tato sekvence upravuje jas! Následným experimentováním jsem našel použitelnou kombinaci vstupních hodnot. Výsledný efekt si můžete prohlídnout na screencastu (AVI, 416KB). (Testováno na starém branchi, ze kterého tečou data se špatnými barvami.)

Zachytil jsem ještě dalších pár stovek megabytů usb komunikace ve windows, během níž jsem upravoval různé parametry obrazu. Mám takové podezření že driver ve Windows dělá většinu úprav obrazu softwarově. Nepodařilo se mi totiž identifikovat žádnou jinou užitečnou řídící sekvenci. Proto jsem začal registr po registru testovat vliv jejich změny na výstupní obraz. Tímto způsobem jsem našel registr měnící „bělost“ obrazu a poté registr jímž se mění čas expozice. Při dlouhých časech expozice senzor krásně snímá ve tmě. Protože mezi standartními identifikátory parametrů v4l2 není „expose time“, označil jsem tento registr v ovladači jako „gain“, tedy zisk.

noční režim (dlouhý čas expozice)

Bohužel se mi nepodařilo najít způsob jak měnit výstupní barvy ze senzoru a jak přimět obraz k větší stabilitě. Nyní se totiž obraz při vyšší světlosti naprosto rozpadne…

Úpravy co jsem na driveru provedl jsou nyní již v svn repozitáři projektu m5602 (od revize 380, branche m5602).