USBCAM补充说明
1. Usbcam 开启RNDIS功能说明¶
-
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
-
将如下ko copy到板子的/customer下
u_ether.ko usb_f_rndis.ko dwc3.ko g_webcam.ko
-
修改
/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
-
重启板子,运行UVC demo
-
设置板子ip
ifconfig usb0 up ifconfig usb0 192.168.1.1 netmask 255.255.0.0
-
若PC端无法识别RNDIS,请重新安装驱动,步骤如下:
设备管理器->更新驱动程序->浏览我的计算机以查找驱动程序文件->让我从计算机上的可用驱动列表中选取->网络适配器->厂商选择:Microsoft 型号选择:远程NDIS兼容设备
-
PC端的虚拟网卡设置与板子同样的IP网段,测试能否互相ping通。
2. USBCAM默认格式信息设置说明¶
下面的修改是将MJPEG 1080P格式信息的顺序设为第一项,以使PC端的Potplayer、window相机等应用的默认USBCAM的格式为MJPEG 1080P。
-
修改kernel中的文件:kernel/ drivers/usb/gadget/legacy/webcam.c
- 将MJPEG格式信息的索引顺序设为1,NV12的设为2,如下:
图2-1
- 将MJPEG格式信息数组中的1080P和240P互换,如下:
图2-2
- 互换MJPEG和NV12在格式信息描述符中的位置:
图2-3
修改完之后更新板子上的g_webcam.ko即可。
-
修改
sdk/verify/mi_demo/common/uvc/st_uvc_datatype.h
文件中的,MJPEG在格式信息数组uvc_formats中的顺序,如下:图2-4
修改完后重新编译prog_uvc.
3. USBCAM添加修改分辨率信息说明¶
3.1. 添加分辨率¶
以添加NV12 640*360分辨率为例,具体修改如下:
-
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,
-
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, }, }, };
-
保存修改,重新编译kernel和uvc demo,更新
g_webcam.ko
和prog_uvc
到板子上,重启后,跑UVC,即可看到NV 12 640*360的格式信息,如下:图3-1
3.2. 修改帧率信息¶
如下是举例将MJPEG 1080P和720P的帧率信息由30fps改为20fps.
-
kernel/drivers/usb/gadget/legacy/webcam.c
图3-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. 升级操作步骤¶
-
编译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
-
将USBdownloadTool文件夹的全部文件拷到将要烧录的images路径下,如
图4-5
-
双击USBDownloadTool.exe启动工具, 点击中间的按钮连接板子并开始烧录
图4-6
4.3. 空片升级说明:(以Macaron为例)¶
-
编译uboot并开启auto ufu,然后把生成的u-boot.mz.img.bin放到USBDownloadTool.exe同一个目录下,重命名为u-boot.bin
-
把要烧写的images/* 放到USBDownloadTool.exe同一个目录下,已经存在了测试的images,可以直接替换掉即可
-
空片升级需要把boot-strapping跳到ROM USB boot mode,升级完后再跳回nor flash boot重新上电启动
-
升级的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
注:
-
USBDownloadTool.exe
不支持xz格式,只支持非压缩和mz格式,所以编译出来要用u-boot.mz.img.bin
-
避免升级完后再次进入auto ufu模式,升级的images中
u-boot.xz.img.bin
文件需要关闭auto ufu, -
usb\_updater.bin
文件为Macaron或Pretzel使用,如是Pudding或Ispahan使用,把USB\_UPD\_SSC33X
替换为usb\_updater.bin
即可。
-