この記事では、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- :
// 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フォーラムの対応するトピックで公開されました。不明な点がある場合は、コメントで質問してください。私にできること-私がお手伝いします。
このために、私は私の休暇を取り、ファームウェアを転送するすべての人に幸運を祈ります!