RK3576處理器的MIPI-CSI調試——通路解析

原創 2024-07-19 09:10:00
 MIPI-CSI是一種在嵌入式系統或移動設備中常見的攝像頭接口,能夠實現高速的圖像數據傳輸。飛凌嵌入式最新推出的OK3576-C開發板擁有豐富的資源接口,其中支持5個CSI-2接口,意味著最多可同時支持5路攝像頭的輸入。本篇內容就通過OK3576-C開發板為大家介紹一下RK3576處理器的Camera通路,以及如何配置MIPI-CSI攝像頭的不同輸出格式。

RK3576開發板

一、RK3576的Camera通路

如果只有一個攝像頭接入,則只開rkispx_vir0 。需要注意的是:

1. vicap和isp并沒有對應關系;

2. 各個vir0/vir1這種關系本質是同一個硬件分時復用,效果等同。多個的時候盡量使用0,1,2 ... 去配置。

硬件通路框圖如下:

rk3576硬件通路框圖

有一個dcphy接口和兩個dphy接口,接入路徑如下:

單攝(接第一個dphy)

sensor0->csi2_dphy0->mipi1_csi2->rkcif_mipi_lvds1(sditf)->rkisp_vir0

雙攝(接兩個dphy)

sensor0->csi2_dphy0->mipi1_csi2->rkcif_mipi_lvds1(sditf)->rkisp_vir0

sensor1->csi2_dphy3->mipi3_csi2->rkcif_mipi_lvds3(sditf)->rkisp_vir1

三攝(接dcphy和2個dphy)

sensor0->csi2_dcphy0->mipi0_csi2->rkcif_mipi_lvds(sditf)->rkisp_vir0

sensor1->csi2_dphy0->mipi1_csi2->rkcif_mipi_lvds1(sditf)->rkisp_vir1

sensor2->csi2_dphy3->mipi3_csi2->rkcif_mipi_lvds3(sditf)->rkisp_vir2

五攝(接dcphy,將2個dphy拆分)

sensor0->csi2_dcphy0->mipi0_csi2->rkcif_mipi_lvds(sditf)->rkisp_vir0

sensor1->csi2_dphy1->mipi1_csi2->rkcif_mipi_lvds1(sditf)->rkisp_vir1

sensor2->csi2_dphy2->mipi2_csi2->rkcif_mipi_lvds2(sditf)->rkisp_vir2

sensor3->csi2_dphy4->mipi3_csi2->rkcif_mipi_lvds3(sditf)->rkisp_vir3

sensor4->csi2_dphy5->mipi4_csi2->rkcif_mipi_lvds4(sditf)->rkisp_vir4

下圖是camera各個通路的連接情況:

rk3576 camera各個通路的連接情況

(注:如果是RGB數據輸入后面還需要跟rkisp_virx)

二、不同平臺的sensor鏈路情況

yuv422/rgb888輸入

對于yuv422/rgb888輸入的情況,常見的有三種情況:

1、自帶isp的或者客戶外接isp的攝像頭。輸入yuv422格式;

2、hdmi轉mipi csi輸入。一般如rk628d/f,lt6911xxx等芯片,常見的是轉換成yuv422,也可以rgb888格式;

3、多路ahd,serdes。這種一個mipi口,最多可以支持4個虛擬通道,對于這幾種情況,是不需要走isp的,只需要到cif即可,所以鏈路為 :

sensor->csi2_dphyX->mipiX_csi2->rkcif_mipi_lvdsX rkcif_mipi_lvdsx_sditf 

以及isp節點有可以disabled掉,里面的X根據不同平臺不同硬件的接法而定。

抓圖使用的節點為rkcif_mipi_lvdsX對應的第一個video節點,這個可以通過media-ctl看拓撲得到,比如OK3576-C開發板上的OV5645攝像頭,掛載在media1節點。

root@ok3576-buildroot:/# media-ctl -p -d /dev/media1
Media controller API version 6.1.57
driver          rkcif
model           rkcif-mipi-lvds1
serial
bus info        platform:rkcif-mipi-lvds1
hw revision     0x0
driver version  6.1.57
Device topology
- entity 1: stream_cif_mipi_id0 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video11
  pad0: Sink
          <- "rockchip-mipi-csi2":1 [ENABLED]
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 5: stream_cif_mipi_id1 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video12
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 [ENABLED]
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 9: stream_cif_mipi_id2 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video13
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 [ENABLED]
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 13: stream_cif_mipi_id3 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video14
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 [ENABLED]
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 17: rkcif_scale_ch0 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video15
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 [ENABLED]
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 21: rkcif_scale_ch1 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video16
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 [ENABLED]
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 25: rkcif_scale_ch2 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video17
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 [ENABLED]
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 29: rkcif_scale_ch3 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video18
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 [ENABLED]
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 33: rkcif_tools_id0 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video19
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 [ENABLED]
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 []
- entity 37: rkcif_tools_id1 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video20
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 [ENABLED]
          <- "rockchip-mipi-csi2":11 []
- entity 41: rkcif_tools_id2 (1 pad, 11 links)
      type Node subtype V4L flags 0
      device node name /dev/video21
  pad0: Sink
          <- "rockchip-mipi-csi2":1 []
          <- "rockchip-mipi-csi2":2 []
          <- "rockchip-mipi-csi2":3 []
          <- "rockchip-mipi-csi2":4 []
          <- "rockchip-mipi-csi2":5 []
          <- "rockchip-mipi-csi2":6 []
          <- "rockchip-mipi-csi2":7 []
          <- "rockchip-mipi-csi2":8 []
          <- "rockchip-mipi-csi2":9 []
          <- "rockchip-mipi-csi2":10 []
          <- "rockchip-mipi-csi2":11 [ENABLED]
- entity 45: rockchip-mipi-csi2 (12 pads, 122 links)
      type V4L2 subdev subtype Unknown flags 0
      device node name /dev/v4l-subdev1
  pad0: Sink
          [fmt:UYVY8_2X8/1920x1080 field:none colorspace:srgb
           crop.bounds:(0,0)/1920x1080
           crop:(0,0)/1920x1080]
          <- "rockchip-csi2-dphy0":1 [ENABLED]
  pad1: Source
          -> "stream_cif_mipi_id0":0 [ENABLED]
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad2: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 [ENABLED]
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad3: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 [ENABLED]
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad4: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 [ENABLED]
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad5: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 [ENABLED]
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad6: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 [ENABLED]
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad7: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 [ENABLED]
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad8: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 [ENABLED]
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad9: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 [ENABLED]
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 []
  pad10: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 [ENABLED]
          -> "rkcif_tools_id2":0 []
  pad11: Source
          -> "stream_cif_mipi_id0":0 []
          -> "stream_cif_mipi_id1":0 []
          -> "stream_cif_mipi_id2":0 []
          -> "stream_cif_mipi_id3":0 []
          -> "rkcif_scale_ch0":0 []
          -> "rkcif_scale_ch1":0 []
          -> "rkcif_scale_ch2":0 []
          -> "rkcif_scale_ch3":0 []
          -> "rkcif_tools_id0":0 []
          -> "rkcif_tools_id1":0 []
          -> "rkcif_tools_id2":0 [ENABLED]
- entity 58: rockchip-csi2-dphy0 (2 pads, 2 links)
      type V4L2 subdev subtype Unknown flags 0
      device node name /dev/v4l-subdev2
  pad0: Sink
          [fmt:UYVY8_2X8/1920x1080@10000/300000 field:none colorspace:srgb
           crop:(0,0)/1920x1080]
          <- "m01_f_ov5645 3-003c":0 [ENABLED]
  pad1: Source
          -> "rockchip-mipi-csi2":0 [ENABLED]
- entity 63: m01_f_ov5645 3-003c (1 pad, 1 link)
      type V4L2 subdev subtype Sensor flags 0
      device node name /dev/v4l-subdev3
  pad0: Source
          [fmt:UYVY8_2X8/1920x1080@10000/300000 field:none colorspace:srgb
           crop:(0,0)/1920x1080]
          -> "rockchip-csi2-dphy0":0 [ENABLED]

如果是多路輸入,就對應前4個,即video11-video14。

RAW格式輸入

從RK3588開始,也就是isp3.0起,瑞芯微處理器的isp便不再有采集功能,而只做圖像處理,所以整個通路為:

sensor->csi2_dphyX->mipiX_csi2->rkcif_mipi_lvdsX rkcif_mipi_lvdsX_sditf->rkispx_virX

這里需要說明一下:

1、在不跑aiq的時候,rkcif_mipi_lvdsX是可以拿RAW圖的;

2、如果我們只打開isp節點的vir0即rkispx_vir0,不打開后面的rkispx_vir1/vir2...,這種就是直通的,不跑aiq,也能拿到nv12圖,但是是未經過效果處理,一般是淡綠色;

3、打開其他vir節點,說明isp需要分時復用,isp節點就必須要開啟aiq才能拿圖(aiq會分時復用isp) ,所以如果只有一個camera,其他isp節點建議disabled掉。

三、總結

在配置攝像頭時,首先要確定攝像頭走的通路,并確定攝像頭輸出的格式,如果是RAW圖則需要走rkisp,如果是yuv422/rgb888,則只需要配置到rkcif_mipi_lvdsx。

本文介紹了RK3576處理器的Camera通路,以及如何配置MIPI-CSI攝像頭的不同輸出格式。在后續的文章中,將會繼續為大家帶來RK3576處理器的攝像頭參數配置和設備樹配置方法


推薦閱讀 換一批 換一批