基于IPC kernel配置启用UVC

Version 1.0


1. 概述

本文主要介绍如何在IPC配置的基础上打开UVC相关的配置来使用USBCAM的功能。

建议使用前先将usbcam固件烧录到对应开发板,然后参考UVC APP说明,查看能否正常识别设备并出图。


2. kernel配置

根据具体使用的平台,操作对应的kernel配置文件。

以338Q平台为例:

kernel$ declare -x ARCH="arm";declare -x CROSS_COMPILE=" arm-linux-gnueabihf-9.1.0-"
kernel$ make infinity6e_ssc012b_s01a_spinand_defconfig //可以通过./list_config.sh查看配置文件
kernel$ make menuconfig

3. 添加media框架配置

-> Device Drivers
    -> Multimedia support

-> Device Drivers
    -> Multimedia support
        -> Cameras/video grabbers support
            -> Media Controller API

输出模块: media.ko videodev.ko v4l2-common.ko


4. 添加USB Gadget 框架配置

-> Device Drivers
    -> USB support (如果已选,请忽略)

-> Device Drivers
    -> USB support
        -> USB Gadget Support  (倒数第二项)

输出模块:usb-common.ko udc-core.ko


5. 添加UDC驱动配置

该模块为硬件IP模块,视具体平台支持情况(USB2.0 or USB 3.0)进行配置

  1. USB 2.0驱动

    -> Device Drivers
        -> USB support
            -> USB Gadget Support
                -> USB Peripheral Controller
                    -> Sstar USB 2.0 Device Controller
    

    输出模块:udc-msb250x.ko

  2. USB 3.0驱动

    输出模块:dwc3.ko

gadget webcam:

-> Device Drivers
    -> USB support
        -> USB Gadget Support
            -> USB Gadget Drivers (输入“M”选择)
                -> USB Webcam Gadget

输出模块:libcomposite.ko videobuf2-core.ko videobuf2-v4l2.ko videobuf2-memops.ko videobuf2-vmalloc.ko usb_f_uvc.ko g_webcam.ko


6. 编译kernel

保存配置退出后编译kernel

kernel$ make clean;make -j8

7. 更新文件

  1. 更新kernel(必做,否则某些ko会因为找不到某些symbol而无法insmod)

    板子预先烧好IPC的固件,然后用kernel/arch/arm/boot/uImage.xz替换image的kernel文件,有网络的情况下,在uboot下通过如下的命令升级更新kernel;没有网络,则可以通过USBDownload Tool工具进行升级。

    SigmaStar # estar scripts/[[kernel.es
    

    升级完成后reset重启进入系统。

  2. 在kernel/modules/目录下找到如下ko并全部copy到板子上

    例如放在板子上的/config/modules/4.9.84/目录下。

    media.ko
    
    videodev.ko
    
    v4l2-common.ko
    
    usb-common.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
    
  3. 修改板子上的/customer/demo.sh文件insmod中所有的ko。因为模块之间具有相应依赖的关系,配置与加载都要有一定的先后顺序

    可直接参考copy如下内容:

    insmod /config/modules/4.9.84/media.ko
    insmod /config/modules/4.9.84/videodev.ko
    insmod /config/modules/4.9.84/v4l2-common.ko        
    insmod /config/modules/4.9.84/usb-common.ko
    insmod /config/modules/4.9.84/videobuf2-core.ko
    insmod /config/modules/4.9.84/videobuf2-v4l2.ko
    insmod /config/modules/4.9.84/videobuf2-memops.ko
    insmod /config/modules/4.9.84/videobuf2-vmalloc.ko
    insmod /config/modules/4.9.84/udc-core.ko
    insmod /config/modules/4.9.84/libcomposite.ko
    insmod /config/modules/4.9.84/usb_f_uvc.ko
    insmod /config/modules/4.9.84/udc-msb250x.ko
    insmod /config/modules/4.9.84/g_webcam.ko streaming_maxpacket=3072
    

    修改完后重启设备,如果是出现某些ko因为已经存在而无法insmod的错误提示,例如

    “insmod: can't insert '/config/modules/4.9.84/usb-common.ko': File exists”则不用管。如果是其他原因insmod出错,例如找不到symbol,那么就要确认是不是kernel没有成功更新,或者是少了某个ko。若没有其他错误则进行下一步。


8. 编译UVC APP

修改sdk/verify/mi_demo/source/Makefile,注释#ifneq ($(filter usbcam%, $(PRODUCT)), )#endif

如果整个工程没有编译过,则要先编译一次,例如:

project$ ./setup_config.sh ./configs/ipc/i6e/spinand.glibc-9.1.0-squashfs.012b.256.qfn128
project$ make clean;make image -j8

编译完成之后,后续如果想单独编uvc app,则可以到sdk/verify/mi_demo/source目录下,执行make uvc即可,可执行文件生成在 sdk/verify/mi_demo/out/demo/app/prog_uvc


9. 运行UVC APP

将8中uvc可执行文件放到板子上, 例如/customer下(记得要chmod 777 prog_uvc),在串口终端输入如下命令运行app:

/customer# ./prog_uvc –A0

注意: prog_uvc可以带一些参数,例如-A选择sensor输入的分辨率选项,具体可带哪些参数可以查看source code, 或者通过prog_uvc -h查看。

至此,host可打开usbcam设备预览图像。如果host无法识别设备或者无法出图,那么请按如下步骤确认:

  1. UVC APP运行是否error;

  2. sensor ko是否正确;

  3. 确认硬件(主要是USB线),板子的USB座子等是否正确。

    可使用板子烧一版usbcam的image,如果UVC APP运行无error,但无法识别设备或无法出图,则硬件存在问题,可以更换USB线或者请硬件工程师确认问题。