由 Tegra 处理器驱动的 Nvidia Jetson 平台已经在边缘分析市场中占据了一席之地,尤其是在视频分析、机器视觉等领域。 凭借 MIPI-CSI、USB、千兆以太网等广泛的接口,可以通过许多不同的接口获取视频数据。其中,CSI 接口仍然是机器视觉应用的首选接口。

在这篇博客中,我们将详细讨论 Jetson Tegra 平台中的相机接口和数据流以及 MIPI CSI 驱动程序的典型配置和设置。具体来说,我们将考虑 Jetson Nano 和 Onsemi OV5693 相机。

Jetson 相机子系统

尽管 Tegra TX1、TX2、Xavier 和 Nano 平台之间存在显着的架构差异,但相机硬件子系统或多或少保持不变。下面捕获了相同的高级设计。

Nvidia Tegra 相机子系统

正如所见,主要组件及其功能是:

  • CSI Unit: MIPI-CSI兼容输入子系统,负责从摄像头获取数据,组织像素格式并将其发送到VI单元。有 6 个像素解析器 (PP) 单元,每个单元都可以接受来自单个 2 车道相机的输入。除了这个 6 摄像头模型之外,还可以重新配置输入,以便将 3 个单声道或立体声 4 通道摄像头连接到 PPA、CSI1_PPA 和 CSI2_PPA 对。
  • VI:视频输入单元通过 24 位总线接收来自 CSI 单元的数据,数据的位置由输入格式决定。然后可以将该数据路由到以下任何一个或两个相关方。VI 还具有一个带有 2 个通道的 Host 1x 接口——一个用于控制对相机的 I2C 访问,另一个用于 VI 寄存器编程。
  • 内存:写入系统内存以供应用程序进一步使用。
  • 图像信号处理器 ISP A:用于预处理输入数据并将其转换/打包为不同的格式。ISP A 还可以从内存中获取数据。
  • 图像信号处理器 ISP B:用于预处理输入数据并将其转换/打包为不同的格式。ISP A 还可以从内存中获取数据。

VI Unit 提供了一种称为 VI 同步点 (syncpts) 的硬件-软件同步机制,用于等待满足特定条件并增加计数器或希望计数器达到特定值。多个预定义索引可用,每个索引对应于一次功能,例如帧开始、行结束、ISP 处理的完成。例如,软件可以选择等待,直到通过下一个与索引对应的计数器值指示的 VI 接收到一个帧。

借助这些强大的组件,Tegra 相机子系统提供了无缝处理来自不同格式的多个来源的数据的选项。

Linux 4 Tegra 相机驱动程序

了解了硬件子系统后,我们现在将研究 Tegra 相机接口的软件架构。Nvidia 通过其 Linux4Tegra (L4T) 软件支持 Linux 操作系统。相机驱动程序通过 CSI 总线以传感器的本机格式配置和读取来自相机传感器的数据,并可选择将它们转换为不同的格式。

Nvidia 提供两种类型的相机访问路径,可以根据相机和应用程序用例进行选择:

  • 直接 V4L2 接口

主要用于从相机捕获 RAW 数据,这是一条不进行任何处理且数据直接由用户应用程序使用的最小路径。

  • 相机核心库接口

在此模型中,相机数据通过少数 Nvidia 库(例如 Camera Core、libArgus)使用。在这种情况下,可以有效地利用内核中可用的 GPU 对输入数据进行各种数据处理。

在任何一种情况下,应用程序都可以是 Gstreamer 插件或自定义插件。

Jetson OV5693 相机

为了深入了解,让我们考虑默认随 Tegra TX1 和 TX2 载板一起提供的 5MP(2592 x 1944,拜耳传感器)Omnivision CSI 摄像头模块 OV5693。高级软件架构如下:

L4T 相机驱动架构

OV5693 摄像头通过 TCA9548 I2C 扩展芯片连接到 I2C 总线 0x06(默认\I2C 地址为 0x36)。这可以通过在 SID 引脚上添加一个上拉电阻来更改为 0x40。

OV5693 驱动程序使用 I2C 总线驱动程序触发,并将自身注册到 Tegra V4L2 相机框架。这反过来又会暴露 /dev/videoX 设备,应用程序可以使用该设备来消费数据。

要启动 OV5693 驱动程序,必须处理以下内容,并在下一节中进一步说明:

  • 设备树中的相应节点
  • V4L2 兼容传感器驱动程序

在下一节中,我们将看到如何为 OV5693 摄像头设置设备树。

Tegra 相机的设备树更改

该  tegra194相机-e3333-a00.dtsi文件位于/硬件/ NVIDIA /平台/ t19x /普通/内核DTS / t19x常见模块/文件夹。

Tegra相机平台:

tegra-camera-platform 由一个或多个模块组成,这些模块定义了连接到 Tegra SoC 的相机/传感器的基本信息。虽然顶部的公共部分包含有关所有连接的综合信息,但每个模块子部分都单独定义了它们。在这种情况下,单个 OV5693 摄像头通过两个 MIPI 通道连接。

<span style="color:#333333"><span style="background-color:#f5f5f5"><code>tegra-camera-platform {compatible = "nvidia, tegra-camera-platform";num_csi_lanes = <2>;        //Number of lanesmax_lane_speed = <1500000>; //Maximum lane speedmin_bits_per_pixel = <12>;  //bits per pixelvi_peak_byte_per_pixel = <2>;   //byte per pixelvi_bw_margin_pct = <25>;    //Don't caremax_pixel_rate = <160000>;  //Don't careisp_peak_byte_per_pixel = <5>;//Don't careisp_bw_margin_pct = <25>;   //Don't caremodules {module0 { //OV5693 basic detailsbadge = "ov5693_right_iicov5693";position = "right";orientation = "1";drivernode0 {pcl_id = "v4l2_sensor";devname = "ov5693 06-0036";proc-device-tree = "/proc/device-tree/i2c@31c0000/tca9548@77/i2c@6/ov5693_a@36"; //Device tree node path};};};
};  </code></span></span>

设备树节点

在设备树节点中,必须添加所有相机属性(输出分辨率、FPS、Mipi 时钟等)以确保设备正常运行。

<span style="color:#333333"><span style="background-color:#f5f5f5"><code>I2c@31c0000 {   //I2C-6 base addresstca9548@77 { //I2C expander ICi2c@6 {ov5693_a@36 {compatible = nvidia,ov5693";reg = <0x36>; //I2C slave addressdevnode = "video0";//device name/* Physical dimensions of sensor */physical_w = "3.674";   //physical width of the sensorphysical_h = "2.738"; //physical height of the sensor/* Enable EEPROM support */has-eeprom = "1";/* Define any required hw resources needed by driver *//* ie. clocks, io pins, power sources */avdd-reg = "vana";    //Power Regulator iovdd-reg = "vif";    //Power Regulatormode0 { // OV5693_MODE_2592X1944mclk_khz = "24000";        //MIPI driving clocknum_lanes = "2";        //Number of lanestegra_sinterface = "serial_a"; //Serial interfacephy_mode = "DPHY";        //physical connection modediscontinuous_clk = "yes";dpcm_enable = "false";      //Don't carecil_settletime = "0";       //Don't careactive_w = "2592";      //active widthactive_h = "1944";        //active heightmode_type = "bayer";     //sensor typepixel_phase = "bggr";      //output formatcsi_pixel_bit_depth = "10";  //bit per pixelreadout_orientation = "0";   //Don't careline_length = "2688";       //Total widthinherent_gain = "1";       //Don't caremclk_multiplier = "6.67";   //pix_clk_hz/mclk_khzpix_clk_hz = "160000000";  //Pixel clock HTotal*VTotal*FPS gain_factor = "10";     //Don't caremin_gain_val = "10";/* 1DB*/    //Don't caremax_gain_val = "160";/* 16DB*/ //Don't carestep_gain_val = "1";     //Don't caredefault_gain = "10";        //Don't caremin_hdr_ratio = "1";        //Don't caremax_hdr_ratio = "1";        //Don't careframerate_factor = "1000000";   //Don't caremin_framerate = "1816577";  //Don't caremax_framerate = "30000000";step_framerate = "1";default_framerate = "30000000";exposure_factor = "1000000"; //Don't caremin_exp_time = "34";        //Don't caremax_exp_time = "550385";    //Don't carestep_exp_time = "1";        //Don't caredefault_exp_time = "33334"; //Don't careembedded_metadata_height = "0";//Don't care};   };};};
};
</code></span></span>

在本例中,像素时钟计算如下:

pix_clk_hz = HTotal*VTotal*FPS

OV5693:- 2592×1944@30fps

2592×1944 的总高度和总宽度为 2688×1984

pix_clk_hz = 2688 x 1984 x 30 = 159989760

pix_clk_hz 是 ~160000000

而 mclk 乘数是

mclk_multiplier = pix_clk_hz / mclk_khz
mclk_multiplier = 160000000 / 24000000 = 6.66

DTS绑定

如前所述,相机数据流如下:

传感器输出 CSI输入 CSI输出 VI输入
ov5693_ov5693_out0 ov5693_csi_in0 ov5693_csi_out0 ov5693_vi_in0

硬件 – 设备树节点数据流映射

内部端口之间的绑定是通过使用以下设置完成的。

<span style="color:#333333"><span style="background-color:#f5f5f5"><code>ports {#address-cells = <1>;#size-cells = <0>;
port@0 {reg = <0>;ov5693_ov5693_out0: endpoint {port-index = <0>;bus-width = <2>;remote-endpoint = <&ov5693_csi_in0>;};
};
};nvcsi@15a00000 {num-channels = <1>;#address-cells = <1>;#size-cells = <0>;status = "okay";channel@0 {reg = <0>;ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;ov5693_csi_in0: endpoint@0 {port-index = <0>;bus-width = <2>;remote-endpoint = <&ov5693_ov5693_out0>;};};port@1 {reg = <1>;ov5693_csi_out0: endpoint@1 {remote-endpoint = <&ov5693_vi_in0>;};};};};};host1x {vi@15c10000 {num-channels = <1>;ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;ov5693_vi_in0: endpoint {port-index = <0>;bus-width = <2>;remote-endpoint = <&ov5693_csi_out0>;};};};};
</code></span></span>

驱动程序通过 Host1x DMA 引擎模块从 VI 输出中获取数据。

覆盖

L4T 采用 DTB 覆盖机制来启用/禁用驱动程序。ov5693 驱动程序可以通过将其状态字段设置为“okay”在 DTS 中启用。

<span style="color:#333333"><span style="background-color:#f5f5f5"><code>fragment-ov5693@0 {ids = "2180-*";override@0 {target = <&ov5693_cam0>;_overlay_ {status = "okay";};};};
</code></span></span>

在启动过程中,如果检测到正确的相机模块,则添加到设备树节点的覆盖层以及进一步的驱动程序和设备注册由相机驱动程序 (ov5693.c) 完成,如下一篇博客所述。

关于 Embien: Embien 是领先的产品工程服务,在 Nvidia Tegra 和 Jetson 平台上提供专业知识。我们一直在通过不同接口将各种类型的相机与 Nvidia 平台连接起来,并通过 libargus 框架以及定制的 Gstreamer 插件和应用程序启用它们。我们的客户包括国防、航空电子、工业自动化、医疗、汽车和半导体领域的财富 500 强公司。

NVIDIA JETSON 平台的 MIPI-CSI 相机驱动程序开发相关推荐

  1. 【AI】AI入门之Nvidia Jetson平台(一)- Jetson平台介绍

    目录 一. Jetson概述 二. Jetson系列 2.1 产品图谱 2.2 参数对比 2.3 Xavier NX模组 三. NVIDIA GPU 3.1 架构演变 3.2 Volta GPU 四. ...

  2. 5菜鸟教程_【菜鸟手册7】如何在NVIDIA Jetson平台上安装Anaconda

    Anaconda是用于科学计算(数据科学.机器学习应用.大规模数据处理.预测分析等)的Python和R编程语言的一个自由和开源的发行版,旨在简化包管理和部署.像Virtualenv一样,Anacond ...

  3. NVIDIA Jetson Xavier配置大恒相机驱动(gige接口火星系列)

    一.下载驱动 下载链接:https://www.daheng-imaging.com/Software/index.aspx?nodeid=304 这里要注意:Xavier采用ARMv8架构,因此下载 ...

  4. python怎么另起一行阅读答案_使用Python+Dlib构建人脸识别系统(在Nvidia Jetson Nano 2GB开发板上)...

    Nvidia Jetson Nano 2GB开发板是一款新的单板机 售价59美元 运行带有GPU加速的人工智能软件.在2020年 你可以从一台售价59美元的单板计算机中获得令人惊叹的性能 让我们用它来 ...

  5. linux的系统监视器图片_用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统...

    作者|Adam Geitgey 编译|Flin 来源|medium 新的Nvidia Jetson Nano 2GB开发板(今天宣布!)是一款单板机,售价59美元,运行带有GPU加速的人工智能软件. ...

  6. linux的系统监视器图片_用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统 - 人工智能遇见磐创...

    作者|Adam Geitgey 编译|Flin 来源|medium 新的Nvidia Jetson Nano 2GB开发板(今天宣布!)是一款单板机,售价59美元,运行带有GPU加速的人工智能软件. ...

  7. 使用Python+Dlib构建人脸识别系统(在Nvidia Jetson Nano 2GB开发板上)

    Nvidia Jetson Nano 2GB开发板是一款新的单板机,售价59美元,运行带有GPU加速的人工智能软件. 在2020年,你可以从一台售价59美元的单板计算机中获得令人惊叹的性能,让我们用它 ...

  8. 基于Nvidia jetson +fpga(ZYNQ)的人工智能图像加速板卡设计

    Nvidia NX平台使用FPGA设备采集mipi视频数据调试记录 Jetson NX与ZYNQ通过Pcie通信. 驱动调试 硬件原理图 基于ZYNQ+Jetson多目标识别方案设计 FPGA+Xav ...

  9. Nvidia Jetson Nano入门与使用

    Pre: Nvidia Nano板等了好久,国内终于便宜了一点.刚从网上买一个,准备替换掉Nvidia TX2开发板(因为目前的算法在Nano开发板上跑应该没有问题).打开包装,核心板上面写着Made ...

最新文章

  1. TabHost.TabSpec中的标签实现图文左右排(默认上下排)
  2. Eureka出现No instances available for xxx的五种解决方案(不能解决你骂我)
  3. 【大会】编码、画质评价与网络协议的未来
  4. java编写k线_用Java绘制K线 (转)
  5. mysql中limit关键字_【JAVA】关于mysql的limit关键字使用。
  6. 有关mysql的开发介绍_深入浅出MySQL之开发篇(二)
  7. python 2和Python3的常见区别及修改办法
  8. 雷军玩谐音梗:称米粉为“小粽子” 因为粽子“心中有MI”
  9. dell 服务器r410装系统,dell r410安装windows2003系统
  10. 智能烟感与物联网卡可以了解一波
  11. 龙之谷2服务器维护,龙之谷2今日上线!详细攻略带你玩转阿尔特里亚大陆
  12. 好想学python猜谜_有人可以教我猜字谜吗 好想学 怎样才可以学好猜字谜呢
  13. iOS获取路由器地址
  14. 【软件测试】8年资深测试解析,软件测试行业情报,风风雨雨......
  15. 【《Real-Time Rendering 3rd》 提炼总结】(十一) 第十四章 : 游戏开发中的渲染加速算法总结
  16. 链接和二维码被微信拦截(被封锁、被屏蔽、被和谐)的最新解决方法——MaxJump
  17. 挣扎数学建模:各种算法汇总(2)多属性决策模型
  18. 利用PIFU-HD生成自己的三维人体图像
  19. zxx学习日报1110
  20. Ubuntu双系统+pytorch环境搭建日记

热门文章

  1. Zookeeper详解(三)——开源客户端curator
  2. Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁)
  3. 软件测试有哪些职业资格证书?
  4. GIS工具maptalks开发手册(二)01-01之Geometry转化为GeoJSON——渲染点
  5. Sketch(二)——图标集画微信图标
  6. Mybatis框架实现CRUD操作
  7. 学区房 | 入学要求房产面积大于60平的小学周边有多少小区
  8. 小白如何用Python脚本玩转跳一跳
  9. 使用PHPMailer实现PHP通过QQ邮箱发邮件功能
  10. H3CTEv2.2教学视频珍藏版