Author: Jonathan Corbet <corbet@lwn.net>
Introduction
“cafe_ccic”是Marvell 88ALP01“cafe” CMOS相机控制器的驱动程序。该控制器可以在第一代OLPC系统中找到,这个驱动程序是在OLPC项目的支持下编写的。
目前状态:核心驱动程序可用。它可以生成YUV422、RGB565和RGB444格式的数据。(查看代码的任何人都会看到RGB32,但那只是一个调试辅助工具,很快就会被删除)。VGA和QVGA模式可行;CIF模式存在,但颜色仍然很奇怪。目前已知只有OV7670传感器能够与该控制器配合使用。
要尝试它,请使用以下任意一个命令:
$ mplayer tv:// -tv driver=v4l2:width=640:height=480 -nosound
$ mplayer tv:// -tv driver=v4l2:width=640:height=480:outfmt=bgr16 -nosound
"xawtv"工具可用;gqcam因未知原因无法使用。
Load time options
有一些加载时选项,大多数可以在加载后通过sysfs进行更改:
• alloc_bufs_at_load:默认情况下,驱动程序不会在传输数据之前分配任何DMA缓冲区。如果设置了此选项,则会在模块加载时分配最坏情况大小的缓冲区。此选项将为模块的生命周期锁定内存,但可能会减少以后分配失败的机会。
• dma_buf_size:要分配的DMA缓冲区的大小。请注意,此选项仅在加载时进行咨询;当在运行时分配缓冲区时,它们将根据当前相机设置适当地调整大小。
• n_dma_bufs:控制器可以循环使用两个或三个DMA缓冲区。通常,驱动程序尝试使用三个缓冲区;但是,在更快的系统上,仅使用两个缓冲区也可以正常工作。
• min_buffers:驱动程序将同意使用的最小流式I/O缓冲区数。默认值为1,但在较慢的系统上,将其设置为更高的值(如六)可以实现与mplayer更好的行为。
• max_buffers:流式I/O缓冲区的最大数量;默认值为10。该数字是仔细挑选出来的,不应认为实际上表示太多东西。
• flip:如果设置了此布尔参数,则会指示传感器反转视频图像。是否有意义取决于您的特定摄像头安装方式。
1.1.6.3 The cpia2 driver
Introduction
这是STMicroelectronics的CPiA2(第二代彩色处理器接口ASIC)摄像头的驱动程序。该摄像头以最高vga尺寸输出MJPEG流。它尽可能实现了Video4Linux接口。由于V4L接口不支持压缩格式,因此只能使用启用mjpeg的应用程序与摄像头一起使用。我们修改了gqcam应用程序以查看此流。
该驱动程序实现为两个内核模块。cpia2模块包含相机功能和V4L接口。cpia2_usb模块包含usb特定功能。这样做的主要原因是模块的大小越来越大,因此我将它们分开。不太可能会有并行端口版本。
Features
该驱动程序支持具有Vision stv6410(CIF)和stv6500(VGA)CMOS传感器的相机。我只有vga传感器,因此无法测试另一个。
图像格式:VGA、QVGA、CIF、QCIF和介于一些大小之间的多个尺寸。 VGA和QVGA是VGA相机的本地图像尺寸。 CIF在协处理器中通过缩放QVGA完成。所有其他尺寸都通过剪裁完成。
调色板:YCrCb,使用MJPEG压缩。
可以设置一些压缩参数。
传感器帧速率可调节(高达30fps的CIF,15 fps的VGA)。
在流媒体时可调节亮度、颜色、对比度。
可设置50或60赫兹的闪烁控制。
CIF图像分辨率:
CIF全称为Common Intermediate Format,通用中间格式,是一种标准的视频格式之一,具体指:352 * 288像素,每秒钟25帧,每帧有24位色深的视频。这种格式主要适用于采集于VCD,SVCD等标准普及设计,是一种标准的视频压缩技术。
VGA图像分辨率:
VGA(Video Graphics Array)是IBM于1987年为其PS/2系列计算机创建的一种模拟视频标准。现在,电脑行业已经扩展了这个标准,并将它包含在数百万个产品中。对于分辨率,VGA最高支持640x480,每秒钟60Hz或70Hz的刷新率。
Making and installing the stv672 driver modules
Requirements
Video4Linux必须作为内核的一部分进行编译,或者作为一个模块可用。Video4Linux2会在编译时自动被检测到并可用。
Setup
使用"modprobe cpia2"命令进行加载,使用"modprobe -r cpia2"命令进行卸载。这可能会被您的发行版自动完成。
Driver options
Setting the options
如果您正在使用模块,编辑/etc/modules.conf文件,并添加像这样的选项行:
options cpia2 num_buffers=3 buffer_size=65535
如果驱动程序被编译进内核中,在启动时可以像这样指定它们:
cpia2.num_buffers=3 cpia2.buffer_size=65535
What buffffer size should I use?
图像的最大尺寸取决于您选择的备用方案以及相机实现的帧率。如果压缩引擎能够跟上帧率,最大图像大小如下表所示。
压缩引擎从最大压缩开始,会增加图像质量,直到接近表格中的尺寸。 只要压缩引擎能够跟上帧速率,在短时间内,所有图像的大小都将大约为表中的大小,而不管分辨率如何。
在低交替设置下,压缩引擎可能无法压缩图像到足够小的尺寸,因此需要通过生成较大的图像来降低帧率。
默认值68k对于大多数用户应该是足够的,这将处理任何备用方案,帧速率可达15fps。 对于更低的帧速率,可能需要增加缓冲区大小,以避免由于空间不足而丢失帧。
How many buffffers should I use?
对于正常流媒体,使用3个缓冲区应该可以获得最佳的结果。如果只使用2个缓冲区,相机发送完一个图像后,程序可能刚好开始读取另一个图像。如果发生这种情况,驱动程序必须删除一帧。但如果您的计算机负载过重,可以使用2个缓冲区。在这种情况下,您可能没有以全帧速率进行读取。如果相机能够在读取完成之前发送多个图像,则它可能会在读取完成之前覆盖第三个缓冲区,从而导致图像损坏。单缓冲和双缓冲具有额外的检查以避免覆盖。
Using the camera
我们提供了一个修改过的gqcam应用程序来查看输出。为避免混淆,在这里它称为mview。还有qx5view程序,可以控制qx5显微镜上的灯光。还可以使用MJPEG工具(http://mjpeg.sourceforge.net)录制相机的视频。
1.1.6.4 The cx88 driver
Author: Gerd Hoffffmann
This is a v4l2 device driver for the cx2388x chip.
Current status
video
• Works.
• 不支持置顶显示
audio
• Works. 电视标准检测由驱动程序执行,因为硬件自动检测存在缺陷。
• 通过cx88-alsa支持音频数据DMA(即无需回环电缆即可录制到声卡)。
vbi
• Works.
vbi是什么:
VBI是指垂直消隐区域(Vertical Blanking Interval),是指电视信号中每一帧的顶部和底部之间可视部分之外的黑色区域,它主要用于传输其他视频信息,如字幕、时间戳等。
How to add support for new cards
驱动程序需要一些有关TV卡的配置信息。这些信息在cx88-cards.c中。如果驱动程序运行不良,则可能需要在该文件中为您的卡添加新条目。使用dmesg检查内核日志以查看驱动程序是否识别您的卡。日志中会显示像这样的一行:
cx8800[0]: subsystem: 0070:3400, board: Hauppauge WinTV \
34xxx models [card=1,autodetected]
如果您的卡被列为“board: UNKNOWN/GENERIC”,则驱动程序无法识别它。那么应该怎么办呢?
1)尝试升级到最新的快照版本,也许之间已经添加了。
2)您可以尝试自己创建一个新条目,请查看cx88-cards.c。如果成功了,请用统一的差异格式(“diff -u”)给我们发电子邮件您所做的更改。
3)或者您可以将配置信息发送给我们。我们需要至少以下信息才能添加卡:
• PCI Subsystem ID(上面的“0070:3400”,也可以使用“lspci -v”输出)。
• 该卡使用的调谐器类型。您可以尝试使用tuner=<n> insmod选项进行试错查找。如果您知道它使用的调谐器类型,也可以查看CARDLIST.tuner中的列表。
1.1.6.5 The VPBE V4L2 driver design
Functional partitioning
该系统由以下部分组成:
1. V4L2显示驱动程序
实现了创建video2和video3设备节点,并提供v4l2设备接口来管理VID0和VID1层。
2. 显示控制器
加载了VENC、OSD和外部编码器(如ths8200)。它提供一组API调用到V4L2驱动程序,以设置VENC或外部子设备中的输出/标准。它还提供了一个设备对象,以使用子设备操作从OSD子设备访问服务。在默认输出和标准选择或运行时应用程序通过V4L2 IOCTL更改输出时,将在初始化时间基于这些设置将外部编码器连接到VENC LCD控制器端口。
当连接到外部编码器时,vpbe控制器还负责根据板级特定设置(在board-xxx-evm.c中指定)设置VENC和外部编码器之间的接口。这使得可以与ths8200等外部编码器进行接口处理。setup_if_config()也为此实施了configure_venc()(下一patch的一部分),以设置特定显示分辨率的VENC定时。
作为这个patch系列的一部分,外部编码器的连接、使能和设置是不存在的,它们将成为下一个patch系列的一部分。
3. VENC子设备模块
负责在连接到端口或需要LCD面板定时的端口时设置由内部DAC提供的输出并设置VENC中的定时。当连接外部编码器/ LCD面板时,从特定于板的表中检索特定标准/预设的定时,然后使用这些值在venc中设置定时,使用非标准定时模式。
支持使用VENC的LCD面板显示。例如,要支持Logic PD显示,需要使用支持的分辨率设置LCD控制器端口,并设置点时钟。因此,我们可以将可用输出作为特定于板的条目添加(即将“LogicPD”输出名称添加到board-xxx-evm.c)。可以在特定于板的设置文件中维护各种支持的LCD显示器的定时表以支持各种LCD显示器。目前,该patch的基本驱动程序是存在的,对外部编码器和显示的支持将成为下一个patch系列的一部分。
4. OSD模块
OSD模块实现所有OSD层管理和硬件特定功能。VPBE模块与OSD交互,以启用和禁用OSD的相应功能。
视频里OSD是什么:
在视频中,OSD是指"On Screen Display",即屏幕显示。它是一个用户界面元素,通过在屏幕上显示信息来增强用户体验,例如在电视、摄像机和监视器等设备上显示当前频道、时间和其他参数等信息。
Current status
现已提供一个完全功能齐备、可用的V4L2驱动程序版本。该驱动程序已经通过NTSC和PAL标准以及缓冲流测试验证过了。
1.1.6.6 The Samsung S5P/Exynos4 FIMC driver
Copyright © 2012 - 2013 Samsung Electronics Co., Ltd.
三星SoC应用处理器中可用的FIMC(Fully Interactive Mobile Camera)设备是一种集成了相机主机接口、颜色空间转换器、图像调整以及旋转器的综合摄像头。它还可以通过SoC内部回写数据路径从LCD控制器(FIMD)捕获数据。SoC中有多个FIMC实例(最多4个),具有略微不同的功能,如像素对齐限制、旋转器可用性、支持LCD回写等。该驱动程序位于`drivers/media/platform/exynos4-is`目录下。
Supported SoCs
S5PC100 (mem-to-mem only), S5PV210, Exynos4210
Supported features
FIMC设备支持以下特性:
- 相机并行接口采集(ITU-R.BT601/565);
- 相机串行接口采集(MIPI-CSI2);
- 存储到存储器的处理(颜色空间转换、缩放、镜像和旋转);
- 可在运行时进行动态管道重新配置(将任何FIMC实例重新连接到任何并行视频输入或任何MIPI-CSI前端);
- 运行时电源管理和系统范围挂起/恢复。
Not currently supported
- LCD回写输入
- 每帧时钟门控(mem-to-mem)
User space interfaces
Media device interface
该驱动程序支持媒体控制器API,遵循第四部分-媒体控制器API的定义。媒体设备驱动程序名为“Samsung S5P FIMC”。
该接口的目的是允许在运行时更改将FIMC实例分配给SoC外围相机输入的方式,并可选地控制MIPI-CSIS设备与FIMC实体之间的内部连接。
通过媒体设备接口,可以配置SoC通过多个FIMC实例(例如,用于同时取景器和拍照设置)来捕获传感器的图像数据。可以通过启用/禁用驱动程序在初始化期间创建的媒体连接来重新配置。内部设备拓扑可以通过媒体实体和链接枚举轻松发现。
Memory-to-memory video node
V4L2内存到内存接口在`/dev/video?`设备节点上。这是一个独立的视频设备,它没有媒体端口。但请注意,不允许在同一FIMC实例上同时使用内存到内存节点和捕获视频节点。驱动程序会检测这些情况,但应用程序应该避免这种未定义行为。
Capture video node
该驱动程序支持V4L2视频捕获接口,遵循Interfaces定义。捕获视频节点和内存到内存视频节点仅支持多平面API的捕获。有关更多详细信息,请参见:单平面和多平面API。
Camera capture subdevs
每个FIMC实例都会导出一个子设备节点(`/dev/v4l-subdev?`),每个可用的并在平台级别启用的MIPI-CSI接收器设备也会创建一个子设备节点(最多两个)。
sysfs
为了通过子设备API实现更精确的相机管道控制,驱动程序创建了一个与“s5p-fimc-md”平台设备关联的sysfs条目。该条目路径为:`/sys/platform/devices/s5p-fimc-md/subdev_conf_mode`。
在典型的用例中,可能存在以下捕获管道配置:传感器子设备->mipi-csi子设备->fimc子设备->视频节点。当我们通过用户空间的子设备API配置这些设备时,配置流必须从左到右进行,视频节点配置为最后一个。
当我们不使用子设备用户空间API时,所有属于管道的设备的整个配置都由视频节点驱动程序完成。sysfs条目允许指示捕获节点驱动程序不配置子设备(格式、裁剪),以避免在视频节点上执行最后一个配置步骤时重置子设备的配置。
为了完全支持子设备控制(在开始流媒体之前在用户空间配置子设备):
# echo "sub-dev" > /sys/platform/devices/s5p-fimc-md/subdev_conf_mode
对于V4L2视频节点控制而言(子设备由主机驱动程序内部配置):
# echo "vid-dev" > /sys/platform/devices/s5p-fimc-md/subdev_conf_mode
这是默认选项。
Device mapping to video and subdev device nodes
每个硬件设备实例都有两个关联的视频设备节点 - 视频捕获和mem-to-mem,另外还有一个用于更精确的FIMC捕获子系统控制的子设备节点。此外,每个MIPI-CSIS设备都会创建一个单独的v4l2子设备节点。
如何查找哪个/dev/video?或/dev/v4l-subdev?分配给了哪个设备?
你可以通过grep kernel日志中的相关信息来查找,例如:
# dmesg | grep -i fimc
请注意,udev(如果存在)可能仍然重新排列了视频节点,你可以从`/dev/media?`中使用`media-ctl`工具检索信息:
# media-ctl -p
Build
如果将驱动程序构建为可加载的内核模块(`CONFIG_VIDEO_SAMSUNG_S5P_FIMC=m`),则会创建两个模块(除了核心v4l2模块之外):s5p-fimc.ko和可选的s5p-csis.ko(MIPI-CSI接收器子设备)。