我有兴趣将相机驱动程序从一个 SOC(Pi) 移植到另一个 SOC(Jetson),它们都运行 Linux 风格并具有 CSI-2 接口。
我有驱动程序的源代码。我试图了解 CSI-2 接口相对于 V4L2 的工作原理。相机由 SOC 通过 I2C 线控制,源代码中提供了控制功能。我感到困惑的是,我是否需要编写一些东西来实际从相机中提取帧并直接控制 CSI 接口?或者都是由 CSI-2 接口标准化并由 V4L2 处理?
如果您想从相机访问原始数据,该怎么做?
这是一个极其令人困惑的话题,而且记录也极其糟糕。看起来,从事 Android 手机开发的公司并不了解其工作原理。
到目前为止我想到的是:
+----+ +-----+
| CS |----| CSI |---> other subdevices
+----+ +-----+
其中 CS 是相机传感器驱动程序,CSI 是 SoC/MCU 特定的 MIPI-CSI2 传感器驱动程序,通常与图像信号处理器 (ISP) 一起处理。
这是 V4L2 魔法的第一圈。
除了 V4L2,还有媒体实体框架……它的作用之一实际上是将多媒体环境的元素以图形形式链接在一起。我不会详细说明,因为我仍然对此感到头疼。
但是,有端口、端点和焊盘。现在,我的理解是前两个是开放固件框架实体(设备树),最后一个是与MEF和V4L2相关的一块:子设备可以有pad!
每个垫可以是 source 或 sink...或两者兼而有之。
看起来设备树中的端点代表焊盘。
+--------+ +-------------+
| +---| |---+ +---|
| CS | 0 |-----| 0 | CSI | 1 |---> other pad
| +---| |---+ +---|
+--------+ +-------------+
上图表示简单的相机,例如 imx219,其中一个源焊盘在逻辑上代表物理相机上的 CSI-2 发射器,链接到处理 SoC/MCU 上的某些驱动程序处理 CSI-2 接收器的接收焊盘。
每个块都由
/dev/v4l-subdevX
节点表示。
这是 V4L2 魔法的第二圈。
现在我有自己的问题,我找不到答案,但要回答你的一个问题:不,只要你有一个适用于 MIPI CSI-2 的工作驱动程序,你就不必实现拉帧你的芯片。
如果您想从相机访问原始数据,该怎么做?
我对此没有确切的答案,但如果您的子设备连接正确,您只需使用正确的库或应用程序(如 GStreamer)打开
/dev/videoX
,您就可以从相机中看到动态图片。