简介
fastboot是一种通信协议,依赖网络或者USB,这篇文章将介绍怎么在uboot下利用USB使用fastboot功能
fastboot安装
fastboot软件已经包含在adb软件包中了,可以详细看前面写的文章,有提到怎么安装adb软件
uboot配置
uboot下需要关注两个点
usb控制器配置为device功能fastboot相关配置需要打开
udc配置
从uboot的配置文件可以看到uboot用的设备树文件为bcm2711-rpi-4-b.dts

一步步查看,uboot中已经将usb设置为device模式了,所以不用做多余的改动

fastboot配置
使能fastboot
CONFIG_FASTBOOT
CONFIG_USB_FUNCTION_FASTBOOT
CONFIG_CMD_FASTBOOT
CONFIG_ANDROID_BOOT_IMAGE
使能fastboot usb gadget
CONFIG_USB_GADGET_DOWNLOAD
CONFIG_USB_GADGET_VENDOR_NUM
CONFIG_USB_GADGET_PRODUCT_NUM
CONFIG_USB_GADGET_MANUFACTURER
配置缓冲区地址和大小,fastboot需要一块大的内存区域用来下载,需要配置CONFIG_FASTBOOT_BUF_ADDR缓冲区的起始地址以及CONFIG_FASTBOOT_BUF_SIZE大小,这两个值决定了你可以通过fastboot烧写多大的镜像。这里树莓派的设置我是暂时这么设置的
CONFIG_FASTBOOT_BUF_ADDR=0x1000000
CONFIG_FASTBOOT_BUF_SIZE=0x7000000
配置fastboot flash命令的支持,因为要烧写到sd卡上,对应的节点是mmc0,要使能的宏如下
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
执行结果
uboot配置完毕后,执行如下命令
fastboot usb 0

通过usbipd wsl list命令可以看到可以识别到usb download gadget

uboot中此时在循环等待下载命令,如果想退出,则执行ctrl+c即可,相关代码如下

更加具体的uboot下fastboot配置以及代码的解析可以看链接
windows配置
在上一步配置好uboot后,用powershell的fastboot devices命令是找不到对应的fastboot设备的,需要windows安装驱动,设备管理器中会显示出黄色感叹号,我们需要让它识别成fastboot设备才能使用

首先下载google_latest_usb_driver_windows.zip文件,我自己也上传了一份
https://github.com/xushuan/google_latest_usb_driver_windows
然后解压文件,记住这个路径

来到设备管理器,右键更新驱动程序

点击浏览我的电脑以查找驱动程序

第一步填入刚刚解压的驱动包路径,第二步选择让我从计算机上的可用驱动程序列表中选取

选择Android Bootloader Interface,点击从磁盘安装

在浏览那里输入我们的文件路径

更新后会出现如下提示

安装好驱动后,再打开设备管理器就能看到了

fastboot devices命令也能显示对应的设备

准备gpt镜像
在使用fastboot去烧写flash的时候,需要指定分区名字,但是MBR的方案是没有分区名的,所以镜像的分布需要使用GPT的方案。GPT镜像的制作可以参考文章。
fastboot命令烧写验证
上一步中我们知道有个dtb分区是给我们来fastboot烧写测试用的,uboot下输入命令part list mmc 0,可以看到镜像的每个分区信息

接下来的验证方法很简单,我们先制作一个ext4文件,里面包含一个测试文件2MB.bin,获取其md5值,然后通过fastboot的方式烧写进去后,再启动kernel,dtb分区挂载ext4文件系统,查看里面的测试文件2MB.bin的md5值,对比看是否一致。
首先先制作测试文件2MB.bin
dd if=/dev/random of=2MB.bin bs=1M count=2
md5sum 2MB.bin

接着是ext4文件
dd if=/dev/zero of=dtb.ext4 bs=4M count=1
sudo mkfs.ext4 dtb.ext4

然后把测试文件拷贝进去
mkdir tmp
sudo mount -t ext4 dtb.ext4 tmp/
sudo cp 2MB.bin tmp/
sudo umount tmp
sync

接下来uboot先输入fastboot usb 0

windows输入
fastboot flash dtb D:\ubuntu_swap\pi4b\dtb.ext4

同时uboot这边也显示下载完毕

重启到kernel后,挂载dtb分区,可以看到里面存放着测试文件2MB.bin,计算其md5值,跟之前的能对应上,说明fastboot功能烧录验证没问题

fastboot命令
这里列举一些fastboot命令
fastboot flash uboot uboot.bin
fastboot flash kernel arch/arm64/boot/Image
fastboot download
fastboot reboot
fastboot oem xxx
fastboot getvar all
其中fastboot oem xx是用户自定义的,因为其他命令是fastboot协议定义的,但是怕不够用,所以就有这个oem自定义的,比如下面是一些参考
#解锁状态查询
fastboot oem lock-state info
#解锁命令
fastboot oem unlock-go


参考链接
后续
- 通过网络的方式来使用
fastboot功能 - 可以自定义实现
fastboot oem命令,以及上锁解锁功能 - 实现
adb reboot bootloader,需要kernel跟uboot一起改动(可以找个白板寄存器之类的),或者像链接中提到的用设备树节点来标志某段memory


