Linux kernel Linux在哪里调用摄像头驱动程序来进行图像传输

Linux kernel Linux在哪里调用摄像头驱动程序来进行图像传输,linux-kernel,camera,driver,imx6,Linux Kernel,Camera,Driver,Imx6,OV5640摄像头的功能有限 静态结构i2c_驱动程序ov5640_i2c_驱动程序={ .司机={ .name=“ov5640”, .of_match_table=ov5640_dt_id, }, .id_table=ov5640_id, .probe=ov5640_探头, .移除=ov5640_移除, }; 这些功能包括名称、探测和删除 我不太熟悉驱动程序,但我找不到驱动程序中渲染像素的任何部分,因此我可以将它们存储到阵列中。我也找不到任何用于读取像素的虚拟内存地址 捕获的图像数据传输发生

OV5640摄像头的功能有限

静态结构i2c_驱动程序ov5640_i2c_驱动程序={
.司机={
.name=“ov5640”,
.of_match_table=ov5640_dt_id,
},
.id_table=ov5640_id,
.probe=ov5640_探头,
.移除=ov5640_移除,
};
这些功能包括
名称
探测
删除

我不太熟悉驱动程序,但我找不到驱动程序中渲染像素的任何部分,因此我可以将它们存储到阵列中。我也找不到任何用于读取像素的虚拟内存地址

捕获的图像数据传输发生在代码的哪一部分? 我在找两个位置:一个在驾驶员位置,另一个在呼叫驾驶员的更高级别。

简短回答 您可以从以下位置捕获视频帧:

  • 找出你的IPU驱动程序在哪里,然后嗅探那里的数据
  • 使用V4L2 API编写用户空间应用程序以捕获帧
  • 第二种选择更可取,也更容易

    详细答案 这里有三个驱动因素:

  • 摄像头驱动程序:通过I2C实现控制路径(例如启动流媒体)
    示例:
    “ovti,ov5640”
  • CSI接收器驱动程序(CSI-2主机控制器驱动程序):基本上是一个PHY,它将CSI-2数据格式转换为IPU的一些内部数据格式
    示例:
    “fsl,imx6-mipi-csi2”
  • IPU(图像处理单元)驱动程序:实现许多功能,例如图像DMA、视频捕获等。
    示例:
    “fsl,imx6q ipu”
    • 捕获子系统驱动程序可以与IPU驱动程序分离
      示例:
      “fsl,imx捕获子系统”
  • 有时,CSI RX和IPU驱动程序组合成单个IP核(如TI AM57xx芯片中的视频输入端口)。有时,视频捕获可以在单独的驱动程序中实现(尽管它是IPU的一部分)。这只是您正在研究的平台架构的问题,但主要思想是相同的

    请看这张照片:

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

  • 在您的IPU驱动程序中:驱动程序可能正在向RAM进行DMA传输,将RAM位置馈送到V4L2。在这里,您可以尝试嗅探图像数据。由于您没有引用您的平台,您需要自己找到该驱动程序。查看
    drivers/media/platform/
    的内部,在
    drivers/staging/media/
    中,它应该在那里的某个地方。另外,浏览您的设备树文件,
    ov5640
    节点应该引用
    port
    节点中的CSI/IPU驱动程序
  • 在用户空间应用程序中:V4L2用户空间界面允许您捕获视频帧;有关详细信息,请参阅
  • 您可以尝试通过某些已知的V4L2常量对内核源代码树进行灰显来查找捕获驱动程序,例如:

    $grep-lIr V4L2\u BUF\u TYPE\u VIDEO\u捕获驱动程序/媒体/平台/*驱动程序/登台/媒体/*
    
    或者尝试从设备树文件中查找。例如,在iMX6平台上,所有相关节点如下所示:

    ov5640:camera@3c {
    compatible=“ovti,ov5640”;
    港口{
    ov5640_to_mipi_csi2:endpoint{remote endpoint=;};
    };
    };
    mipi_csi:mipi@21e0000 {
    compatible=“fsl,imx6-mipi-csi2”;
    port@0 {
    mipi_csi2_in:endpoint{remoteendpoint=;};
    };
    };
    ipu1:ipu@2800000 {
    compatible=“fsl,imx6q ipu”;
    ipu1\U csi0:port@0 { };
    };
    捕获子系统{
    compatible=“fsl,imx捕获子系统”;
    端口=;
    };
    
    但我建议您尝试从用户空间应用程序捕获视频帧,就像这样,因为在内核驱动程序中这样做可能是一项困难的任务。此外,在用户空间应用程序中,将捕获的帧保存到jpg文件会更容易,就像这样

    iMX6资源 有很多关于iMX6 w.r.t.摄像头的文档:

    • 内核iMX6 V4L2文档:
    • iMX6 TRM(技术参考手册):
    • iMX Linux参考手册:
    • 申请须知如
    • 像这样的幻灯片:

    非常感谢您的全面回答。我的平台是iMX6。@hadoop那么你很幸运:)有很多关于iMX6 w.r.t.摄像头的好文档。我在答案的末尾添加了一些链接,您可以先查看这些链接。