Lanzamiento del sistema operativo Android desde la tarjeta SD para dispositivos con procesador Amlogic S912

El artículo describe en detalle, con el código fuente, el trabajo realizado para transferir y lanzar el firmware desde la tarjeta SD con el sistema operativo Android para dispositivos basados ​​en el procesador Amlogic S912.



Me encantan las computadoras en miniatura con sistema en un chip (SOC). Por su pequeño tamaño y bajo consumo de energía en comparación con los ordenadores personales. Con estos dispositivos, puede resolver una amplia gama de tareas. En miniordenadores, puede instalar tanto el sistema operativo Android (como hacen la mayoría de los fabricantes de estos "juguetes") como varias distribuciones de Linux o Chrome OS.



Mi trabajo actual es desarrollar aplicaciones para Android. En este trabajo, las pruebas en dispositivos reales en varias versiones del sistema son muy deseables. Tengo un par de miniordenadores de Rockchip y Amlogic en los que también ejecuto mis pruebas. Android, como sistema operativo, se está desarrollando de forma bastante dinámica y ahora se utilizan en el mercado sus modificaciones de 4.4 a 10 versiones. Y en camino ya está la versión 11 de Android.



Muchas empresas involucradas en el desarrollo de decodificadores basados ​​en Android deben tener un período de mantenimiento corto para su descendencia debido al rápido desarrollo tanto del hardware como del software. Una de mis principales herramientas de trabajo para las pruebas es una caja KM8P en un procesador S912 con dos gigabytes de RAM y un sistema operativo Android 7.1 preinstalado. El tiempo pasa y desde hace un par de años han aparecido en el mercado las versiones 8.1, 9.0 y 10.0 del sistema operativo Android.



Me gustaría mucho probar mi aplicación en estas mismas versiones. ¿Pero qué hacer? O necesita comprar animales en nuevos procesadores y versiones de Android, o autoadaptar nuevas versiones de Android en dispositivos existentes. La primera forma es fácil y sencilla: pagando una pequeña cantidad, el problema se resuelve fácilmente. Pero no buscamos caminos fáciles, entonces elegimos el segundo camino. La segunda forma es mucho más difícil, pero más interesante. Además, el chip S912 en sí es un excelente procesador de 8 núcleos, no muy inferior en rendimiento a los últimos procesadores Amlogic en el 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;


Eso es todo lo que se necesita para transferir firmware de Android a bordo a una tarjeta SD.



Varios firmwares que se crearon utilizando este método se publicaron en el tema correspondiente en el foro w3bsit3-dns.com. Si algo no está claro, haga preguntas en los comentarios. Lo que pueda, lo ayudaré.



Por esto, déjenme despedirme y buena suerte a todos en la transferencia del firmware.




All Articles