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升级能力。

操作步骤:

  1. 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)做修改。

  2. 按正常流程编译整包sdk,生成image升级文件。

  3. 整包sdk编译成功后,执行make_usb_factory_sigmastar.sh脚本,可以选择全部升级和部分分区升级:

    执行成功后在project\image\output\images目录生成SstarUsbImage_xxxx(date).bin空片升级包

  4. 下载工具包 (当前版本V1.0.0.4)

  5. 空片模式上电,接入usb。可以观察到pc上有接入存储设备

  6. PC通过usbhub连接需要升级的板子(板子flash必须为空片),打开USB Factory Tool.exe,显示如下:

    图上各个ICON功能如下:

    1→升级开始和停止的按钮,需要注意的是停止按钮必须等接上的所有设备升级成功后才能按下;

    2→升级包选择按钮:用来选择usb空片的升级包文件;

    3→usb设备升级状态和结果显示栏,需要注意的是目前空片升级有两个状态:准备和升级。必须等升级状态成功后才能拔掉usb设备插上另一个usb设备进行升级;

    4→显示目前识别到的usb设备

    5→Usb设备插入显示状态log

  7. 选择好usb升级包文件,等插上的所有设备都识别到后,点击start按钮进行升级,升级完成后的界面如下:

    图上各个ICON功能如下:

    1→显示每个设备升级的结果;

    2→显示每个设备升级的log;

    3→显示连接的所有设备个数以及升级的状态;

    4→显示检测到的usb设备,需要注意的是升级成功后检测到的usb设备会被移除

    根据1→显示的每个设备的升级状态,进行如下操作:

    升级成功:拔掉对应的设备,插上另一块空片继续进行升级;

    升级失败:可以尝试插拔一下设备重新 升级看是否ok

  8. 如果不想插入板子识别到设备后自动进行升级,可以选择manual模式,升级方式跟auto差不多,只是要在升级前选中需要升级的设备,然后再点击start进行升级:


3. uboot模式usb device升级

需求场景:已有完整pcb,有usb 接口,确保系统可进入uboot模式

实现原理: flash/emm/sdmmc里面已经有uboot。且此份uboot支持device模式下接pc升级,通过执行uboot和pc软件进行交互,完成下载升级。

此模式下要求:uboot 本身具备ufu升级能力。

操作步骤:

  1. 配置uboot

    支持ufu升级,但是不开启自动运行。

  2. 将uboot烧录入flash。此boot具有ufu升级能力。

    如果需要在uboot来使用usb device升级功能,需要在boot模式下设定如下参数,开机会进入device升级模式。

    setenv ota_upgrade_status 1
    
    saveenv
    
  3. 重启板子进入uboot会停在如下位置:

  4. 打开usb factory tool就可以识别到设备,然后按照上面空片升级方式进行升级即可


4. kernel模式usb device升级(uvc模式)

此处分为两部分:内核配置和应用程序

实现原理:板端会配置为uvc模式。通过应用pc tool 下命令到板端的应用程序。之后设置环境变量,最终利用uboot下的ufu升级功能完成升级。

在验证kernel下的usb 升级的时候,首先要确保uboot下可以正常使用usb device升级。

此模式要求:

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功能时需手动修改以下两个文件:

  1. 若是在kernel配置中使用方式二配置则需修改project/makefile文件,注释掉image目标下的$(MAKE) linux-kernel,以免重新编译kernel覆盖了之前手动编译的kernel;

  2. 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. 应用程序

源码参考:myuvc_remove_media.zip

应用端执行程序: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。

配置方式:

驱动配置方法:

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

操作流程:

  1. 更新image

  2. 确认加载上面5个ko文件

  3. 执行脚本,配置u盘参数

    建立文件:dd if=/dev/zero of=/customer/disk.img bs=1M count=20

    ./usb_storage.sh
    
  4. 执行升级脚本

    ./fwupdated &
    
  5. 参照空片升级模式下的步骤(步骤5之后)使用usb factory tool升级即可。


6. 无法升级注意事项

  • 首先确保空片下也可以正常升级,否则查硬件。

  • 其次确保可以在uboot下完成升级。否则检查硬件和uboot配置。

  • 在kernel 模式下可以正常接收uvc tool的升级命令(可以重启进入uboot升级模式)。确保执行有执行mi_uvc。

  • 如果pc上检测到多个uvc设备,请禁用pc上camera设备。

参考资料:

myuvc_remove_media.zip

usbotg.zip


7. 使用过程中可能遇到的问题

使用SD卡/SDNAND 代替spinor/spinand的方案时,使用工具会弹出提示需要格式化的窗口,现象如下图:

解决办法:

  • Win10系统的话关闭U盘自动播放 https://jingyan.baidu.com/article/acf728fd6f27bdf8e510a38b.html

  • Win7系统的话,还需要关闭Shell Hardware Detection服务

    点开始——在运行框中输入services.msc,按回车键;

    找到Shell Hardware Detection服务,双击;

    首先停止服务,然后启动类型选择禁用,点确定。