本文转载自:<span id="profileBt"><a href="https://mp.weixin.qq.com/s/KGmC5G5qTv-SfUnmhGhxUw"> 硬码农二毛哥微信公众号</a></span>
在进行MIPI摄像头开发时,经常用到Xilinx的MIPI CSI-2 Receiver Subsystem IP,下面对该IP使用方法进行简单介绍。
<strong>系统组成</strong>
MIPI CSI-2 Receiver Subsystem由以下四部分组成:
• MIPI D-PHY
• MIPI CSI-2 RX Controller
• AXI Crossbar/Smart Connect
• Video Format Bridge
<center><img src="http://xilinx.eetrend.com/files/2022-04/%E5%8D%9A%E5%AE%A2/100559861-25…; alt=""></center>
<strong>MIPI协议简介</strong>
要想正常使用该IP核,要对MIPI协议有所了解。
CSI-2 Layer Definitions
CSI-2可以分为PHY Layer 、Protocol Layer 和Application Layer 。
<center><img src="http://xilinx.eetrend.com/files/2022-04/%E5%8D%9A%E5%AE%A2/100559861-25…; alt=""></center>
<strong>PHY Layer</strong>
由1到4路数据Lanes和1路时钟Lane组成。数据从MIPI摄像头输出,进入CSI-2 Receiver Subsystem中的D-PHY。
<strong>Protocol Layer</strong>
Protocol Layer 又分为三层,Pixel/Byte Packing/Unpacking Layer 、Low Level Protocol 和Lane Management 。
<strong>Pixel/Byte Packing/Unpacking Layer</strong>
CSI-2支持不同像素格式,配个像素可以从6bits到24bits。在接收侧,这一层将Low Level Protocol曾的bytes拆解成像素格式,传输到Application Layer 。
<strong>Low Level Protocol</strong>
Low Level Protocol(LLP)支持通过短包或长包传输任意数据。
<strong>Lane Management</strong>
根据应用要求,不同带宽可以选择1、2、3和4个Lanes。
<strong>Application Layer</strong>
这一层目标高级编码和解析数据流中的数据。
Low Level Protocol
Low Level Protocol Packet
Low Level Protocol 支持Long packets和Short packets。每包从LPS到SoT开始传输,从EoT到LPS结束传输。
<center><img src="http://xilinx.eetrend.com/files/2022-04/%E5%8D%9A%E5%AE%A2/100559861-25…; alt=""></center>
<strong>相机设置</strong>
mipi摄像头通常使用IIC进行设置,摄像头寄存器数据有8bit和16bit两种,IIC代码需要支持两种数据传输。
<strong>mipi-csi2-rx</strong>
<strong>IP设置</strong>
Line Rate速率选择要与摄像头MIPI输出速率匹配。可以遵循如下原则:
1500 Mbps : The IP should be able to receive 600-1500Mbps data rate from the TX.
599 Mbps : The IP should be able to receive 300-599Mbps data rate from the TX.
299 Mbps : The IP should be able to receive 150-299Mbps data rate from the TX.
149 Mbps : The IP should be able to receive 80-149Mbps data rate from the TX.
<center><img src="http://xilinx.eetrend.com/files/2022-04/%E5%8D%9A%E5%AE%A2/100559861-25…; alt=""></center>
<strong>video_aclk</strong>
video_aclk要根据摄像头数据速率和通道进行计算。
<center><img src="http://xilinx.eetrend.com/files/2022-04/%E5%8D%9A%E5%AE%A2/100559861-25…; alt=""></center>
<strong>CSI输出时序</strong>
在MIPI协议中RAW格式数据如下:
<center><img src="http://xilinx.eetrend.com/files/2022-04/%E5%8D%9A%E5%AE%A2/100559861-25…; alt=""></center>
当Pixels Per Clock选择2时,MIPI摄像头经过CSI-2 IP核后输出如下:
<center><img src="http://xilinx.eetrend.com/files/2022-04/%E5%8D%9A%E5%AE%A2/100559861-25…; alt=""></center>
<strong>软件初始化</strong>
在摄像头输出数据前,要对MIPI CSI-2 Receiver Subsystem进行初始化,代码如下:
XCsiSs CsiSsInst;
u32 InitializeCsiSRxSs(u32 DeviceId)
{
u32 Status;
XCsiSs_Config *ConfigPtr;
ConfigPtr = XCsiSs_LookupConfig(DeviceId);
if (!ConfigPtr) {
return XST_FAILURE;
}
Status = XCsiSs_CfgInitialize(&CsiSsInst, ConfigPtr,
ConfigPtr->BaseAddr);
if (Status != XST_SUCCESS) {
xil_printf("MIPI CSI RX config initialization failed.\n\r");
return Status;
}
int main()
{
Status = InitializeCsiSRxSs(XCSISS_DEVICE_ID);
if (Status != XST_SUCCESS) {
xil_printf("CSI Rx Ss Init failed status = %x.\r\n", Status);
return XST_FAILURE;
}
XCsiSs_Reset(&CsiSsInst);
XCsiSs_Activate(&CsiSsInst, XCSI_ENABLE);
}