AmlogicS912プロセッサを搭載したデバイス用のSDカードからのAndroidOSの起動

この記事では、Amlogic S912プロセッサに基づくデバイス用に、AndroidOSを使用してSDカードからファームウェアを転送および起動するために実行される作業をソースコードとともに詳細に説明しています。



システムオンチップ(SOC)ミニチュアコンピューターが大好きです。パーソナルコンピュータに比べてサイズが小さく、消費電力が少ないため。このようなデバイスを使用すると、さまざまなタスクを解決できます。ミニコンピューターでは、Android OS(これらの「おもちゃ」のほとんどのメーカーが行うように)と、さまざまなLinuxまたはChromeOSディストリビューションの両方をインストールできます。



私の現在の仕事はAndroidアプリの開発です。この作業では、システムのさまざまなバージョンの実際のデバイスでのテストが非常に望ましいです。RockchipとAmlogicのミニコンピューターがいくつかあり、それらもテストを実行しています。オペレーティングシステムとしてのAndroidは非常に動的に開発されており、現在、4.4から10バージョンへの変更が市場で使用されています。そして、途中ですでにAndroidバージョン11があります。



Androidをベースにしたセットトップボックスの開発に携わる多くの企業は、ハードウェアとソフトウェアの両方が急速に開発されているため、子孫を短期間サポートする必要があります。テスト用の私の主な作業ツールの1つは、2ギガバイトのRAMとプリインストールされたAndroid7.1オペレーティングシステムを備えたS912プロセッサ上のKM8Pボックスです。時が経ち、数年の間、Android OSのバージョン8.1、9.0、および10.0が市場に登場しました。



これらの同じバージョンでアプリケーションをテストしたいと思います。しかし、何をすべきか?新しいプロセッサとバージョンのAndroidで動物を購入するか、既存のデバイスで新しいバージョンのAndroidを自己適応させる必要があります。最初の方法は簡単でシンプルです。少額を支払うことで、問題は簡単に解決されます。しかし、私たちは簡単な方法を探しているわけではないので、2番目の方法を選択します。 2番目の方法ははるかに困難ですが、より興味深いものです。さらに、S912チップ自体は優れた8コアプロセッサであり、S905xチップ上の最新のAmlogicプロセッサよりもパフォーマンスがそれほど劣っていません。



, , . : ? 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;


オンボードのAndroidからSDカードにファームウェアを転送するのに必要なのはこれだけです。



この方法を使用して作成されたいくつかのファームウェアは、w3bsit3-dns.comフォーラムの対応するトピック公開されました不明な点がある場合は、コメントで質問してください。私にできること-私がお手伝いします。



このために、私は私の休暇を取り、ファームウェアを転送するすべての人に幸運を祈ります!




All Articles