L'article décrit en détail, avec le code source, le travail effectué pour transférer et lancer le firmware depuis la carte SD avec l'OS Android pour les appareils basés sur le processeur Amlogic S912.
J'adore les ordinateurs miniatures à système sur puce (SOC). Pour sa petite taille et sa faible consommation d'énergie par rapport aux ordinateurs personnels. En utilisant de tels appareils, vous pouvez résoudre un large éventail de tâches. Sur les mini-ordinateurs, vous pouvez installer à la fois le système d'exploitation Android (comme le font la plupart des fabricants de ces «jouets») et diverses distributions Linux ou Chrome OS.
Mon travail actuel consiste à développer des applications Android. Dans ce travail, des tests sur des appareils réels sur différentes versions du système sont hautement souhaitables. J'ai quelques mini-ordinateurs de Rockchip et d'Amlogic sur lesquels j'exécute également mes tests. Android, en tant que système d'exploitation, se développe de manière assez dynamique, et maintenant ses modifications de 4.4 à 10 versions sont utilisées sur le marché. Et sur le chemin est déjà la version 11 d'Android.
De nombreuses entreprises engagées dans le développement de décodeurs basés sur Android doivent avoir une courte période de support pour leur progéniture en raison du développement rapide du matériel et des logiciels. L'un de mes principaux outils de travail pour les tests est un boîtier KM8P sur un processeur S912 avec deux gigaoctets de RAM et un système d'exploitation Android 7.1 préinstallé. Le temps passe, et depuis quelques années, les versions 8.1, 9.0 et 10.0 d'Android OS sont apparues sur le marché.
J'aimerais beaucoup tester mon application sous ces mêmes versions. Mais que faire? Soit vous devez acheter des animaux sur de nouveaux processeurs et versions d'Android, soit vous auto-adapter de nouvelles versions d'Android sur des appareils existants. Le premier moyen est simple et simple: en payant une petite somme, le problème est facilement résolu. Mais nous ne cherchons pas des moyens faciles, nous choisissons donc la deuxième voie. La deuxième voie est beaucoup plus difficile, mais plus intéressante. De plus, la puce S912 elle-même est un excellent processeur à 8 cœurs, dont les performances ne sont pas très inférieures aux derniers processeurs Amlogic basés sur la puce 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- :
// 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;
C'est tout ce qu'il faut pour transférer le firmware d'Android à bord vers une carte SD.
Plusieurs firmwares créés à l'aide de cette méthode ont été publiés dans la rubrique correspondante du forum w3bsit3-dns.com. Si quelque chose n'est pas clair, posez des questions dans les commentaires. Ce que je peux - je vais vous aider.
Pour cela, laissez-moi prendre congé et bonne chance à tous dans le transfert du firmware!