MIPI CSI-2
1. 框架介绍
1.1 前处理框架
M1000 MIPI CSI-2 集成了 6 个 CSI-2 控制器,以及 4 个 4-lane 的 CSI-2 PHY。其 中每个 PHY 都可以独立地配置为 D-PHY 模式或者 C-PHY 模式。工作于 D-PHY 模式时,单个 PHY 最多支持 4-lane 输入;工作于 C-PHY 模式时,单个 PHY 最多支持 3-trio 输入。
D-PHY 模式如下图所示:

C-PHY 模式如下图所示:

特殊地,当工作于 CSI-2 D-PHY 模式时,D-PHY0、D-PHY2 支持分裂模式;分裂模式下,1 个 4-lane 的 D-PHY 可分成 2 个 2-lane 的 D-PHY 使用。如下图所示:

C-PHY 不支持分裂模式。
M1000 MIPI CSI-2 支持 DPHY v2.5、C-PHY v2.0 以及 CSI-2 v2.1 协议标准。
D-PHY 模式下,每 lane 最高速率为 4.5 Gbps。
C-PHY 模式下,每 trio 最高速率为 3.5 Gsps,等效 8 Gbps。
通过 CSI-2 virtual channel 区分,每个控制器支持同时接收最多 4 路数据流。
举例说明:
D-PHY 4-lane 模式下,支持以下视频流输入:
- 1 路 RAW12 格式 7680 × 4320 @ 30 fps
- 1 路 YUV422 8-bit 格式 7680 × 4320 @ 30 fps
- 1 路 RAW12 格式 3840 × 2160 @ 60 fps
- 1 路 YUV422 8-bit 格式 3840 × 2160 @ 60 fps
- 4 路 YUV422 8-bit 格式 1920 × 1080 @ 60 fps
D-PHY 2-lane 模式下,支持以下视频流输入:
- 1 路 RAW12 格式 3840 × 2160 @ 30 fps
- 1 路 YUV422 8-bit 格式 3840 × 2160 @ 30 fps
- 4 路 YUV422 8-bit 格式 1920 × 1080 @ 30 fps
M1000 CSI-2 支持以下像素格式接收:
- RAW8 / RAW10 / RAW12 / RAW14 / RAW16 / RAW20
- RGB565 / RGB888
- YUV420 8-BIT / YUV420 8-BIT Legacy / YUV420 10-BIT
- YUV422 8-BIT / YUV422 10-BIT
1.2 后处理框架
每个 CSI-2 控制器后面连接一个像素处理单元(VICAP)。
经过 VICAP 处理的像素数据流,可在线传输给后级 ISP 单元,也可离线写出到内存中。
当选择离线写出时,每个 VICAP 单元支持的图像排布方式并不完全相同,如下表所示:
| VICAP 单元 | VICAP 支持的排布方式 |
|---|---|
| VICAP0 | RAW8 / RAW10 / RAW12 / RAW14 / RAW16;YUV422 8-bit(Packed) |
| VICAP1 | RAW8 / RAW10 / RAW12 / RAW14 / RAW16;YUV422 8-bit(Packed) |
| VICAP2 | RAW8 / RAW10 / RAW12 / RAW14 / RAW16;RGB565(Packed)/ RGB888(Packed);YUV422 8-bit(Packed)/ YUV422 8-bit(Semi-Planar)/ YUV422 8-bit(Planar);YUV420 8-bit(Planar) |
| VICAP3 | RAW8 / RAW10 / RAW12 / RAW14 / RAW16;YUV422 8-bit(Packed) |
| VICAP4 | RAW8 / RAW10 / RAW12 / RAW14 / RAW16;YUV422 8-bit(Packed) |
| VICAP5 | RAW8 / RAW10 / RAW12 / RAW14 / RAW16;RGB565(Packed)/ RGB888(Packed);YUV422 8-bit(Packed)/ YUV422 8-bit(Semi-Planar)/ YUV422 8-bit(Planar);YUV420 8-bit(Planar) |
后处理框架如下图所示:

如图所示,CSI0 RX0、CSI0 RX1、CSI1 RX0 可以自由地选择连接到 VICAP0、VICAP1、VICAP2;CSI2 RX0、CSI2 RX1、CSI3 RX0 可以自由地选择连接到 VICAP3、VICAP4、VICAP5。但 CSI0 RX0、CSI0 RX1、CSI1 RX0 不允许连接到 VICAP3、VICAP4、VICAP5;CSI2 RX0、CSI2 RX1、CSI3 RX0 则不允许连接到 VICAP0、VICAP1、VICAP2。
如下表所示:
| CSI-2 控制器 | VICAP 单元 | 是否可连接 |
|---|---|---|
| CSI0 RX0 | VICAP0 | Y |
| CSI0 RX0 | VICAP1 | Y |
| CSI0 RX0 | VICAP2 | Y |
| CSI0 RX0 | VICAP3 | N |
| CSI0 RX0 | VICAP4 | N |
| CSI0 RX0 | VICAP5 | N |
| CSI0 RX1 | VICAP0 | Y |
| CSI0 RX1 | VICAP1 | Y |
| CSI0 RX1 | VICAP2 | Y |
| CSI0 RX1 | VICAP3 | N |
| CSI0 RX1 | VICAP4 | N |
| CSI0 RX1 | VICAP5 | N |
| CSI1 RX0 | VICAP0 | Y |
| CSI1 RX0 | VICAP1 | Y |
| CSI1 RX0 | VICAP2 | Y |
| CSI1 RX0 | VICAP3 | N |
| CSI1 RX0 | VICAP4 | N |
| CSI1 RX0 | VICAP5 | N |
| CSI2 RX0 | VICAP0 | N |
| CSI2 RX0 | VICAP1 | N |
| CSI2 RX0 | VICAP2 | N |
| CSI2 RX0 | VICAP3 | Y |
| CSI2 RX0 | VICAP4 | Y |
| CSI2 RX0 | VICAP5 | Y |
| CSI2 RX1 | VICAP0 | N |
| CSI2 RX1 | VICAP1 | N |
| CSI2 RX1 | VICAP2 | N |
| CSI2 RX1 | VICAP3 | Y |
| CSI2 RX1 | VICAP4 | Y |
| CSI2 RX1 | VICAP5 | Y |
| CSI3 RX0 | VICAP0 | N |
| CSI3 RX0 | VICAP1 | N |
| CSI3 RX0 | VICAP2 | N |
| CSI3 RX0 | VICAP3 | Y |
| CSI3 RX0 | VICAP4 | Y |
| CSI3 RX0 | VICAP5 | Y |
需要注意的是,VICAP 采用离线方式将图像数据写出到内存时,每一行的数据量必须是 128 Byte 的整数倍。如下图所示:

假设 CSI-2 接收一帧尺寸为 128 × 2、格式为 RAW8 的图像,通过 VICAP 离线写出到内存中。由于 1 行图像数据长度为 128(像素)× 8(像素深度)/ 8 = 128 bytes,正好是 128 Byte 的整数倍,所以整行都是图像数据。
又假设 CSI-2 接收一帧尺寸为 128 × 2、格式为 RAW10 的图像,通过 VICAP 离线写出到内存中。由于 1 行图像数据长度为 128(像素)× 10(像素深度)/ 8 = 160 bytes,而 160 不是 128 Byte 的整数倍,向上取整后每行的数据量为 256 bytes,其中前 160 bytes 为图像数据,后 96 bytes 为无效数据;第 2 行的图像数据从 B256 开始写入。
2. 软件说明
2.1 软件栈介绍
M1000 MIPI CSI-2 软件栈支持标准的 V4L2 接口规范。支持基于用户态使用 V4L2 方法配置 CSI-2 硬件,以接收图像传感器或解串器的数据流,离线写出到内存。
CSI-2 软 件栈基于 DTS 设备树的配置,为每个数据流生成一个 V4L2 设备节点,命名为:
videoXY_sensor
其中,X 为控制器编号,如 CSI0 RX0 编号为 0,CSI0 RX1 编号为 1 等;Y 为数据流编号,在设备树中指定。
控制器编号如下表所示:
| 控制器名 | 控制器编号 |
|---|---|
| CSI0 RX0 | 0 |
| CSI0 RX1 | 1 |
| CSI1 RX0 | 2 |
| CSI2 RX0 | 3 |
| CSI2 RX1 | 4 |
| CSI3 RX0 | 5 |
数据流编号与设备树的关系如下图所示:

2.2 用户态配置示例
用户态使用 V4L2 方法配置 CSI-2 示例:



3. 设备树配置说明
3.1 配置 m1000-videv.dtsi
lane_divide_mode
如框架介绍所说明,当 CSI-2 PHY 工作于 D-PHY 模式时,D-PHY0 与 D-PHY2 支持分裂模式。lane_divide_mode 指定当前 CSI-2 lane 的分布模式,共有 4 种取值,如下表所示:
lane_divide_mode | D-PHY 分布 |
|---|---|
4+0+4+4+0+4 | D-PHY0 不分裂;D-PHY2 不分裂。此时 CSI0 RX1、CSI2 RX1 不可用。 |
2+2+4+4+0+4 | D-PHY0 分裂成 2 个 2-lane 的 PHY;D-PHY2 不分裂。此时 CSI2 RX1 不可用。 |
4+0+4+2+2+4 | D-PHY0 不分裂;D-PHY2 分裂成 2 个 2-lane 的 PHY。此时 CSI0 RX1 不可用。 |
2+2+4+2+2+4 | D-PHY0 分裂成 2 个 2-lane 的 PHY;D-PHY2 分裂成 2 个 2-lane 的 PHY。所有 CSI-2 控制器均可用。 |
bind-vicap
选择 CSI-2 控制器所连接的 VICAP,详见后处理框架。
需要注意的是,VICAP 与 iommus 字段有一一对应关系,如下表所示:
| VICAP 单元 | SMMU ID |
|---|---|
| VICAP0 | 34 |
| VICAP1 | 34 |
| VICAP2 | 38 |
| VICAP3 | 35 |
| VICAP4 | 35 |
| VICAP5 | 39 |
配置时两者要同时修改,举例如下图:

vc-ids
MIPI CSI-2 协议规定的 virtual channel 号,支持每路数据流单独配置,从左到右分别是流 0、流 1、流 2、流 3 对应的 vc-id 值。
phy-mode
配置 PHY 的工作模式,0 为 D-PHY,1 为 C-PHY。
lane-rate-kbps
数据 lane 上的传输速率,以 kbps 为单位。
num-lanes
使用的 lane 数量。
clk-lane-id
使用哪个 pin 作为时钟 lane。ID 值与外部 pin 脚对应关系如下表:
| Lane ID | Pin 脚名称 |
|---|---|
| 0 | CDRX_L0 |
| 1 | CDRX_L1 |
| 2 | CDRX_L2 |
| 3 | CDRX_L3 |
| 4 | CDRX_L4 |
| 5 | CDRX_L5 |
lane-ids
使用哪些 pin 作为数据 lane。从左到右分别配置 lane0、lane1、lane2、lane3 的外部 pin 的 Lane ID 值。
clk-lane-dpdn-swap
D-PHY 模式下,是否交换 DP、DN 线。
data-lane-dpdn-swap
D-PHY 模式下,是否交换 DP、DN 线。
phy-timing-valid
是否使用设备树中的 PHY timing 参数。
dphy-Tclk-prepare
当 phy-timing-valid 为 1 时,该值可配置 D-PHY 时钟 lane 的 Tclk-prepare 参数。
dphy-Tclk-zero
当 phy-timing-valid 为 1 时,该值可配置 D-PHY 时钟 lane 的 Tclk-zero 参数。
dphy-Ths-prepare
当 phy-timing-valid 为 1 时,该值可配置 D-PHY 数据 lane 的 Ths-prepare 参数。
dphy-Ths-zero
当 phy-timing-valid 为 1 时,该值可配置 D-PHY 数据 lane 的 Ths-zero 参数。
3.2 配置 m1000-aimodule.dts
在每个 CSI-2 控制器内,配置数据流的数量,以及所连接的图像传感器节点。如下图所示:

上图中,CSI0 RX0 控制器配置了 4 路数据流,每路数据流都连接了不同的图像传感器。
用户应该根据本地实际的硬件连接配置数据流;例如只有 1 路时,保留 m_csi_ctl00_ep 即可,其他节点(m_csi_ctl01_ep、m_csi_ctl02_ep、m_csi_ctl03_ep)必须删除。
4. 查看调试信息
sudo su
cat /sys/kernel/debug/videv/info
如下图所示:

4.1 VIDEV ATTR INFO
| 字段 | 说明 |
|---|---|
DevId | 设备 ID,与 M1000 CSI-2 控制器编号是一一对应关系。 |
CapId | 该控制器所连接的 VICAP 编号。 |
Hdr | HDR 模式,线性模式下是 none。 |
Stream | 数据流编号。 |
State | 数据流的状态:ON/OFF 等。 |
TransMode | 数据流的传输模式:在线、离线。 |
PixelFormat | 数据流的像素格式。 |
Width | 图像宽度。 |
Height | 图像高度。 |
Plane | 离线模式下,图像数据在内存的排布方式:Packed、Semi-planar、Planar。 |
4.2 CSI2 ATTR INFO
| 字段 | 说明 |
|---|---|
LaneDivideMode | Lane 排布模式,取值如设备树配置说明所述。 |
LaneNum | 所使用的 lane 数量。 |
LaneRate | 设备树中配置的数据 Lane 速率,以 kbps 为单位。 |
PhyMode | PHY 工作模式:D-PHY 或 C-PHY。 |
VcId | 设备树中配置的 vc-ids。 |
ClkLane | 时钟 Lane 的 pin 脚名称。 |
DataLane | 数据 Lane 的 pin 脚名称。 |
4.3 VIDEV FSM INFO
| 字段 | 说明 |
|---|---|
FsNum | 所收到 CSI-2 FS 包的数量。 |
FeNum | 所收到 CSI-2 FE 包的数量。 |
FramePTime | 所测量到的帧周期,单位是毫秒。 |
FrameRate | 所测量到的帧率值。 |
FrameNotReady | 所记录到已发生帧未就绪错误的次数。 |
4.4 VICAP HW INFO
| 字段 | 说明 |
|---|---|
BufFull | 所记录到已发生缓冲区满的次数。 |
Overflow | 所记录到已发生 overflow 错误的次数。 |
BufNotReady | 所记录到已发生帧未完成错误的次数。 |
4.5 CSI2 HOST HW INFO
| 字段 | 说明 |
|---|---|
CrcCphyHdrErr | 所记录到已发生 C-PHY 模式下 CSI-2 PH 中 CRC 错误的次数。 |
CsrParityErr | 所记录到已发生 CsrParity 错误的次数。 |
EccMultiBitErr | 所记录到已发生 CSI-2 PH 中 ECC 多比特 错误的次数。 |
Ecc1BitErr | 所记录到已发生 CSI-2 PH 中 ECC 单比特错误的次数。 |
PayloadCrcErr | 所记录到已发生 CSI-2 PF 中 CRC 错误的次数。 |
4.6 CSI2 PHY HW INFO
| 字段 | 说明 |
|---|---|
LaneErr | 所记录到已发生 lane 错误的次数。 |
SotHsErr | 所记录到已发生 CSI-2 SotHsErr 的次数。 |
SotSyncHsErr | 所记录到已发生 CSI-2 SotSyncHsErr 的次数。 |
ErrControl | 所记录到已发生 CSI-2 ErrControl 的次数。 |
4.7 CSI2 HW DEBUG INFO
| 字段 | 说明 |
|---|---|
VC | 实时检测到的 CSI-2 virtual channel 值。 |
DataType | 实时检测到的 CSI-2 data type 值。 |
WordCount | 实时检测到的 CSI-2 PH 中 word count 值。 |
LineNum | 一帧图像内检测到的行数值,每路数据流独立显示。 |
LaneData | 实时显示 lane 上正在传输的数据,每根 lane 独立显示。 |
StopState | 是否检测到 CSI-2 stop state 状态,每根 lane 独立显示。 |
5. 调试方法说明
5.1 设备开流后收不到图像
使用以下命令查看调试信息:
watch -n 1 cat /sys/kernel/debug/videv/info
重点检查以下内容:
VIDEV ATTR INFO、CSI2 ATTR INFO区域中的配置值是否符合预期?VIDEV ATTR INFO中State的值是否为ON(表示开流成功)?VIDEV FSM INFO区域中FsNum、FeNum的值是否在变化?有变化则说明能够收到帧头、帧尾。VICAP HW INFO区域中是否有错误发生?错误计数是否一直累加?如果有, 说明当前能够收到数据,但时序上存在错误。- 查看
CSI2 HOST HW INFO、CSI2 PHY HW INFO区域中的错误计数是否一直累加。如果有,说明存在 PHY 时序上的错误。 - 查看
CSI2 HW DEBUG INFO:- 首先查看
LaneData。如果一直在变化,说明有持续收到数据;如果不变化,说明 PHY 没有收到数据。 - 查看实时收到的
VC值,对比设备树中的vc-ids,确认是否与对应数据流位置的值一致。 - 查看实时收到的
DataType值,确认是否与预期的像素格式一致。 - 查看
WordCount,换算成图像宽度后,确认是否符合预期。 - 查看
LineNum,确认图像高度计数值是否符合预期。
- 首先查看
5.2 能收到图像但存在花屏现象
重点查看 VICAP HW INFO、CSI2 HOST HW INFO、CSI2 PHY HW INFO 是否有错误发生,以及错误计数是否持续累加。

