从SD卡启动适用于具有Amlogic S912处理器的设备的Android OS

本文详细介绍了源代码,以及使用适用于Amlogic S912处理器的设备的Android OS从SD卡传输和启动固件所进行的工作。



我喜欢片上系统(SOC)微型计算机。与个人计算机相比,其体积小,功耗低。使用此类设备,您可以解决各种各样的任务。在小型计算机上,您既可以安装Android操作系统(就像大多数“玩具”的制造商一样),也可以安装各种Linux或Chrome OS发行版。



我目前的工作是开发Android应用程序。在这项工作中,非常需要在系统的各种版本上的真实设备上进行测试。我有一些来自Rockchip和Amlogic的微型计算机,它们也可以在这些微型计算机上进行测试。Android作为一种操作系统,正在相当动态地进行开发,现在市场上已经将其从4.4修改为10。即将推出的是Android版本11。



由于硬件和软件的快速发展,许多从事基于Android的机顶盒开发的公司都必须在短期内为其后代提供支持。我测试的主要工作工具之一是S912处理器上的KM8P盒,带有两个千兆字节的RAM和一个预装的Android 7.1操作系统。随着时间的流逝,几年来,市场上出现了8.1、9.0和10.0版的Android OS。



我非常想在这些相同版本下测试我的应用程序。但是该怎么办?您需要在新处理器和新版Android上购买动物,或者在现有设备上自适应安装新版Android。第一种方法既简单又简单:只需支付少量费用,即可轻松解决问题。但是我们并不是在寻找简单的方法,因此我们选择第二种方法。第二种方法难度更大,但更有趣。此外,S912芯片本身就是出色的8核处理器,其性能不亚于S905x芯片上最新的Amlogic处理器。



因此,选择了第二个选项,因为它更有趣并且可以满足我的需求。问题出现了:走哪条路?当前版本的Android 7.1在其引擎盖上装有Linux 3.14.29内核,并在SK Hynix H27UCG8T2ETR芯片上装有NAND ROM,Amlogic为此开发了自己的驱动程序aml_nftl_dev.ko。



所有最新版本的Android均基于4.9内核。并且期望使用它。但是,根据Amlogic的政策,在过去的几年中,仅向生产基于Amlogic芯片的设备的合法公司提供Android SDK。



, 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;


这就是将固件从板载Android传输到SD卡所需的全部。



使用此方法制作的几种固件已发布w3bsit3-dns.com论坛上的相应主题中如果不清楚,请在评论中提出问题。我所能-我会帮忙。



为此,在迁移固件时,请允许我离开并祝大家好运!




All Articles