|
||
|
![]() |
![]() |
ROMs y desarrollo BQ Pascal 2 ROMs y desarrollo BQ Pascal 2 |
![]() |
|
Herramientas |
#1
|
||||
|
||||
![]()
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:
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: Código:
cat /proc/mtd 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" "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: Código:
cat /proc/mtd Código:
mtd4: 1e000000 00004000 "backup" Código:
dd if=/dev/block/mtdblock4 of=/mnt/sdcard/backup.dump count= 503316480 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 Código:
00000004 00 20 b5 13 |. ..| 00000008 Código:
dd if=backup.dump of=update.img bs=330637316 count=1 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 Código:
mkdir unpacked afptool -unpack update-rkaf.img unpacked 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! 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 Última edición por Naproxeno Día 02/05/12 a las 01:00:11. |
Los siguientes 18 usuarios han agradecido a Naproxeno su comentario: | ||
|
#2
|
||||
|
||||
Sea cual sea la alternativa que hayamos elegido, ya tenemos un fichero boot.img listo para meterle mano. Pero, ¿no había una forma más sencilla de llegar a él?
La respuesta es sí, y además implica que nuestra tableta es prácticamente inmune al brickeo. Presentamos... El modo "flasheo" Nombre completamente no oficial. ![]() Como sugiere BQ en sus instrucciones para hacer un hard reset, existe un modo especial, controlado por hardware, en el que la tableta responde a 3 órdenes simples: leer un bloque de la memoria interna, escribir un bloque de la memoria interna y reiniciar. Como hemos dicho, este modo está controlado por hardware, de forma que, aunque cometido los abusos más pérfidos con su memoria interna, siempre que tengamos una imagen de restauración a mano, podremos volver a dejarla como salida de fábrica (para los usuarios de smartphones de Samsung: esto es muy parecido al modo "download" y Odin). Para activar este modo, hay que conectar el cable USB al ordenador, con la tableta apagada, mientras pulsamos la tecla de bajar volumen. Si todo va bien... no veremos nada, ya que la pantalla permanecerá apagada. Pero, si ejecutamos: Código:
lsusb Código:
Bus 002 Device 004: ID 2207:290a Código:
img-manager.py dump boot Desempaquetar boot.img Ya tenemos el fichero boot.img, ahora vamos a ver qué contiene. Como se mencionó anteriormente, la partición boot, en su formato moderno, contiene tanto el kernel como el ramdisk, así que primero tendremos que separarlos. Para ello, ejecutamos: Código:
split_bootimg.pl boot.img Modificar el ramdisk El ramdisk no es más que un fichero comprimido de cierta forma. Podemos descomprimirlo ejecutando: Código:
mkdir ramdisk cd ramdisk gunzip -c ../boot.img-ramdisk.gz | sudo cpio -i Para crear nuestro propio logo, tenemos dos opciones: basarnos en el logo original o hacer el nuestro desde cero. Para esta última opción, tan solo necesitaremos crear un fichero PNG de 800x480 píxeles. Una vez tengamos un logo preparado (initlogo.png), tendremos que convertirlo a un formato adecuado. Para ello, usaremos las herramientas convert, de ImageMagick, y to565, de esta forma: Código:
convert -depth 8 initlogo.png rgb:initlogo.raw to565 -rle < initlogo.raw > initlogo.rle Ya estamos listos para generar un nuevo ramdisk. Para ello, ejecutamos, en el directorio "ramdisk": Código:
find . ! -name "." | sort | cpio -oa -H newc | gzip -n > ../newinitrd.gz Empaquetar y grabar boot y kernel Como se comentó anteriormente, no se conocen todos los detalles de como generar una partición boot con el nuevo formato que sea admitida por nuestra tableta. Por fortuna, sí que podemos grabar el ramdisk y el kernel por separado, siguiendo el formato antiguo. Para ello, usaremos la imagen del kernel que obtuvimos anteriormente (boot.img-kernel) y nuestro nuevo ramdisk. En primer lugar, tenemos que añadir un CRC a ambas imágenes. Para ello, ejecutamos: Código:
rkcrc -k boot.img-kernel kernel.img rkcrc -k newinitrd.gz boot-new.img ![]() Dicho esto, vamos al lío. Simplemente hay que ejecutar: no Código:
img-manager.py write kernel kernel.img img-manager.py write boot boot-new.img Código:
rkflashtool b ![]() Como se ve en el vídeo, en el proceso de arranque hay 3 pasos y este sustituye el logo del paso 2. El logo del paso 1 no se sabe muy bien si está en el cargador de arranque (bootloader) o en el kernel, así que habrá que investigar. El logo del paso 3 es estándar de Android y admite animaciones. Seguro que encontráis mucha información por ahí acerca de como personalizarlo. Espero que os haya gustado este tutorial y que hayáis aprendido algo acerca de como se puede modificar la Pascal 2. Como he dicho, siempre que tengáis a mano una imagen de restauración no hay nada que temer, así que espero que le hayáis perdido un poco el miedo al cacharreo. Estoy deseando ver qué se os ocurre hacer con todo esto. ¡Suerte! ![]() Última edición por Naproxeno Día 02/05/12 a las 20:23:14. Razón: Tutorial Extraer imagen de restauración y modificar logo de arranque (parte 2) |
Los siguientes 10 usuarios han agradecido a Naproxeno su comentario: | ||
#4
|
||||
|
||||
la leche naproxeno, excelente hilo, me gusta mucho tu manera de explicar las cosas, las entiendo y todo.
![]() mil gracias Naproxeno. |
Gracias de parte de: | ||
#8
|
||||
|
||||
Yo he conseguido unas herramientas sirven tanto para desempaquetar como para empaquetar basadas en AFPTool para RK29xx (Lo he probado con el update.img de BQ Pascal 2 y me lo ha desempaquetado). Las herramientas las he conseguido a través de Wendal:
wendal-teclast_tools-374c2a8.zip https://docs.google.com/file/d/0B8hU...TQ1/edit?pli=1 la fuente desde donde creo que lo encontré: http://www.slatedroid.com/topic/1980...magetools-v21 Dentro del script "rk29xx_rom_tools.lua" (hecho en lua) hay una función que se llama packROM: function packROM() local SYSTEM_DIR = io.open('system/build.prop','r') if SYSTEM_DIR then SYSTEM_DIR:close() --os.execute('chmod -R 777 system/*') print('Packing system folder to system.img,overwrite to Temp\\Image\\system.img') os.execute('mkcramfs -q system Temp/Image/system.img') <---------------------------------Ojo, nosotros tenemos Ext3/4 end print('Packing files in Temp folder to update_new.img') os.execute('Afptool -pack ./Temp update_new.img') print('Get loader\'s and update_new.img\'s file len') local L_P = 0x66 -- Loader's offset local loader_file = io.open('RK29xxLoader(L).bin','rb+') local L_L = loader_file:seek('end') loader_file:seek('set',0) -- back to start of file U_P = L_P + L_L -- update.img's offset, following loader local update_file = io.open('update_new.img','rb+') local U_L = update_file:seek('end') update_file:seek('set',0) -- back to start of file local T_File = io.open('wendal.img', 'rb+') -- open pre-packed image local DestF = io.open('wendal_new.img', 'wb+') --open target file local data = T_File:read(25) DestF:write(data) writeHex(DestF,L_P) writeHex(DestF,L_L) writeHex(DestF,U_P) writeHex(DestF,U_L) T_File:read(16) -- sjip 16 bytes , data is Unkown!! data = T_File:read(102 - 25 - 16) DestF:write(data) DestF:flush() T_File:close() print('Start writing loader') while L_L > 0 do if L_L > BUFF then data = loader_file:read(BUFF) L_L = L_L - BUFF else data = loader_file:read(L_L) L_L = 0 end DestF:write(data) end print('Start writing update.img') while U_L > 0 do if U_L > BUFF then data = update_file:read(BUFF) U_L = U_L - BUFF else data = update_file:read(U_L) U_L = 0 end DestF:write(data) end DestF:flush() DestF:close() print('calculate MD5') os.execute('md5sums.exe -u wendal_new.img > md5.txt') local M_File = io.open('md5.txt','r') local md5 = M_File:read(32) M_File:close() print('MD5='..md5) print('Write MD5 into wendal_new.img') DestF = io.open('wendal_new.img', 'ab+') --open target file DestF:seek('end') DestF:write(md5) DestF:flush() DestF:close() print('Pack completa!! Target file --> wendal_new.img') end Última edición por jjb_wii Día 04/05/12 a las 20:47:41. |
Los siguientes 6 usuarios han agradecido a jjb_wii su comentario: | ||
#9
|
||||
|
||||
#10
|
||||
|
||||
Madre mía que trabajazo, ya tengo entretenimiento para el verano jeje No pongáis cosas tan interesantes cuando estoy de exámenes que al final me lío y no estudio
![]() Ahora la pregunta: ¿partiendo entonces de la rom oficial se puede modificar el particionamiento de la memoria interna y así resolver los problemas de la SdCard y demás en el modelo de 4GB? |
#11
|
||||
|
||||
en RK29xxLoader(L)
Lo cual es el BootLoader, no se encuentra la imagen de cargado primera. Asi que debe estar en otro sitio que tampoco es la kernel ya que en el C.F. de la misma no figura nada al respecto... Estoy confundido jajajaja... Saludos y muchisimas gracias por este fantastico tuto!... |
#12
|
||||
|
||||
Muchas gracias por el tremendo curro que te has pegado, pero leyendo y releyendo, me surge una duda.
Comprendo todos los pasos hasta llegar a la creación del archivo "backup.dump" Entiendo que ese archivo es nuestra "tabla de salvación". Pero yo he llegado a tu tutorial buscando una forma de conseguir precisamente eso, crear una copia de seguridad del sistema para poder revivir tablets que hayan muerto (como la mía), y yo, lo que quiero, es un archivo *.img que poder meter en el apartado "backup" del rk29update... Si en vez de nombrarlo como backup.dump, le damos un nombre que sea backup.img, serviría? Es que los pasos a partir de ahí entiendo que los haces en un terminal de linux, y en el ordenador que tengo liniux no tarmina de ir del todo bien...y yo tampoco tengo demasiada idea, para que nos vamos a engañar.. Concretamente esto es lo que no entiendo muy bien: ![]() 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. ![]() ![]() Si vemos esto, la tableta ya está preparada para recibir órdenes. Para dárselas, usaremos las herramientas de João Pinto, basadas en rkflashtool. Con ellas, extraer la partición boot es tan sencillo como ejecutar:
Código:
img-manager.py dump boot ![]() Siento el tocho, pero es que si me sacan de mi querido galaxy s, me pierdo muchísimo! |
#13
|
||||
|
||||
bueno, pues la primera parte ya la he conseguido, mi problema ahora viene porque no consigo extraer el "update.img"
Yo sigo tus instrucciones, pero el terminal de linux me dice que no hay ningún comando que se llame así.... te adjunto una imagen de la pantalla (yo copio en la misma carpeta update.img y las herramientas de lamegopinto, desde el terminal entro en esa carpeta y escribo los comandos que tu dices...pero no pasa nada...) ![]() también he probado a intentar ejecutar el comando llamando a afptool con su dirección completa, y me da un error en la línea 18 (ni idea de que es eso..) y los scripts no los puedo copiar al directorio /bin o /usr/bin....y se me han acabado las ideas por hoy, jejeje ![]() Muchas gracias de antemano por las respuestas!! Seguro que es un fallo absurdo por lo que no puedo utilizar las herramientas de lamegopinto, pero como no tengo muchos conocimientros de linux...he intentado descargarlas como un .tar.gz, pero eso no es un instalable tampoco, por lo que desconozco el proceder... Un saludo Última edición por valve Día 08/07/12 a las 18:00:18. |
#14
|
||||
|
||||
Hi. When i write this commands:
i have the error "img_unpack: command not found" and "afptool: command not found". What's the problem? Thanks |
#15
|
||||
|
||||
|
Gracias de parte de: | ||
#16
|
||||
|
||||
Now work.
Thanks ;) |
#17
|
||||
|
||||
hola,
como podemos volver a rehacer la ROM? yo hecho lo comando: afptool -pack ROM/ system.img pero quando hoy a flashear con el RKBatchTool aparece una mensaje "load firmware failed". esto significa que la ROM no fue bien enpacotada. muchas gracias por qualquier ayuda. un saludo |
#18
|
||||
|
||||
naproxeno donde andas?
hace tiempo que no os veo por aqui a navajita ni a ti. supongo que tendreis un supertablet, jeje, la pascal2 se os quedo pequeña un saludo |
#19
|
||||
|
||||
Hola llevo dos días atrancado en este punto:
Código:
img_unpack update.img update-rkaf.img He probado con un ROM original del fabricante y funciona correctamente, por lo que sospecho que la imagen que yo genero recortada no es correcta ¿Que se me escapa? Hay que generar el CRC MD5 a mano? Sigo al pie de la letra el este tutorial y ya estoy desesperado no doy con la solución Saludos y gracias |
|
#20
|
||||
|
||||
![]()
Buenos Dias esta buy interesante tu tema muchas gracias
¿Sabes si es posible llegar a editar los drivers o parametros incluidos en el kernel de la pantalla o touch etc. de rockchip? |
![]() |
![]() |
||||||
|