linux-kernel - linux在哪里调用摄像头驱动进行图片传输

标签 linux-kernel camera driver imx6

Linux driver OV5640 相机提供有限的功能。

static struct i2c_driver ov5640_i2c_driver = {
    .driver = {
        .name  = "ov5640",
        .of_match_table = ov5640_dt_ids,
    },
    .id_table = ov5640_id,
    .probe    = ov5640_probe,
    .remove   = ov5640_remove,
};

这些功能是nameproberemove

我对驱动程序不是很熟悉,但我找不到驱动程序中渲染像素的任何部分,因此我无法将它们存储到数组中。我也找不到任何用于读取像素的虚拟内存地址。

捕获的图像数据传输发生在代码的哪一部分? 我正在寻找两个位置:一个在驱动程序中,一个在调用驱动程序的更高级别中。

最佳答案

简答

您可以从以下位置捕获视频帧:

  1. 找出您的 IPU 驱动程序在哪里并在那里嗅探数据。
  2. 使用 V4L2 API 编写用户空间应用程序以捕获帧。

第二个选项是首选且更容易。

详细解答

这里有三个驱动因素:

  1. 摄像头驱动:实现 I2C 上的控制路径(例如启动流)
    示例:“ovti,ov5640”
  2. CSI Receiver driver(CSI-2 主机 Controller 驱动程序):基本上是一个 PHY,将 CSI-2 数据格式转换为 IPU 的某种内部数据格式。
    示例:"fsl,imx6-mipi-csi2"
  3. IPU(图像处理单元)驱动程序:实现了很多功能,例如图像DMA、视频采集等
    示例:“fsl,imx6q-ipu”
    • 捕获子系统驱动可以从IPU驱动中分离出来。
      示例:“fsl,imx-capture-subsystem”

有时 CSI RX 和 IPU 驱动程序会组合成单个 IP 内核(如 TI AM57xx 芯片中的视频输入端口)。有时视频捕获可以在单独的驱动程序中实现(尽管它是 IPU 的一部分)。这只是您正在处理的平台架构问题,但主要思想是相同的。

看看这张照片:

Camera Architecture

因此,如果您正在寻找一个 Hook 数据的地方,那么它应该位于以下位置之一:

  1. 在您的 IPU 驱动程序中:驱动程序可能正在将 DMA 传输到 RAM,并将该 RAM 位置提供给 V4L2。在那里您可以尝试嗅探图像数据。由于您没有引用您的平台,因此您需要自己找到该驱动程序。查看 drivers/media/platform/drivers/staging/media/ 内部,它应该在某处。此外,探索您的设备树文件,ov5640 节点应引用 port 节点中的 CSI/IPU 驱动程序。
  2. 在您的用户空间应用程序中:V4L2 用户空间界面允许您捕获视频帧;见 this example了解详情。

您可以尝试通过一些已知的 V4L2 常量 grepping 内核源代码树来找到您的捕获驱动程序,例如:

$ grep -lIr V4L2_BUF_TYPE_VIDEO_CAPTURE drivers/media/platform/* drivers/staging/media/*

或尝试从您的设备树文件中找出它。例如,在 iMX6 平台上,所有相关节点如下所示:

ov5640: camera@3c {
    compatible = "ovti,ov5640";
    port {
        ov5640_to_mipi_csi2: endpoint { remote-endpoint = <&mipi_csi2_in>; };
    };
};

mipi_csi: mipi@21e0000 {
    compatible = "fsl,imx6-mipi-csi2";
    port@0 {
        mipi_csi2_in: endpoint { remote-endpoint = <&ov5640_to_mipi_csi2>; };
    };
};

ipu1: ipu@2800000 {
    compatible = "fsl,imx6q-ipu";
    ipu1_csi0: port@0 { };
};

capture-subsystem {
    compatible = "fsl,imx-capture-subsystem";
    ports = <&ipu1_csi0>;
};

但我建议您尝试从用户空间应用程序捕获视频帧,就像它已经完成 here ,因为在内核驱动程序中这样做可能是一项艰巨的任务。此外,在用户空间应用程序中,将捕获的帧保存到 jpg 文件会更容易,就像它已完成 here .

iMX6 资源

有很多 iMX6 w.r.t 的文档。相机在那里:

关于linux-kernel - linux在哪里调用摄像头驱动进行图片传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56731704/

相关文章:

linux - 更新 ARM TTBR(转换表基址寄存器)的缺点是什么?

ios - 检查电话调用或 Skype 调用是否处于事件状态 iOS

java - org.postgresql.util.PSQLException : Protocol error. session 设置失败

安卓相机 View 打不开

c# - 将 Unity 中的 2D 相机移动限制在 map 的边缘

c++ - 如何获取驱动程序名称?

c++ - glGenFramebuffers 或 glGenFramebuffersEXT?

linux - 从内核线程为用户空间分配内存

sockets - 我可以在内核空间中拥有超过 32 个 netlink 套接字吗?

java - Spring Boot 在 Linux 中运行比 Windows 使用更多的内存