本文转载自: 硬码农二毛哥微信公众号
在进行MIPI摄像头开发时,经常用到Xilinx的MIPI CSI-2 Receiver Subsystem IP,下面对该IP使用方法进行简单介绍。
系统组成
MIPI CSI-2 Receiver Subsystem由以下四部分组成:
• MIPI D-PHY
• MIPI CSI-2 RX Controller
• AXI Crossbar/Smart Connect
• Video Format Bridge
MIPI协议简介
要想正常使用该IP核,要对MIPI协议有所了解。
CSI-2 Layer Definitions
CSI-2可以分为PHY Layer 、Protocol Layer 和Application Layer 。
PHY Layer
由1到4路数据Lanes和1路时钟Lane组成。数据从MIPI摄像头输出,进入CSI-2 Receiver Subsystem中的D-PHY。
Protocol Layer
Protocol Layer 又分为三层,Pixel/Byte Packing/Unpacking Layer 、Low Level Protocol 和Lane Management 。
Pixel/Byte Packing/Unpacking Layer
CSI-2支持不同像素格式,配个像素可以从6bits到24bits。在接收侧,这一层将Low Level Protocol曾的bytes拆解成像素格式,传输到Application Layer 。
Low Level Protocol
Low Level Protocol(LLP)支持通过短包或长包传输任意数据。
Lane Management
根据应用要求,不同带宽可以选择1、2、3和4个Lanes。
Application Layer
这一层目标高级编码和解析数据流中的数据。
Low Level Protocol
Low Level Protocol Packet
Low Level Protocol 支持Long packets和Short packets。每包从LPS到SoT开始传输,从EoT到LPS结束传输。
相机设置
mipi摄像头通常使用IIC进行设置,摄像头寄存器数据有8bit和16bit两种,IIC代码需要支持两种数据传输。
mipi-csi2-rx
IP设置
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.
video_aclk
video_aclk要根据摄像头数据速率和通道进行计算。
CSI输出时序
在MIPI协议中RAW格式数据如下:
当Pixels Per Clock选择2时,MIPI摄像头经过CSI-2 IP核后输出如下:
软件初始化
在摄像头输出数据前,要对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);
}