Nagyon sokan kérdezték tőlem, hogyan sikerült a ZTE Blade androidos készüléknél az USB host módot engedélyeznem, ezért közzéteszem ezt a személyes bejegyzést.
FONTOS! Ezen bejegyzés (NEM pedig cikk) elsősorban hozzáértőknek ajánlott!
FONTOS! Az USB host mód egy erősen kísérleti mod! Ha aktiválva van, nem csatlakoztatható a mobil PC-hez!
FONTOS! Ha az USB host mód aktiválva van, akkor nem lehet elérni a mobilt ADB-n és az SD kártya sem elérhető PC-ről!
FONTOS! Bármilyen módosítás előtt készítsünk rendszerünkről teljes backupot!
FONTOS! A működésért, esetleges károkért (pl. téglásodás) NEM vállalok semmiféle felelősséget, csak saját felelősségre!
FONTOS! A témához NEM nyújtok semmiféle támogatást!
Kettő (!) USB billentyűzet és egy USB egér egyszerre (!) csatlakozik egy Blade-hez
Az alábbiakban találhatjátok a proof-of-concept videót:
http://www.youtube.com/watch?v=B1ydScM0sXU
A következő bekezdésben a témában kevésbé jártasaknak vázolnám az alapvető ismereteket.
FYI: a Blade (mint a többi androidos készülék) alapesetben kliens (slave) módban csatlakozik a számítógép USB host (master, szerver) vezérlőjéhez. A Blade SoC-a (System on Chip, típusa: Qualcomm MSM7227) hardverileg támogatja a host módú működést is (értsd: a mobil is viselkedhet USB hostként, mint egy PC, így USB perifériákat csatlakoztathatunk hozzá, ha adott a szoftveres támogatás). A szoftveres támogatás alatt a megfelelő (USB host enabled/engedélyezett) Linux kernel, kernelmodulok és megosztott függvénykönyvtárak memóriába (illetve a NAND megfelelő könyvtáraiba) való betöltését (illetve felmásolását, elérhetővé tételét) értem. Visszatérve a hardverhez: Az USB hosthoz a Blade esetében mindenképpen szükséges egy speciális, Y-alakú USB-kábel (mivel a mobil USB host vezérlője nem biztos hogy szolgáltat a perifériáknak elegendő áramot). Ezt könnyen elkészíthetjük, boltban azonban nehéz beszerezni (a leírását lásd lentebb).
Milyen USB perifériák csatlakoztathatók?
- billentyűzet (a legtöbb vezetéknélküli billentyűzet, egér NEM működik!)
- egér
- pendrive, külső merevlemez SATA/IDE-USB átalakítóval és extra árambetáplálással (elvileg működik, gyakorlatilag nekem nem sikerült működésre bírni), másik, kliens módban működő Blade , digitális fényképezőgép, egyéb USB Mass Storage osztályú USB eszköz
- botkormány
- gamepad
- speciális eszközzel (pl. DisplayLink): monitor (DVI), hangszóró, Ethernet, TV (HDMI), DVB-T adapter
A következő négy pontban összefoglalnám, mi szükséges az USB host mód aktiválásához:
1. Operációs rendszer és firmware Egyelőre csak Android 2.1 rendszeren működik a Blade esetében az USB host. Tehát szükséges egy rootolt 2.1-es Android. A modhoz Gen1-es firmware kell (a firmware generációkról lásd a személyes bejegyzést a Logout blogomban).
2. Megfelelő kernel Szükséges lecserélni a boot partíció tartalmát Sven Killig boot.img lemezképére. Ez tartalmazza a (csak!) host módban működő kernelt. FIGYELEM! Ekkor kliens (slave) módban NEM fog működni a mobil! Ez azt jelenti, hogy pl. nem tudod pendriveként csatlakoztatni az SD-jét egy PC-hez. Megjegyzés: kettő USB host módú eszköz összekötéséhez speciális, elektronikával (mikrokontrollerrel) rendelkező USB-kábel + szoftveres támogatás szükséges.
A téma szakértőinek: az USB host enabled kernel config fájljában fordítás előtt engedélyezték az USB host módot, illetve esetlegesen belefordítottak néhány abszolút szükséges modult. Mivel a kernel mérete gzippelve kisebb kell hogy legyen mint 3-4 MB a platform sajátosságai miatt, ezért az ilyen modulok száma minimalizált. Ezért van szükség a következő pontban említett kernelmodulokra.
3. Kernelmodulok Ezután bebootolod az új kernellel a 2.1-es rendszert, majd terminál emulátorból (rootként) a kernelhez csatolsz kernelmodulokat (*.ko fájlok, ~ driverek a csatlakoztatandó USB perifériákhoz: billentyűzet (igen, ahhoz is kell driver), egér, pendrive, akár hangkártya, monitor, Ethernet-kártya stb. ; az utóbbi 3-4 periféria a Blade-nél nincs megfelelően implementálva -- értsd: elvileg működhetne, DE nincs meg a megfelelő szoftveres háttér a működéshez, így NEM működik). A kernelhez csatolást az insmod paranccsal lehet megtenni. A kernel objectek (innen a ko kiterjesztés) felfoghatók shared objectekként is (megosztott objektumfájlok, bináris (lefordított) függvénykönyvtárak, a windowsos terminológiában ilyenek a Dynamic Linking Library-k, azaz a dll fájlok.) A billentyűzet, egér jó eséllyel működni fog, pendrive-ot nem sikerült mountolnom. A ko fájlokon túl szükséges egyéb függvénykönyvtárak bemásolása is, általában a /system/lib/modules helyre (ezek shared object fájlok, a perifériák kezeléséhez szükséges speciális rutinokat tartalmazzák).
A futási időben a kernelkódhoz csatolt kernelmodulokat minden indításnál csatlakoztatni kell: ezért célszerű egy indításkor lefutó parancsfájlba (a /system/etc/init.d/ könyvtárba) ezt beírni. A system partíciót az írása előtt rw opcióval remountoljuk.
4. Speciális Y-alakú kábel FYI: Y-alakú kábel: olyan különleges USB-kábel, aminek mindkét végén female USB-csatlakozó van, és erre rá van kötve egy male USB-dugó, DE csak elektromosan (tehát csak a két szélső kábel csatlakozik). Az egyik USB-csatlakozóra kell kötni az USB perifériát, a másikra a mobilt a saját USB-kábelével, az Y-alakú kábel USB-dugóját pedig USB-s áramforráshoz (pl. a telefon töltőjéhez) kell csatlakoztatni.
Az Y-alakú elosztó kábelt egyszerre szükséges csatlakoztatni a töltőhöz, a Blade-hez és az USB perifériához. Ha mindent jól csináltál pl. egy USB billentyűzettel lehet vezérelni a mobilt. Az USB-s egér is működik (de nincs kurzor, az egér mozgatáskor nyílbillentyűk bináris karakterkódjait küldi, nincs kurzor implementálva). Ezekből akár többet is egyidőben a Blade-re csatlakoztathatsz, de nem szabad megfeledkezni a megfelelő árambetáplálásról! Már egy billentyűzetnél is szükséges extra árambetáplálás (értsd: csatlakoztatott töltő), több eszköznél esetleg powered hub.
A fentebb említett boot.img, *.ko, és esetlegesen egyéb *.so fájlokat (függvénykönyvtárak) letöltheted a következő weblapról (az img, ko, so kiterjesztésű fájlok lefordított binárisok, esetünkben ARM architektúrára (armeabi, armel), figyelembe véve a Blade jellegzetességeit):
http://sven.killig.de/android/Blade/usb_host/
Sven Killig először Nexus One-ra csinálta meg az USB host mód aktiválását. Ajánlott mind a Nexus One, mind a Blade host mód leírásainak tanulmányozása. Ezeket megtalálhatók a fenti címen. Természetesen a Blade esetében csak a Blade-hez közétett fájlokat szabad használni.
Újabb kernelhez (így 2.1-nél újabb Androidhoz) sajnos nem tudok semmilyen megoldást. Nyilván rom-ba nincs sok értelme USB host módot integrálni, mivel alapesetben ekkor csak hostként működik az eszköz. Az USB OTG (On-the-Go, dinamikus, hw-es váltás a host/client módok között) rom-ba integrálásnak viszont több értelme lenne, azonban tudomásom szerint ez Blade-nél nincs megfelelően implementálva (bár a SoC minden bizonnyal támogatja).
A téma szakértőinek: Sven Killig honlapjáról letölthetők a kernel objectek forráskódjai (C és header fájlok), továbbá a kernel patchei is. Az eredeti 2.6.29-es Linux kernel forráskódja letölthető a gyártó honlapjáról. A megfelelő boot.img összeállításához szükség van további scriptekre is. Az USB-s beviteli eszközök közül kizárólag az ehci-hcd modulra támaszkodók működnek. Ezért nem működnek a kizárólag HID protokollt használó, többségében vezetéknélküli billentyűzetek/egerek.
Saját boot.img fordításához a ramdiszket egy szintén 2.6.29-es kernelt tartalmazó boot.img fájlunkból kicsomagolhatjuk. A kernelkód címe a boot.img-ben: 0x03000000.