Hola a todos.
Como ya sabréis, ya están pululando por estos foros tanto
imágenes de restauración, como el
código fuente del kernel de nuestra Pascal 2. Si queremos poder "cocinar" para la tableta, una de las primeras cosas que necesitaremos es saber cómo manipular las distintas particiones de la memoria interna, que es básicamente lo que contiene la imagen de restauración. Como primera prueba, en este tutorial vamos a hacer algo muy chorra, como es cambiar el logo de arranque por uno propio pero nos servirá para comprobar que funciona todo el proceso.
Con un poco de suerte, al final del tutorial conseguiremos algo parecido a esto:
Eso sí, tened en cuenta que, aunque me gusta el "cacharreo", soy bastante novato con estos temas, así que es posible que diga alguna barbaridad o que haya cosas que se puedan hacer de forma más simple. Cualquier crítica, comentario o sugerencia será bienvenida.
El tutorial está pensado para trabajar con Linux, aunque es posible que se pueda hacer casi todo también en Windows.
¿Preparados? ¡Vamos allá!
Sobre Pascal 2
Pascal 2 es una tableta basada en el chipset
RK2918 del fabricante chino
Fuzhou Rockchip Electronics Co., Ltd., o Rockchip, para los amigos.
Al parecer, Rockchip proporciona a los fabricantes un SDK para construir las ROMs de sus cacharros y seguramente BQ haya usado también estas herramientas.
Lo bueno de esto es que hay un montón más de tablets basadas en este mismo chipset o versiones anteriores, así que en Internet se puede encontrar utilidades y conocimiento acumulado para el cacharreo con este tipo de dispositivos.
Ingredientes
Imágenes de restauración
Como os decía antes, Rockchip tiene un SDK para preparar la ROM. Al parecer, al menos existe una versión antigua y una
versión 2.0 del SDK, y Pascal 2 utiliza esta última. La mala noticia es que hay menos información acerca del formato de los ficheros de la versión 2.0. La buena noticia es que, en general, la tablet admite ficheros en el formato antiguo y más conocido.
Lo primero que necesitaremos es una imagen de restauración y para ello tenemos dos posibilidades:
- Usar la imagen de restauración de BQ
- Extraer la imagen de restauración de la propia tableta
La primera opción es directa. Tan solo hay que descargar la imagen desde
Mediafire.
Esta imagen sigue el formato "moderno", conocido como RKFW (son los primeros cuatro bytes del fichero) y es el que admite la "Rockchip Batch Tool v1.3", según se explica en
el blog de BQ.
Para la segunda opción, en la que obtendremos una imagen en formato "antiguo", o RKAF, primero tenemos que hablar de...
Particiones
La memoria interna de la Pascal 2 está dividida en particiones, cada una dedicada a una función. Se puede conocer la distribución de estas particiones ejecutando como root, en adb o un terminal en la tableta, lo siguiente:
En mi tableta, y supongo que en las vuestras también, la distribución es la siguiente:
Código:
dev: size erasesize name
mtd0: 00400000 00004000 "misc"
mtd1: 00800000 00004000 "kernel"
mtd2: 01000000 00004000 "boot"
mtd3: 01000000 00004000 "recovery"
mtd4: 1e000000 00004000 "backup"
mtd5: 07400000 00004000 "cache"
mtd6: 40000000 00004000 "userdata"
mtd7: 00400000 00004000 "kpanic"
mtd8: 1cc00000 00004000 "system"
mtd9: 69400000 00004000 "user"
La utilidad de la partición "misc"
no está del todo clara.
"kernel" contiene (¿debe?) lo que estáis pensando: el kernel (fichero zImage).
"boot" puede contener, o bien el kernel y el ramdisk (initrd.gz),
casi siguiendo el formato estándar de Android, o bien solo el ramdisk sin el kernel. La primera alternativa es la que se usa con el SDK 2.0 de Rockchip pero,
al parecer, hay un valor hash en el offset 0x240 que nadie sabe aún calcular. Resultado: se puede extraer el kernel y el ramdisk de una partición boot en este formato pero no se pueden volver a empaquetar para que los admita la tablet. En mis pruebas, en cuanto se trata de arrancar con una partición boot no reconocida, la tablet restaura automáticamente una copia "limpia". De nuevo, hay buenas noticias: la tablet
sigue admitiendo un kernel y un ramdisk en particiones independientes, siguiendo el formato antiguo, que sí es conocido. Este será el que usaremos.
"backup" es la partición más interesante para nosotros. Contiene una imagen de restauración completa. Cuando se selecciona la opción "recovery system from backup" desde
el modo recovery, lo que seguramente se haga sea machacar el resto de particiones de la tableta con la copia contenida en esta. Curiosamente, en mi tablet, la partición "backup" está en formato RKAF, que es el que se usaba antiguamente.
"system" contiene el sistema propiamente dicho, es decir, la mayoría de cosas que están en la raíz del sistema de ficheros.
"user" es el espacio de almacenamiento que queda libre para el usuario, es decir, lo que hay en /mnt/sdcard.
Extrayendo la imagen de restauración (backup)
Como hemos dicho, backup es, a todos los efectos, una imagen de restauración completa, así que podemos utilizarla en vez de la que proporciona BQ. Para
extraerla, primero necesitamos conocer su tamaño, así que, desde adb y como root, ejecutamos:
y nos fijamos en la línea:
Código:
mtd4: 1e000000 00004000 "backup"
La primera columna nos dice que la partición "backup" está en /dev/block/mtdblock4, mientras que la segunda nos da su tamaño en bloques de 512 bytes. Ojo, el valor es hexadecimal, así que, al convertirlo a decimal, backup ocupa 0x1e000000 = 503316480 bloques de 512 bytes. Con esto, ya tenemos los datos que necesitamos para ejecutar:
Código:
dd if=/dev/block/mtdblock4 of=/mnt/sdcard/backup.dump count= 503316480
Que lo que hace es copiar (dd) 503316480 bloques (count= 503316480) del contenido de la partición mtd4 (if=/dev/block/mtdblock4) en el fichero backup.dump de la memoria internal (of=/mnt/sdcard/backup.dump).
Con esto conseguiremos una copia idéntica de la partición pero, como suele ocurrir en cualquier disco, la partición no tiene por qué estar llena, así que seguramente hayamos copiado "basura" al final del fichero. Vamos a corregirlo recortándolo hasta que tenga el tamaño exacto de la imagen de restauración.
En el formato usado por Rockchip, el tamaño del fichero se almacena en los bytes 4 a 7 (empezando la cuenta desde 0, los informáticos somos así...). Necesitamos el valor exacto de esos bytes, así que no nos servirá un editor de texto. Podemos usar un editor hexadecimal o directamente esta orden:
Código:
hexdump -n 4 -s 4 -C backup.dump
Cuyo resultado será algo así:
Código:
00000004 00 20 b5 13 |. ..|
00000008
Lo que íbamos buscando es "00 20 b5 13" pero hay algo que debemos tener en cuenta: ese valor es
little-endian. Para obtener el valor hexadecimal del tamaño de la imagen, le damos la vuelta a los bytes, con lo que obtenemos "13 b5 20 00", es decir 0x13b52000 = 330637312 en decimal. A este valor, hay que sumar 4 bytes más para un CRC que está al final de la imagen, con lo que finalmente obtenemos 330637316. Ya estamos listos para recortar la imagen mediante:
Código:
dd if=backup.dump of=update.img bs=330637316 count=1
El parámetro "bs" indica el tamaño de bloque, así que, básicamente, lo que hacemos es copiar un solo bloque del fichero con el tamaño que nos interesa. Si todo va bien, en update.img tendremos nuestra flamante imagen de restauración.
Ojo, el recorte de la imagen podemos hacerlo en un ordenador común, no tiene por que hacerse en la propia tableta.
Desempaquetando la imagen de restauración
Sea cual sea la vía que hayamos elegido, ya tenemos en nuestro poder un fichero update.img. Ahora vamos a ver qué contiene. Para ello, emplearemos algunas de las
herramientas de lamegopinto.
Como dijimos antes, el formato de la imagen de restauración de BQ es RKFW pero la mayoría de utilidades están preparadas para usar el formato antiguo. Por tanto, si queremos usar el fichero de BQ primero tendremos que convertirlo al formato antiguo. Para ello, ejecutamos:
Código:
img_unpack update.img update-rkaf.img
Y ahora, sea cual sea la imagen que estemos usando, vamos a desempaquetarla:
Código:
mkdir unpacked
afptool -unpack update-rkaf.img unpacked
Si todo va bien, veremos algo así:
Código:
Check file...OK
------- UNPACK -------
package-file 0x00000800 0x0000021C
RK29xxLoader(L)_V2.14.bin 0x00001000 0x0002512E
parameter 0x00026800 0x00000270
Image/misc.img 0x00027000 0x0000C000
Image/boot.img 0x00033000 0x00784000
Image/recovery.img 0x007B7000 0x0091C000
Image/system.img 0x010D3000 0x12A7DC00
SELF 0x00000000 0x13B52004
Skip SELF file.
update-script 0x13B51000 0x000003A5
recover-script 0x13B51800 0x0000010A
UnPack OK!
Y tendremos, en el directorio "unpacked", el ansiado contenido de la imagen de restauración.
Dentro de "unpacked" hay otro directorio, "Image" que contiene las particiones que se copiarán a la tableta durante el proceso de actualización o restauración.
Si tenéis curiosidad, podéis examinar el contenido de system.img, montando la partición con algo así:
Código:
cd Image
mkdir system
sudo mount -o loop system.img system
cd system
De todos modos, nuestro objetivo en este tutorial era boot.img. Vamos a por él...