Skip to content

CSI-2(相机串行接口 2 )" Unicam"

树莓派系列上使用的 SoC 都有两个摄像头接口,支持 CSI -2 D-PHY 1.1或 CCP2 (紧凑型摄像头端口 2 )源。该接口的代号为" Unicam"。 Unicam的第一个实例支持 2 个 CSI -2数据通道,而第二个则支持 4 个。每个通道可以以最高 1Gbit /s(DDR,因此最大链路频率为 500MHz )运行。

但是,树莓派的普通变体仅公开第二个实例,并且仅将* 2个数据通道路由到摄像机连接器。计算模块范围从两个外设路由所有通道。

软件界面

有 3 个独立的软件接口可用于与 Unicam 外设通信:

固件

封闭源 GPU 固件具有 Unicam 和三个摄像头传感器的驱动程序以及一个桥接芯片。它们是树莓派摄像机 v1 .3(Omnivision OV5647),树莓派摄像机 v2 .1(Sony IMX219),树莓派 HQ摄像机(Sony IMX477),以及不支持的 Toshiba TC358743 HDMI-> CSI2桥接芯片驱动程序。

该驱动程序将源驱动程序,Unicam,ISP和调谐器控制集成到完整的摄像机堆栈中,以提供处理后的输出图像。可以使用 bcm2835 -v4l2内核模块通过 MMAL ,OpenMAX IL和 V4L2 使用它。此接口仅支持树莓派摄像机。

MMAL rawcam组件

在 V4L2 驱动程序可用之前,这是一个临时选项。 MMAL组件 vc .ril.rawcam允许以与 V4L2 驱动程序相同的方式接收原始 CSI2 数据,但是所有源配置都必须由用户级通过源所需的任何接口来完成。 raspiraw应用程序可在github上找到。它使用此组件以及 OV5647 ,IMX219和 ADV7282M 的标准 I2C 寄存器集来支持流传输。

V4L2

Unicam模块有一个完全开源的内核驱动程序。这是一个称为 bcm2835 -unicam的内核模块。此接口与 V4L2 子设备驱动程序连接,以供源传递原始帧。该 bcm2835 -unicam驱动程序控制传感器,并配置 CSI -2接收器,以便外设将原始帧(在 Debayer 之后)写入 SDRAM ,以供 V4L2 交付给应用程序。除了具有将 CSI -2 Bayer格式解压缩到 16 位/像素的功能外,图像源(例如相机传感器)与 bcm2835 -unicam之间没有图像处理功能,无法将图像数据放入 SDRAM 。

| ------------------------ |
| bcm2835-unicam |
| ------------------------ |
     ^ |
     | | ------------- |
 img | |子设备|
     | | ------------- |
     v -SW/HW- |
| --------- | | ----------- |
| Unicam | | I2C或 SPI  |
| --------- | | ----------- |
csi2/^ |
ccp2 | |
    | ----------------- |
    |传感器|
    | ----------------- |

Mainline Linux有一系列现有的驱动程序。 树莓派内核树还具有一些其他驱动程序和设备树覆盖,用于配置它们,这些驱动程序和设备树都已经过测试并确认可以正常工作。它们包括:

|设备|类型注意事项 | :----- | :- :---- | | Omnivision OV5647 | 5MP相机|原始树莓派相机| |索尼 IMX219 | 8MP相机|修订版 2 树莓派相机| |索尼 IMX477 | 12MP相机| 树莓派 HQ相机| |东芝 TC358743 | HDMI至 CSI -2桥接器| | | ADI公司 ADV728x -M |模拟视频到 CSI -2桥|没有隔行支持 |英飞凌 IRS1125 |飞行时间深度传感器|由第三方支持|

由于子设备驱动程序也是具有标准 API 的内核驱动程序,因此第三方可以自由选择自己选择的任何来源编写自己的内容。

为 bcm2835 -unicam开发第三方驱动程序

这是通过 Unicam 进行连接的推荐方法。

为打算与 bcm2835 -unicam模块一起使用的新设备开发驱动程序时,需要该驱动程序和相应的设备树覆盖。理想情况下,应将驱动程序提交到linux-media邮件列表以进行代码审查并合并到主线,然后移至树莓派内核树,但可以对驱动程序进行检查并直接合并到树莓派内核中,这可能会有所例外。

请注意,所有内核驱动程序均已获得 GPLv2 许可,因此源代码"必须"可用。仅运送二进制模块违反了许可 Linux 内核的 GPLv2 许可。

编写 bcm2835 -unicam是为了尝试容纳当前在主流 Linux 内核中发现的所有类型的 CSI -2源驱动程序。这些可以大致分为相机传感器和桥接芯片。桥接芯片允许在某些其他格式和 CSI -2之间进行转换。

摄像头传感器相机传感器的传感器驱动程序通常通过 I2C 或 SPI 负责设备的所有配置。与其从头开始编写驱动程序,不如以现有驱动程序为基础并对其进行适当修改,通常会更容易。

IMX219驱动程序是一个很好的起点,可以在[here]找到 5 .4内核中找到的版本(https://github.com/raspberrypi/linux/blob/rpi-5.4.y/drivers/media/i2c/imx219 。 C )。该驱动程序支持 8 位和 10 位 Bayer 读出,因此枚举帧格式和帧大小要稍微复杂一些。

传感器通常支持此处中记录的 V4L2 用户控件。并非所有这些控件都需要在驱动程序中实现。 IMX219驱动程序仅实现下面列出的一小部分子集,其实现由" imx219_set_ctrl"函数处理。

  • V4L2_CID_PIXEL_RATE /V4L2_CID_VBLANK /V4L2_CID_HBLANK:允许应用程序设置帧频。
  • V4L2_CID_EXPOSURE:以行为单位设置曝光时间。应用程序需要使用 V4L2 _CID_PIXEL_RATE,V4L2_CID_HBLANK和帧宽度来计算行时间。
  • V4L2_CID_ANALOGUE_GAIN:传感器特定单位的模拟增益。
  • V4L2_CID_DIGITAL_GAIN:传感器特定单位的可选数字增益。
  • V4L2_CID_HFLIP/V4L2_CID_VFLIP:水平或垂直翻转图像。请注意,此操作可能会更改帧中数据的拜耳顺序,就像 imx219 一样。
  • V4L2_CID_TEST_PATTERN /V4L2_CID_TEST_PATTERN_ *:允许从传感器输出各种测试模式。对于调试很有用。

对于 IMX219 ,许多控件直接映射到对传感器本身的寄存器写操作。

设备树用于选择传感器驱动程序并进行配置 参数,例如 CSI -2通道数,连续时钟通道 操作和链接频率(通常仅支持一个)。可以在here

桥接芯片

这些设备可将输入的视频流(例如 HDMI 或复合视频)转换为树莓派 CSI-2接收器可以接受的 CSI -2流。

处理桥接芯片更为复杂,因为与摄像头传感器不同,它们必须响应输入信号并将其报告给应用程序。

处理桥接芯片的机制可以大致分为模拟或数字两种。

在以下各节中使用" ioctls"时," ioctl"名称中的" S"表示它是一个设置函数,而" G"是一个 get 函数,而" _ENUM"则枚举一组允许值。

模拟视频源

模拟视频源使用标准的" ioctls"来检测和设置视频标准。 :VIDIOC_G_STDVIDIOC_S_STDVIDIOC_ENUMSTDVIDIOC_QUERYSTD

选择错误的标准通常会导致图像损坏。设置标准通常还会在 V4L2 CAPTURE队列上设置分辨率。不能通过 VIDIOC _S_FMT设置。通常,通过" VIDIOC_QUERYSTD"请求检测到的标准,然后在流传输之前将其设置为" VIDIOC_S_STD"。

数字视频源

对于 HDMI 之类的数字视频源,还有一组备用呼叫,允许指定所有数字定时参数(VIDIOC_G_DV_TIMINGSVIDIOC_S_DV_TIMINGSVIDIOC_ENUM_DV_TIMINGSVIDIOC_QUERY_DV_TIMINGS)。

与模拟网桥一样,时序通常会固定 V4L2 CAPTURE队列解析度,并在流传输之前使用 VIDIOC _QUERY_DV_TIMINGS的结果调用 VIDIOC _S_DV_TIMINGS,以确保格式正确。

根据桥接芯片和驱动器的不同,可能会通过" VIDIOC_SUBSCRIBE_EVENT"和" V4L2_EVENT_SOURCE_CHANGE"将输入源的更改报告给应用程序。

当前支持的设备

Rasberry Pi Linux内核当前支持 2 种桥接芯片,用于模拟视频源的 Analog Devices ADV728x-M和用于 HDMI 源的 Toshiba TC358743。

模拟设备 ADV728x (A)-M模拟视频至 CSI2 桥这些芯片将复合视频,S视频(Y/C)或分量(YPrPb)视频转换为单通道 CSI -2接口,并受到ADV7180内核驱动程序。 可以在 Analog Devices网站上找到该芯片各种版本的产品详细信息。

ADV7280AADV7281AADV7282A

由于当前核心 V4L2 实现中缺少一些代码,因此选择源失败,因此树莓派内核版本向 ADV7180 内核驱动程序添加了一个名为 dbg _input的内核模块参数,该参数每次调用 VIDIOC _S_STD时都会设置输入源。在某个时候,主流将解决潜在的问题(内核 API 调用 s _routing与用户空间调用VIDIOC_S_INPUT之间的脱节),并且将删除此修改。

请注意,不支持接收隔行视频,因此该芯片的 ADV7281 (A)-M版本使用受限,因为它没有必要的 I2P 去隔行模块。还应确保在选择设备时指定-M选项。否则,您将获得无法连接到树莓派的并行输出总线。

没有已知的使用这些芯片的市售板,但是该驱动器已经通过 ADI [EVAL-ADV7282-M评估板]进行了测试(https://www.analog.com/cn/design-center/evaluation-hardware -and-software/evaluation-boards-kits/EVAL-ADV7282A-M.html)

如果使用的是 ADV7282 -M芯片变体,则可以使用 config .txt dtoverlay adv7282m加载该驱动程序。或参数为" adv7280m = 1"," adv7281m = 1"或" adv7281ma = 1"的" adv728x-m"(如果您使用的是其他变体)。例如

dtoverlay = adv728x-m,adv7280m = 1

东芝 TC358743 HDMI至 CSI2 桥

这是 HDMI 到 CSI -2的桥接芯片,能够以高达 1080p60 的速度转换视频数据。

可以在Toshiba网站中找到有关此桥芯片的信息。 -interface-bridge-ics/detail.TC358743XBG.html)

TC358743将 HDMI 输入接口连接到 CSI -2和 I2S 输出。 TC358743内核模块支持它。

该芯片支持传入的 HDMI 信号,如 RGB888 ,YUV444或 YUV422 ,最高可达 1080p60 。它可以转发 RGB888 ,或将其转换为 YUV444 或 YUV422 ,并在 YUV444 和 YUV422 之间进行任意转换。仅对 RGB888 和 YUV422 支持进行了测试。当使用 2 个 CSI -2通道时,可以支持的最大速率是 1080p30 (作为 RGB888 )或 1080p50 (作为 YUV422 )。在计算模块上使用 4 条通道时,可以采用两种格式接收 1080p60 。

HDMI通过接收设备来通告其可以支持的所有模式的分辨率,以通告EDID。内核驱动程序不了解您希望接收的分辨率,帧速率或格式,因此,由用户决定是否提供合适的文件。 这是通过 VIDIOC _S_EDID ioctl完成的,或更容易地使用v4l2-ctl --fix-edid-checksums --set-edid = file = filename.txt(添加--fix-edid-checksums选项意味着您不需要不必在源文件中获得正确的校验和值)。生成所需的 EDID 文件(二进制 EDID 文件的文本十六进制转储)并不是很繁琐,并且可以使用工具来生成它们,但这不在本页面的讨论范围内。

如上所述,使用DV_TIMINGS ioctl配置驱动程序以匹配传入的视频。最简单的方法是使用命令" v4l2-ctl --set-dv-bt-timings query"。如果您希望编写一个应用程序来处理变化的源,则驱动程序确实支持生成 SOURCE _CHANGED事件。通过 VIDIOC _S_FMT进行设置可以更改输出像素格式,但是由于分辨率是由 dv 时序配置的,因此只有像素格式字段会被更新。

有两块可商用的板将此芯片连接到树莓派。 Auvidea B101和 B102 是获得最广泛的产品,但也可以使用其他等效的电路板。

使用 config .txt dtoverlay tc358743加载该驱动程序。

该芯片还支持通过 I2S 捕获立体声 HDMI 音频。 Auvidea板将相关信号分解到插头上,该插头可以连接到 Pi 的 40 针插头。所需的接线是:

|信号| B101接头| Pi 40针接头| BCM GPIO | | ---------- |:-----------:|:----------------:|:---- -----:| | LRCK/WFS | 7 | 35 | 19 | | BCK/SCK | 6 | 12 | 18 | |数据/SD | 5 | 38 | 20 | | GND | 8 | 39 | N/A |除了 tc358743`叠加层以外,还需要 tc358743 -audio叠加层。这将为 HDMI 音频创建一个 ALSA 记录设备。请注意,该音频没有重新采样。音频的存在反映在 V4L2 控件 TC358743 _CID_AUDIO_PRESENT /"音频存在"中,传入音频的采样率反映在 V4L2 控件 TC358743 _CID_AUDIO_SAMPLING_RATE /"音频采样频率"中。在没有音频的情况下进行录制将产生警告,以及以与报告的采样率不同的采样率进行录制。