e anche che la cosa interessi a qualcuno! :D
Da quasi tre settimane sono in possesso del V1277, che piu' lo conosco piu' mi entusiasma.
La prima cosa che ho fatto è metterci su una SDCARD da 32GB e modificare il vold.fstab per
scambiare sdcard con sdcard2 ... ma mi dava un po' fastidio vedere sprecato lo spazio della
partizione chiamata "fat", che veniva vista adesso come sdcard2 ma che veniva snobbata da
tutte le app !
E invece la partizione "usrdata" era soltanto di 834MB !!! :D
Perciò mi sono guardato un po' i file del firmare e ho cercato le corrispondenze tra quello
che veniva fuori con un "fdisk" dalla shell di adb, dalla tabella della EMMC in /proc, e i file
presenti nel pacchetto del firmware originale.
Il file "scatter.txt" originale è questo:
- {L_CODE}: {L_SELECT_ALL_CODE}
PRELOADER 0x0 {}
DSP_BL 0x40000 {}
MBR 0x600000 {}
EBR1 0x604000 {}
__NODL_PMT 0x608000 {}
__NODL_NVRAM 0xa08000 {}
__NODL_SECCFG 0xf08000 {}
UBOOT 0xf28000 {}
BOOTIMG 0xf88000 {}
RECOVERY 0x1588000 {}
SEC_RO 0x1b88000 {}
__NODL_MISC 0x2188000 {}
LOGO 0x21e8000 {}
__NODL_EXPDB 0x24e8000 {}
ANDROID 0x26e8000 {}
CACHE 0x1b6e8000 {}
USRDATA 0x346e8000 {}
FAT 0x689e8000 {}
__NODL_BMTPOOL 0xFFFF00a8 {}
Leggiamo adesso la tabella delle partizioni direttamente dal nostro V1277, tramite
- {L_CODE}: {L_SELECT_ALL_CODE}
adb shell "cat /proc/emmc"
che a me ha restituito questo:
- {L_CODE}: {L_SELECT_ALL_CODE}
partno: start_sect nr_sects partition_name
emmc_p1: 00000020 00000002 "ebr1"
emmc_p2: 0000ac40 00002800 "sec_ro"
emmc_p3: 00010740 000c7800 "android"
emmc_p4: 000d8740 000c7800 "cache"
emmc_p5: 001a0740 001a1000 "usrdata"
emmc_p6: 00341f40 003f99c0 "fat"
E cerchiamo conferma dei dati anche con l'fdisk
- {L_CODE}: {L_SELECT_ALL_CODE}
adb shell "fdisk /dev/block/mmcblk0 -lu"
che a me ha restituito questo:
- {L_CODE}: {L_SELECT_ALL_CODE}
Warning: ignoring extra data in partition table 5
Disk /dev/block/mmcblk0: 3883 MB, 3883008000 bytes
1 heads, 16 sectors/track, 474000 cylinders, total 7584000 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/block/mmcblk0p1 32 30 2147483647+ 5 Extended
Partition 1 does not end on cylinder boundary
/dev/block/mmcblk0p2 44096 54335 5120 83 Linux
Partition 2 does not end on cylinder boundary
/dev/block/mmcblk0p3 67392 884543 408576 83 Linux
Partition 3 does not end on cylinder boundary
/dev/block/mmcblk0p4 886592 1703743 408576 83 Linux
Partition 4 does not end on cylinder boundary
/dev/block/mmcblk0p5 1705792 3413823 854016 83 Linux
... che a parte gli avvisi inutili da quasi le stesse info del comando precedente,
ma in decimale!
Ma manca la "p6" che viene considerata errata ... e in effetti lo è, ma di proposito
(e tra poco lo vedremo)
Prendiamo adesso in considerazione i file MBR e EBR1 che abbiamo nel pacchetto del
firmware originale.
I file MBR e EBR1 sono standard MasterBootRecord (MBR appunto), che è lo stesso
usato dal DOS e dai sistemi operativi in genere (esiste anche il GPT, ma è un'altra storia,
e qui non serve).
I primi 446 byte sarebbero destinati ad un programma di avvio (che qui non c'è quindi
e' tutto a 00) e gli altri 128 byte sono destnati alla descrizione di quattro partizioni
principali.
L'unità di misura nelle tabelle descrittive MBR è il settore, che in genere è di 512 byte
(anche nel nostro caso).
Vediamo cosa contengono
- {L_CODE}: {L_SELECT_ALL_CODE}
#MBR
00000000 .. ..
00000010 .. ..
.. .. ..
000001B0 .. ..
000001c0 00 00 05 00 00 00 20 00 00 00 ff ff ff ff 00 00
000001d0 00 00 83 00 00 00 40 ac 00 00 00 28 00 00 00 00
000001e0 00 00 83 00 00 00 40 07 01 00 00 78 0c 00 00 00
000001f0 00 00 83 00 00 00 40 87 0d 00 00 78 0c 00 55 aa
- {L_CODE}: {L_SELECT_ALL_CODE}
#EBR1
00000000 .. ..
00000010 .. ..
.. .. ..
000001B0 .. ..
000001c0 00 00 83 00 00 00 20 07 1a 00 00 10 1a 00 00 00
000001d0 00 00 83 00 00 00 20 1f 34 00 df e0 cb ff 00 00
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
Ora vediamo cosa significano questi numeri (che sono in esadecimale, ma
lo avevate già notato, vero? :D).
La notazione è little-endian (cioè per indicare 0x12345678 si scrive "78 56 34 12")
- {L_CODE}: {L_SELECT_ALL_CODE}
#MBR 1c0-1cf
__ __ 05 __ __ __ 20 00 00 00 ff ff ff ff __ __
ovvero, tipo 05 da 0x20 , lunghezza -1
Il tipo 05 è la PartizioneEstesa, ovvero la EBR, che in pratica è un secondo blocco MBR in cui definire altre 4 partizioni (la lunghezza qui è fissa, per questo è -1)
è la nostra "ebr1"
- {L_CODE}: {L_SELECT_ALL_CODE}
#MBR 1d0-1df
__ __ 83 __ __ __ 40 ac 00 00 00 28 00 00 __ __
ovvero, tipo 83 da 0xac40 , lunghezza 0x2800 (0x2800=10240settori *512=5242880 byte /1024/1024=5MB)
Il tipo 83 è una partzione di tipo linux (diciamo EXT4 per semplicita')
è la nostra "sec_ro"
- {L_CODE}: {L_SELECT_ALL_CODE}
#MBR 1e0-1ef
__ __ 83 __ __ __ 40 07 01 00 00 78 0c 00 __ __
ovvero, tipo 83 da 0x10740 , lunghezza 0xc7800 (=817152 *512=418381824 =399MB)
è la nostra "android"
- {L_CODE}: {L_SELECT_ALL_CODE}
#MBR 1f0-1ff
__ __ 83 __ __ __ 40 87 0d 00 00 78 0c 00 __ __
ovvero, tipo 83 da 0xd8740 , lunghezza 0xc7800 (=399MB)
è la nostra "cache"
continuamo quindi con EBR1 per le altre partizioni
ma consideriamo che EBR1 parte dal settore 0x20, e gli offset descritti qui dentro
sono relativi alla sua posizione (cioè bisogna sommare 0x20!)
- {L_CODE}: {L_SELECT_ALL_CODE}
#EBR1 1c0-1cf
__ __ 83 __ __ __ 20 07 1a 00 00 10 1a 00 __ __
ovvero, tipo 83 da 0x1a0720+0x20=0x1a0740 , lunghezza 0x1a1000 (=1708032 *512 =834MB)
è la nostra "usrdata"
- {L_CODE}: {L_SELECT_ALL_CODE}
#EBR1 1d0-1df
__ __ 83 __ __ __ 20 1f 34 00 df e0 cb ff __ __
ovvero, tipo 83 da 0x341f20+0x20=0x341f40 , lunghezza 0xffcbe0df (in realtà sarebbe 0x3f99c0=2035MB)
è la nostra "fat"
la lunghezza è formalmente errata, ma ha un suo perchè
0x341f20 + 0xffcbe0df = 0xffffffff
in pratica vuol dire fino alla fine ...
probabilmente in questo modo si gestiscono automaticamente le flash di varie dimensioni 4GB 8GB 16GB.
le altre 2 partizioni sono a 00, ovvero non assegnate
{in effetti sarebbe utile mappare la partizione "misc", che è comunque allocata e risparmieremmo
altro spazio, e la definizione in MBR sarebbe di questo tipo
- {L_CODE}: {L_SELECT_ALL_CODE}
__ __ 83 __ __ __ 40 dc 00 00 00 28 00 00 __ __
e bisognerebbe spostare la partizione "android" in EBR1 , e fare alcune piccole modifiche al boot.img
ma anche questa è un'altra storia! :D }
La corrispondenza con la tabella delle partizioni letta dal V1277 è abbastanza evidente.
Vediamo ora il file "scatter.txt", che serve soltanto al SP-FlashTool e
contiene soltanto degli offset iniziali
Rispetto al file scatter bisogna partire dall'offset di MBR, quindi nel nostro
caso dobbiamo sommare un 0x600000.
Inoltre l'unità base non è il settore ma il byte, quindi bisogna moltiplicare
per 512 , ovvero per 0x200 ...
- {L_CODE}: {L_SELECT_ALL_CODE}
ebr1 0x20 => 0x4000+0x600000 = 0x604000
sec_ro 0xac40 => 0x1588000+0x600000 = 0x1b88000
android 0x10740 => 0x20e8000+0x600000 = 0x26e8000
cache 0xd8740 => 0x1b0e8000+0x600000 = 0x1b6e8000
usrdata 0x1a0740 => 0x340e8000+0x600000 = 0x346e8000
fat 0x341f40 => 0x683e8000+0x600000 = 0x689e8000
Adesso anche la corrispondenza con lo scatter.txt è abbastanza evidente.
Ora che conosciamo tutto (si fa per dire) quello che riguarda le partizioni della
nostra EMMC, siamo anche in grado di modificarle.
Le prime partizioni per ora le lasciamo in pace (ma se proprio volessimo ...)
Supponiamo adesso di voler allargare la partizione "usrdata" a 2754MB (e di
conseguenza stringere la partizione "fat" a 115MB).
{Potremmo anche azzerare la partizione "fat" ma personalmente la uso per
conservarci le installazione delle apk e altra roba, e so che non viene
toccata da un evantuale azzeramento di usrdata , o ripristino da recovery}
Facciamo il calcolo inverso ...
2754MB = 2754*1024*1024 = 2887778304 byte /512 = 5640192settori = 0x561000
quindi
- {L_CODE}: {L_SELECT_ALL_CODE}
#EBR1 1c0-1cf
__ __ 83 __ __ __ 20 07 1a 00 00 10 56 00 __ __
^^^^^^^^^^^
in pratica stiamo portato la dimensione di "usrdata" da 0x1a1000 a 0x561000,
cioè abbiamo l'abbiamo aumentata di 0x561000-0x1a1000=0x3c0000 settori,
e abbiamo lasciata invariata la posizione iniziale.
Per pareggiare i conti non ci resta che spostare avanti l'inizio di "fat"
dello stesso numero di settori (quindi 0x341f20+0x3c0000=0x701f20) e diminuirne
di conseguenza la dimensione (quindi 0xffcbe0df-0x3c0000=0xff8fe0DF)
quindi
- {L_CODE}: {L_SELECT_ALL_CODE}
#EBR1 1d0-1df
__ __ 83 __ __ __ 20 1f 70 00 df e0 8f ff __ __
^^^^^^^^^^^ ^^^^^^^^^^^
Quindi il nostro EBR1 dovrà essere modificato così ...
- {L_CODE}: {L_SELECT_ALL_CODE}
#EBR1
000001c0 00 00 83 00 00 00 20 07 1a 00 00 10 56 00 00 00
000001d0 00 00 83 00 00 00 20 1f 70 00 df e0 8f ff 00 00
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
Ma per poter flashare abbiamo bisogno anche di uno "scatter.txt" equivalente.
Fino a "usrdata" non abbiamo spostato niente ... quindi calcoliamo da li in poi
- {L_CODE}: {L_SELECT_ALL_CODE}
usrdata 0x1a0740 => 0x340e8000+0x600000 = 0x346e8000
fat 0x701f40 => 0xe03e8000+0x600000 = 0xe09e8000
l'offset di "usrdata", visto che non l'abbiamo spostata, ma soltanto allargata è
rimasto invariato, invece è cambiato in avanti l'offset di "fat", quindi dovremo
modificare soltanto il rigo riguardante "fat" con
- {L_CODE}: {L_SELECT_ALL_CODE}
FAT 0xe09e8000 {}
Il nuovo "scatter.txt" completo è quindi diventato questo
- {L_CODE}: {L_SELECT_ALL_CODE}
PRELOADER 0x0 {}
DSP_BL 0x40000 {}
MBR 0x600000 {}
EBR1 0x604000 {}
__NODL_PMT 0x608000 {}
__NODL_NVRAM 0xa08000 {}
__NODL_SECCFG 0xf08000 {}
UBOOT 0xf28000 {}
BOOTIMG 0xf88000 {}
RECOVERY 0x1588000 {}
SEC_RO 0x1b88000 {}
__NODL_MISC 0x2188000 {}
LOGO 0x21e8000 {}
__NODL_EXPDB 0x24e8000 {}
ANDROID 0x26e8000 {}
CACHE 0x1b6e8000 {}
USRDATA 0x346e8000 {}
FAT 0x689e8000 {}
__NODL_BMTPOOL 0xFFFF00a8 {}
... spero di essere stato abbastanza chiaro per tutti ...
ma vi assicuro che è stato più facile a farlo che descriverlo!!! :D