简介
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