Latest:
- Sailfish OS and memory
- Hillshade tile server
- Statistics of OSM Scout for Sailfish OS
- Nebezpečný router
- Tree model with Silica components
By month:
- November 2021
- January 2019
- December 2017
- December 2016
- May 2014
- April 2014
- November 2013
- April 2013
- April 2011
- February 2011
- January 2011
- August 2010
- May 2010
- March 2010
- January 2010
- October 2009
- April 2009
- February 2009
- October 2008
- September 2008
- August 2008
- April 2008
- March 2008
- February 2008
Topic:
Webová kamera m5602 pod Linuxem
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ší.
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.
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).