树莓派开发(八)

uboot下fastboot使用

Posted by 婷 on May 10, 2025 本文总阅读量

简介

fastboot是一种通信协议,依赖网络或者USB,这篇文章将介绍怎么在uboot下利用USB使用fastboot功能

fastboot安装

fastboot软件已经包含在adb软件包中了,可以详细看前面写的文章,有提到怎么安装adb软件

uboot配置

uboot下需要关注两个点

  • usb控制器配置为device功能
  • fastboot相关配置需要打开

udc配置

uboot的配置文件可以看到uboot用的设备树文件为bcm2711-rpi-4-b.dts

img

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

img

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

img

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

img

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

img

更加具体的ubootfastboot配置以及代码的解析可以看链接

windows配置

在上一步配置好uboot后,用powershellfastboot devices命令是找不到对应的fastboot设备的,需要windows安装驱动,设备管理器中会显示出黄色感叹号,我们需要让它识别成fastboot设备才能使用

img

首先下载google_latest_usb_driver_windows.zip文件,我自己也上传了一份

https://github.com/xushuan/google_latest_usb_driver_windows

然后解压文件,记住这个路径

img

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

img

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

img

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

image-20250510210533485

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

img

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

img

更新后会出现如下提示

img

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

img

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

img

准备gpt镜像

在使用fastboot去烧写flash的时候,需要指定分区名字,但是MBR的方案是没有分区名的,所以镜像的分布需要使用GPT的方案。GPT镜像的制作可以参考文章

fastboot命令烧写验证

上一步中我们知道有个dtb分区是给我们来fastboot烧写测试用的,uboot下输入命令part list mmc 0,可以看到镜像的每个分区信息

img

接下来的验证方法很简单,我们先制作一个ext4文件,里面包含一个测试文件2MB.bin,获取其md5值,然后通过fastboot的方式烧写进去后,再启动kerneldtb分区挂载ext4文件系统,查看里面的测试文件2MB.binmd5值,对比看是否一致。

首先先制作测试文件2MB.bin

dd if=/dev/random of=2MB.bin bs=1M count=2
md5sum 2MB.bin

img

接着是ext4文件

dd if=/dev/zero of=dtb.ext4 bs=4M count=1
sudo mkfs.ext4 dtb.ext4

img

然后把测试文件拷贝进去

mkdir tmp
sudo mount -t ext4 dtb.ext4 tmp/
sudo cp 2MB.bin tmp/
sudo umount tmp
sync

img

接下来uboot先输入fastboot usb 0

img

windows输入

fastboot flash dtb  D:\ubuntu_swap\pi4b\dtb.ext4

img

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

img

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

img

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

img

img

参考链接

后续

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

img

img

img