跳到主要内容

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 模式如下图所示:

D-PHY 模式

C-PHY 模式如下图所示:

C-PHY 模式

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

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 支持的排布方式
VICAP0RAW8 / RAW10 / RAW12 / RAW14 / RAW16;YUV422 8-bit(Packed)
VICAP1RAW8 / RAW10 / RAW12 / RAW14 / RAW16;YUV422 8-bit(Packed)
VICAP2RAW8 / 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)
VICAP3RAW8 / RAW10 / RAW12 / RAW14 / RAW16;YUV422 8-bit(Packed)
VICAP4RAW8 / RAW10 / RAW12 / RAW14 / RAW16;YUV422 8-bit(Packed)
VICAP5RAW8 / 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)

后处理框架如下图所示:

CSI-2 后处理框架

如图所示,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 RX0VICAP0Y
CSI0 RX0VICAP1Y
CSI0 RX0VICAP2Y
CSI0 RX0VICAP3N
CSI0 RX0VICAP4N
CSI0 RX0VICAP5N
CSI0 RX1VICAP0Y
CSI0 RX1VICAP1Y
CSI0 RX1VICAP2Y
CSI0 RX1VICAP3N
CSI0 RX1VICAP4N
CSI0 RX1VICAP5N
CSI1 RX0VICAP0Y
CSI1 RX0VICAP1Y
CSI1 RX0VICAP2Y
CSI1 RX0VICAP3N
CSI1 RX0VICAP4N
CSI1 RX0VICAP5N
CSI2 RX0VICAP0N
CSI2 RX0VICAP1N
CSI2 RX0VICAP2N
CSI2 RX0VICAP3Y
CSI2 RX0VICAP4Y
CSI2 RX0VICAP5Y
CSI2 RX1VICAP0N
CSI2 RX1VICAP1N
CSI2 RX1VICAP2N
CSI2 RX1VICAP3Y
CSI2 RX1VICAP4Y
CSI2 RX1VICAP5Y
CSI3 RX0VICAP0N
CSI3 RX0VICAP1N
CSI3 RX0VICAP2N
CSI3 RX0VICAP3Y
CSI3 RX0VICAP4Y
CSI3 RX0VICAP5Y

需要注意的是,VICAP 采用离线方式将图像数据写出到内存时,每一行的数据量必须是 128 Byte 的整数倍。如下图所示:

VICAP 行数据对齐

假设 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 RX00
CSI0 RX11
CSI1 RX02
CSI2 RX03
CSI2 RX14
CSI3 RX05

数据流编号与设备树的关系如下图所示:

数据流编号与设备树关系

2.2 用户态配置示例​

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

V4L2 配置示例 1

V4L2 配置示例 2

V4L2 配置示例 3

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_modeD-PHY 分布
4+0+4+4+0+4D-PHY0 不分裂;D-PHY2 不分裂。此时 CSI0 RX1、CSI2 RX1 不可用。
2+2+4+4+0+4D-PHY0 分裂成 2 个 2-lane 的 PHY;D-PHY2 不分裂。此时 CSI2 RX1 不可用。
4+0+4+2+2+4D-PHY0 不分裂;D-PHY2 分裂成 2 个 2-lane 的 PHY。此时 CSI0 RX1 不可用。
2+2+4+2+2+4D-PHY0 分裂成 2 个 2-lane 的 PHY;D-PHY2 分裂成 2 个 2-lane 的 PHY。所有 CSI-2 控制器均可用。

bind-vicap​

选择 CSI-2 控制器所连接的 VICAP,详见后处理框架。

需要注意的是,VICAP 与 iommus 字段有一一对应关系,如下表所示:

VICAP 单元SMMU ID
VICAP034
VICAP134
VICAP238
VICAP335
VICAP435
VICAP539

配置时两者要同时修改,举例如下图:

bind-vicap 与 iommus 配置示例

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 IDPin 脚名称
0CDRX_L0
1CDRX_L1
2CDRX_L2
3CDRX_L3
4CDRX_L4
5CDRX_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 控制器内,配置数据流的数量,以及所连接的图像传感器节点。如下图所示:

m1000-aimodule.dts 配置示例

上图中,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

如下图所示:

videv 调试信息

4.1 VIDEV ATTR INFO​

字段说明
DevId设备 ID,与 M1000 CSI-2 控制器编号是一一对应关系。
CapId该控制器所连接的 VICAP 编号。
HdrHDR 模式,线性模式下是 none。
Stream数据流编号。
State数据流的状态:ON/OFF 等。
TransMode数据流的传输模式:在线、离线。
PixelFormat数据流的像素格式。
Width图像宽度。
Height图像高度。
Plane离线模式下,图像数据在内存的排布方式:Packed、Semi-planar、Planar。

4.2 CSI2 ATTR INFO​

字段说明
LaneDivideModeLane 排布模式,取值如设备树配置说明所述。
LaneNum所使用的 lane 数量。
LaneRate设备树中配置的数据 Lane 速率,以 kbps 为单位。
PhyModePHY 工作模式: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 是否有错误发生,以及错误计数是否持续累加。