Lançamento do sistema operacional Android a partir do cartão SD para dispositivos com processador Amlogic S912

O artigo descreve detalhadamente, com o código fonte, o trabalho realizado para transferir e executar a partir do cartão SD o firmware com o sistema operacional Android para dispositivos baseados no processador Amlogic S912.



Eu amo computadores em miniatura do sistema em um chip (SOC). Por seu tamanho minúsculo e baixo consumo de energia em comparação aos computadores pessoais. Usando esses dispositivos, você pode resolver uma ampla gama de tarefas. Em minicomputadores, você pode instalar o sistema operacional Android (isso é o que a maioria dos fabricantes desses "brinquedos" faz), bem como várias distribuições de Linux ou Chrome OS.



Meu trabalho atual é desenvolver aplicativos para Android. Neste trabalho, testes em dispositivos reais em várias versões do sistema são altamente desejáveis. Tenho alguns minicomputadores da Rockchip e da Amlogic nos quais também executo meus testes. O Android, como sistema operacional, está se desenvolvendo de forma bastante dinâmica, e agora suas modificações de 4.4 a 10 versões são utilizadas no mercado. E a caminho já está a versão 11 do Android.



Muitas empresas envolvidas no desenvolvimento de decodificadores baseados em Android precisam ter um curto período de suporte para seus filhos devido ao rápido desenvolvimento de hardware e software. Uma das minhas principais ferramentas de trabalho para testes é uma caixa KM8P em um processador S912 com dois gigabytes de RAM e um sistema operacional Android 7.1 pré-instalado. O tempo passa e, por alguns anos, as versões 8.1, 9.0 e 10.0 do sistema operacional Android surgiram no mercado.



Eu gostaria muito de testar meu aplicativo nessas mesmas versões. Mas o que fazer? Ou você precisa comprar animais em novos processadores e versões do Android ou adaptar novas versões do Android em dispositivos existentes. A primeira maneira é fácil e simples: pagando uma pequena quantia, o problema é facilmente resolvido. Mas não estamos procurando caminhos fáceis, então escolhemos o segundo caminho. A segunda maneira é muito mais difícil, mas mais interessante. Além disso, o próprio chip S912 é um excelente processador de 8 núcleos, não muito inferior em desempenho aos mais recentes processadores Amlogic no chip S905x.



, , . : ? 7.1 Linux 3.14.29 NAND SK Hynix H27UCG8T2ETR, Amlogic aml_nftl_dev.ko.



4.9. . , Amlogic , SDK Android , Amlogic.



, github' 4.9 SDK Android Amlogic 2017-18 . , git- Khadas. , , , aml_nftl_dev 4.9 . ? 4.9? , . .



S912 EMMC. , ( - 2020 ) 9, ( ). EMMC. , , SD-, MMC, EMMC, SD- .



, , Amlogic SD-. , - . Amlogic SD-. Amlogic u-boot . , FAT- SD-. , , MMC SD-. .



, , -, EMMC, . SDMMC- SDIO-. , SDMMC, , EMMC?



-, , Amlogic . , , , . , .



, SDMMC, EMMC SD-, , , EMMC SD-! , , . — . , , . github', amlpt. Ubuntu. , , , Windows.



mmcparts_a9.c, , , . — 0x1, cache — 0x2, data — 0x4. 0x2800000 (40). , partitions . 9- 17.



mmcparts_a9.c, , make_amlptwrt.sh. amlptwrt, mmc_parts.bin. , MMC. make_amlptrdr.sh amlptrdr, . amlptrdr , . :



@>:~/AML/amlpt$ ./amlptrdr

[mmc_verify_partition_tbl] mmc read partition OK!

show_mmc_partitions

[disk p01] logo offset 40 Mb, size 8 Mb

[disk p02] recovery offset 48 Mb, size 24 Mb

[disk p03] misc offset 72 Mb, size 8 Mb

[disk p04] dtbo offset 80 Mb, size 8 Mb

[disk p05] cri_data offset 88 Mb, size 8 Mb

[disk p06] rsv offset 96 Mb, size 16 Mb

[disk p07] metadata offset 112 Mb, size 16 Mb

[disk p08] vbmeta offset 128 Mb, size 2 Mb

[disk p09] param offset 130 Mb, size 16 Mb

[disk p10] boot offset 146 Mb, size 16 Mb

[disk p11] tee offset 162 Mb, size 32 Mb

[disk p12] vendor offset 194 Mb, size 130 Mb

[disk p13] odm offset 324 Mb, size 128 Mb

[disk p14] system offset 452 Mb, size 1350 Mb

[disk p15] product offset 1802 Mb, size 128 Mb

[disk p16] cache offset 1930 Mb, size 1120 Mb

[disk p17] data offset 3050 Mb, size 4050 Mb


, MMC SDMMC, , drivers/amlogic/mmc/emmc_partitions.c:



) -, , EMMC. is_card_emmc :



static int is_card_emmc(struct mmc_card *card) 
{ 
    //struct mmc_host *mmc = card->host; 
    // emmc port, so it must be an eMMC or TSD  
    //if (!strcmp(mmc_hostname(mmc), "emmc")) 
        return 1; 
    //else 
    //    return 0; 
    //return mmc->is_emmc_port;
}


, , , . , - .



) , . mmc_read_partition_tbl:



 //start_blk = get_reserve_partition_off(card);         
start_blk = MMC_BOOT_PARTITION_SIZE + MMC_BOOT_PARTITION_RESERVED;


, MMC_BOOT_PARTITION_SIZE + MMC_BOOT_PARTITION_RESERVED 36 . , , EMMC . .



, , SD- 36 . , , amlptwrt, SD- :



// 36M = 37748736 bytes = 73728 sectors         
sudo dd if=mmc_parts.bin of=/dev/sdb seek=73728 bs=512


, /dev/sdb — SD-.



, boot.img initrd :



 root=/dev/mmcblk0p14 rootfstype=ext4 rootwait


, u-boot Amlogic Linux c SD- FAT. SD- FAT 32 . boot.img dtb.img. dtb.img EMMC, SD- /dev/mmcblk0. , boot.img , , /dev/mmcblk0p14.

, , - SD-. SD- :



SD-
// logo
sudo dd if=logo.PARTITION of=/dev/sdb bs=1M seek=40 conv=sync,fsync status=progress 
// recovery 
sudo dd if=recovery.PARTITION of=/dev/sdb bs=1M seek=48 conv=sync,fsync status=progress 
// misc 
sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=72 count=8 conv=sync,fsync status=progress 
// dtbo 
sudo dd if=dtbo.PARTITION of=/dev/sdb bs=1M seek=80 conv=sync,fsync status=progress 
// cri_data 
sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=88 count=8 conv=sync,fsync status=progress 
// rsv 
sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=96 count=16 conv=sync,fsync status=progress 
// metadata 
sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=112 count=16 conv=sync,fsync status=progress 
// vbmeta 
sudo dd if=vbmeta.PARTITION of=/dev/sdb bs=1M seek=128 conv=sync,fsync status=progress 
// param 
sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=130 count=16 conv=sync,fsync status=progress 
// boot 
sudo dd if=boot.PARTITION of=/dev/sdb bs=1M seek=146 conv=sync,fsync status=progress 
// tee 
sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=162 count=32 conv=sync,fsync status=progress
// vendor
sudo dd if=vendor.img of=/dev/sdb bs=1M seek=194 conv=sync,fsync status=progress 
// odm
sudo dd if=odm.img of=/dev/sdb bs=1M seek=324 conv=sync,fsync status=progress 
// system
sudo dd if=system.img of=/dev/sdb bs=1M seek=452 conv=sync,fsync status=progress 
// product
sudo dd if=product.img of=/dev/sdb bs=1M seek=1802 conv=sync,fsync status=progress


, , . , system vendor , sparse-. :



simg2img system.PARTITION system.img


cache data -. , amlptwrt, fdisk SD- ext4:



sudo mkfs.ext4 /dev/sdb2 
sudo mkfs.ext4 /dev/sdb3


, fdisk, /dev/sdb2 /dev/sdb3.



u-boot , SD-, FAT- aml_autoscript. aml_autoscript mkimage :



 if mmcinfo; then fatload mmc 0 ${loadaddr} boot.img; fatload mmc 0 ${dtb_mem_addr} dtb.img; bootm; fi;


Isso é tudo o que é preciso para transferir o firmware do Android a bordo para o cartão SD.



Vários firmwares que foram feitos usando este método foram publicados no tópico correspondente no fórum w3bsit3-dns.com. Se algo não estiver claro, faça perguntas nos comentários. O que posso - vou ajudar.



Para isso, gostaria de despedir-se e boa sorte a todos na transferência do firmware!




All Articles