大部分安卓手机的引导程序实现了一个名为Fastboot的协议,可以通过USB向设备刷写/启动操作系统,或者读取一些信息。常见的BL锁指的就是fastboot和avb(Android Verified Boot安卓验证启动)是否强制验证签名。
设备识别ID
USB Class: 0xFF, SubClass: 0x42, Protocol: 0x03
DeviceInterfaceGUIDs: {F72FE0D4-CBCB-407D-8814-9ED673D0DD6B}
Windows: USB\MS_COMP_WINUSB
Windows: USB\Class_ff&SubClass_42&Prot_03
关于驱动
Fastboot不需要驱动。
在Linux下,fastboot工具直接读写/dev/bus/usb/XXX/XXX设备进行通信
在Windows下,fastboot工具通过WinUSB(对于裸USB设备的包装,Windows不允许直接读写USB设备,此驱动系统内置)和设备进行通信
WINUSB: C:\Windows\INF\winusb.INF C:\Windows\System32\drivers\winusb.sys
主机端命令请求格式:
- getvar:%s
该命令用于从设备读取一个变量
getvar:current-slot
%s:任意字符串(变量名称)
- download:%08x
该命令表示即将向设备的缓冲区发送指定大小的数据用于刷写/启动等等
%08x: 8字长的十六进制数(数据大小)
小写x表示数字以小写十六进制表示,8表示不满8字长则填充,0表示使用0填充
示例:download:0000A000
- flash:%s
将缓冲区中的数据刷入指定分区
%s:任意字符串(分区名称)
- reboot
重启设备
设备端响应格式
- OKAY / OKAY%s
表示命令已成功执行,并附带信息
%s:任意字符串(状态信息)
示例:OKAY
示例:OKAYyes
示例:OKAYcommand done
- INFO%s
命令执行中上报状态信息
%s:任意字符串(状态信息)
示例:INFOflashing
- FAIL / FAIL%s
表示命令执行失败,并附带信息
%s:任意字符串(状态信息)
示例:FAIL
示例:FAILunknown command
示例:FAILwrite failed
- DATA%08x
表示设备已准备好接收主机端发来的数据(通常由download:%08x发起)
%08x: 8字长的十六进制数(数据大小)
小写x表示数字以小写十六进制表示,8表示不满8字长则填充,0表示使用0填充
示例:DATA0000A000
示例命令分析
- fastboot getvar kernel
主机:getvar:kernel
设备:OKAYuefi
- fastboot flash boot boot.img
主机:download:00100000
设备:DATA00100000
主机:(发送boot.img的内容)
设备:OKAY
主机:flash:boot
设备:INFOflashing...
设备:OKAY
其它注意事项
- 向设备发送数据(download)时,数据不能大于max-download-size变量(缓冲区大小)的值。
当需要刷写的数据超过缓冲区大小时,则使用sparse对文件分段处理。
(待补充...)
Fastboot实现
Qualcomm ABL: https://git.codelinaro.org/clo/la/abl/tianocore/edk2/-/tree/uefi.lnx.4.0.r37-rel/QcomModulePkg/Library/FastbootLib
lk2nd: https://github.com/msm8916-mainline/lk2nd/blob/master/app/aboot/fastboot.c
U-Boot: https://github.com/u-boot/u-boot/tree/master/drivers/fastboot
Userspace Fastbootd: https://android.googlesource.com/platform/system/core/+/refs/heads/main/fastboot/device/
linux-simple-mass-storage: https://github.com/BigfootACA/linux-simple-mass-storage/tree/master/src/fastboot
其它参考文档
https://android.googlesource.com/platform/system/core/+/master/fastboot/README.md