USBCAM补充说明


1. Usbcam 开启RNDIS功能说明

  1. kernel 打开rndis功能

    declare -x ARCH="arm"; 
    declare -x CROSS_COMPILE="arm-linux-gnueabihf-9.1.0-"
    make infinity6e_ssc013a_s01a_usbcam_defconfig (for nor flash)
    make menuconfig
    

    > Device Drivers > USB support > USB Gadget Support

    图1-1

    make clean;make –j8
    
  2. 将如下ko copy到板子的/customer下

    u_ether.ko
    usb_f_rndis.ko
    dwc3.ko
    g_webcam.ko
    
  3. 修改/customer/demo.sh insmod如上ko,并注释掉usb 2.0的ko :

    insmod /customer/u_ether.ko            
    insmod /customer/usb_f_rndis.ko  maxpacket=64
    insmod /customer/dwc3.ko assume_high_speed=1 
    insmod /customer/g_webcam.ko streaming_maxpacket=3072 uac_function_enable=0 rndis_function_enable=1
    
  4. 重启板子,运行UVC demo

  5. 设置板子ip

    ifconfig usb0 up
    ifconfig usb0 192.168.1.1 netmask 255.255.0.0
    
  6. 若PC端无法识别RNDIS,请重新安装驱动,步骤如下:

    设备管理器->更新驱动程序->浏览我的计算机以查找驱动程序文件->让我从计算机上的可用驱动列表中选取->网络适配器->厂商选择:Microsoft 型号选择:远程NDIS兼容设备

  7. PC端的虚拟网卡设置与板子同样的IP网段,测试能否互相ping通。


2. USBCAM默认格式信息设置说明

下面的修改是将MJPEG 1080P格式信息的顺序设为第一项,以使PC端的Potplayer、window相机等应用的默认USBCAM的格式为MJPEG 1080P。

  1. 修改kernel中的文件:kernel/ drivers/usb/gadget/legacy/webcam.c

    1. 将MJPEG格式信息的索引顺序设为1,NV12的设为2,如下:

    图2-1

    1. 将MJPEG格式信息数组中的1080P和240P互换,如下:

    图2-2

    1. 互换MJPEG和NV12在格式信息描述符中的位置:

    图2-3

    修改完之后更新板子上的g_webcam.ko即可。

  2. 修改sdk/verify/mi_demo/common/uvc/st_uvc_datatype.h文件中的,MJPEG在格式信息数组uvc_formats中的顺序,如下:

    图2-4

    修改完后重新编译prog_uvc.


3. USBCAM添加修改分辨率信息说明

3.1. 添加分辨率

以添加NV12 640*360分辨率为例,具体修改如下:

  1. Kernel部分,修改前后的差异如下:

    --- a/drivers/usb/gadget/legacy/webcam.c
    +++ b/drivers/usb/gadget/legacy/webcam.c
    @@ -463,7 +463,7 @@ static const struct uvc_format_uncompressed uvc_format_nv12 = {
            .bDescriptorType        = USB_DT_CS_INTERFACE,
            .bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED,
            .bFormatIndex           = 1,
    -       .bNumFrameDescriptors   = 4, //修改分辨率的数量,增加几个就在原有的基础上加
    +       .bNumFrameDescriptors   = 5,// 几,现在添加一个,该值由原来的4修改为5
            .guidFormat             =
                    { 'N',  'V',  '1',      '2', 0x00, 0x00, 0x10, 0x00,
                    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71},
    @@ -542,12 +542,33 @@ static const struct UVC_FRAME_UNCOMPRESSED(3) uvc_frame_nv12_1080p = {
            .dwFrameInterval[1] = cpu_to_le32(666666),
            .dwFrameInterval[2] = cpu_to_le32(1000000),
    };
    +//添加640*360的分辨率信息
    +static const struct UVC_FRAME_UNCOMPRESSED(3) uvc_frame_nv12_360p = {
    +       .bLength                = UVC_DT_FRAME_UNCOMPRESSED_SIZE(3),
    +       .bDescriptorType        = USB_DT_CS_INTERFACE,
    +       .bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED,
    +       .bFrameIndex            = 5,
    +       .bmCapabilities         = 0,
    +       .wWidth                 = cpu_to_le16(640),
    +       .wHeight                = cpu_to_le16(360),
    +       .dwMinBitRate           = cpu_to_le32(640*360*1.5*8*10),
    +       .dwMaxBitRate           = cpu_to_le32(640*360*1.5*8*30),
    +       .dwMaxVideoFrameBufferSize      = cpu_to_le32(640*360*1.5),
    +       .dwDefaultFrameInterval         = cpu_to_le32(333333),
    +       .bFrameIntervalType = 3,
    +       .dwFrameInterval[0] = cpu_to_le32(333333),
    +       .dwFrameInterval[1] = cpu_to_le32(666666),
    +       .dwFrameInterval[2] = cpu_to_le32(1000000),
    +};
    +
    +
    //将640*360分辨率信息添加到分辨率信息数组中
    #define UVC_DESCRIPTOR_HEADERS_OF_NV12_FRAME \
            (const struct uvc_descriptor_header *) &uvc_format_nv12, \
            (const struct uvc_descriptor_header *) &uvc_frame_nv12_240p, \
            (const struct uvc_descriptor_header *) &uvc_frame_nv12_480p, \
            (const struct uvc_descriptor_header *) &uvc_frame_nv12_720p, \
    -       (const struct uvc_descriptor_header *) &uvc_frame_nv12_1080p,
    +       (const struct uvc_descriptor_header *) &uvc_frame_nv12_1080p, \ 
    +       (const struct uvc_descriptor_header *) &uvc_frame_nv12_360p,
    
  2. Demo部分,修改差异如下:

    --- a/verify/mi_demo/common/uvc/st_uvc_datatype.h
    +++ b/verify/mi_demo/common/uvc/st_uvc_datatype.h
    @@ -189,7 +189,8 @@ static const struct uvc_frame_info uvc_frames_nv12[] = {
        {  320, 240, { 333333, 666666, 1000000, 0 }, },
        {  640, 480, { 333333, 666666, 1000000, 0 }, },
        { 1280, 720, { 333333, 666666, 1000000, 0 }, },        
    +    {  640, 360, { 333333, 666666, 1000000, 0 }, },
        { 0, 0, { 0, }, },
    };
    
  3. 保存修改,重新编译kernel和uvc demo,更新g_webcam.koprog_uvc到板子上,重启后,跑UVC,即可看到NV 12 640*360的格式信息,如下:

    图3-1


3.2. 修改帧率信息

如下是举例将MJPEG 1080P和720P的帧率信息由30fps改为20fps.

  1. kernel/drivers/usb/gadget/legacy/webcam.c

    图3-2

  2. sdk/verify/mi_demo/common/uvc/st_uvc_datatype.h

    图3-3


3.3. 添加多路流的格式信息

修改kernel/drivers/usb/gadget/legacy/webcam.c

uvc_function_enable的值对应码流路数,在如下位置分别设置 uvc_fs_streaming_cls/ uvc_hs_streaming_cls/ uvc_ss_streaming_cls三个数组的值,并分别赋值相应的码流即可。

图3-4


4. USB Download Tool使用说明


4.1. 概述

USBDownload Tool可用于空片、uboot和系统下通过USB来升级软件,如下是对操作步骤作说明。

4.2. 升级操作步骤

  1. 编译uboot

    For spi-nor upgrading

    • make infinity6e_ufu_defconfig; make clean; make -j5; cp u-boot.img.bin u-boot.bin

    For spi-nand upgrading

    • make infinity6e_ufu_spinand_defconfig; make clean; make -j5; cp u-boot_spinand.img.bin u-boot.bin

    Output:

    u-boot.bin

    What is the difference in ufu_defconfig:

    • Enable UFU gadget config

    图4-1

    注意:如果选择Auto run ufu command in boot,那么u-boot就会启动跑进ufu停住,等待升级。此项用在空片升级才需要选(空片升级还需要usb_updater.bin文件),正常情况是不需要选上,否则会进不到kernel。

    若是需要在系统下升级则参考st_uvc_xu.c文件中添加如下修改:

    system("/etc/fw_setenv ota_upgrade_status 1");
    

    图4-2

    • Disable EMAC, for speed-up uboot booting

    图4-3

    Uboot用ISP tool或者SD卡更新到板子后,重启板子进到uboot,若uboot下有ufu命令说明uboot更新成功,输入ufu命令后即等待tool的连接和升级,如下:

    图4-4

  2. 将USBdownloadTool文件夹的全部文件拷到将要烧录的images路径下,如

    图4-5

  3. 双击USBDownloadTool.exe启动工具, 点击中间的按钮连接板子并开始烧录

    图4-6


4.3. 空片升级说明:(以Macaron为例)

  1. 编译uboot并开启auto ufu,然后把生成的u-boot.mz.img.bin放到USBDownloadTool.exe同一个目录下,重命名为u-boot.bin

  2. 把要烧写的images/* 放到USBDownloadTool.exe同一个目录下,已经存在了测试的images,可以直接替换掉即可

  3. 空片升级需要把boot-strapping跳到ROM USB boot mode,升级完后再跳回nor flash boot重新上电启动

  4. 升级的images需要修改分区脚本文件set_partition,修改内容如下:

    tftp 0x21000000 boot/MXP_SF.bin
    sf probe 0
    sf erase 0x20000 0x1000
    sf write 0x21000000  0x20000 ${filesize}
    # <- this is for comment / total file size must be less than 4KB
    mxp t.init
    tftp 0x21000000 boot/MXP_SF.bin
    mxp t.update 0x21000000
    mxp t.load
    sf probe 0
    sf erase 0x10000 0x1000
    sf write 0x21000000 0x10000 0x1000
    % <- this is end of file symbol
    

    注:

    1. USBDownloadTool.exe不支持xz格式,只支持非压缩和mz格式,所以编译出来要用u-boot.mz.img.bin

    2. 避免升级完后再次进入auto ufu模式,升级的images中u-boot.xz.img.bin文件需要关闭auto ufu,

    3. usb\_updater.bin文件为Macaron或Pretzel使用,如是Pudding或Ispahan使用,把USB\_UPD\_SSC33X替换为usb\_updater.bin即可。