我有一个专有的 ARM 设备,工具和 SDK 非常有限,但我可以设法在 RAM 中启动 Android 引导加载程序。在主机上,我看到:
# fastboot devices
SERIAL Android Fastboot
# lsusb
Bus 003 Device 098: ID 18d1:0002 Google Inc. USB download gadget
换句话说,设备通过 USB OTG 连接到 PC,并且该 Android 引导加载程序在 RAM 中运行。
该设备只有一个 emmc,而我有一个工作 emmc:图像 img-4GB(0x0 到 0xE9000000)。该镜像是一个自定义操作系统,与 Android 无关。这不是安卓。 emmc全是零,上面什么都没有。
如何通过fastboot直接将整个镜像刷入emmc而无需加载内核?
如果需要,我已准备好在 PC 上修补 fastboot。我尝试使用partmap.txt 文件:
flash=mmc,0:all:all:0x0,0xE9000000:img-4GB;
并且想做类似的事情:
fastboot flash partmap partmap_emmc.txt
fastboot flash all
但它不起作用。
如果您有 U-Boot v2021.04 或更高版本,则可以使用 U-Boot 分区语法 来指定整个分区。例如,
$ fastboot flash 1:0 img-4GB
会将您的映像刷新到 MMC 1。您还可以刷新单个分区:
$ fastboot flash 0:2 partition2.img
将闪存 MMC 0 的分区 2。
但是,听起来您可能会被供应商的 U-Boot 所困扰,它可能不够新,无法支持上述语法。如果是这种情况,您可以尝试先暂存图像
$ fastboot stage img-4GB
这会将图像下载到
CONFIG_FASTBOOT_BUF_ADDR
,通常与 CONFIG_LOAD_ADDR
相同。如果您不知道那是什么地址,您可以尝试使用内存搜索(ms
)命令在磁盘映像中查找已知值:
=> ms.l <start> <size> 0xcafebabe
其中
<start>
和 <size>
是 RAM 的起始位置和 RAM 的大小,以 4 字节字 (l
ongs) 为单位。如果您不知道 RAM 在哪里,可以通过运行 bdinfo
来找到。
一旦你弄清楚了
CONFIG_FASTBOOT_BUF_ADDR
是什么,就跑吧
=> mmc dev 0
=> mmc write <CONFIG_FASTBOOT_BUF_ADDR> 0 <size in sectors>
其中
<size in sectors>
是图像的大小(以 512 字节扇区为单位,以十六进制表示)。