全志V3S嵌入式驱动开发(USB camera驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        soc和mcu的一个重要区别,就是soc会涉及到大量的音视频操作,当然音视频也就包括了camera摄像头这部分。v3s本身支持csi接口和mipi csi2接口。但是两者不能同时使用,一份电路图,只能使用一种接口。另外,厂家对于两份接口的支持也是不同的,对于csi,官方soc文档中给出了主要的寄存器配置信息;而对mipi cs2则支持有限,只是一份介绍性的文档。

1、mipi csi2电路图

全志V3S嵌入式驱动开发(USB camera驱动)_第1张图片

         这是mipi csi2的驱动电路,整个结构还是很清楚的。CK_P & CK_N是时钟差分,D0_P & D0_N、D1_P & D1_N是数据差分。另外三个信号是MCLK、PWDN和RST。AVDD是电压信号,2.8V。上面这些都是数据通讯的信号线。控制信号线则比较简单,主要就是IIC接口,即SCK和SDA。

        电路上看camera接口还是比较简单的,几乎没有什么难度。而难点正是在于软件驱动的编写,而使用频率比较高的mipi csi2又没有相关的驱动支持,这就有点尴尬。除此之外,对于h264这样的编解码支持,目前文档上面体现的也不多,这也有点遗憾。

2、usb camera

        为了弥补camera的遗憾,同时可以让大家继续学习和了解camera,另外一个方向,大家可以试试usb camera。使用usb camera有几个好处,第一,本身linux kernel就对usb camera uvc支持,不需要做额外的工作,就可以适配很多的第三方摄像头;第二;相关的摄像头也比较容易采购,选择余地较多;第三,有了驱动之后,大家也方便对/dev/video0进行操作,进行图片的后续处理,或者相关视频的开发工作。

全志V3S嵌入式驱动开发(USB camera驱动)_第2张图片

3、设备树配置

        设备树的配置没有特别需要注意的。和usb host一样,它所要做的就是就是把usb_otg中的dr_mode修改为host,其他部分不需要则不做修改。

&usb_otg {
	dr_mode = "host";
	status = "okay";
};

        后续其他所有的usb设备,只要v3s是作为host访问,基本设备树这边的修改都是这样的。

4、uvc驱动的修改

        目前关于usb camera这部分的配置,主要位于drivers->Multimedia support这个部分,

全志V3S嵌入式驱动开发(USB camera驱动)_第3张图片

         自从内核从4.14.y升级到5.2.y之后,关于usb camera这部分驱动,默认已经配置好。因此对于我们来说,唯一需要修改的,就是把Multimedia support下面所有的M选项,修改成y选项。这也就是说明,相关的驱动代码没有被编译成单独的ko文件,而是集成在zImage里面。这主要是对于我们测试来说比较方便。修改之后,可以通过diff查看下,相关的内容是如何修改的,

2097,2098c2096,2097
< CONFIG_VIDEO_TUNER=y
< CONFIG_V4L2_FWNODE=y
---
> CONFIG_VIDEO_TUNER=m
> CONFIG_V4L2_FWNODE=m
2115c2114
< CONFIG_USB_VIDEO_CLASS=y
---
> CONFIG_USB_VIDEO_CLASS=m
2117c2116
< CONFIG_USB_GSPCA=y
---
> CONFIG_USB_GSPCA=m
2191,2192c2190,2191
< CONFIG_VIDEO_EM28XX=y
< CONFIG_VIDEO_EM28XX_V4L2=y
---
> CONFIG_VIDEO_EM28XX=m
> CONFIG_VIDEO_EM28XX_V4L2=m
2198c2197
< CONFIG_VIDEO_MUX=y
---
> CONFIG_VIDEO_MUX=m
2200c2199
< CONFIG_VIDEO_SUN6I_CSI=y
---
> CONFIG_VIDEO_SUN6I_CSI=m
2215c2214
< CONFIG_VIDEO_TVEEPROM=y
---
> CONFIG_VIDEO_TVEEPROM=m
2217,2221c2216,2220
< CONFIG_VIDEOBUF2_CORE=y
< CONFIG_VIDEOBUF2_V4L2=y
< CONFIG_VIDEOBUF2_MEMOPS=y
< CONFIG_VIDEOBUF2_DMA_CONTIG=y
< CONFIG_VIDEOBUF2_VMALLOC=y
---
> CONFIG_VIDEOBUF2_CORE=m
> CONFIG_VIDEOBUF2_V4L2=m
> CONFIG_VIDEOBUF2_MEMOPS=m
> CONFIG_VIDEOBUF2_DMA_CONTIG=m
> CONFIG_VIDEOBUF2_VMALLOC=m
2232c2231
< CONFIG_VIDEO_MSP3400=y
---
> CONFIG_VIDEO_MSP3400=m
2241,2242c2240,2241
< CONFIG_VIDEO_SAA711X=y
< CONFIG_VIDEO_TVP5150=y
---
> CONFIG_VIDEO_SAA711X=m
> CONFIG_VIDEO_TVP5150=m
2255,2256c2254,2255
< CONFIG_VIDEO_OV2640=y
< CONFIG_VIDEO_MT9V011=y
---
> CONFIG_VIDEO_OV2640=m
> CONFIG_VIDEO_MT9V011=m
3636c3635
< CONFIG_MULTIPLEXER=y
---
> CONFIG_MULTIPLEXER=m

        箭头<表示新添加的内容,箭头>表示删除的内容,大家灵活比较一下即可。

5、编译烧入文件

        因为dts和内核代码都发生了改变,所以我们需要分别生成dtb文件、zImage文件。等到编译完成之后,烧入即可。

6、开始测试

        所有的文件都准备之后,就可以开始准备测试了。测试可以分成三个部分,第一,当usb camera插入的时候,看看有没有具体的打印信息,

# [  101.038523] usb 1-1: new high-speed USB device number 2 using ehci-platform
[  101.283232] usb 1-1: New USB device found, idVendor=0bda, idProduct=9143, bcdDevice=20.22
[  101.291460] usb 1-1: New USB device strings: Mfr=3, Product=1, SerialNumber=2
[  101.298638] usb 1-1: Product: USB Camera
[  101.302573] usb 1-1: Manufacturer: RYS
[  101.306326] usb 1-1: SerialNumber: 200901010001
[  101.320010] uvcvideo: Found UVC 1.00 device USB Camera (0bda:9143)
[  101.347812] uvcvideo 1-1:1.0: Entity type for entity Realtek Extended Controls Unit was not initialized!
[  101.357392] uvcvideo 1-1:1.0: Entity type for entity Extension 4 was not initialized!
[  101.365273] uvcvideo 1-1:1.0: Entity type for entity Processing 2 was not initialized!
[  101.373224] uvcvideo 1-1:1.0: Entity type for entity Camera 1 was not initialized!
[  101.381864] input: USB Camera: USB Camera as /devices/platform/soc/1c1a000.usb/usb1/1-1/1-1:1.0/input/input1

        第二,查看对应的video设备节点有没有生成,

# ls -l /dev/video*
crw-------    1 root     root       81,   0 Jan  1 00:01 /dev/video0
crw-------    1 root     root       81,   1 Jan  1 00:01 /dev/video1

        第三,编写程序,对/dev/video节点进行访问,查看是否可以进行截图操作。这里我们参考了网上的一份代码,地址在https://blog.csdn.net/zhangdaxia2/article/details/72763847。链接地址的最后直接给出了源代码,不妨命名为new_video.c,交叉编译之后copy到开发板,

arm-linux-gnueabihf-gcc new_video.c -g -o new_video

        等到文件准备好之后,就可以准备开始截图操作了。因为相关的摄像头是/dev/video0,所以只需要输入./new_video 0即可,

# ./new_video 0
use video 0
video 0--------------capability------------------
driver:uvcvideo    
card:USB Camera: USB Camera   
capabilities:84a00001
-------------VIDIOC_ENUM_FMT--------------
index:0   
pixelformat:MJPG  
description:Motion-JPEG
index:1   
pixelformat:YUYV  
description:YUYV 4:2:2
-----------------VIDIOC_G_FMT----------------------
width:640   
height:480   
type:1   pixelformat:YUYV
----------------mmap----------------
start:b6db2000  length:614400
start:b6d1c000  length:614400
start:b6c86000  length:614400
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------
-------------poll success---------------

        不出意外的话,你会看到上面这些打印,除此之外,ls一下,还可以看到生成的10张bmp图像,

# ls -l
total 10312
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb0.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb1.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb2.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb3.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb4.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb5.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb6.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb7.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb8.bmp
-rw-r--r--    1 root     root        921654 Jan  1 00:03 rgb9.bmp

        为了验证效果,此时可以拔掉usb摄像头,重新插入u盘,mount到/mnt目录之后,就可以把所有的bmp图像拷贝到U盘出上。重新u盘插上电脑,用一个看图软件看一下效果,就能判断出是不是camera真的是有效果。目前看下来,拍摄的前面几张图片比较暗淡,后面是正常的,这一点略微有点奇怪。

        至此,usb camera的部分算是讲完了,大家可以自己做做实验,加深一下印象和认知。

你可能感兴趣的:(全志V3S嵌入式开发,驱动开发)