设备固件升级 (DFU) 支持通过 USB 连接时从 U-Boot 下载和上传固件。
U-Boot 遵循 USB 论坛的设备固件升级版本 1.1 的通用串行总线设备类规范。
U-Boot 基于以下内容通过命令 dfu (cmd/dfu.c / CONFIG_CMD_DFU) 实现此 DFU 功能 (CONFIG_DFU):
-
基于 USB DFU 下载小工具 (drivers/usb/gadget/f_dfu.c) 的 DFU 堆栈 (common/dfu.c 和 common/spl/spl_dfu.c)
-
对介质的访问是在 DFU 后端 (driver/dfu) 中完成的
目前支持的 DFU 后端有:
-
MMC(RAW 或 FAT / EXT2 / EXT3 / EXT4 文件系统 / SKIP / SCRIPT)
-
SCSI(UFS、RAW 分区、FAT/EXT2/EXT3/EXT4 文件系统/SKIP/SCRIPT)
-
NAND
-
内存
-
SF(串行闪存)
-
MTD(所有 MTD 设备:NAND、SPI-NOR、SPI-NAND……)
-
virtual
这些 DFU 后端还用于
- dfutftp
- thordown 命令(cmd/thordown.c 和 gadget/f_thor.c)
“虚拟”后端是一个通用的 DFU 后端,用于支持特定于板的目标(例如 OTP),仅基于弱功能:
- dfu_write_medium_virt
- dfu_get_medium_size_virt
- dfu_read_medium_virt
配置选项
以下配置选项与设备固件升级相关:
- CONFIG_DFU
- CONFIG_DFU_OVER_USB
- CONFIG_DFU_MMC
- CONFIG_DFU_MTD
- CONFIG_DFU_NAND
- CONFIG_DFU_RAM
- CONFIG_DFU_SCSI
- CONFIG_DFU_SF
- CONFIG_DFU_SF_PART
- CONFIG_DFU_TIMEOUT
- CONFIG_DFU_VIRTUAL
- CONFIG_CMD_DFU
环境变量
dfu_alt_info
USB 下载小工具的 DFU 设置,每个选项上的信息字符串用分号分隔:
dfu_alt_info="<alt1>;<alt2>;....;<altN>"
当使用多个设备时,格式为:
-
’=’alternate list (‘;’ separated)
-
each interface is separated by ‘&’
dfu_alt_info=\
"<interface1> <dev1>=<alt1>;....;<altN>&"\
"<interface2> <dev2>=<altN+1>;....;<altM>&"\
...\
"<interfaceI> <devI>=<altY+1>;....;<altZ>&"
dfu_bufsiz
DFU 缓冲区的大小(若不存在)默认为 CONFIG_SYS_DFU_DATA_BUF_SIZE(默认为 8 MiB)
dfu_hash_algo
要使用的哈希算法的名称
命令
dfu <USB_controller> [ ] list
列出dfu_alt_info中定义的备用设备。
dfu <USB_controller> [ ] []
使用选定的介质后端在 USB 实例上启动 dfu 堆栈,并使用dfu_alt_info变量配置备用设置并将每个设置与介质链接起来。dfu 命令继续,直到它在控制台中收到 ^C 或从 HOST 收到 DFU 分离事务。如果启用了 CONFIG_DFU_TIMEOUT 选项并且命令行中存在 参数,则在等待遥控器启动 DFU 会话 秒后,DFU 操作将自动中止。
的可能值为(dfu 命令示例中的 = 0)
mmc
dfu 0 mmc <dev>
dfu_alt_info中的每个元素都是
-
raw [mmcpart ] 对 mmc 设备的原始访问
-
part <part_id> [offset ]对分区的原始访问
-
fat <part_id> 在 FAT 文件系统分区中
-
ext4 <part_id> 在 EXT4 文件系统分区中
-
skip 0 0 忽略闪存数据
-
script 0 0 在 shell 中执行命令
offset
设备中的偏移量(不带“0x”的十六进制)
size
访问区域的大小(十六进制,不带“0x”)或 0(表示整个设备)
partid
GPT 或 DOS 分区索引
num
eMMC硬件分区号
eMMC 的环境变量dfu_alt_info的值可能是:
u-boot raw 0x3e 0x800 mmcpart 1;bl2 raw 0x1e 0x1d mmcpart 1
SD 卡的环境变量dfu_alt_info的值可以是:
u-boot raw 0x80 0x800;uImage ext4 0 2
如果您不想将给定的图像文件刷入存储,请使用“跳过”类型实体。
-
它可用于防止特定主板闪现错误图像。
-
特别是当使用 thor 协议时,这种布局会很有用,该协议以批处理模式执行刷写,其中处理多个文件。
例如,如果制作一个支持两块主板的 u-boot-.bin 和 u-boot-.bin 文件的一个 tar 文件,就可以用它在两块主板上刷写正确的 u-boot 映像,而不会出现故障:
u-boot-<board1>.bin raw 0x80 0x800; u-boot-<board2>.bin skip 0 0
当刷新新的系统映像需要您执行一些比将数据写入存储介质更复杂的事情时,可以使用“脚本”类型。写入此类实体的数据将作为 u-boot shell 中的命令列表执行。例如,这允许您重新创建分区布局,甚至为新创建的分区设置新的dfu_alt_info。这样的脚本如下所示:
setenv dfu_alt_info ...
setenv mbr_parts ...
mbr write ...
请注意,这意味着用户将能够像在 u-boot 的 shell 中一样执行任意命令。
scsi
对于 UFS 存储:
dfu 0 scsi <dev>
dfu_alt_info中的每个元素都是
-
raw raw access to SCSI LUN
-
part <part_id> raw access to partition
-
fat <part_id> file in FAT partition
-
ext4 <part_id> file in EXT4 partition
-
skip 0 0 ignore flashed data
-
script 0 0 execute commands in shell
size
是访问区域的大小(十六进制,不带“0x”)或 0(表示整个设备)
partid
GPT 或 DOS 分区索引。
dev
SCSI LU(逻辑单元)索引(仅十进制)
UFS 的环境变量dfu_alt_info的值可能是
u-boot part 4;bl2 raw 0x1e 0x1d
有关跳过和脚本类型的详细信息,请参阅上面的 mmc 部分。
nand
原始 slc nand 设备:
dfu 0 nand <dev>
dfu_alt_info中的每个元素都是
-
raw raw access to nand device
-
part <dev_id> <part_id> raw access to partition
-
partubi <dev_id> <part_id> raw access to ubi partition
offset
是nand设备中的偏移量(十六进制,不带“0x”)
size
是访问区域的大小(不带“0x”的十六进制)
dev_id
NAND 设备索引(仅十进制)
part_id
NAND 分区索引(仅十进制)
ram
原始访问 RAM:
dfu 0 ram <dev>
dev
不用于 RAM 目标
dfu_alt_info中的每个元素是:
<name> ram <offset> <size> raw access to ram
offset
RAM 设备中的偏移量(十六进制,不带“0x”)
size
访问区域的大小(不带“0x”的十六进制)
sf
串行闪存:NOR:
cmd: dfu 0 sf <dev>
dfu_alt_info中的每个元素都是以下之一:
-
raw raw access to sf device
-
part <dev_id> <part_id> raw access to partition
-
partubi <dev_id> <part_id> raw access to ubi partition
offset
sf 设备中的偏移量(十六进制,不带“0x”)
size
访问区域的大小(不带“0x”的十六进制)
dev_id
sf 设备索引(设备是“nor<dev_id>”)(仅十进制)
part_id
MTD 分区索引(仅十进制)
mtd
所有 MTD 设备:NAND、SPI-NOR、SPI-NAND……:
cmd: dfu 0 mtd <dev>
dev
mtd 命令中定义的 mtd 标识符(nand0、nor0、spi-nand0、…)
dfu_alt_info中的每个元素都是以下之一:
-
raw for raw access to mtd device
-
part <part_id> for raw access to partition
-
partubi <part_id> for raw access to ubi partition
offset
mtd 设备中的偏移量(十六进制,不带“0x”)
size
访问区域的大小(不带“0x”的十六进制)
part_id
是 MTD 分区索引(仅十进制)
virt
DFU 的虚拟闪存后端
cmd: dfu 0 virt <dev>
dfu_alt_info中的每个元素是:
和 不存在,dfu 命令使用多个设备:
cmd: dfu 0 list
cmd: dfu 0
dfu_alt_info变量提供 列表,其中备用列表由 ‘&’ 分隔,每个 的格式相同:
mmc <dev>=<alt1>;....;<altN>
nand <dev>=<alt1>;....;<altN>
ram <dev>=<alt1>;....;<altN>
scsi <dev>=<alt1>;....;<altN>
sf <dev>=<alt1>;....;<altN>
mtd <dev>=<alt1>;....;<altN>
virt <dev>=<alt1>;....;<altN>
回调
可以实现弱回调函数来管理特定行为
dfu_initiated_callback
在 DFU 事务启动时调用,用于初始化设备
dfu_flush_callback
在DFU表现后写入DFU结束时调用,用于在DFU事务关闭时管理设备
主机工具
当 U-Boot 运行 dfu 堆栈时,DFU 主机工具可用于在每个配置的替代方案上发送/接收固件映像。
例如,dfu-util 是 DFU 1.1 规范(http://dfu-util.sourceforge.net/)的主机端实现,可与 U-Boot 配合使用。
用法
示例 1:位于 eMMC 或 SD 卡中的固件,具有:
SPL 分区(GPT 分区 1)的替代 1(alt=1)
U-Boot 分区(GPT 分区 2)的备用分区 2(alt=2)
U-Boot配置为:
U-Boot> env set dfu_alt_info "spl part 0 1;u-boot part 0 2"
U-Boot> dfu 0 mmc 0 list
DFU alt settings list:
dev: eMMC alt: 0 name: spl layout: RAW_ADDR
dev: eMMC alt: 1 name: u-boot layout: RAW_ADDR
Boot> dfu 0 mmc 0
在主机端:
列出可用的替代设置:
$> dfu-util -l
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Found DFU: [0483:5720] ver=0200, devnum=45, cfg=1, intf=0, path="3-1.3.1", \
alt=1, name="u-boot", serial="003A00203438510D36383238"
Found DFU: [0483:5720] ver=0200, devnum=45, cfg=1, intf=0, path="3-1.3.1", \
alt=0, name="spl", serial="003A00203438510D36383238"
To download to U-Boot, use -D option
$> dfu-util -a 0 -D u-boot-spl.bin
$> dfu-util -a 1 -D u-boot.bin
To upload from U-Boot, use -U option
$> dfu-util -a 0 -U u-boot-spl.bin
$> dfu-util -a 1 -U u-boot.bin
To request a DFU detach and reset the USB connection:
$> dfu-util -a 0 -e -R
示例 2:位于 NOR(sf)和 NAND 中的固件,具有:
SPL 分区(NOR GPT 分区 1)的替代 1(alt=1)
U-Boot 分区(NOR GPT 分区 2)的备用分区 2(alt=2)
U-Boot-env 分区(NOR GPT 分区 3)的备用 3(alt=3)
UBI 分区(NAND GPT 分区 1)的备用分区 4(alt=4)
U-Boot> env set dfu_alt_info \
"sf 0:0:10000000:0=spl part 0 1;u-boot part 0 2; \
u-boot-env part 0 3&nand 0=UBI partubi 0,1"
U-Boot> dfu 0 list
DFU alt settings list:
dev: SF alt: 0 name: spl layout: RAW_ADDR
dev: SF alt: 1 name: ssbl layout: RAW_ADDR
dev: SF alt: 2 name: u-boot-env layout: RAW_ADDR
dev: NAND alt: 3 name: UBI layout: RAW_ADDR
U-Boot> dfu 0
0
$> dfu-util -l
Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
intf=0, alt=3, name="UBI", serial="002700333338511934383330"
Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
intf=0, alt=2, name="u-boot-env", serial="002700333338511934383330"
Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
intf=0, alt=1, name="u-boot", serial="002700333338511934383330"
Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
intf=0, alt=0, name="spl", serial="002700333338511934383330"
与 MTD 后端相同的示例
U-Boot> env set dfu_alt_info \
"mtd nor0=spl part 1;u-boot part 2;u-boot-env part 3&"\
"mtd nand0=UBI partubi 1"
U-Boot> dfu 0 list
using id 'nor0,0'
using id 'nor0,1'
using id 'nor0,2'
using id 'nand0,0'
DFU alt settings list:
dev: MTD alt: 0 name: spl layout: RAW_ADDR
dev: MTD alt: 1 name: u-boot layout: RAW_ADDR
dev: MTD alt: 2 name: u-boot-env layout: RAW_ADDR
dev: MTD alt: 3 name: UBI layout: RAW_ADDR
示例 3
位于 SD 卡 (mmc) 中的固件以及 OTP 和 PMIC 非易失性存储器上的虚拟分区
- scard 的替代 1 (alt=1)
- 替代 2 (alt=2) 用于 OTP (虚拟)
- 替代 3 (alt=3) 用于 PMIC NVM (虚拟)
U-Boot> env set dfu_alt_info \
"mmc 0=sdcard raw 0 0x100000&"\
"virt 0=otp" \
"virt 1=pmic"
U-Boot> dfu 0 list
DFU alt settings list:
dev: eMMC alt: 0 name: sdcard layout: RAW_ADDR
dev: VIRT alt: 1 name: otp layout: RAW_ADDR
dev: VIRT alt: 2 name: pmic layout: RAW_ADDR
标签:info,raw,DFU,boot,升级,dfu,固件,alt
From: https://blog.csdn.net/qq_37255138/article/details/144926373