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服务,双击;
首先停止服务,然后启动类型选择禁用,点确定。