Kompletní odblokování a root smartphonu HTC Sensation XE Z715e

      7.2.2016 Po té, co moje poslední androidové dobrodružství se Samsungem Galaxy S2 neslavně skončilo ještě dříve, než vůbec začalo, jsem sehnal na hraní další smartphone HTC Sensation XE. Pochází zhruba ze stejné doby jako Galaxy S2, výkon a výbava je podobná. HTC sice nemá AMOLED, ale jeho LCD má zas vyšší rozlišení (540 x 960). Mechanická konstrukce je poměrně pevná a solidní, proti S2 je tlustší a těžší. Srdcem telefonu je 2-jádrový 45nm procesor Qualcomm Snapdragon S3 MSM8660.

HTC Sensation XE-back HTC Sensation XE-inside

      Na webu lze najít nepřeberné množství návodů na root/S-OFF, jenže většina je už zastaralá, linky na nástroje jsou dávno mrtvé nebo daný postup funguje jen se starší verzí bootloaderu. Pro spuštění bootloaderu napřed vypněte telefon, krátce vyndejte a zandejte baterku a pak současně stiskněte a držte tlačítka Vol- a Power. Asi po 2 vteřinách se objeví bílá obrazovka s robotem na skejtu a na 3. řádku je vypsaná verze HBOOTu. Menu HBOOTu se prochází tlačítky Vol+, Vol- a výběr se potvrzuje tlačítkem Power. Pokud máte HBOOT 1.1x, můžete použít snadnější zaručený postup s Revolutionary 0.4 nebo HTC All in one root kit.
      Já zde popíšu postup, který mi fungoval s novější verzí HBOOT 1.29. Vysvětlení základních pojmů jako root, unlock bootloaderu, S-ON/OFF a SuperCID najdete zde a zde a zda-li S-OFF vůbec potřeba. Zjednodušeně probíhá spouštění telefonu tak, že se nejprve startuje primární procesor ARM9 (radio) pomocí PBL (Primary Boot Loader) z ROM. Ten provede základní inicializaci HW a z 1. oddílu na externí FlashROM (eMMC) spustí DBL (Device Boot Loader) též od Qualcommu. Ten inicializuje kryptografický HW pro podporu funkce SecureBoot. Následně načte do RAM a zkontroluje signaturu SBL (Secondary Boot Loader) z 3. oddílu a spustí ho. Po další inicializaci HW se načte z 18. oddílu ApPSBL (Applications Processor Secondary Boot Loader - to je výše zmiňovaný HBOOT) a spustí na sekundárním aplikačním procesoru ARM11. Dále se z 5. oddílu načte REX/AMSS (Real-time EXecutive/Advanced Mobile Subscriber Software). HBOOT se stará o upgrade FW ze ZIP balíčků přenášených po síti (FOTA) a umožňuje obnovit tovární nastavení a spustit z boot oddílu hlavní operační systém (Linuxové jádro Androida) nebo alternativní záchranný systém (Recovery - Linuxové jádro s minimálním subsystémem, o něm bude řeč dále).
      Jako základní předpoklady je nejprve nutné stáhnout a nainstalovat USB ovladače pro telefon: buď instalační balíček HTC Mobile Driver 4.17.0.001 nebo Universal Naked Driver 0.72 a vývojářské nástroje SDK Platform Tools (ADB, fastboot...). Pro ladění Androida 4.2.2 a novější je třeba ADB verze alespoň 1.0.31 (Platform Tools 16.0.1 ) s podporou RSA (a následně povolit spárování s PC), jinak se zařízení bude detekovat ve stavu offline. Dále je třeba v nastavení telefonu vypnout automatické vypínání, vypnout power|fast boot a zapnout ve vývojářských nástrojích ladění přes USB. Před jakýmkoliv flashováním by měla být samozřejmost dostatečně nabitá baterie.
      První postup na S-OFF jsem vyzkoušel drátkovou metodu, ale ani po půl hodině zkoušení se mi to nepodařilo. Pak jsem našel modernější nástroj rumrunner s-off 0.5.0, který vyžaduje už rootuntý telefon. To lze zařídit pomocí programu TempRoot-Sensation. Napřed jsem tedy rozbalil TempRoot a spustil dávku temp_root.bat. Po restartu a naběhnutí telefonu v dočasném root módu jsem rozbalil rumrunner a spustil program soju.exe. Po potvrzení zadáním "Yes" se spustil kolotoč několika restartů a v konzoli se vypisovaly různé úchylné hlášky. Po několika minutách celé divadlo skončilo hláškou "WTF: What are you doing?" Už jsem si říkal, že to zas nezabralo, ale když jsem spustil bootloader, bylo vše hotovo. Po úspěšném S-OFF by měla obrazovka vypadat takto:

HTC Sensation XE-unlocked bootloader

      V dalším kroku popíšu, jak je možné změnit CID:
1) připojit telefon přes USB v režimu ladění
2) v adresáři s rozbalenými Platform Tools spustit příkazový řádek a postupně zadat:
3) adb devices - pokud jsou správně nainstalované drivery, vypíše ID zařízení
4) adb reboot bootloader - restartuje do bootloaderu (HBOOT)
5) fastboot getvar cid - vypíše aktuální CID (pro telefon koupený v ČR by to mělo být HTC__032)
6) fastboot oem writecid 11111111 - zapíše SuperCID
7) fastboot reboot-bootloader - restartuje bootloader, aby se projevila změna
8) fastboot getvar cid - vypíše aktuální CID pro kontrolu (mělo by být 11111111)
9) fastboot reboot - restartuje do normálního režimu

      Před instalací modifikované ROMky je potřeba si vždy přečíst, jaké má požadavky na instalaci, zejména jaký alternativní Recovery systém a jeho minimální verzi vyžaduje. Nejběžnější jsou tyto 3: CWM (ClockworkMod), 4EXT Recovery Touch a TWRP (Team Win Recovery Project), novější verze a zdrojáky od Ivaniche jsou zde. Samozřejmě je třeba použít správnou verzi pro odpovídající typ telefonu. Jsou možné 2 způsoby instalace: buď přes ADB a fastboot nebo přes image soubor na SD kartě pomocí HBOOTu. Uvedu oba příklady instalace CWM.

      Instalace Recovery ClockworkMod 5.8.0.9 přes ADB a fastboot:
1) stáhnout soubor image recovery-clockwork-touch-5.8.0.9-pyramid.img pro HTC Sensation (XE)
2) přejmenovat soubor na recovery.img
3) zkopírovat jej do adresáře nástroji Platform Tools
4) připojit telefon přes USB v režimu ladění
5) v adresáři s rozbalenými Platform Tools spustit příkazový řádek a postupně zadat:
6) adb devices - pokud jsou správně nainstalované drivery, vypíše ID zařízení
7) adb reboot bootloader - restartuje do bootloaderu (HBOOT)
8) fastboot flash recovery recovery.img - flashne nový Recovery image ze souboru
9) fastboot reboot - restartuje do normálního režimu
Pokud nyní spustíme bootloader a vybereme v menu položku RECOVERY, měl by se po pár vteřinách spustit ClockworkMod. CWM i TWRP nabízí oproti standardnímu Recovery spoustu funkcí navíc, např. TWRP podporuje i režim USB Mass Storage a ovládání přes GUI a dotykovku. Hlavní funkcí je ale instalace alternativních ROMek ze ZIP balíčků na SD kartě.

      Instalace Recovery ClockworkMod 5.8.0.9 image soubor na SD kartě pomocí HBOOTu:
1) stáhnout soubor image recovery-clockwork-touch-5.8.0.9-pyramid.img pro HTC Sensation (XE)
2) přejmenovat soubor na recovery.img
3) stáhnout soubor android-info.txt do stejného adresáře jako image
4) zabalit soubory recovery.img a android-info.txt do archivu PG58IMG.ZIP
5) nahrát soubor PG58IMG.ZIP do kořenového adresáře SD karty
6) vypnout telefon a vložit do něj připravenou SD kartu
7) spustit bootloader tlačítkovou kombinací Vol- a Power
8) pokud je soubor správně pojmenovaný a souhlasí model ID a CID, automaticky se objeví výzva k potvrzení přeflashování recovery (potvrdit stiskem Vol+):


 HBOOT
   Parsing...[SD ZIP]
   [1] RECOVERY
 Do you want to start update?
 <VOL UP> Yes
 <VOL DOWN> No
 Update Complete...
 Press <POWER> to reboot.

9) po restartu smazat soubor PG58IMG.ZIP z SD karty, aby se znovu nespouštěla výzva k přeprogramování.

      Nyní se konečně dostáváme k výběru a instalaci kýžené alternativní ROMky. Pro úplnost uvedu přehledovou tabulku klíčových vlastností různých verzí OS Android. Pro HTC Sensation XE je nyní k dispozici i nejnovější Android Marshmallow 6.0.1, ale zatím jen testovací verze. Od verze Androidu 4.1.2 Jelly Bean byla odstraněna podpora USB Mass Storage :( V novějších verzích Androidu 5.x byly skryty nástroje pro vývojáře a ladění - lze je zapnout v Nastavení|O telefonu a 7x ťuknout na číslo sestavení. Vyzkoušel jsem postupně několik různých ROMek:

- = Venom ViperS 5.3.0 = - - = CyanogenMod 12.1 = - - = Euphoria-OS-1.1 = - - = CyanogenMod 13.0 = - - = originální RUU ROM 3.32.401.105 = -       Dále uvedu jeden konkrétní postup instalace alternativní ROMky Venom ViperS 5.3.0:
1) stáhnout a nahrát na SD kartu soubor ViperS_C2_5.3.0.zip [825 MB]
2) spustit bootloader a vybrat položku RECOVERY, spustí se ClockworkMod Recovery 5.8.0.9
3) v ClockworkMod Recovery 5.8.0.9 vybrat (zde už funguje dotykovka) wipe data/factory reset|Yes -- delete all user data


 --Wiping data...
 Formatting /data...
 Formatting /chache...
 Formatting /sd-ext...
 E:format_volume: make_extf4fs failed on /dev/block/mmcblk1p2
 Formatting /sdcard/.android_secure..
 Data wipe copmplete.

4) v ClockworkMod Recovery 5.8.0.9 vybrat install zip from sdcard|choose zip from sdcard|ViperS_C2_5.3.0.zip
5) v uvítací obrazovce Welcome, You're about to flash ťukni na Next:


 ViperS/C2 for HTC Sensation/XE/4G, HTC One S C2
 Version: 5.3.0
 Updated: Sep 17, 2014

6) odsouhlasit licenční ujednání (I agree with this terms of use, Next)
7) zkouknout Changelog, Next
8) v Pre-flash Options potvrdit Perform a full wipe, Next
9) výběr modelu - vyber HTC Sensation XE
10) v Additional Mods je možno zatrhnout odebrání Sense launcheru a jeho widgetů
11) v Remove Apps je možno vybrat, které aplikace nebudou nainstalovány, zrušil jsem: Hangouts, FaceLock, Magazines, Movies & TV, Music, Now, Plus, TalkBack, Live Wallpaper, Stocks, Facebook, Twitter, Kid mode
12) v Install Keyboards je možno zatrhnout, která rozložení klávesnice se budou instalovat
13) potvrdit uložení Customized data na SD kartu
14) vybrat max. frekvenci CPU (nechávám default 1512 MHz)
15) vybrat max. frekvenci GPU (nechávám default 266 MHz)
16) závěrečné potvrzení Ready To Install, Install Now
17) po asi 5 minutách by mělo být hotovo, Next, Finish
18) potvrdit restart

      Po těchto experimentech jsem se nakonec vrátil zpět k CyanogenMod 12.1, který mi přišel stabilní, funkční a bez zbytečností. Spoustu dalších informací lze najít na XDA fóru a na českém Ká for YOU fóru. Zajímavé tipy na aplikace najdete v seriálu: Nejlepší aplikace pro rootnuté telefony 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16. Pro hrátky v linuxové konzoli doporučuji nainstalovat poslední verzi BusyBoxu 1.24.1.

      18.2.2016 Asi po týdnu spokojeného běhu na CyanogenMod 12.1 mě nepříjemně překvapila náhlá smrt. Prostě jsem odpoledne telefon normálně zapnul, objevila se cca na vteřinu odemykací obrazovka a hned se zas vypnul - už na věky. Baterku jsem měl přitom nabitou tak na 80%. Telefon nereagoval na tlačítko Power a po připojení USB kabelu se vůbec nesvítila LED (nenabíjel). Nepomohlo ani mnohanásobné vyndání/zandání baterie a různé tlačítkové pokusy včetně několikaminutového držení Power s nebo bez Vol- či Vol+. Za určitých okolností (lze opakovaně vyvolat drátkovou metodou uzemněním jednoho testpointu dále od rohu baterky) se podařilo telefon detekovat na PC jako neznámé zařízení "QHSUSB_DLOAD" s VID: 05C6, PID: 9008. Patrně se jedná o PBL (Primary Boot Loader) primárního procesoru ARM9. Po instalaci ovladačů od Qualcommu, se pak objeví ve správci zařízení jako virtuální sériový port "Qualcomm HS-USB QDLoader 9008". Detekce na Linuxu:


 [  264.472713] usb 1-1.6: new high-speed USB device number 9 using ehci-pci
 [  264.559097] usb 1-1.6: New USB device found, idVendor=05c6, idProduct=9008
 [  264.559160] usb 1-1.6: New USB device strings: Mfr=1, Product=2, SerialNumber=0
 [  264.559216] usb 1-1.6: Product: QHSUSB_DLOAD
 [  264.559245] usb 1-1.6: Manufacturer: Qualcomm CDMA Technologies MSM
 [  264.559572] qcserial 1-1.6:1.0: Qualcomm USB modem converter detected
 [  264.559683] usb 1-1.6: Qualcomm USB modem converter now attached to ttyUSB0
 $ lsusb
 Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
 Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
 Bus 001 Device 009: ID 05c6:9008 Qualcomm, Inc. Gobi Wireless Modem (QDL mode)
 ...

      Doufal jsem, že mě zachrání linuxový HTC Unbricking Project z XDA. Jenže ten jaksi předpokládá, že je bootloader v režimu USB Mass Storage a hledá nějaké zařízení /dev/sd?12, v mém případě je to však sériová linka /dev/ttyUSB0 a nevím jakým způsobem to přepnout. Na XDA jsem pročetl spoustu vláken, ale přímo pro HTC Sensation není moc informací. Něco podobného se řešilo ve vlákně o HTC Desire HD. Je patrné, že se do RAM procesoru musí nejprve uploadnout nějaká binárka od Qualcommu (podle typu procesoru: MPRG7x30.hex pro Desire, MPRG8660.bin pro Sensation/Pyramid), která je schopná pracovat s eMMC. Dále je potřeba image xxxx_msimage.mbn (specifický pro konkrétní model telefonu) se sekundárním bootloaderem a partition tabulkou. PBL patrně ověřuje nějaký digitální podpis nahrávaných souborů, pokud je v procesoru aktivní bezpečnostní pojistka (režim Secure Boot). Bohužel jsem udělal chybu, že jsem si dříve nevytvořil kompletní RAW zálohu eMMC, z které bych to mohl teď vytáhnout. Co mě však dost znepokojilo, že v případě diskutujích uživatelů se nakonec ukázal problém ve vadném eMMC čipu do kterého nešlo zapsat ani JTAGem. Jeden z nich to vyřešil výměnou desky, ale ne na dlouho, eMMC mu pravděpodobně odešlo znova. Už jsem slyšel o umírajících flash pamětech u Samsung Galaxy S3 a Huawei Ascend G300, takže nejde u starších zařízení o nic výjimečného.
      Také jsem našel zajímavé vlákno, které popisuje komunikační protokol PBL Qualcomm DMSS, PDF dokumenty ke stažení zde a zde. Vznikl i jednoduchý perlový skript qd.pl, kterým lze bootloaderu poslat soubor nebo přečíst nějaké základní informace. Zde je můj testovací výpis po spuštění ./qd.pl --check:


 Requesting SoftwareVersion...
 SENDING: 7e 0c 14 3a 7e // Software Version Request
 RECEIVED: 0d 0f 50 42 4c 5f 44 6c 6f 61 64 56 45 52 31 2e 30 37 41
 Version: PBL_DloadVER1.0
 Requesting Params...
 SENDING: 7e 07 c7 84 7e // Parameter Request
 RECEIVED: 08 06 01 01 00 90 00 00 14 70
 Params: 06 01 01 00 90 00 00
 // Byte1: 06 - Protocol version (implemented in phone)
 // Byte2: 01 - Minimum protocol version (non-secure implementation)
 // Byte3,4: 0100 - Maximum write data length supported (256B)
 // Byte5: 90 - Phone hardware model number
 // Byte6: 00 - Flash device size code (invalid/unrecognized/unsupported)
 // Byte7: 00 - Flash device type code (currently not supported)
 Unlocking...
 SENDING: 7e 0b 00 00 00 00 00 00 00 00 2a 18 7e // Unlock (64b sec. code)
 RECEIVED: 03 00 06 9e 4c
 Invalid Response: 03 00 06 // NAK (Unknown/invalid command)
 Dumping chunk...
 SENDING: 7e 09 2a 00 00 00 00 80 2f e5 7e // Memory Dump (optional)
 RECEIVED: 03 00 06 9e 4c
 Response: 03 00 06 // NAK (Unknown/invalid command)
 Requesting Reboot...
 SENDING: 7e 0a 22 5f 7e // HW Reset
 requestReboot send ok
 RECEIVED: 02 6a d3
 Param: 02 // ACK

Je zde vidět, že PBL některé příkazy nepodporuje. S PBL lze též komunikovat pomocí windowsí utility QPST (Qualcomm Product Support Tools) verze 2.7.363, 2.7.378, 2.7.425, jen tak mít ty správné soubory. Patrně jedinou ověřenou možností, jak eMMC přeprogramovat, je RIFF BOX JTAG (a to nemám jistotu, že není eMMC čip vadný), který stojí asi 2500 Kč, což značně převyšuje dnešní cenu telefonu. Když se mi podaří sehnat poškozený kus s funkční deskou, tak bych to vyměnil, jinak to nemá cenu...

      22.2.2016 Večer jsem si podrobněji prostudoval komunikační protokol bootloaderu DMSS (Dual-Mode Subscriber Station). Je docela jednoduchý, klasická výzva - odpověď. 1-Bytový kód příkazu a případné další parametry (Big-endian) jsou zabaleny do linkové vrstvy HDLC. Telefon pak odpoví buď jednoduchým paketem ACK/NAK+kód chyby nebo delším paketem s daty. Pomocí perlového skriptu qd.pl jsem si na Linuxu vyzkoušel naposílat příkazy dle dokumentace, ale zjistil jsem, že PBL jich spoustu nezná (odpověď NAK s kódem 0x0006 - Unknown/invalid command). Zde je stručný přehled, co jsem otestoval:

CMDB popis příkazu podpora
05 Go to a memory location and run nevrátí žádnou odpověď
07 Request implementation information OK
09 Memory Dump (optional) NAK (0x0006)
0A HW Reset OK
0B Unlock access to secured operations NAK (0x0006)
0C Software Version Request OK
0F Write with 32-bit address OK
10 Memory Debug Query NAK (0x0006)
12 Memory Read Request NAK (0x0006)
14 Serial Number Read Request (jen PBL) OK, S/N: 0x00000000
16 Serial Number Read Request NAK (0x0006)
17 Hardware ID Read Request NAK (0x0006)
18 Public Key Hash Read NAK (0x0006)
19 QPST Cookie Read Request NAK (0x0006)

Také jsem zjistil, že v odpovědi na Parameter Request se nachází důležitá položka "Maximum write data length supported", která říká, kolik max. Bytů lze do telefonu poslat v jednom příkazu zápisu. V mém případě je to 256 B, ale skript qd.pl používá natvrdo 1024 B. Toto jsem tedy ve skriptu upravil a přidal i jednoduché parsování parametrů (v Perlu jsem předtím nikdy neprogramoval, ale docela se to podobá Céčku). Též se mi podařilo najít soubor MPRG8660.bin pro procesor MSM8660, který by měl zpřístupnit eMMC, jenže po jeho nahrání a spuštění se bootloader sekne a dál na USB komunikaci nereaguje. Je možné, že tento soubor je jen vývojová verze od Qualcommu bez digitálního podpisu, zatím co HTC má svoji podepsanou verzi. Určitě existuje více variant programovacího kódu, protože různí výrobci zařízení používají různé FlashROM paměti a mohou být i různě zapojené...

      23.2.2016 Dnes ráno došlo k naprosto nepochopitelné události - vstání z mrtvých jak Ježíše Krista. Když jsem zapnul PC, všiml jsem si, že se detekovalo nové USB zařízení "HTC Sensation" s VID: 18D1, PID: 0C86 - ADB most. A také svítila LEDka signalizující nabíjení baterie. Telefon šel normálně zapnout. Při prvním bootu došlo před zobrazením odemykací obrazovky k restartu. Při druhém bootu už systém normálně naběhl s veškerým nastavením a aplikacemi jako dříve. Možná to má na svědomí nějaký špatný kontakt nebo odcházející eMMC, každopádně si teď zazálohuju důležité systémové oddíly.

      25.2.2016 Tak dnes se mi telefon 3x restartoval a při posledním restartu zůstal viset na bíle obrazovce s logem HTC. Po vyndání a zandání baterky už nenaběhl a na nic nereagoval. Došlo mi, že to bude nejspíš HW chyba. Zkusil jsem horkým vzduchem prohřát pouzdro eMMC paměti Samsung KMMLL000QM-B503, ale nepovedlo se a teď už ani nenaběhne PBL :( Ze zvědavosti jsem zkusil eMMC čip odpájet. Ani po dlouhém smažení se mu nechtělo. Po aplikaci hrubé síly jsem zjistil, že byl zespod důkladně přilepený epoxidem. PCB jsem sice nepoškodil, ale na výměnu BGA zatím nemám. Stejně bych musel nový eMMC nějak naprogramovat a nemám čím.

HTC Sensation XE inside-CPU board-top HTC Sensation XE inside-CPU board-bottom desoldered eMMC Samsung KMMLL000QM-B503

      22.3.2016 mi dorazila zásilka z Anglie (přes eBay) s jedním poškozeným HTC Sensation XE na náhradní díly. Vymontoval jsem z něj procesorovou desku a přehodil ji do svého telefonu. Ten se mi podařilo normálně zapnout a naběhl původní Andoid 4.0.3. Celkem rutinně jsem provedl S-OFF postupem popsaným výše, změnil CID, naflashoval alternativní recovery TWRP 2.8.6.0 a chystal se flashnout CyanogenMod 12.1. Jenže při mazání oddílu /data na flešce nastal problém, proces formátování zatuhnul a ani po 20 minutách se nic nedělo. Musel jsem tedy vyndat baterku a spustit TWRP znovu, jenže to už hlásil, že oddíl /data nelze přimountovat a další pokusy o formátování na FS ext4 skončily opět zátuhem. Vyzkoušel jsem i další recovery: ClockworkMod 5.8.0.9, ClockworkMod 6.0.0.3, ClockworkMod 6.0.1.2, 4EXT Recovery Touch 1.0.0.6 RC3 a TWRP 3.0.0 R4, ale bez úspěchu. Formátování skončilo buď chybou nebo zátuhem a oddíl se nepovedlo přimountovat. Jak je vidět v tomto vlákně na XDA fóru, není to u HTC nic výjimečného.

TWRP wipe data partition error

      Pokud použijeme TWRP, je možné se dostat na linuxový shell buď přes položku Advanced|Terminal nebo pohodlněji z PC po USB kabelu přes ADB pomocí příkazu adb shell. Následujícími příkazy lze zjistit více informací o eMMC flash a jeho oddílech:

cat /sys/devices/platform/msm_sdcc.1/mmc_host/mmc0/mmc0:0001/name
MLL00M

cat /proc/emmc


 dev:        size     erasesize name
 mmcblk0p32: 000ffa00 00000200 "misc"
 mmcblk0p21: 00fffc00 00000200 "recovery"
 mmcblk0p20: 01000000 00000200 "boot"
 mmcblk0p22: 31fffc00 00000200 "system"
 mmcblk0p24: 077f5c00 00000200 "cache"
 mmcblk0p23: 4aabc400 00000200 "userdata"
 mmcblk0p28: 01400000 00000200 "devlog"
 mmcblk0p30: 00040000 00000200 "pdata"
 mmcblk0p25: 00008000 00000200 "extra"
 mmcblk0p17: 02800000 00000200 "radio"
 mmcblk0p19: 01000000 00000200 "adsp"
 mmcblk0p18: 007ffa00 00000200 "radio_config"
 mmcblk0p26: 00400000 00000200 "modem_st1"
 mmcblk0p27: 00400000 00000200 "modem_st2"

cat /proc/partitions


 major minor  #blocks  name
  179        0    2359296 mmcblk0
  179        1        128 mmcblk0p1
  179        2        256 mmcblk0p2
  179        3      32367 mmcblk0p3
  179        4          1 mmcblk0p4
  179        5         16 mmcblk0p5
  179        6        256 mmcblk0p6
  179        7      20442 mmcblk0p7
  179        8        256 mmcblk0p8
  179        9       1024 mmcblk0p9
  179       10        256 mmcblk0p10
  179       11       2048 mmcblk0p11
  179       12       1024 mmcblk0p12
  179       13         32 mmcblk0p13
  179       14       6144 mmcblk0p14
  179       15       1024 mmcblk0p15
  179       16        256 mmcblk0p16
  179       17      40960 mmcblk0p17
  179       18       8190 mmcblk0p18
  179       19      16384 mmcblk0p19
  179       20      16384 mmcblk0p20
  179       21      16383 mmcblk0p21
  179       22     819199 mmcblk0p22
  179       23    1223409 mmcblk0p23
  179       24     122839 mmcblk0p24
  179       25         32 mmcblk0p25
  179       26       4096 mmcblk0p26
  179       27       4096 mmcblk0p27
  179       28      20480 mmcblk0p28
  179       29          4 mmcblk0p29
  179       30        256 mmcblk0p30
  179       31         16 mmcblk0p31
  179       32       1022 mmcblk0p32
  179       64    1966080 mmcblk1
  179       65    1959898 mmcblk1p1

dmesg |grep I/O


 <3>[  672.744476] end_request: I/O error, dev mmcblk0, sector 4709845
 <3>[  672.744842] Buffer I/O error on device mmcblk0p28, logical block 4352
 <3>[  672.773071] end_request: I/O error, dev mmcblk0, sector 4711893
 <3>[  672.773254] Buffer I/O error on device mmcblk0p28, logical block 4608
 <3>[  672.801452] end_request: I/O error, dev mmcblk0, sector 4713941
 <3>[  672.801544] Buffer I/O error on device mmcblk0p28, logical block 4864
 <3>[  776.400177] end_request: I/O error, dev mmcblk0, sector 4412899
 <3>[  776.400268] Buffer I/O error on device mmcblk0p24, logical block 0
 <3>[  776.400543] end_request: I/O error, dev mmcblk0, sector 4412901
 <3>[  776.400665] Buffer I/O error on device mmcblk0p24, logical block 1
 <3>[  776.400848] end_request: I/O error, dev mmcblk0, sector 4412903
 <3>[  776.400939] Buffer I/O error on device mmcblk0p24, logical block 2
 <3>[  776.401123] end_request: I/O error, dev mmcblk0, sector 4412905
 <3>[  776.401214] Buffer I/O error on device mmcblk0p24, logical block 3
 <3>[  776.401397] end_request: I/O error, dev mmcblk0, sector 4412907
 <3>[  776.401489] Buffer I/O error on device mmcblk0p24, logical block 4
 <3>[  776.401672] end_request: I/O error, dev mmcblk0, sector 4412909
 <3>[  776.401763] Buffer I/O error on device mmcblk0p24, logical block 5
 <3>[  776.401947] end_request: I/O error, dev mmcblk0, sector 4412911
 <3>[  776.402130] Buffer I/O error on device mmcblk0p24, logical block 6
 <3>[  776.402221] end_request: I/O error, dev mmcblk0, sector 4412913
 <3>[  776.402404] Buffer I/O error on device mmcblk0p24, logical block 7
 <3>[  776.402526] end_request: I/O error, dev mmcblk0, sector 4412915
 <3>[  776.402679] Buffer I/O error on device mmcblk0p24, logical block 8
 <3>[  776.402801] end_request: I/O error, dev mmcblk0, sector 4412917
 <3>[  776.402984] Buffer I/O error on device mmcblk0p24, logical block 9
 <3>[  783.229522] end_request: I/O error, dev mmcblk0, sector 1966080
 <3>[  783.229736] Buffer I/O error on device mmcblk0p23, logical block 0
 <3>[  783.229919] end_request: I/O error, dev mmcblk0, sector 1966082
 <3>[  783.230102] Buffer I/O error on device mmcblk0p23, logical block 1
 <3>[  783.230194] end_request: I/O error, dev mmcblk0, sector 1966084
 <3>[  783.230377] Buffer I/O error on device mmcblk0p23, logical block 2
 <3>[  783.230590] end_request: I/O error, dev mmcblk0, sector 1966086
 <3>[  783.230773] Buffer I/O error on device mmcblk0p23, logical block 3
 <3>[  783.230865] end_request: I/O error, dev mmcblk0, sector 1966088
 <3>[  783.231048] Buffer I/O error on device mmcblk0p23, logical block 4
 <3>[  783.231140] end_request: I/O error, dev mmcblk0, sector 1966090
 <3>[  783.231323] Buffer I/O error on device mmcblk0p23, logical block 5
 <3>[  783.231414] end_request: I/O error, dev mmcblk0, sector 1966092
 <3>[  783.231597] Buffer I/O error on device mmcblk0p23, logical block 6
 <3>[  783.231719] end_request: I/O error, dev mmcblk0, sector 1966094
 <3>[  783.231903] Buffer I/O error on device mmcblk0p23, logical block 7
 <3>[  783.232055] end_request: I/O error, dev mmcblk0, sector 1966096
 <3>[  783.232177] Buffer I/O error on device mmcblk0p23, logical block 8
 <3>[  783.232330] end_request: I/O error, dev mmcblk0, sector 1966098
 <3>[  783.232452] Buffer I/O error on device mmcblk0p23, logical block 9

Z výpisu dmesg je patrné, že eMMC obsahuje vadné sektory nejen v oddílu userdata, ale i v oddílech cache a devlog. Proskenování eMMC utilitou Partition scanner neodhalilo žádné chyby, ale to nejspíš díky tomu, že z každého 1MB bloku čte jen malou část, takže vadné sektory může minout.


 partition /dev/block/mmcblk0p1
 /dev/block/mmcblk0p1
 scanned         0 MiB =        0 MB completed --> OK

 partition /dev/block/mmcblk0p2
 /dev/block/mmcblk0p2
 scanned         0 MiB =        0 MB completed --> OK

 partition /dev/block/mmcblk0p3
 /dev/block/mmcblk0p3
 scanned        31 MiB =       33 MB completed --> OK
 ...
 partition /dev/block/mmcblk0p23
 /dev/block/mmcblk0p23
 scanned      1194 MiB =     1252 MB completed --> OK
 ...

Zkusil jsem též ruční formátování oddílu pomocí příkazů mke2fs -b 4096 -m 0 -c -F -T ext4 /dev/block/mmcblk0p23 a mkfs.ext4 -b 4096 -O ^huge_file,^dir_nlink,^ext_attr,^resize_inode,^extra_isize -m 0 /dev/block/mmcblk0p23 a kontrolu pomocí příkazu fsck.ext4 -cDfty -C 0 /dev/block/mmcblk0p23 - opět bez úspěchu. Nakonec jsem zkusil flashnout i originální RUU ROM 3.32.401.105 z SD karty. Jelikož v recovery módu nefunguje připojení k PC tak, jak očekává RUU updater, je třeba po jeho spuštění (a před jeho zavřením) vytáhnout z local tempu Windows soubor rom.zip, přejmenovat ho na PG58IMG.ZIP, nahrát jej do kořene SD karty a spustit na telefonu bootloader. Ten si soubor sám najde a po potvrzení začne flashovat. Jenže při flashování sekce data to opět vytuhlo.
      Ještě mě napadlo pomocí TWRP 3.0.0 R4 zkusit změnit typ souborového systému z ext4 na FAT. Formátování se zdařilo, oddíl se přimountoval a byl jsem schopen flashnout CM 12.1 ROMku. I první boot vypadal slibně, ale skončil chybovou hláškou "Encryption unsuccessful" s jedinou možností "Reset phone", což se po potvrzení opakovalo pořád dokola. Když jsem pustil kontrolu fsck.fat -t /dev/block/mmcblk0p23, objevila se první chyba asi na clusteru 8000, tj. cca 32 MB od začátku oddílu. Je zřejmé, že jakmile se systém pokusí o přístup k nějakému vadnému sektoru, tak se eMMC uzamkne a na další příkazy nereaguje - je nutný restart. Asi jediná šance, jak se vadným sektorům vyhnout, by byla změna tabuly oddílů tak, že by se postižené oddíly posunuly a zmenšily a místa s vadnými sektory se nechala nevyužitá. Nenašel jsem ale žádný postup, jak to na HTC Sensation XE provést.
      Nakonec jsem objevil jednodušší a spolehlivější řešení - pomocí utility BOOT-MOD-PLUS 4.03 určené pro Ivanichovy CyanogenMod ROMky 11.x, 12.x a 13.x, který se naflashuje hned po ROMce, lze systém upravit tak, že se oddíl /data přimountuje na externí SD kartu (její 2. primární oddíl /dev/block/mmcblk1p2, jenž musí mít souborový systém ext4 nebo F2FS). Nevýhoda je, že přístup na externí SD kartu je pomalejší než na interní eMMC, je doporučována SD karta alespoň třídy 10. Já tam mám jen obyčejnou 2GB Kingstonku SD-C02G třídy 4 nebo 6. Pomocí Acronis Disk Director jsem nedestruktivně zmenšil stávající FAT oddíl a vytvořil další primární oddíl (alespoň tak 1 GB). SD kartu jsem vložil do telefonu, spustil TWRP, připojil se přes ADB a oddíl naformátoval na F2FS (je prý o něco rychlejší při zápisu jak ext4) pomocí příkazu mkfs.f2fs -l sdextdata /dev/block/mmcblk1p2.


 F2FS-tools: mkfs.f2fs Ver: 1.6.0 (2015-12-21) [modified by Motorola to reserve space]

 Info: Debug level = 0
 Info: Label = sdextdata
 Info: Segments per section = 1
 Info: Sections per zone = 1
 Info: Trim is enabled
 Info: sector size = 512
 Info: total sectors = 1044225 (509 MB)
 Info: zone aligned segment0 blkaddr: 481
 Info: format version with
   "Linux version 3.4.110-ga791ac3-05608-gc31c76e9 (ivanich@ivanich) (gcc version
  4.9.x-google 20140827 (prerelease) (GCC) ) #1 SMP PREEMPT Fri Mar 18 23:47:45 EET 2016"
 Info: Discarding device: 0 sectors
 Info: Wipe via secure discard failed, used discard instead
 Info: Overprovision ratio = 10.000%
 Info: Overprovision segments = 49 (GC reserved = 28)
 Info: format successful

Interní oddíly userdata a cache jsem taky přeformátoval na F2FS. Pak jsem z FAT oddílu SD karty pomocí TWRP nainstaloval CM 12.1 ROMku a BOOT-MOD-PLUS 4.03 utilitu, která upravila konfiguraci mountpointů. Po restartu se CM ROMka normálně spustila a mohl jsem znovu nainstalovat vybrané aplikace. V nastavení systému to občas trochu lagne, ale zatím jsem neměl žádný restart či zátuh. Uvidím, jak se to bude chovat po dlouhodobějším používání. Zde je ještě výpis mountpointů a volného místa na běžícím systému:

mount


 rootfs / rootfs ro,seclabel,relatime 0 0
 tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
 devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
 proc /proc proc rw,relatime 0 0
 sysfs /sys sysfs rw,seclabel,relatime 0 0
 selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
 none /acct cgroup rw,relatime,cpuacct 0 0
 none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
 tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
 tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
 none /dev/cpuctl cgroup rw,relatime,cpu 0 0
 none /sys/fs/cgroup/bfqio cgroup rw,relatime,bfqio 0 0
 /dev/block/platform/msm_sdcc.1/by-name/radio /firmware_radio vfat ro,context=u:object_r:firmware_file:s0,relatime,
 fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
 /dev/block/platform/msm_sdcc.1/by-name/adsp /firmware_q6 vfat ro,context=u:object_r:firmware_file:s0,relatime,
 fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
 /dev/block/platform/msm_sdcc.1/by-name/devlog /devlog ext4 rw,seclabel,nosuid,nodev,noatime,nobarrier,data=ordered 0 0
 /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 rw,seclabel,noatime,nobarrier,data=ordered 0 0
 /dev/block/platform/msm_sdcc.1/by-name/userdata /cache f2fs rw,seclabel,nosuid,nodev,noatime,nodiratime,
 background_gc=on,discard,user_xattr,inline_xattr,acl,inline_data,extent_cache,active_logs=6 0 0
 /dev/block/platform/msm_sdcc.3/by-num/p2 /data f2fs rw,seclabel,nosuid,nodev,noatime,nodiratime,
 background_gc=on,discard,user_xattr,inline_xattr,acl,inline_data,extent_cache,active_logs=6 0 0
 /sys/kernel/debug /sys/kernel/debug debugfs rw,relatime 0 0
 /dev/block/vold/179:65 /mnt/media_rw/sdcard0 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,
 fmask=0007,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
 /dev/block/vold/179:65 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,
 fmask=0007,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
 /dev/fuse /storage/sdcard0 fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

df


 Filesystem               Size     Used     Free   Blksize
 /dev                   303.3M    36.0K   303.3M   4096
 /sys/fs/cgroup         303.3M    12.0K   303.3M   4096
 /mnt/asec              303.3M     0.0K   303.3M   4096
 /mnt/obb               303.3M     0.0K   303.3M   4096
 /firmware_radio        199.8M    21.5M   178.3M   4096
 /firmware_q6           199.8M     5.8M   194.0M   4096
 /devlog                 19.7M     4.0M    15.6M   4096
 /system                787.4M   406.1M   381.3M   4096
 /cache                   1.2G   146.1M     1.0G   4096
 /data                  508.0M   484.8M    23.2M   4096

      Také jsem vyzkoušel na telefonu servisní kódy, které jsem našel na Internetu, ale z několika desítek fungovaly jen tyto 2. Nicméně pod tím druhým se nachází menu se spoustou zajímavých informací o HW/SW a sítích.

*#06# IMEI
*#*#4636#*#* Phone info, Battery info, Usage stat., Wi-Fi info

      28.3.2016 Radost z opravy mi nevydržela moc dlouho. Zjistil jsem, že nefunguje interní GPS. Normálně jde zapnout, ale nevidí žádné satelity, dokonce ani neposílá žádné NMEA věty (zkoušel jsem programy GPS NMEA Tool, GPS Test a další). Nepodařilo se mi nikde dohledat, přes jaký low-level interface se NMEA data v systému posílají (čekal bych nějaký dev/tty*). Akorát výpis shellového příkazu dumpsys location vypíše poslední polohu (v mém případě 0, 0) a nějaké informace. Rozdělal jsem telefon, abych se podíval, jestli jsem nezapomněl zacvaknout nějaký konektor. Z procesorové desky vede do druhé desky s kamerkou tenký černý koaxiální kablík, který je připojen konektorem k malé zaplechované krabičce - nějaký VF obvod, který je dále připojen přes 2 pružné kontakty k anténě v zadním víku. Zkontroloval jsem, že není zkratovaný ani přerušený.
      Dále mě napadlo vyzkoušet starší verze CM 12.1 a CM 13 ROMek spolu s vymazáním cache a user dat, jestli náhodou není chybka tam, ale chovalo se to pořád stejně. Když jsem jako poslední pokus flashoval CM 11, tak se mi jako na potvoru objevila chyba formátování systémového oddílu na ext4 - zřejmě se objevil nový vadný blok. Po několika opakováních chcípla eMMC fleška úplně a telefon zůstal viset v PBL (dříve zmiňovaný "QHSUSB_DLOAD" USB mode) - tak to je konečná, seru na to...



Zpět

Aktualizováno 29.3.2016 v 3:53