Hej!
I min iver att lära mig hur saker hänger ihop i denna roliga telefon så har jag nu fattat lite mer om vad som skiljer PVT32A och PVT32B...i alla fall några av skillnaderna. Denna guide/information riktar sig till "advanced readers"...så var beredd på det.
För att kunna få "root" access i ett "adb shell" så måste en setting i "default.prop" vara satt, nämligen "ro.secure". Denna fil ligger dock på "ram-disken" och är "read-only"...dvs man kan inte ändra på den helt lätt.
För att kunna ändra i "default.prop" så måste man packa upp en "boot.img" (detta måste göras i Linux eller MacOS då alla host tools etc bara funkar där...), ändra i filen när den ligger upp-packad i Linux filsystemet...och sedan använda lite verktyg för att packa ihop den igen. (Se denna länk för detaljer.)
Dock så finns det ett litet problem. Det verktyg man kör "mkbootimg" (finns här i GIT-repot för Android) används för att packa ihop en kompilerad kernel samt en ram-disk (där default.prop ligger).
Verktyget "mkbootimg" kommer att bygga en fil (dvs boot.img) enligt detta (lånat från sidan som refas ovan):
Kod:
+-----------------+
| boot header | 1 page
+-----------------+
| kernel | n pages
+-----------------+
| ramdisk | m pages
+-----------------+
| second stage | o pages
+-----------------+
n = (kernel_size + page_size - 1) / page_size
m = (ramdisk_size + page_size - 1) / page_size
o = (second_size + page_size - 1) / page_size
0. all entities are page_size aligned in flash
1. kernel and ramdisk are required (size != 0)
2. second is optional (second_size == 0 -> no second)
Det som är trixigt är att i "headern" så ligger information om vad som finns i filen, dvs var/hur stor ram-disken är, var/hur stor kernel är osv. Det finns också en "physical load address" för varje del. Detta är en adress som används när boot-strap (dvs den allra första booten...) laddar "boot.img" och skall kopiera upp ramdisk och kernel till RAM. Boot-strap kommer då att kopiera dem till RAM (de adresser som står i "boot.img")....och det är alltså en av de saker som skiljer en PVT32A och PVT32B. Man har lite olika konfigurationer (olika radio-hw t.ex.) och då är dessa adresser inte samma för A respektive B. Det är detta som gör att en "boot.img" från en PVT32B tvärhänger i en PVT32A. Om man däremot packar om den funkar den bättre (dock kan det ju vara mer i kernel/drivers som behöver ändras så det kanske tvärhänger ändå...fast någon millisekund senare).
Så....slutsaten (och jag har även provat) är då att om man packar ihop en ny boot.img med "mkbootimg" som finns i GIT (alltså det man får när man kompilerar Android sourcen från scratch) kommer alltså inte att passa för PVT32A! Även om det var en PVT32A boot.img man packade upp.
Det jag gjorde var att ta en "boot.img" från en PVT32A (via Nandroid backup) och titta på "physical load address" i denna (en hex-editor). Sedan tog jag helt enkelt och ändrade dessa i källkoden till "mkbootimg" och kompilerade om denna. Med denna nya version av mkbootimg så funkade det sedan att "packa ihop" denna upp-packade "boot.img" igen...dvs vi kan alltså "root:a" en "boot.img" även om vi inte har någon rootad "boot.img" innan!
Här ser ni (en del av källkoden) som jag ändrat och alltså de nya adresserna som behövs för en PVT32A HTC Magic (alltså INGEN ANNAN TELEFON!).
Kod:
...
strcpy(hdr.name, board);
hdr.kernel_addr = 0x19208000;
hdr.ramdisk_addr = 0x1A200000;
if(saddr) {
hdr.second_addr = 0x00300000;
} else {
hdr.second_addr = 0x1A100000;
}
hdr.tags_addr = 0x19200100;
hdr.page_size = pagesize;
memcpy(hdr.magic, BOOT_MAGIC, BOOT_MAGIC_SIZE);
...
Detta (nedanför) är från GIT-repot...och alltså även det som funkar för en PVT32B. Vet inte varför just denna version ligger i repot då de flesta tillverkare säkert måste meka en sådan mkbootimg själva om de inte bygger precis som en PVT32B.
Kod:
...
strcpy(hdr.name, board);
hdr.kernel_addr = 0x10008000;
hdr.ramdisk_addr = 0x11000000;
if(saddr) {
hdr.second_addr = 0x00300000;
} else {
hdr.second_addr = 0x10F00000;
}
hdr.tags_addr = 0x10000100;
hdr.page_size = pagesize;
...
Allt detta är goda nyheter för "kommande" telefoner. Om vi kan trolla ut en "boot.img" (via tex Nandroid eller liknande) så kan vi kanske packa om denna. Skulle det vara så att det är andra "physical load addresses" i den så kan vi skapa nya versioner av "mkbootimg" med detta koncept. Med lite tur så funkar det t.ex. för Galaxy etc.
För de som vill prova detta så skickar jag även med min kompilerade version av mkbootimg, kallad "mkbootimg-PVT32A" och den är kompilerad i senaste Ubuntu 9.04 32-bit (dvs beroende av de lib etc som finns där).
Mvh
Gruffy