SSD_USB Device升级(onebin)
1. 概述¶
适用IKAYAKI_DLM00V015及之后的版本,之前版本需要打相关patch。
1.1. 升级方式类别¶
- 
空片模式usb device升级 
- 
uboot模式usb device升级 
- 
kernel模式usb device升级(uvc模式) 
- 
kernel模式usb device升级(U盘模式) 
1.2. 测试环境¶
pcb:ssd212 demo board
内核配置:pioneer3_spinand_defconfig
project配置:dispcam_p3_spinand.glibc-9.1.0-s01a.64.qfn128.demo_defconfig
usbtool:usb factory tool (v1.0.0.4)
2. 空片模式usb device升级¶
需求场景:已有完整pcb,有usb 接口,但是nandflash或norflash里面为空。
实现原理:IC上电先执行rom code,然后根据外部硬件配置跳转到flash/emmc/sdmmc中执行IPL,没有找到IPL资料,系统自动进入ufu的升级模式。通过pc tool 预加载u-boot.bin。
此模式下要求:预加载的u-boot.bin 本身具备ufu升级能力。
操作步骤:
- 
uboot配置  将编译生成的u-boot_spinand.img.bin 或u-boot.img.bin 替换到 /project/board/p3/boot/usb/upgrade下对应的bin档 (仅仅用作空片引导)。  针对emmc/sdmmc,编译了对应的u-boot.img.bin后,参考rootfs_dispcam.mk (搜索add for usb factory upgrade tool)做修改。 
- 
按正常流程编译整包sdk,生成image升级文件。 
- 
整包sdk编译成功后,执行make_usb_factory_sigmastar.sh脚本,可以选择全部升级和部分分区升级:  执行成功后在project\image\output\images目录生成SstarUsbImage_xxxx(date).bin空片升级包 
- 
下载工具包 (当前版本V1.0.0.4) 
- 
空片模式上电,接入usb。可以观察到pc上有接入存储设备  
- 
PC通过usbhub连接需要升级的板子(板子flash必须为空片),打开USB Factory Tool.exe,显示如下:  图上各个ICON功能如下: 1→升级开始和停止的按钮,需要注意的是停止按钮必须等接上的所有设备升级成功后才能按下; 2→升级包选择按钮:用来选择usb空片的升级包文件; 3→usb设备升级状态和结果显示栏,需要注意的是目前空片升级有两个状态:准备和升级。必须等升级状态成功后才能拔掉usb设备插上另一个usb设备进行升级; 4→显示目前识别到的usb设备 5→Usb设备插入显示状态log 
- 
选择好usb升级包文件,等插上的所有设备都识别到后,点击start按钮进行升级,升级完成后的界面如下:  图上各个ICON功能如下: 1→显示每个设备升级的结果; 2→显示每个设备升级的log; 3→显示连接的所有设备个数以及升级的状态; 4→显示检测到的usb设备,需要注意的是升级成功后检测到的usb设备会被移除 根据1→显示的每个设备的升级状态,进行如下操作: 升级成功:拔掉对应的设备,插上另一块空片继续进行升级; 升级失败:可以尝试插拔一下设备重新 升级看是否ok 
- 
如果不想插入板子识别到设备后自动进行升级,可以选择manual模式,升级方式跟auto差不多,只是要在升级前选中需要升级的设备,然后再点击start进行升级:  
3. uboot模式usb device升级¶
需求场景:已有完整pcb,有usb 接口,确保系统可进入uboot模式
实现原理: flash/emm/sdmmc里面已经有uboot。且此份uboot支持device模式下接pc升级,通过执行uboot和pc软件进行交互,完成下载升级。
此模式下要求:uboot 本身具备ufu升级能力。
操作步骤:
- 
配置uboot  支持ufu升级,但是不开启自动运行。 
- 
将uboot烧录入flash。此boot具有ufu升级能力。 如果需要在uboot来使用usb device升级功能,需要在boot模式下设定如下参数,开机会进入device升级模式。 setenv ota_upgrade_status 1 saveenv 
- 
重启板子进入uboot会停在如下位置:  
- 
打开usb factory tool就可以识别到设备,然后按照上面空片升级方式进行升级即可 
4. kernel模式usb device升级(uvc模式)¶
此处分为两部分:内核配置和应用程序
实现原理:板端会配置为uvc模式。通过应用pc tool 下命令到板端的应用程序。之后设置环境变量,最终利用uboot下的ufu升级功能完成升级。
在验证kernel下的usb 升级的时候,首先要确保uboot下可以正常使用usb device升级。
此模式要求:
- 
uboot支持ufu升级。参考3. uboot模式usb device升级 
- 
内核配置uvc模式 
- 
需要有应用程序mi_uvc 
4.1. 内核配置¶
在现有配置基础上增加uvc的配置可以通过以下两种方式:
方式一(推荐):直接修改当前平台的默认配置。
添加以下配置: CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_CONTROLLER=y CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_MEDIA_SUBDRV_AUTOSELECT=y CONFIG_USB_GADGET=m CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 CONFIG_USB_GADGET_SSTAR_DEVICE=m CONFIG_USB_AVOID_SHORT_PACKET_IN_BULK_OUT_WITH_DMA_FOR_ETHERNET=y CONFIG_USB_LIBCOMPOSITE=m CONFIG_SS_GADGET=m CONFIG_USB_F_UVC=m CONFIG_USB_G_WEBCAM=m CONFIG_USB_WEBCAM_UVC=y CONFIG_MULTI_STREAM_FUNC_NUM=1
方式二:
1. 使用当前平台的默认配置
    >> make pioneer3_xxxx_defconfig
2. 添加配置:make menuconfig
    a. media 框架配置
    -> Device Drivers
        -> Multimedia support
    -> Device Drivers
        -> Multimedia support
            -> Cameras/video grabbers support
    -> Device Drivers
        -> Multimedia support
            -> Media Controller API
    输出模块: media.ko videodev.ko v4l2-common.ko
    b. usb Gadget 框架配置
    -> Device Drivers
        -> USB support
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
    输出模块:usb-common.ko udc-core.ko
    c. udc 驱动配置:该模块为硬件ip相关模块,视具体情况进行配置
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
                -> USB Peripheral Controller
                    -> Sstar USB 2.0 Device Controller
    输出模块:udc-msb250x.ko
    d. gadget webcam
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
                -> USB Gadget Drivers
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
                -> USB Gadget Drivers
                    -> USB Webcam Gadget
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
                -> USB Peripheral Controller
                    -> Sstar USB 2.0 Device Controller
                        -> Avoid short packet in bulk out with DMA for ethernet
    输出模块:libcomposite.ko videobuf2-core.ko videobuf2-v4l2.ko videobuf2-memops.ko videobuf2-vmalloc.ko usb_f_uvc.ko g_webcam.ko
project配置,因目前没有添加UVC相关配置,所以编译uvc功能时需手动修改以下两个文件:
- 
若是在kernel配置中使用方式二配置则需修改project/makefile文件,注释掉image目标下的$(MAKE) linux-kernel,以免重新编译kernel覆盖了之前手动编译的kernel; 
- 
project/kbuild/customize/4.9.84/p3/dispcam/kernel_mod_list_late文件,修改为内容: media.ko videodev.ko v4l2-common.ko usb-common.ko #usbcore.ko #ehci-hcd.ko #scsi_mod.ko #usb-storage.ko videobuf2-core.ko videobuf2-v4l2.ko videobuf2-memops.ko videobuf2-vmalloc.ko udc-core.ko libcomposite.ko usb_f_uvc.ko udc-msb250x.ko g_webcam.ko streaming_maxpacket=3072 streaming_maxburst=13 uac_function_enable=0 
4.2. 应用程序¶
应用端执行程序:mi_uvc
核心代码:
case UVC_SET_CUR:
    if (cfg->bCmdCap & CAP_SET_CUR_CMD) {
      UVC_INFO("/etc/fw_setenv ota_upgrade_status 1\n");
      system("/etc/fw_setenv ota_upgrade_status 1");
      system("sleep 1");
      system("reboot");
      if (cfg->bInfoCap & INFO_AUTO_MODE_SUPPORT) {
      }
    }
    else {
      goto invalid_req;
    }
操作流程:
参考上述的方式编译kernel,更新 image后执行应用程序。
接入usb 到pc 后,执行usb factory tool 。板端收到uvc的cmd后,会重新设置env自动重启进入uboot升级模式。
参照空片升级模式下的步骤(步骤5之后)使用usb factory tool升级即可。
5. kernel模式usb device升级(U盘模式)¶
需求场景:没有使用uvc场景下。例如:u盘模式
实现原理: 默认情况下, usb factory tool 还是首先检测 device是不是 uvc, 如果是 uvc, 就跟上面 uvc 升级步骤一模一样; 如果不是 uvc, 才会使用到扩展升级。 为了支持扩展升级, usb factory tool 将会通过 EP0 下发自定义的 setup command 来取代 XU command, 通知板子进行升级。(注:特殊的 setup command 已添加到 usb gadget driver 中, 须更新到相应版本, 才能进行升级。此文件composite.c 有更新)
此模式要求:
- 
uboot本身具有ufu升级能力。 
- 
kernel 支持 u 盘模式。 
- 
使用usb factory tool。 
配置方式:
- 
uboot 配置,参考3. uboot模式usb device升级 
- 
kernel 支持usb device mass storage 功能 
驱动配置方法:
1. usb Gadget 框架配置
    -> Device Drivers
        -> USB support
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
    输出模块:usb-common.ko udc-core.ko
2. 配置支持configfs
    -> Device Drivers
        -> USB Gadget Support
            -> USB functions configurable through configfs
    如果配置成模块,需要安装对应驱动:libcomposite.ko
3. 芯片ip相关驱动
例如:USB device2.0 驱动
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
                -> USB Peripheral Controller
                    -> Sstar USB 2.0 Device Controller
    生成驱动: udc-msb250x.ko
4. usb function相关驱动
需要到以下位置配置子选项:(需要处理 function 所需依赖问题)
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
                -> USB functions configurable through configfs
5. mass storage
    -> Device Drivers
        -> USB support 
            -> USB Gadget Support 
                -> USB Gadget Drivers 
                    -> Mass Storage Gadget
    生成模块:usb_f_mass_storage.ko
配置如图:




在project/kbuild/customize/4.9.84/p3/dispcam/kernel_mod_list_late修改为:
usb-common.ko udc-core.ko libcomposite.ko udc-msb250x.ko usb_f_mass_storage.ko
操作流程:
- 
更新image 
- 
确认加载上面5个ko文件 
- 
执行脚本,配置u盘参数 建立文件:dd if=/dev/zero of=/customer/disk.img bs=1M count=20 ./usb_storage.sh 
- 
执行升级脚本 ./fwupdated & 
- 
参照空片升级模式下的步骤(步骤5之后)使用usb factory tool升级即可。 
6. 无法升级注意事项¶
- 
首先确保空片下也可以正常升级,否则查硬件。 
- 
其次确保可以在uboot下完成升级。否则检查硬件和uboot配置。 
- 
在kernel 模式下可以正常接收uvc tool的升级命令(可以重启进入uboot升级模式)。确保执行有执行mi_uvc。 
- 
如果pc上检测到多个uvc设备,请禁用pc上camera设备。 
参考资料:
7. 使用过程中可能遇到的问题¶
使用SD卡/SDNAND 代替spinor/spinand的方案时,使用工具会弹出提示需要格式化的窗口,现象如下图:

解决办法:
- 
Win10系统的话关闭U盘自动播放 https://jingyan.baidu.com/article/acf728fd6f27bdf8e510a38b.html 
- 
Win7系统的话,还需要关闭Shell Hardware Detection服务 点开始——在运行框中输入services.msc,按回车键; 找到Shell Hardware Detection服务,双击; 首先停止服务,然后启动类型选择禁用,点确定。