本文主要阐述mipi phy layer 到csi2 lane managenment layer 到low level protocol layer的数据接收过程,更高层的byte to pixel以及医用层可按照csi2协议解包.
本文主要参考文献:
1.mipi D PHY specification version 1.2
2.mipi CSI-2 specification version 2.1
mipi csi-2的结构类似于以太网的分层结构,如下图所示:
phy layer为物理层,通过控制时钟以及数据通道信号的电平值,实现低速模式(low power,或者说低功耗模式)与高速模式(high speed)的切换.
lane management layer 负责检测各通道(lane)低速模式到高速模式的跳变,并检测高速数据的同步头(HS ...00011101...序列),进一步将各通道的同步头对齐到字节,最终各通道的同步头实现对齐.
low level protocol layer,按照csi2协议,解析出帧起始(Frame Start,FS)短包,视频数据长包,以及帧结束(Frame End,FE)短包.输出图像数据,帧有效,数据有效.
byte to pixel unpack format层负责将基于字节的数据,按照协议,还原成各颜色空间/格式的像素数据,比如rgb565,raw10等格式.
整体结构图如下:
首先运行摄像头配置模块,通过iic总线配置摄像头,是摄像头输出指定格式的视频流.
sensor输出视频流后,phy层接收模块会接收到4通道(或者2通道,可配置)串行双沿差分数据以及一个通道的差分时钟信号.phy层接收模块会调用fpga厂家提供的源语,对输入信号做串并转换以及差分到单端的转换.输出每个通道的两根差分线可输出l0,l1两bit低速信号(4通道就是l0[3:0]以及l1[3:0]),或者输出四路高速视频数据,rx_byte_clk的时钟频率是rx_clk_p/n的四分之一,内部源语的解串比是4:1,再双沿转单沿后,四个通道的数据共32bit数据输出给字节对齐模块.(四个字节之间还没对齐)
字节对齐模块检测各个通道低速模式到高速模式的跳变,并检测高速数据的同步头,先将各个通道的同步头对齐到字节,再将各个通道的同步头也对齐.
解包模块解析出帧起始短包,数据长包,以及帧结束短包.输出图像,后续按照协议将包数据恢复成各种格式的像素.
phy层接收模块示意图如下:
GTP_IOBUF_RX_MIPI源语完成差分转单端,逻辑电平转换(不完成双沿转单沿,iserdes以4:1的时钟比,将串行双沿数据转换成8bit单沿并行数据).高低电平转换指示为高时,该源语工作于高速模式,电压摆幅200mv,有利于高速传输数据.指示为低时,源语工作于低速模式,此时源语输出两根低速单端信号.
根据csi-2协议,低速信号LP11->LP01->LP00序列标志着主设备(摄像头)从低速模式进入高速模式.从设备(fpga)可设置一个状态机,先让源语工作在低速模式,实时监测LP11->LP01->LP00序列.监测到该序列后,向GTP_IOBUF_RX_MIPI源语发出转换到高速模式的指示.进入高速模式后,监测各个通道的rx_data_hs是否出现同步头(...00011101...),低位先传,即监测0xB8序列.
序列00011101有可能分布在两拍rx_data_hs[7:0]上,因此需将各个通道的同步头做相应的移位,使得B8位于一个字节之内,然后再对齐各个通道的B8,使得各通道的B8位于同一拍时钟之内.简单代码如下:
assign data_2byte = {rx_data_hs,rx_data_hs_d1};
for(i=0;i<8;i=i+1)
{
always@(*)
begin
if(c_state==LP00)
begin
if(data_2byte[(i+8):i]==8'hb8 && data_2byte[i:0]==8'b0)
lane0[i]=1'b1
else
lane0[i]=1'b0;
end
end
}
always@(posedge rx_byte_clk)
begin
if(lane0 != 8'b0 && sot_flag0==1'b0)
begin
case(lane0)
8'd1:reg <= 3'd0;
8'd2:reg <= 3'd1;
8'd4:reg <= 3'd2;
...
8'd128 <= reg <= 3'd7;
endcase
end
end
always@(posedge rx_byte_clk)
begin
if(c_state==IDLE)
sot_flag0 <=0;
else if(lane0 != 0)
sot_flag0<= 1;
end
always@(*)
begin
case(reg)
3'd0:lane_byte = date_2byte_d1[8:1];
3'd1:lane_byte = date_2byte_d1[9:2];
...
3'd7:ane_byte = date_2byte_d1[15:8];
endcase
end
lane_byte就是某一通道对齐到字节的同步头.
一般各通道对齐后的同步头,会位于同一时钟周期内.四个通道的b8下一拍就是数据包的内容,可以按照csi2协议解包
mipi的数据包分为长包和短包两大类.长包用于传输视频数据,一个长包传输一行视频数据.短包用于传输帧头帧尾,行头行尾(可选)
长包格式如下图:
上图中SOT即前文所述的B8同步头.SOT后的首字节为包类型信息
CS后,LP信息由LP00跳转到LP11,表明lane由高速转入低速模式.
解包模块的接口信号如下:
input rx_byte_clk,
input rst_n,
input dpckt_en,
input [31:0] shift_data,
output [31:0] csi_data,
output csi_fv,
output csi_data_vld
解包模块的整体思路是,在字节对齐模块对齐B8后,拉高depkt_en,以状态机检测帧起始短包,检测到短包以后拉高帧有效信号csi_fv,检测到长包以后拉高csi_data_vld.输出数据csi_data,则是将shift_data延迟若干拍.该输出数据信号尚未对齐到像素.
将对齐到字节的数据转换成各种格式的视频像素(raw10,rgb565,yuv422等),可按照协议进一步解析.难度不大.