Ecco la traduzione del messaggio originale postato su xda modificata e corretta, ho integrato anche qualche altra informazione
Ecco una lista di cosa ho fatto:- Sulla scheda del telefono con un ago ho rimosso della colla che copriva alcuni pin jtag
- Ho quindi saldato i fili sui pin, i pin jtag sono stati segnalati sul forum di xda da 3izz che li ha trovati sul web (~~~~~HTC G2 (32A) JTAG Pinout~~~~~~~~~ « ORT Support Forum)
Come interfaccia jtag ho usato l'ARM-USB-OCD della Olimex che in Italia è venduto on-line da Robot-Italy. Questa interfaccia Jtag che ha un'uscita usb per interfacciarsi al pc lavora di default a 6MHz quindi ho evitato di saldare anche il pin rtck (Return to tck) che serve a sincronizzare il clock tra interfaccia Jtag e dispositivo a frequenze maggiori. Essendo i pin molto vicini tra loro e anche vicini ad altri componenti e pezzi di metallo un pin in meno su cui saldare significa meno probabilità di fare danni. Infatti io ho perso un minuscolo condensatore a causa di un errore, per fortuna non è risultato essere vitale al funzionamento del telefono...
Lo standard JTAG prevede anche l'utilizzo di una tensione di riferimento con cui l'interfaccia regola i valori dei segnali. Per i cellulari htc magic/dream/g1 è di 2.6v e deve essere molto stabile e precisa altrimenti c'è il rischio di bruciare il telefono. Per ottenere questa tensione ho usato l'integrato LM317 con uno schema classico (http://i43.tinypic.com/124k7sk.png) che si trova anche sui datasheet, come ingresso ho usato i 5V di una porta usb.
- Ho installato openOCD sulla mia distro ubuntu 9.10 con il supporto per i driver ftdi opensuource (rimando al README di openOCD per chi volesse saperne di più)
openOCD èil programma che ho usato per utilizzare l'interfaccia della olimex. - Ho collegato il telefono al cavo seriale che mi ero già costruito. Per sapere come si fa Android G1 Serial to USB Cable
quindi ho accesso il telefono in modalità blue-light (trackball+power)
Questa modalità avvia il telefono bootando solo l'oemsbl (la radio) (ARM9) che ha un'interfaccia seriale con cui si può comunicare per digitare dei comandi. Il problema è che questi comandi non sono tutti accessibili se non si ha il telefono security-unlocked cioè con superCID. - Prima di avviare openOCD ho collegato il filo +5v della usb sul cavo seriale altrimenti l'interfaccia Jtag non riconosceva il telefono dando come errore "FAILED: all ones". Una volta avviato openOCD con successo ho staccato il filo di prima perchè con quello attaccato il cavo seriale non mi invia i comandi (non so perchè)
Quindi mi sono collegato sia al cavo seriale che a openocd tramite due terminali
.
Ora i comandi che ho scritto sui terminali e che mi hanno permesso di reinstallare spl e recovery. La versione della radio installata sul mio telefono era la 3.22.20.17 quindi gli offset/indirizzi usati di seguito valgono per questa versione e non è detto che vadano bene per altre (meglio non rischiare), per altre versioni della radio andare su xda e cercare i post di ezterry
in openocd:
codice:
bart99@bart99-laptop:~/workspace/Prova$ telnet 127.0.0.1 4444
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Open On-Chip Debugger
> halt
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x600000d3 pc: 0x0090d1fc
MMU: disabled, D-Cache: disabled, I-Cache: disabled
>mww 0x9038f0 0xea000013
> bp 0x902b30 0x4
breakpoint set at 0x00902b30
> resume
halt serve per stoppare il processore sul telefono
mww 0x9038f0 0xea000013 serve per bypassare la restrizione del CID e sbloccare gli altri comandi sull'interfaccia seriale. Per saperne di più andare sempre sullo stesso thread su xda
bp 0x902b30 0x4 aggiunge un breakpoint al comando "cego" dell'interfaccia seriale. Cego serve a caricare in memoria il spl e eseguirlo.
resume fa ripartire il processore sul telefono.
Sulla console seriale:
ora digitando "?" e invio si ottiene una lista di comandi disponibili (se invece da come risposta "? invalid command" significa che non ha funzionato l'hack del CID).
Ho digitato quindi
cego +invio per caricare spl in memoria. Ora il breakpoint impostato prima stoppa nuovamente il processore sul cellulare.
Di nuovo in openocd:
codice:
target state: halted
target halted in ARM state due to breakpoint, current mode: Supervisor
cpsr: 0x400000d3 pc: 0x00902b30
MMU: disabled, D-Cache: disabled, I-Cache: disabled
> rbp 0x902b30
> mww 0x00000c0c 0x98000c4c
> resume
rbp 0x902b30 elimina il bp impostato prima
mww 0x00000c0c 0x98000c4c Modifica dinamicamente il spl in memoria che è stato appena caricato da cego e lo forza ad entre in modalità fastboot. Il brick infatti è dovuto al fatto che non essendo il spl compatibile con la radio ha degli offset diversi e cerca di avviare android con un bootmode=3. Gli offset usati sono stati testati solo con pochi tipi di spl tipo 1.33_2005 e 1.33_2009.
A questo punto ho staccato il cavo seriale e ho connesso quello usb,il display ha mostrato la scritta "fastboot usb" quindi ho potuto utilizzare fastboot per ripristinare spl e recovery (spl 1.33.2009e compatibile con la mia radio e recovery recovery-RA-sapphire-v1.6.2H)
Un saluto,
bart99