Como modificar a ROM de tablet Allwinner A10 (Wei Wide Pro BC1003)

kocaso

Usei a imagem ROM da Kocaso como base de minha ROM.

O System-on-Chip (SoC) A10, da empresa chinesa Allwinner, é muito barato e poderoso. Por isto, equipa centenas de tablets, set top box, leitores de ebooks. Neste artigo, explico como melhorei meu tablet Wei Wide Pro.

Para manipular a ROM, usei os sistema operacionais Linux e Windows, em função de ferramentas que estão disponíveis apenas para um ou outro sistema.

Primeiro, fiz uma cópia da ROM original, através do ADB, Android Debug Bridge. A seguir, obtive uma ROM de fabricante. Examinando as imagens de splash na partição boot, achei o fabricante Kocaso, dos EUA, o único que colocou à disposição dos usuários as ROM de um produto similar ao Wei Wide Pro. São 3 imagens ROM para o modelo M1050S, aparentemente diferindo apenas na capacidade da bateria.

Extraí os diversos arquivos que compõem a ROM com o programa unimg.exe, pelo Windows. Este programa está no pacote ImageSuite, que vem no Allwinner A10 Flash Kitchen. O unimg.exe gera uma pasta chamada “image.img.dump” com dezenas de arquivos de nomes estranhos. A lista é esta, que está no arquivo filelist.txt, criado no processo:

COMMON  _SYS_CONFIG000000.hdr    COMMON  _SYS_CONFIG000000
COMMON  _SYS_CONFIG100000.hdr    COMMON  _SYS_CONFIG100000
COMMON  _SPLIT_0000000000.hdr    COMMON  _SPLIT_0000000000
RFSFAT16_BOOTLOADER_00000.hdr    RFSFAT16_BOOTLOADER_00000
RFSFAT16_ENVIROMENT_00000.hdr    RFSFAT16_ENVIROMENT_00000
RFSFAT16_BOOT_00000000000.hdr    RFSFAT16_BOOT_00000000000
RFSFAT16_SYSTEM_000000000.hdr    RFSFAT16_SYSTEM_000000000
RFSFAT16_RECOVERY_0000000.hdr    RFSFAT16_RECOVERY_0000000
RFSFAT16_DISKFS_000000000.hdr    RFSFAT16_DISKFS_000000000
RFSFAT16_VBOOTLOADER_0000.hdr    RFSFAT16_VBOOTLOADER_0000
RFSFAT16_VENVIROMENT_0000.hdr    RFSFAT16_VENVIROMENT_0000
RFSFAT16_VBOOT_0000000000.hdr    RFSFAT16_VBOOT_0000000000
RFSFAT16_VSYSTEMFS_000000.hdr    RFSFAT16_VSYSTEMFS_000000
RFSFAT16_VRECOVERYFS_0000.hdr    RFSFAT16_VRECOVERYFS_0000
BOOT    _BOOT0_0000000000.hdr    BOOT    _BOOT0_0000000000
BOOT    _BOOT1_0000000000.hdr    BOOT    _BOOT1_0000000000
PXTOOLS _xxxxxxxxxxxxxxxx.hdr    PXTOOLS _xxxxxxxxxxxxxxxx
UPFLYTLS_xxxxxxxxxxxxxxxx.hdr    UPFLYTLS_xxxxxxxxxxxxxxxx
FES     _FES_1-1000000000.hdr    FES     _FES_1-1000000000
FES     _FES_1-2000000000.hdr    FES     _FES_1-2000000000
FES     _FES_200000000000.hdr    FES     _FES_200000000000
FES     _FES_000000000000.hdr    FES     _FES_000000000000
FET     _HW_SCAN_00000000.hdr    FET     _HW_SCAN_00000000
FET     _UPDATE_BOOT0_000.hdr    FET     _UPDATE_BOOT0_000
FET     _UPDATE_BOOT1_000.hdr    FET     _UPDATE_BOOT1_000
FET     _FET_RESTORE_0000.hdr    FET     _FET_RESTORE_0000
FET     _MAGIC_CRC_START_.hdr    FET     _MAGIC_CRC_START_
FET     _MAGIC_CRC_EN_000.hdr    FET     _MAGIC_CRC_EN_000
FET     _MAGIC_DE_START_0.hdr    FET     _MAGIC_DE_START_0
FET     _MAGIC_DE_END_000.hdr    FET     _MAGIC_DE_END_000
FED     _FED_NAND_0000000.hdr    FED     _FED_NAND_0000000
12345678_1234567890cardtl.hdr    12345678_1234567890cardtl
12345678_1234567890script.hdr    12345678_1234567890script
12345678_1234567890boot_0.hdr    12345678_1234567890boot_0
12345678_1234567890boot_1.hdr    12345678_1234567890boot_1
12345678_1234567890___mbr.hdr    12345678_1234567890___mbr
12345678_1234567890dlinfo.hdr    12345678_1234567890dlinfo
FET     _CARD_UPDATE_BOT0.hdr    FET     _CARD_UPDATE_BOT0
FET     _CARD_UPDATE_BOT1.hdr    FET     _CARD_UPDATE_BOT1
FED     _CARD_FED_0000000.hdr    FED     _CARD_FED_0000000
FET     _CARD_HW_SCAN_000.hdr    FET     _CARD_HW_SCAN_000

Alguns destes arquivos são programas para Windows, usados pelo LiveSuit. Outros são pequenos programas ARM carregados na memória dos dispositivos enquanto eles são flashados. Para cada arquivo extraído, há um arquivo HDR correspondente, de função desconhecida. O que vai nos interessar são os arquivos que começam com “RFSFAT16_”, pois são as cópias (imagens) da memória ROM. Também são interessantes os arquivos “COMMON  _SYS_CONFIG000000” e “COMMON  _SYS_CONFIG100000”, que contém configurações para o bootloader em formato INI do Windows. Estes arquivos têm algum texto em chinês, que traduzi carregando-os no Firefox, mudando  a página de código para chinês e  e usando o plugin Google Translator.

RFSFAT16_BOOTLOADER_00000

Este é o bootloader, ou seja, o carregador do boot. Está em formato de sistema de arquivos VFAT. Portanto, pode ser montado facilmente no Linux. Através dos comandos abaixo, pode-se montar esta imagem com r/w, a fim de se editar os arquivos:

mkdir bootloader
sudo mount -o loop,uid=1000,gid=1000 -t vfat RFSFAT16_BOOTLOADER_00000 ./bootloader

O id de usuário é descoberto com o comando “id”.

Este firmware contém o diretório /linux, onde estão as imagens da tela de splash em formato BMP; o diretório /os_show, com as imagens da bateria carregando; e o diretório /sprite, com um arquivo sprite.ini, cuja função desconheço. Na raiz, estão duas fontes tipográficas do sistema, alguns executáveis e arquivos de configuração Linux e o arquivo script.bin (e uma cópia de segurança script0.bin), que contém as configurações de hardware do dispositivo, configuradas no boot.

Quem não pode ou não quer usar Linux, pode modificar esta partição diretamente no tablet entrando no adb shell e usando os comandos:

# cria um diretório para montar a partição
mkdir /sdcard/nanda
# monta a partição
mount -t vfat /dev/block/nanda /sdcard/nanda
# Entrano diretório com as imagens splash e muda a default
cd /sdcard/nanda/linux
cp linux.bmp linux.old.bmp
cp kocaso.bmp linux.bmp

RFSFAT16_ENVIROMENT_00000

Contém alguns parâmetros do sistema U-Boot Linux, sistema de Linux embarcado usado pelo dispositivo. Nada para mudar, aqui. No  início deste arquivo há:

bootdelay=0
bootcmd=run setargs boot_normal
console=ttyS0,115200
nand_root=/dev/nandc
mmc_root=/dev/mmcblk0p4
init=/init
loglevel=8
setargs=setenv bootargs console=${console} root=${nand_root} init=${init} loglevel=${loglevel}
boot_normal=nand read 40007800 boot;boota 40007800
boot_recovery=nand read 40007800 recovery;boota 40007800
boot_fastboot=fastboot
recovery_key_value_max=0x13
recovery_key_value_min=0x10
fastboot_key_value_max=0x8
fastboot_key_value_min=0x

Mais para o meio do arquivo, tem o que parece ser um executável Linux em formato ELF e estes parâmetros:

bootdelay=0
bootcmd=run setargs boot_normal
console=ttyS0,115200
nand_root=/dev/nandd
mmc_root=/dev/mmcblk0p7
init=/init
loglevel=8
setargs=setenv bootargs console=${console} root=${mmc_root} init=${init} loglevel=${loglevel}
boot_normal=mmc read 40007800 22000 10000;boota 40007800
boot_recovery=mmc read 40007800 recovery;boota 40007800
boot_fastboot=fastboot

RFSFAT16_BOOT_00000000000

Boot do sistema Linux. Pode-se mudar a segunda tela splash, que normalmente tem o androidezinho de braços cruzados, chupado de um site Android.

RFSFAT16_SYSTEM_000000000

Sistema Android, aplicativos. Está no formato ext4 sparse, que deve ser convertido para ext4 antes de ser montada. Pode-se adicionar, atualizar ou eliminar aplicativos Android. A forma mais fácil de fazer isto é instalar os aplicativos no Android e passá-los para o diretório /system através de utilitários como o Link2SD, e depois fazer uma imagem ROM da partição /system.

RFSFAT16_RECOVERY_0000000

Partição com um sistema Linux mínimo, para recuperação. Eu troquei esta imagem,que tem um bug grave, pelo ClockWorkMode Recovery, muito melhor que o original.

RFSFAT16_DISKFS_000000000

Armazenamento interno. Não é uma imagem, na verdade. É só um placeholder, com 8 bytes, do disco interno /sdcard, que é criado no primeiro boot do sistema. Seu tamanho parece ser tudo o que sobrar, depois da criação das outras partições.

COMMON  _SYS_CONFIG000000

Este arquivo texto define os parâmetros do particionamento da memória NAND (ROM interna), para uso do programa de gravação de ROM da Allwinner, o LiveSuit. Particularmente importantes são estas seções:

[part_num]
num     = 8

;------------------------------>nanda, known as bootfs before, includes boot.axf u-boot.bin etc...
[partition0]
    class_name  = DISK
    name        = bootloader
    size_hi     = 0
;    size_lo     = 16384
    size_lo     = 65536
    user_type   = 0
    ro          = 0

;------------------------------>nandb, enviroment for u-boot
[partition1]
    class_name  = DISK
    name        = env
    size_hi     = 0
    size_lo     = 16384
    user_type   = 0
    ro          = 0

;------------------------------>nandc, kernel and ramdisk
[partition2]
    class_name  = DISK
    name        = boot
    size_hi     = 0
    size_lo     = 32768
    user_type   = 0
    ro          = 0

;------------------------------>nandd, android real rootfs
[partition3]
    class_name  = DISK
    name        = system
    size_hi     = 0
    size_lo     = 524288
;    size_lo     = 327680
    user_type   = 0
    ro          = 0

;------------------------------>nande, user data
[partition4]
    class_name  = DISK
    name        = data
    size_hi     = 0
    size_lo     = 1048576
;    size_lo     = 384000
    user_type   = 1
    ro          = 0

;------------------------------>nandf, misc
[partition5]
    class_name  = DISK
    name        = misc
    size_hi     = 0
    size_lo     = 16384
    user_type   = 0
    ro          = 0

;------------------------------>nandg, for recovery
[partition6]
    class_name  = DISK
    name        = recovery
    size_hi     = 0
    size_lo     = 32768
    user_type   = 0
    ro          = 0

;------------------------------>nandh, android app cache
[partition7]
    class_name  = DISK
    name        = cache
    size_hi     = 0
    size_lo     = 327680
    user_type   = 0
    ro          = 0

Neste arquivo, pode-se fazer a a mais importante modificação no BC1003: aumentar a memória da partição /data. Nesta partição, o Android guarda informações de todos os programas. Em geral, é a primeira a ficar lotada, impedindo que novos programas sejam instalados, mesmo que haja espaço em disco. No exemplo acima, a partição /data é 3 vezes maior que o padrão. O espaço extra foi retirado da partição /sdcard. Com esta modificação, pode-se instalar mais aplicativos sem problemas de falta de espaço interno.

COMMON  _SYS_CONFIG100000

Arquivo texto que vai formar o binário script.bin, colocado na partição bootloader. O LiveSuit gera o binário automaticamente ou pode-se  compilar este binário com o programa fexc, executável Linux do pacote Allwinner Kitchen Master. Pode-se mudar algumas atribuições de pinos i/o, por exemplo, para direcionar a UART para o cartão microSD. Coisas para hackers avançados. O usuário comum não precisa nem deve mexer nisto.

Reconstruindo

Depois de modificar os arquivos desejados, reconstruí a imagem de instalação do A10 com os comandos Windows:

del /s image.img.dump\RFSFAT16_VBOOTLOADER_0000
del /s image.img.dump\RFSFAT16_VBOOT_0000000000
del /s image.img.dump\RFSFAT16_VSYSTEMFS_000000
del /s image.img.dump\RFSFAT16_VRECOVERYFS_0000
FileAddSum.exe "image.img.dump/RFSFAT16_BOOTLOADER_00000" "image.img.dump\RFSFAT16_VBOOTLOADER_0000"
FileAddSum.exe "image.img.dump/RFSFAT16_BOOT_00000000000" "image.img.dump\RFSFAT16_VBOOT_0000000000"
FileAddSum.exe "image.img.dump/RFSFAT16_SYSTEM_000000000" "image.img.dump\RFSFAT16_VSYSTEMFS_000000"
FileAddSum.exe "image.img.dump/RFSFAT16_RECOVERY_0000000" "image.img.dump\RFSFAT16_VRECOVERYFS_0000"
unimg -e image.img

FileAddSum.exe, do pacote A10 Flash Kitchen, recria alguns arquivos de checksum. unimg.exe com o parâmetro -e recria a imagem de instalação do Allwinner A10, que pode, então, ser gravada com o LiveSuite.

LiveSuit

O programa que a Allwinner usa para gravar suas ROMs é o LiveSuit. Ele é encontrado em muitos lugares, como no pacote Allwinner A10 Flash Kitchen. Existe uma versão do Allwinner LiveSuit para Linux, mas ainda não testei.

Para instalar o LiveSuit no Windows, abri uma pasta na área de trabalho do Windows, copiei o instalador para ela e executei-o. Ele descomprimiu todos os arquivos no local. O Flash Kitchen já tem o LiveSuit incluído.

Para flashar o tablet, no Windows, coloco o dispositivo no modo FES, isto é, preparado para ser flashado:

  1. Desconecto o cabo USB, se estiver conectado.
  2. Seguro o botão Power por mais de 10 segundos para me certificar que o tablet foi mesmo desligado.
  3. Solto o Power e mantenho apertado qualquer botão que não o Power. O botão da face, por exemplo (Home).
  4. Conecto o cabo USB sem largar o botão apertado.
  5. Aperto rapidamente o botão Power por 10 vezes.
  6. Solto o botão que mantive apertado.

Isto vai instalar o driver especial de flashing do Allwinner. Se o driver não for instalado automaticamente, use o modo padrão de Windows para instalar drives. Procure o driver no computador, na pasta do LiveSuit.

Uma vez que o tablet esteja no modo FES, abro o programa LiveSuit e sigo o assistente para instalação. O LiveSuit apresentará as seguintes telas:

Captura de tela 2014-05-20 01.21.20

Ele pede para escolher o modo de atualização. Escolho o recomendado, “mandatory”.

Captura de tela 2014-05-20 01.21.28

Pede para desconetar todos os dispositivos.

Captura de tela 2014-05-20 01.21.38

Pede para escolher o arquivo de imagem ROM.

Captura de tela 2014-05-20 01.21.52

Avisa para recolocar o dispositivos em modo FES.

Captura de tela 2014-05-20 01.28.35

Finalmente, pergunta se é para formatar ou se instala o sistema sem formatar. Na primeira instalação, se houve modificação do tamanho das partições ou se quero ressetar para as configurações de fábrica, escolho reformatar. Se não escolher reformatar, os programas e configurações de usuário serão preservados.

Captura de tela 2014-05-25 20.10.10

Feito isto, o LiveSuit passa a gravar a ROM. O processo leva de 2 a 5 minutos.

Captura de tela 2014-05-20 01.22.46

A primeira  instalação da imagem deve ser feita formatando-se toda a memória NAND. Instalações subsequentes podem ser feitas sem formatação. Neste caso, os dados e aplicativos do usuários não serão apagados.

Aqui está a imagem ROM do Wei Wide Pro com SoC BC1003, mod Meira para gravar com o LiveSuit. A partição /data foi aumentada para 1 giga, para que eu possa instalar mais aplicativos, e a partição Recovery tem o ClockWorkMod Recovery.

Referências

Sobre José Antonio Meira da Rocha

Jornalista, professor de Planejamento Gráfico e Mídias Digitais da Universidade Federal de Santa Maria, campus da cidade de Frederico Westphalen, Rio Grande do Sul, Brasil. Doutorando em Design na UFRGS, Porto Alegre, Brasil, 2014.