首页 > 其他分享 >摄像头 —— MIPI CSI-2简介

摄像头 —— MIPI CSI-2简介

时间:2023-03-01 11:12:21浏览次数:44  
标签:lane MIPI CSI LLP packet 传输 LP 摄像头

概述

  本文简单介绍MIPI CSI-2协议,根据MIPI联盟的官方文档MIPI Alliance Specification for Camera Serial Interface 2 (CSI-2),描述其协议层次和应用场景。

  CSI (Camera Serial Interface) 是MIPI定义的规范,用于连接摄像头和CPU,传输摄像头的视频信号,最新的规范是2012发布的CSI-3,使用的物理层为M-PHY。而这里要介绍的CSI-2规范在2005发布、使用D-PHY作为物理层。DSI(Display Serial Interface)同样基于D-PHY,不同的是,它主要用于host将图像传输给显示设备。

  在手机的应用中,一般的SoC至少会有两个CSI Receiver控制器,分别用于连接前置和后置摄像头。

  下图为CSI-2的物理连接:

 

 

 

  从图中可以看到,CSI-2接口包含两种连接: CSI和CCI。

  CCI (Camera Control Interface) 为双向连接,兼容I2C协议。该接口主要用来访问camera中的寄存器,以便对其进行配置和控制。通常使用host的I2C host控制器,而camera则作为I2C slave device。不同的厂家的camera寄存器布局和字段定义是不同的。

  CSI接口为单向传输,包括一个clock lane和一到四个的data lane组成,传输图像数据。采用D-PHY物理层协议。

  像USB、Ethernet一样,复杂的协议一般都会分层,方便将复杂的功能拆解,逐个实现和验证。下图为CSI-2的协议栈:

从上到下,分别是:

  • 应用层
  • CSI协议:
    • pixel/byte转换层
    • Low Level Protocol层
    • Lane Management层
  • 物理层

下面分别进行介绍。

D-PHY物理层

  物理层定义了CSI传输介质的电气特性、帧格式以及时钟等。如下图所示:

 

 

 

  CSI中有clock lane和data lane,每个lane包括两个引脚,传输串行差分信号。clock lane传输时钟信号,接收端根据时钟对data lane的引脚进行采样获取数据。

  D-PHY有两种工作状态:低功耗(LP)和高性能(HS)。LP模式下处于单端模式,传输的信号是单端信号,通常用来维持连接;HS模式下则传输的是差分数据信号。

  在data lane上进行数据传输时,一开始发送SoT(start of transmission)信号,然后发送数据payload,最后以EoT(end of transmission)结束,这样为一个完整的物理层上的数据包。接收端通过SoT和EoT识别数据包并获取payload,然后交给上层解析。

  对物理层的访问和控制,是通过PPI(PHY Protocol Interface)进行的。

  关于D-PHY规范,由MIPI的规范文档MIPI_D-PHY_Specification说明。

CSI协议层

  在物理层之上,即是CSI协议层,由三层构成,每一层有着明确的功能。

Pixel/Byte Packing/Unpacking Layer

  这一层中,发送端接收来自应用层的像素数据,并打包成字节格式发送到下一层;在接收端,解包来自LLP层的数据并传输到应用层。

  该层的主要目的是将不同像素格式(例如YUYV, RGBA等)都转换成为8bit字节格式,消除不同图像格式差异,减少传输的复杂度。例如,对于RGB888格式,一个pixel为24 bit,将转换为三个字节;RGB565格式,一个pixel为16 bit,转换为两个字节。而对于RGB444,大小为12 bit,需要通过padding变成RGB565格式,为两个字节,如下图所示:

 

Low Level Protocol

  Low Level Protocol(LLP)层为CSI协议的主要功能层,不仅定义了包格式,还定义了传输中使用的同步机制。

  在发送端,该层负责将上层传输过来的数据打包,添加校验字段,增加同步包,发送到下一层;在接收端首先校验包的完整性,并解析各个字段,根据包类型执行对应操作,将图像数据传到上一层。

  LLP处理的playload数据为经过转换后的纯字节数据,没有像素概念。通过定义不同的的字段和包类型,实现一帧一帧图像数据的传输。

Lane Management

  CSI-2是可以根据性能要求使用data lane进行扩展的。针对不同的带宽要求,data lane的数目可以是一、二、三或者四。发送端根据使用的lane数目,自动将数据分发到各个lane上进行传输;在接收端则将各个lane上的数据重新合并,恢复数据。

  该层将LLP传输过来的packet当作一段纯字节数据,根据lane数目进行分发,而不考虑包里的数据意义。

  例如,对于4个lane的发送,按如下方式分发:

 

   通过这样的转换之后,一个packet在lane上的传输情况如下图所示:

 

   从上面的说明可知,pixel/byte转换层的作用为消除pixel格式差异、简化传输,lane management层的作用为分发和拼接packet、提高带宽。这两层都是对数据进行单纯的转换,而不涉及功能逻辑。LLP层才是和传输机制密切相关。因此在后面的讨论中,展示出来的包格式,将只涉及到LLP层,忽略掉其他两层对包格式的作用,即不考虑pixel与byte的转换而直接显示pixel,不考虑lane的拆分而直接在一个lane上展示,如下图所示:

 

   上图展示了数据传输,黄色背景色的ST(SoT)、ET(EoT)是物理层所添加的包,和中间的数据包一起,表示一次传输。LPS即Low Power State,Dp-Dn处于低功耗工作状态,此时不传输数据。而SP(Short Packet)和LP(Long Packet)为LLP层所定义的包,用于同步以及帧图像数据传输。

传输一帧图像

  LLP作为主要功能的实现,定义了很多包类型、字段和传输机制。这里不详尽地罗列这些细节,而是讲述一下一帧图像在总线上的传输格式,给出一个直观、感性的理解。关于LLP的详细细节,可以参考协议的Chapter 9 Low Level Protocol

  LLP的packet主要有两种: SP (short packet)和LP (long packet)。一个LP包含一行图像数据,一个SP则用来进行特殊的用途,主要是同步,例如表示帧开始(FS)、帧结束(FE)、线开始(LS)和线结束(LE)。其中LS和LE是可选的。

  同时协议规定,每个packet之间,必须有一个LPS状态,即packet spacing。因此在进行传输时,总线上传输的是SoT+SP+EoT、SoT+LP+EoT和LPS。

  一帧必须以FS包开始,以FE包结束,中间为帧高度个数的LP包,每个包含一行图像数据。如下图所示:

 

  图中底部的VVALID、HVALID和DVALID表明垂直有效和水平有效。

  传输一开始,首先传输FS类型的SP包,表示一帧图像数据开始,进行帧同步。

  然后传输图像数据,一行数据一个LP包。每个LP包由PH (packet header)、Data和PF (packet footer)组成,各字段定义如下如下图所示:

 

 

  其中Data字段中的内容,根据不同的图像格式,其组织方式也不一样。这即为上一章Pixel/Byte转换层的内容。关于Data的格式,可以参考Chapter 11 Data Formats

  如RGB565的格式如下:

 

  在一帧图像的所有数据包传输之后,最后传输一个FE类型的LP包,表示一帧的结束。

 

Linux驱动

  在Linux系统中,要使用CSI进行图像传输,还需要两种驱动:CSI receiver驱动和CSI sender驱动。

  CSI receiver驱动用来控制SoC上的CSI外设,读取CSI总线上的数据并输出到内存或者ISP上,位于drivers/media/platform/soc_camera。一方面,驱动实现soc_camera子系统和v4l2子系统需要的结构体和回调函数,成为一个v4l2 device,以/dev/video接口暴露给用户层;另一方面,控制SoC中的CSI硬件并调用它的subdev接口,实现具体的传输。

  CSI sender驱动,即camera sensor驱动,位于drivers/media/i2c中。一方面,该驱动通过I2C与sensor通信,配置参数、启动或停止传输图像;另一方面实现soc_camera子系统所需的结构体和回调函数,作为v4l2 device的subdev,提供接口给receiver驱动调用。

通过soc_camera和v4l2子系统框架,sensor驱动和host驱动相互独立,能够被复用。

总结

  本文介绍了CSI-2协议的层次结构,展现总线上实际数据传输情况,提供一个感性的认识。驱动方面的介绍非常简单,没有涉及细节,因为实现细节和内核版本有关,v4l2子系统和soc_camera子系统也一直在进化。

和I2C、SPI总线不同的是,CSI总线因为速度高,需要性能较高的示波器才能进行在线分析。重要的是了解其中的概念,在写驱动时有帮助。

标签:lane,MIPI,CSI,LLP,packet,传输,LP,摄像头
From: https://www.cnblogs.com/kn-zheng/p/17167386.html

相关文章

  • 双MIPI摄像头图像系统设计
    介绍FPGA 的一大优势是我们可以实现并行图像处理数据流。虽然任务比较重,但是我们不需要昂贵的FPGA,我们可以使用成本低廉范围中的一个,例如Spartan7或Artix7。对于......
  • 全志 芯片 Linux MIPI CSI摄像头接口开发指南 VIN DVP CSI MIPI V4l2
    1前言1.1文档简介介绍VIN(videoinput)驱动配置,API接口和上层使用方法。1.2目标读者camera驱动开发、维护人员和应用开发人员。1.3适用范围​表1-1:适用产品......
  • 瑞芯微平台MIPI摄像头应用程序编写
    前面3篇我们讲解了camera的基础概念,MIPI协议,CSI2,常用命令等,本文带领大家入门,如何用c语言编写应用程序来操作摄像头。Linux下摄像头驱动都是基于v4l2架构,要基于该架构编写......
  • 瑞芯微 | 摄像头ov13850移植笔记
    《2.Linux驱动|瑞芯微rtc-hym8563移植笔记》《3.Linux驱动|Linux内核RTC时间架构-基于瑞芯微》0、环境soc:rk3568board:EVB1-DDR4-V10软件:Android11Lin......
  • usb免驱动摄像头实验
    1、编译openwrt系统内核使它支持usb,进入在/openwrt/trunk上执行makemenuconfig2、1).添加USB相关支持Kernelmodules—>USBSupport—><*>kmod-usb-core.##默认......
  • Net Core 3.1 ONVIF 操控海康摄像头
    先给出实现的代码https://github.com/lu1770/onvif-client.git这里实现了设备发现,登录,获得码流列表,获得画面rtsp,vlc播放,云台上下左右控制,放大缩小安装nuget包......
  • ffmpeg+ffserver实现摄像头直播
    1.首先,下载ffmpeg的源码,编译先./configure--disableyasm--prefix=/usr/local/ffmpeg然后make跟makeinstall 2.修改环境变量修改/etc/profile文件,在最后......
  • 用户手册:接入设备之接入Hikvision摄像头
    获取模板在​​examples/rtspDeviceShifu​​中查看模板文件。修改配置在​​examples/rtspDeviceShifu/camera-deployment/deviceshifu-camera-deployment.yaml​​中:spec......
  • Qt调用摄像头一,基础版
     本示例,为纯Qt调用摄像头,功能比较简单,打开摄像头,设置参数,拍照涉及到的功能有:获取摄像头列表获取摄像头分辨率获取摄像头帧率获取摄像头支持的视频......
  • Android增加USB Camera摄像头驱动支持
    一般情况下kernel需要添加以下宏=================================CONFIG_VIDEO_DEV=yCONFIG_VIDEOBUF2_CORE=yCONFIG_VIDEOBUF2_VMALLOC=yCONFIG_MEDIA_USB_SUPPORT=yC......