DFU uboot kernel配置以及DFU-util使用

关于DFU uboot 内核kernel and 开源代码配置

• DFU 实现原理
• linux 内核配置
• Uboot 相关配置
• DFU模式以及DFU-util 的使用

USB Device Firmware Update (DFU)

DFU 实现原理

dfu 功能分为两个模式: runtime 模式与 dfu 模式

  1. runtime 模式:
    正常工作状态,此时需要host设备发送detach命令使设备转换成dfu模式
  2. dfu 模式
    升级状态,host设备可以读写相应分区的数据来升级设备

dfu 具体工作流程如下:

  1. host设备给device设备发送准备升级固件命令
  2. device 在接收到命令时会卸载所有已经加载的驱动,并切换到DFU 模式
  3. host 给device发起usb reset
  4. device 发送DFU 模式下的描述符,进行重新枚举识别
  5. host 给设备发送需要升级的固件
  6. host 收到设备端数据处理成功的信息,给device发送转换模式的命令
  7. device 重新切换到 runtime 模式
  8. host 发起usb reset,并重新识别device设备

DFU模式与runtime模式的客制化流程:

  1. device 正常启动到linux,配置相关的usb device驱动使设备处于runtime模式
  2. 当用户需要升级firmware时,需要通过host端软件发送runtime模式detach命令(DFU-util -e)
  3. 当device 接收到detach命令,会通过fw_setenv工具配置uboot环境变量enter_dfu_mode为1,并重启
  4. device 重启进入uboot过程中会读取enter_dfu_mode变量的值,当为1时,执行相应的dfu命令(例dfu 0 ram 0)
    进入dfu模式并等待升级
  5. 用户通过DFU-util工具发送firmware 到对应配置分区
  6. device 收到数据包并写入相应配置分区
  7. 当升级完毕,用户使用DFU-util工具重启device
  8. device 收到重启命令,配置环境变量enter_dfu_mode为0,并重启进入linux,配置模式为runtime
    用户配置dfu流程:
  9. 编译生成fw_setenv,以便支持linux下配置uboot环境变量
    i. 使用uboot编译生成fw_setenv,并拷贝到linux 文件系统中的/etc目录
    make env; ln -sf fw_printenv fw_setenv
    ii. 配置fw_env.config,并拷贝到linux 文件系统中/etc目录
  10. linux的配置以支持usbcam以及dfu
  11. uboot的配置以支持dfu功能
  12. 设置uboot环境变量
    i. 分区表变量 dfu_alt_info
    ii. 缓存大小配置 dfu_bufsiz

linux 内核配置

需要在配置完webcam的基础上增加配置,具体配置方法参考:usbcam 配置
在linux kernl目录执行:make menuconfig ,并找到对应的配置:

 -> Device Drivers
 			  -> USB support
     					-> USB Gadget Support
       							-> USB Gadget Drivers
        							 -> USB Webcam Gadget
          									-> Include configuration with (DFU)

在这里插入图片描述

编译完成会在linux/modules 目录生成对应的驱动:usb_f_dfu.ko
在装载阶段需要在 g_webcam.ko 后面增加参数:insmod g_webcam.ko dfu_function_enable=1
编译完成会在linux/modules 目录生成对应的驱动:usb_f_dfu.ko
在装载阶段需要在 g_webcam.ko 后面增加参数:insmod g_webcam.ko dfu_function_enable=1

Uboot 相关配置

需要在基础配置上添加相应的配置,可以在uboot目录执行:./list_config.sh 查看相应配置
在uboot 目录执行:make menuconfig , 并找到对应配置:
首先配置出uboot cmdline下 dfu 命令:

-> Command line interface
  -> USB commands
    -> dfu

在这里插入图片描述

-> Device Drivers
  -> DFU support
    -> Enable USB DFU gadget
添加RAM支持:
-> Device Drivers
  -> DFU support
    -> RAM back end for DFU
添加SPI NorFlash支持:
-> Device Drivers
  -> DFU support
    -> SPI flash back end for DFU
添加NAND Flash支持:
-> Device Drivers
  -> DFU support
    -> NAND back end for DFU

在这里插入图片描述

DFU模式以及DFU-util 的使用

  1. Uboot 配置环境变量:
    1. dfu_bufsiz
  2.  用户缓存用户数据的buff大小, 需要32 byte对齐(cacheline)
    
  3.  setenv dfu_bufsiz 0x320000
    
    1. dfu_alt_info
  4.  用于配置分区的变量, host仅支持已经配置的分区,可以使用DFU-util 烧写相应分区:
    
  5.  i. 配置Dram:dfu_alt_info=name ram offset size
    
  6.    例:
    
  7.      配置一个RAM分区:setenv dfu_alt_info "block ram 0x21000000 0x100000"
    
  8.      配置两个RAM分区:setenv dfu_alt_info "block ram 0x21000000 0x100000\;block2 ram 0x22000000 0x100000"
    
  9. ii. 配置Nor Flash:dfu_alt_info=name raw offset size
    
  10.   例:
    
  11.      配置两个Nor分区:setenv dfu_alt_info "rootfs raw 0x00250000 0x00400000\;IPL raw 0x00000000 0x00010000"
    
  12. iii. 配置Nand Flash
    
  13.   配置Nand普通分区:
    
  14.      方式一:dfu_alt_info=name raw offset len
    
  15.             例:setenv dfu_alt_info "IPL0 raw 0x00140000 0x000c0000;IPL_CUST0 raw 0x00200000 0x00060000"
    
  16.      方式二:dfu_alt_info=name part nandNum partNum
    
  17.             例:setenv dfu_alt_info "IPL0 part 0 1;IPL_CUST0 part 0 2"
    
  18.      可以通过mtdparts查找对应分区号:注意实际分区号需加1,譬如IPL0分区号为0, 实际传入参数则为1
    
  19.             SigmaStar # mtdparts 
    
  20.             device nand0 <nand0>, # parts = 10
    
  21.             #: name		size		offset		mask_flags
    
  22.             0: IPL0                0x000c0000	0x00140000	0
    
  23.             1: IPL_CUST0           0x00060000	0x00200000	0
    
  24.             2: IPL_CUST1           0x00060000	0x00260000	0
    
  25.             3: UBOOT0              0x00060000	0x002c0000	0
    
  26.             4: UBOOT1              0x00060000	0x00320000	0
    
  27.             5: ENV0                0x00040000	0x00380000	0
    
  28.             6: KERNEL              0x00500000	0x003c0000	0
    
  29.             7: RECOVERY            0x00500000	0x008c0000	0
    
  30.             8: rootfs              0x00600000	0x00dc0000	0
    
  31.             9: UBI                 0x06c40000	0x013c0000	0
    
  32.   配置Nand UBI分区:
    
  33.      方式一:dfu_alt_info=name partubi nandNum partNum
    
  34.            例:setenv dfu_alt_info "UBI partubi 0 10"
    
  35.            注意: 该方式无法区分UBI分区下的具体volume,要求烧写的firmware包含ubi分区表信息?
    
  36.      方式二:dfu_alt_info=name partubi-e part volume
    
  37.            例:setenv dfu_alt_info miservice partubi-e UBI miservice
    
  38.            注意:该方式为新增方式,非uboot原生:part指代mtd具体分区名,volume为ubi分区下的volume
    
    1. enter_dfu_mode
  39. device设备转换模式时自动配置,当值为1时,系统重启进入uboot dfu模式
    
  40. 0->1: runtime--->dfu
    
  41. 1->0: dfu--->runtime
    
  42. 注:
  43. 1. 在uboot命令行可以执行如下命令设置环境变量: setenv 变量名 变量值
    
  44.    在修改完环境变量需要使用命令进行保存:saveenv
    
  45. 2. linux 配置需要有fw_setenv工具,该工具由uboot编译获得,可以通过fw_env.config配置分区信息,
    
  46.    可将工具放置到以下目录"/bin", "/usr/bin", "/config", "/sbin", "/customer", "/etc"。
    
  47.    fw_env.config 文件默认存放到/etc目录。
    
  48. Uboot执行DFU
  49. 程序使用帮助:
  50. Usage:
  51. dfu <USB_controller> [list]
    • device firmware upgrade via <USB_controller>
  52. on device <dev>, attached to interface
    
  53. <interface>
    
  54. [list] - list available alt settings
    
  55. 目前uboot仅支持一个interface,需要从ram,nor flash, nand flash, mmc中选择一个:
    1. 启动 ram 0 支持:
  56. dfu 0 ram 0
    
    1. 启动 nor flash 0 支持:
  57. dfu 0 sf 0:0
    
    1. 启动 nand flash 0 支持:
  58. dfu 0 nand 0
    
  59. dfu的执行时机:
  60. 在uboot启动阶段,程序会读取enter_dfu_mode环境变量,当为1时,uboot会执行相应dfu命令:见update_dfu(common/main.c)
  61. 也可以在uboot命令行执行命令进入。
  62. DFU-util DFU-util 是一个host端开源软件,可以对支持dfu功能的设备进行升级:dfu-util
  63. DFU-Util 帮助手册:
  64. Usage: dfu-util [options] …
  65. -h --help Print this help message
  66. -V --version Print the version number
  67. -v --verbose Print verbose debug statements
  68. -l --list List the currently attached DFU capable USB devices
  69. -e --detach Detach the currently attached DFU capable USB devices
  70. -d --device vendor:product Specify Vendor/Product ID of DFU device
  71. -p --path bus-port. … .port Specify path to DFU device
  72. -c --cfg config_nr Specify the Configuration of DFU device
  73. -i --intf intf_nr Specify the DFU Interface number
  74. -a --alt alt Specify the Altsetting of the DFU Interface
  75.                         by name or by number
    
  76. -t --transfer-size Specify the number of bytes per USB Transfer
  77. -U --upload file Read firmware from device into
  78. -D --download file Write firmware from into device
  79. -R --reset Issue USB Reset signalling once we’re finished
  80.  -s --dfuse-address address    ST DfuSe mode, specify target address for
    
  81.                                raw file download or upload. Not applicable for
    
  82.                                DfuSe file (.dfu) downloads
    
  83. 命令事例:
    1. 让设备重启到DFU模式:
  84.    DFU-Util -e
    
    1. 下载bin档案到对应配置分区并重启到runtime模式:
  85.    DFU-Util -R -D Image.bin --alt 0
    
  86. DFU 版本号获取方法
  87. 通过USB interface string 来获取版本号:
  88. device配置:
  89. insmod f_dfu.ko version_file=path (默认/customer/version_info)
  90. 将版本信息放入文件
  91. host获取方法:
  92. DFU-util -l
参考: usb dfu 官方文档
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值