Difference between revisions of "MV Camera on Firfly Boards/zh"

From wiki_veye
Jump to navigation Jump to search
 
(21 intermediate revisions by the same user not shown)
Line 6: Line 6:
 
MV系列和RAW系列相机是为工业领域的AI应用推出的相机。其使用MIPI CSI-2接口,尤其适合嵌入式运算平台使用。它具备丰富的数据格式和触发特性,极低的延时,极高的带宽和可靠的稳定性。
 
MV系列和RAW系列相机是为工业领域的AI应用推出的相机。其使用MIPI CSI-2接口,尤其适合嵌入式运算平台使用。它具备丰富的数据格式和触发特性,极低的延时,极高的带宽和可靠的稳定性。
  
本文以Firefly的ROC-RK3588S-PC主板为例,介绍怎样将MV和RAW系列摄像机接入RK3588S/RK3588系统。
+
本文以Firefly的ROC-RK3588S-PC和ROC-RK3566-PC主板为例,介绍怎样将MV和RAW系列摄像机接入RK3566/3K3568和RK3588S/RK3588系统。
  
 
我们提供了Linux(以Ubuntu为例)操作系统下的驱动。
 
我们提供了Linux(以Ubuntu为例)操作系统下的驱动。
Line 42: Line 42:
 
|RAW系列
 
|RAW系列
 
|RAW-MIPI-SC132M
 
|RAW-MIPI-SC132M
 +
|完成
 +
|-
 +
|RAW系列
 +
|RAW-MIPI-IMX462M
 +
|完成
 +
|-
 +
|RAW系列
 +
|RAW-MIPI-AR0234M
 +
|完成
 +
|-
 +
|RAW系列
 +
|RAW-MIPI-SC535M
 
|完成
 
|完成
 
|}
 
|}
 +
此外,在ubuntu系统下,已经调通V-by-One HS连接模式的驱动。
 +
 
=== 硬件准备及安装 ===
 
=== 硬件准备及安装 ===
 
MV系列和RAW系列相机需要使用[[ADP-MV2 Adapter Board Data Sheet/zh|ADP-MV2]]转接板才能连接到ROC-RK35xx-PC主板。
 
MV系列和RAW系列相机需要使用[[ADP-MV2 Adapter Board Data Sheet/zh|ADP-MV2]]转接板才能连接到ROC-RK35xx-PC主板。
  
==== MV相机与ADP-MV2的连接 ====
+
==== 新版本ADP-MV2的连接 ====
 +
 
 +
===== MV相机与ADP-MV2的连接 =====
 
二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。
 
二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。
[[File:ADP-MV2-MV-MIPI 01.jpg|alt=ADP-MV2-MV-MIPI 01|center|thumb|800x800px|ADP-MV2 to MV camera 01]]
+
{| class="wikitable"
[[File:ADP-MV2-MV-MIPI 02.jpg|center|thumb|800x800px|ADP-MV2 to MV camera 02]]
+
!TOP
 +
!BOTTOM
 +
|-
 +
|[[File:ADP-MV2-V2 to MV-MIPI-X.jpg|alt=|center|thumb|600x600px|ADP-MV2 to MV-MIPI-X]]
 +
|[[File:ADP-MV2-V2 to MV-MIPI-X No.2.jpg|alt=|center|thumb|600x600px|ADP-MV2 to MV-MIPI-X]]
 +
|}<br />
 +
 
 +
===== RAW-MIPI-SC132M与ADP-MV2的连接 =====
 +
二者使用1.0mm间距*15P的FFC异面线连接,注意接触面向外。
 +
{| class="wikitable"
 +
!TOP
 +
!BOTTOM
 +
|-
 +
|[[File:ADP-MV2 to RAW-MIPI-SC132M.jpg|alt=|center|thumb|600x600px|ADP-MV2 to RAW-MIPI-SC132M ]]
 +
|[[File:ADP-MV2 to RAW-MIPI-SC132M No.2.jpg|alt=ADP-MV2 to RAW-MIPI-SC132M|center|thumb|600x600px|ADP-MV2 to RAW-MIPI-SC132M]]
 +
|}
 +
===== 其他RAW系列摄像头与ADP-MV2的连接 =====
 +
二者使用0.5mm间距*22P的FFC异面线连接,注意接触面向外。
 +
{| class="wikitable"
 +
!TOP
 +
!BOTTOM
 +
|-
 +
|[[File:ADP-MV2 to RAW series camera.jpg|alt=|center|thumb|600x600px|ADP-MV2 to RAW series camera]]
 +
|[[File:ADP-MV2 to RAW series camera No.2.jpg|alt=ADP-MV2 to RAW series camera No.2|center|thumb|600x600px|ADP-MV2 to RAW series camera]]
 +
|}
 +
<br />
 +
===== ADP-MV2与主板的连接 =====
 +
二者使用0.5mm间距*30P的FFC同面线连接,注意接触面方向,ADP-MV2上向外,RK board上向内。
 +
[[File:RK-ADP-MV2-V2-RAW-MIPI 02.jpg|alt=|center|thumb|800x800px|RK to ADP-MV2 and MV cam]]
 
<br />
 
<br />
  
==== RAW相机与ADP-MV2的连接 ====
+
==== 老版本ADP-MV2的连接 ====
 +
 
 +
===== MV相机与ADP-MV2的连接 =====
 
二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。
 
二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。
[[File:ADP-MV2-RAW-MIPI 02.jpg|center|thumb|800x800px|ADP-MV2 to RAW-MIPI 01]]
+
{| class="wikitable"
<br />
+
!TOP
[[File:ADP-MV2-RAW-MIPI 01.jpg|center|thumb|800x800px|ADP-MV2 to RAW-MIPI 02]]
+
!BOTTOM
 +
|-
 +
|[[File:ADP-MV2-MV-MIPI 01.jpg|alt=|center|thumb|600x600px|ADP-MV2 to MV-MIPI-X]]
 +
|[[File:ADP-MV2-MV-MIPI 02.jpg|alt=|center|thumb|600x600px|ADP-MV2 to MV-MIPI-X]]
 +
|}<br />
 +
 
 +
===== RAW-MIPI-SC132M与ADP-MV2的连接 =====
 +
二者使用1.0mm间距*15P的FFC异面线连接,注意接触面向外。
 +
{| class="wikitable"
 +
!TOP
 +
!BOTTOM
 +
|-
 +
|[[File:ADP-MV2-RAW-MIPI 02.jpg|alt=|center|thumb|600x600px|ADP-MV2 to RAW-MIPI-SC132M]]
 +
|[[File:ADP-MV2-RAW-MIPI 01.jpg|alt=|center|thumb|600x600px|ADP-MV2 to RAW-MIPI-SC132M]]
 +
|}
 +
===== 其他RAW系列摄像头与ADP-MV2的连接 =====
 +
二者使用15转22P的FFC同面线连接,注意接触面向外。
 +
[[File:RAW-MIPI-AR0234-ADP-MV2.jpg|center|thumb|800x800px|ADP-MV2 to RAW series camera]]
 
<br />
 
<br />
 
+
===== ADP-MV2与主板的连接 =====
==== ADP-MV2与主板的连接 ====
 
 
二者使用0.5mm间距*30P的FFC同面线连接,注意接触面向内。
 
二者使用0.5mm间距*30P的FFC同面线连接,注意接触面向内。
 
[[File:RK-ADP-MV2-MV-MIPI 01.jpg|center|thumb|800x800px|RK to ADP-MV2 and MV cam]]
 
[[File:RK-ADP-MV2-MV-MIPI 01.jpg|center|thumb|800x800px|RK to ADP-MV2 and MV cam]]
 
<br />
 
<br />
  
 +
==== V-by-One-HS-KIT摄像机连接示意图 ====
 +
[[File:VBYONE connection with rk3588.jpg|center|thumb|800x800px|VBYONE connection with rk3588]]
 +
<br />
 
=== github库介绍 ===
 
=== github库介绍 ===
 
https://github.com/veyeimaging/rk35xx_firefly
 
https://github.com/veyeimaging/rk35xx_firefly
Line 76: Line 141:
 
此外,在[https://github.com/veyeimaging/rk356x_firefly/releases releases]中,提供了编译好的linux系统镜像。
 
此外,在[https://github.com/veyeimaging/rk356x_firefly/releases releases]中,提供了编译好的linux系统镜像。
 
=== 更新ubuntu系统 ===
 
=== 更新ubuntu系统 ===
对于ROC-RK3588S-PC,我们提供了发布系统的烧写镜像。
+
对于ROC-RK3566-PC和ROC-RK3588S-PC,我们提供了发布系统的烧写镜像。
  
 
下载[https://github.com/veyeimaging/rk356x_firefly/releases/ https://github.com/veyeimaging/rk35xx_firefly/releases/]中最新的支持MV和RAW系列的镜像。
 
下载[https://github.com/veyeimaging/rk356x_firefly/releases/ https://github.com/veyeimaging/rk35xx_firefly/releases/]中最新的支持MV和RAW系列的镜像。
  
参考Firefly[https://wiki.t-firefly.com/zh_CN/ROC-RK3588S-PC/upgrade_bootmode.html 文档],烧写系统。
+
参考Firefly文档([https://wiki.t-firefly.com/en/ROC-RK3588S-PC/upgrade_bootmode.html ROC-RK3588S-PC] [https://wiki.t-firefly.com/en/ROC-RK3566-PC/03-upgrade_firmware.html ROC-RK3566-PC]),烧写系统。
 
=== 系统状态检测 ===
 
=== 系统状态检测 ===
  
Line 94: Line 159:
 
<code>mvcam 7-003b: firmware version: 0x1290133</code>
 
<code>mvcam 7-003b: firmware version: 0x1290133</code>
  
可以看到识别到当前的摄像机模组的型号,版本号。摄像机挂载在i2c-7, i2c地址是0x3b。
+
可以看到识别到当前的摄像机模组的型号,版本号。
 +
 
 +
在ROC-RK3588S-PC上,摄像机挂载在i2c-7, i2c地址是0x3b。
 +
 
 +
在ROC-RK3566-PC上,摄像机挂载在i2c-4。
  
 
*执行如下命令检查video0设备节点
 
*执行如下命令检查video0设备节点
Line 104: Line 173:
 
<code>video0</code>
 
<code>video0</code>
  
正确识别摄像头之后,MIPI-CSI2接口的摄像头识别为/dev/video0。
+
正确识别摄像头之后,相机被识别为/dev/video0。
  
 
==== 使用media-ctl查看拓扑结构 ====
 
==== 使用media-ctl查看拓扑结构 ====
Line 133: Line 202:
 
可以看到:
 
可以看到:
  
* 该Entity完整的名称是: <code>m00_b_mvcam 7-003b</code>
+
* 该Entity完整的名称是: <code>m00_b_mvcam 7-003b</code>。(在ROC-RK3566-PC上该Entity名称是<code>m00_b_mvcam 4-003b</code>)
 
* 它是一个 V4L2 subdev (Sub-Device) Sensor。
 
* 它是一个 V4L2 subdev (Sub-Device) Sensor。
 
* 它对应的节点是 <code>/dev/v4l-subdev2</code> ,应用程序(如<code>v4l2-ctl</code>)可以打开它,并进行配置。
 
* 它对应的节点是 <code>/dev/v4l-subdev2</code> ,应用程序(如<code>v4l2-ctl</code>)可以打开它,并进行配置。
Line 182: Line 251:
 
后文提到的pixel_layer_convert转换工具,也是将Compact RAW转换为此种存储方式。方便使用图片播放器打开显示。
 
后文提到的pixel_layer_convert转换工具,也是将Compact RAW转换为此种存储方式。方便使用图片播放器打开显示。
 
====紧密排列的图片格式(Compact RAW)====
 
====紧密排列的图片格式(Compact RAW)====
像素和像素之间不会进行空bit位填充。
+
如上图所示,像素和像素之间不会进行空bit位填充。
 
 
V4L2标准的'Y10P' (10-bit Greyscale (MIPI Packed)),'Y12P' (12-bit Greyscale (MIPI Packed))格式都是以这种方式存储的。
 
  
 
==== 行对齐(line stride) ====
 
==== 行对齐(line stride) ====
Line 211: Line 278:
 
=== 应用范例 ===
 
=== 应用范例 ===
 
====配置命令行全局变量 ====
 
====配置命令行全局变量 ====
 +
根据主板型号,配置I2C_BUS全局变量。
 +
 +
* ROC-RK3588S-PC
 +
 +
<code>export I2C_BUS=7</code>
 +
 +
* ROC-RK3566-PC
 +
 +
<code>export I2C_BUS=4</code>
 +
 
为了后面描述方便,此处根据sensor尺寸,配置全局变量。
 
为了后面描述方便,此处根据sensor尺寸,配置全局变量。
  
Line 263: Line 340:
 
*RAW-MIPI-SC132M
 
*RAW-MIPI-SC132M
  
<code>export WIDTH=1080</code>
+
<code>export WIDTH=1024</code>
  
 
<code>export HEIGHT=1280</code>
 
<code>export HEIGHT=1280</code>
Line 269: Line 346:
 
<code>export FPS=120</code>
 
<code>export FPS=120</code>
  
 +
*RAW-MIPI-IMX462M
 +
 +
<code>export WIDTH=1920</code>
 +
 +
<code>export HEIGHT=1088</code>
 +
 +
<code>export FPS=60</code>
 +
 +
*RAW-MIPI-AR0234M
 +
 +
<code>export WIDTH=1920</code>
 +
 +
<code>export HEIGHT=1200</code>
 +
 +
<code>export FPS=60</code>
 +
 +
*RAW-MIPI-SC535M
 +
 +
<code>export WIDTH=2432</code>
 +
 +
<code>export HEIGHT=2048</code>
 +
 +
<code>export FPS=50</code>
 
==== 使用v4l2-ctl配置参数 ====
 
==== 使用v4l2-ctl配置参数 ====
 
<code>$ v4l2-ctl -d /dev/v4l-subdev2 -L</code>  
 
<code>$ v4l2-ctl -d /dev/v4l-subdev2 -L</code>  
Line 317: Line 417:
 
随分辨率的调整,最大帧率会自动更新。
 
随分辨率的调整,最大帧率会自动更新。
  
===== 设置ROI其实位置 =====
+
===== 设置ROI起始位置 =====
 
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_x=0</code>
 
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_x=0</code>
  
Line 329: Line 429:
 
可以通过下面的命令,配置摄像机的数据格式,分辨率,帧率。
 
可以通过下面的命令,配置摄像机的数据格式,分辨率,帧率。
  
<code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam 7-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
+
<code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam '"$I2C_BUS"'-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
  
 
其中:<code>"m00_b_mvcam 7-003b"</code>指的相机的<code>entity</code>完整名称,<code>Y8_1X8</code>为<code>mbus-code</code>,<code>'"$WIDTH"'x'"$HEIGHT"'</code>指明了分辨率,<code>1/'"$FPS"'</code>指明了帧率。
 
其中:<code>"m00_b_mvcam 7-003b"</code>指的相机的<code>entity</code>完整名称,<code>Y8_1X8</code>为<code>mbus-code</code>,<code>'"$WIDTH"'x'"$HEIGHT"'</code>指明了分辨率,<code>1/'"$FPS"'</code>指明了帧率。
Line 348: Line 448:
 
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_y=0</code>
 
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_y=0</code>
  
<code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam 7-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
+
<code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam '"$I2C_BUS"'-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
  
 
===== 帧率统计 =====
 
===== 帧率统计 =====
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=-1 --stream-to=/dev/null</code>
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=-1 --stream-to=/dev/null</code>
 +
 
 +
或者
 +
 
 +
<code>./yavta -c-1 --skip 0 -f Y8 -s ${WIDTH}x${HEIGHT} /dev/video0</code>
  
 
===== 保存图片到文件 =====
 
===== 保存图片到文件 =====
Line 357: Line 461:
 
* raw8格式
 
* raw8格式
  
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-$WIDTHx$HEIGHT.raw</code>
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-${WIDTH}x${HEIGHT}.raw</code>
  
 
* raw10格式
 
* raw10格式
  
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-$WIDTHx$HEIGHT.raw</code>
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-${WIDTH}x${HEIGHT}.raw</code>
  
 
* raw12格式
 
* raw12格式
  
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=$WIDTH,height=$HEIGHT,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to=y12-$WIDTHx$HEIGHT.raw</code>
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=$WIDTH,height=$HEIGHT,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to=y12-${WIDTH}x${HEIGHT}.raw</code>
  
 
图片格式请参考前面章节的描述。
 
图片格式请参考前面章节的描述。
 +
=====yavta应用范例=====
  
===== gstreamer应用范例 =====
+
====== yavta安装 ======
为了方便进行安装和调试,MV系列相机提供了UYVY模式。UYVY模式支持的最大宽度为2880,使用如下命令可以进行实时预览。
+
<code>git clone <nowiki>git://git.ideasonboard.org/yavta.git</nowiki></code>
 +
 
 +
<code>cd yavta;make</code>
 +
 
 +
====== 保存图片到文件 ======
 +
配置完数据格式,分辨率,帧率之后,执行:
 +
 
 +
<code>./yavta -c1 -Fy8-${WIDTH}x${HEIGHT}.raw --skip 0 -f Y8 -s ${WIDTH}x${HEIGHT} /dev/video0</code>
 +
 
 +
===== 将相机数据导入OpenCV的范例 =====
 +
<code>sudo apt install python3-opencv</code>
 +
 
 +
详见github上的[https://github.com/veyeimaging/rk356x_firefly/tree/main/linux/samples samples]目录。
 +
 
 +
<code>python3 ./v4l2dev_2_opencv_show_grey.py --width 1456 --height 1088 --fps 60 --i2c 7</code>
  
注意RAW系列不支持UYVY格式。
+
注意需要使用合适的参数来执行上述程序。
  
 +
===== gstreamer应用范例 =====
 
我们提供了几个gstreamer例程,实现了预览功能。详见github上的[https://github.com/veyeimaging/rk356x_firefly/tree/main/linux/samples samples]目录。
 
我们提供了几个gstreamer例程,实现了预览功能。详见github上的[https://github.com/veyeimaging/rk356x_firefly/tree/main/linux/samples samples]目录。
 
==== 触发模式 ====
 
==== 触发模式 ====
Line 382: Line 502:
 
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_y=0</code>
 
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_y=0</code>
  
<code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam 7-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
+
<code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam '"$I2C_BUS"'-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
 
=====软触发模式=====
 
=====软触发模式=====
 
======设置模式======
 
======设置模式======
Line 389: Line 509:
 
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_src=0</small></code>
 
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_src=0</small></code>
 
======开始取图======
 
======开始取图======
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-$WIDTHx$HEIGHT.raw</code>
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-${WIDTH}x${HEIGHT}.raw</code>
 
======进行软触发操作======
 
======进行软触发操作======
 
在其他的shell终端,可以多次执行下面命令进行多次触发。
 
在其他的shell终端,可以多次执行下面命令进行多次触发。
Line 402: Line 522:
 
可以使用[[Mv mipi i2c.sh user guide|mv_mipi_i2c.sh]]脚本进行丰富的触发参数设置。
 
可以使用[[Mv mipi i2c.sh user guide|mv_mipi_i2c.sh]]脚本进行丰富的触发参数设置。
 
======开始取图======
 
======开始取图======
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-$WIDTHx$HEIGHT.raw</code>
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-${WIDTH}x${HEIGHT}.raw</code>
 
======进行硬触发操作======
 
======进行硬触发操作======
 
将合适的触发信号连接到摄像机的trigger引脚并进行触发。
 
将合适的触发信号连接到摄像机的trigger引脚并进行触发。
Line 419: Line 539:
 
https://wiki.t-firefly.com/zh_CN/ROC-RK3588S-PC/
 
https://wiki.t-firefly.com/zh_CN/ROC-RK3588S-PC/
 
=== 本文修改记录 ===
 
=== 本文修改记录 ===
 +
 +
* 2024-07-09
 +
 +
支持RAW-MIPI-SC535M。
 +
 +
* 2024-04-17
 +
 +
支持 RK3566。
 +
 +
* 2024-03-10
 +
 +
增加新版本ADP-MV2的硬件连接的图片和说明。
 +
 +
*2023-08-30
 +
 +
增加对RAW-MIPI-IMX462M和RAW-MIPI-AR0234M的支持。
 +
 +
* 2023-07-31
 +
 +
在ubuntu系统下,已经调通V-by-One连接的驱动。
  
 
* 2023-04-12
 
* 2023-04-12
  
 
第一个版本。
 
第一个版本。

Latest revision as of 09:44, 9 July 2024

English

怎样在Firefly板子上使用MV系列和RAW系列相机

1 概述

MV系列和RAW系列相机是为工业领域的AI应用推出的相机。其使用MIPI CSI-2接口,尤其适合嵌入式运算平台使用。它具备丰富的数据格式和触发特性,极低的延时,极高的带宽和可靠的稳定性。

本文以Firefly的ROC-RK3588S-PC和ROC-RK3566-PC主板为例,介绍怎样将MV和RAW系列摄像机接入RK3566/3K3568和RK3588S/RK3588系统。

我们提供了Linux(以Ubuntu为例)操作系统下的驱动。

1.1 支持的模组

系列 型号 状态
MV系列 MV-MIPI-IMX178M 完成
MV系列 MV-MIPI-SC130M 完成
MV系列 MV-MIPI-IMX287M 完成
MV系列 MV-MIPI-IMX296M 完成
MV系列 MV-MIPI-IMX265M 完成
MV系列 MV-MIPI-IMX264M 完成
RAW系列 RAW-MIPI-SC132M 完成
RAW系列 RAW-MIPI-IMX462M 完成
RAW系列 RAW-MIPI-AR0234M 完成
RAW系列 RAW-MIPI-SC535M 完成

此外,在ubuntu系统下,已经调通V-by-One HS连接模式的驱动。

2 硬件准备及安装

MV系列和RAW系列相机需要使用ADP-MV2转接板才能连接到ROC-RK35xx-PC主板。

2.1 新版本ADP-MV2的连接

2.1.1 MV相机与ADP-MV2的连接

二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。

TOP BOTTOM
ADP-MV2 to MV-MIPI-X
ADP-MV2 to MV-MIPI-X


2.1.2 RAW-MIPI-SC132M与ADP-MV2的连接

二者使用1.0mm间距*15P的FFC异面线连接,注意接触面向外。

TOP BOTTOM
ADP-MV2 to RAW-MIPI-SC132M
ADP-MV2 to RAW-MIPI-SC132M
ADP-MV2 to RAW-MIPI-SC132M
2.1.3 其他RAW系列摄像头与ADP-MV2的连接

二者使用0.5mm间距*22P的FFC异面线连接,注意接触面向外。

TOP BOTTOM
ADP-MV2 to RAW series camera
ADP-MV2 to RAW series camera No.2
ADP-MV2 to RAW series camera


2.1.4 ADP-MV2与主板的连接

二者使用0.5mm间距*30P的FFC同面线连接,注意接触面方向,ADP-MV2上向外,RK board上向内。

RK to ADP-MV2 and MV cam


2.2 老版本ADP-MV2的连接

2.2.1 MV相机与ADP-MV2的连接

二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。

TOP BOTTOM
ADP-MV2 to MV-MIPI-X
ADP-MV2 to MV-MIPI-X


2.2.2 RAW-MIPI-SC132M与ADP-MV2的连接

二者使用1.0mm间距*15P的FFC异面线连接,注意接触面向外。

TOP BOTTOM
ADP-MV2 to RAW-MIPI-SC132M
ADP-MV2 to RAW-MIPI-SC132M
2.2.3 其他RAW系列摄像头与ADP-MV2的连接

二者使用15转22P的FFC同面线连接,注意接触面向外。

ADP-MV2 to RAW series camera


2.2.4 ADP-MV2与主板的连接

二者使用0.5mm间距*30P的FFC同面线连接,注意接触面向内。

RK to ADP-MV2 and MV cam


2.3 V-by-One-HS-KIT摄像机连接示意图

VBYONE connection with rk3588


3 github库介绍

https://github.com/veyeimaging/rk35xx_firefly

包括以下主要内容:

  • driver和dts源码
  • i2c通信工具集
  • 应用层demo

此外,在releases中,提供了编译好的linux系统镜像。

4 更新ubuntu系统

对于ROC-RK3566-PC和ROC-RK3588S-PC,我们提供了发布系统的烧写镜像。

下载https://github.com/veyeimaging/rk35xx_firefly/releases/中最新的支持MV和RAW系列的镜像。

参考Firefly文档(ROC-RK3588S-PC ROC-RK3566-PC),烧写系统。

5 系统状态检测

5.1 是否正确识别到了相机

完成系统安装后,系统上电。在Firefly板端执行以下命令来检测是否正确连接相机。

dmesg | grep mvcam

应当有类似下面的提示:

mvcam 7-003b: camera is:MV-MIPI-IMX296M

mvcam 7-003b: firmware version: 0x1290133

可以看到识别到当前的摄像机模组的型号,版本号。

在ROC-RK3588S-PC上,摄像机挂载在i2c-7, i2c地址是0x3b。

在ROC-RK3566-PC上,摄像机挂载在i2c-4。

  • 执行如下命令检查video0设备节点

ls /dev/video0

可以看到

video0

正确识别摄像头之后,相机被识别为/dev/video0。

5.2 使用media-ctl查看拓扑结构

使用media-ctl指令,可以清晰的展现出当前的拓扑结构。

media-ctl -p -d /dev/media0

5.2.1 链接关系

mv camera->rockchip-csi2-dphy0->rockchip-mipi-csi2->stream_cif_mipi_id0 - - ->DDR(/dev/video0)

应用程序可以通过/dev/video0节点获取图像。

5.2.2 mv camera entity信息

以MV-MIPI-IMX296M为例:

- entity 63: m00_b_mvcam 7-003b (1 pad, 1 link)

             type V4L2 subdev subtype Sensor flags 0

             device node name /dev/v4l-subdev2

        pad0: Source

                [fmt:Y8_1X8/1456x1088@100/6000 field:none]

                -> "rockchip-csi2-dphy0":0 [ENABLED]

可以看到:

  • 该Entity完整的名称是: m00_b_mvcam 7-003b。(在ROC-RK3566-PC上该Entity名称是m00_b_mvcam 4-003b
  • 它是一个 V4L2 subdev (Sub-Device) Sensor。
  • 它对应的节点是 /dev/v4l-subdev2 ,应用程序(如v4l2-ctl)可以打开它,并进行配置。
  • 它的输出格式是 [fmt:Y8_1X8/1456x1088@100/6000 field:none] ,其中Y8_1X8是一种mbus-code的简写,下一小节会列出支持的mbus-code。
  • 当前分辨率是1456x1088。
  • 当前帧间隔是100/6000,即帧率是60。

摄像机输出的数据格式,可以通过media-ctl指令修改。

5.3 相机支持的mbus-code

MV系列和RAW系列相机具备不同的数据格式能力,具体请参考每个型号的相机的数据手册。

格式对应关系
Format on datasheet mbus-code for media-ctl FourCC pixelformat for v4l2-ctl
RAW8 Y8_1X8 GREY
RAW10 Y10_1X10 'Y10 '
RAW12 Y12_1X12 'Y12 '
UYVY UYVY8_2X8 UYVY

6 raw图片格式说明

RK3588的VICAP模块支持两种数据保存格式,Compact和Noncompact RAW。可以通过RKCIF的RKCIF_CMD_SET_CSI_MEMORY_MODE ioctl指令修改模式。默认情况下,输出的是Compact RAW格式。

Compact raw and noncompact raw of rk3588 VICAP


6.1 具有填充位的图片格式(Noncompact RAW)

对于10bit深度、12bit深度的像素数据,总是使用两个字节来存储一个像素。这种存储方式方便软件处理,缺点是空间占用较大。根据数据有效数据保存在高位还是低位,又分为high align和low align两种。

6.1.1 Noncompact RAW(high align)

数据保存到高位,用不到的低位以0填充。RK VICAP支持的一种数据格式。

6.1.2 Noncompact RAW(low align)

数据保存到低位,用不到的高位以0填充。V4L2标准的'Y10 ' (10-bit Greyscale),'Y12 ' (12-bit Greyscale)格式都是以这种方式存储的。

后文提到的pixel_layer_convert转换工具,也是将Compact RAW转换为此种存储方式。方便使用图片播放器打开显示。

6.2 紧密排列的图片格式(Compact RAW)

如上图所示,像素和像素之间不会进行空bit位填充。

6.3 行对齐(line stride)

为了方便对图像进行快速操作,系统通常为每行数据提供行对齐的buffer大小。RK3588使用256字节对齐。

line_stride = ALIGN_UP(image_width*bits_per_pixel/8,256)

比如当图像宽度是1456时:

8bit depth,line_stride=1536。

10bit depth,preferred_stride=2048。

12bit depth,preferred_stride=2304。

6.4 转换工具

我们编写了一个小工具:pixel_layer_convert,可以很方便的将紧密排列的图片(Compact RAW)转为具有填充位的图片(Noncompact RAW(low align))。

比如下面的命令,可以将一个1456宽度的compact raw10 图片转为noncompact raw10。

./pixel_layer_convert -I R10C -i y10-1456x1088_0001.raw -o y10-1456x1088_0001_new.raw -w 1456

6.5 raw图片播放器

推荐使用vooya作为播放器,支持GREY, 和具有填充位的图片格式。

Y8文件可以用这个播放器: YUV Displayer Deluxe

7 应用范例

7.1 配置命令行全局变量

根据主板型号,配置I2C_BUS全局变量。

  • ROC-RK3588S-PC

export I2C_BUS=7

  • ROC-RK3566-PC

export I2C_BUS=4

为了后面描述方便,此处根据sensor尺寸,配置全局变量。

  • MV-MIPI-IMX178M

export WIDTH=3088

export HEIGHT=2064

export FPS=22

  • MV-MIPI-SC130M

export WIDTH=1280

export HEIGHT=1024

export FPS=108

  • MV-MIPI-IMX296M

export WIDTH=1456

export HEIGHT=1088

export FPS=60

  • MV-MIPI-IMX287M

export WIDTH=704

export HEIGHT=544

export FPS=319

  • MV-MIPI-IMX265M

export WIDTH=2048

export HEIGHT=1544

export FPS=45

  • MV-MIPI-IMX264M

export WIDTH=2432

export HEIGHT=2056

export FPS=28

  • RAW-MIPI-SC132M

export WIDTH=1024

export HEIGHT=1280

export FPS=120

  • RAW-MIPI-IMX462M

export WIDTH=1920

export HEIGHT=1088

export FPS=60

  • RAW-MIPI-AR0234M

export WIDTH=1920

export HEIGHT=1200

export FPS=60

  • RAW-MIPI-SC535M

export WIDTH=2432

export HEIGHT=2048

export FPS=50

7.2 使用v4l2-ctl配置参数

$ v4l2-ctl -d /dev/v4l-subdev2 -L

User Controls

                   trigger_mode 0x00981901 (int)    : min=0 max=2 step=1 default=0 value=0 flags=volatile, execute-on-write

                    trigger_src 0x00981902 (int)    : min=0 max=1 step=1 default=1 value=1 flags=volatile, execute-on-write

                    soft_trgone 0x00981903 (button) : flags=write-only, execute-on-write

                     frame_rate 0x00981904 (int)    : min=1 max=60 step=1 default=60 value=60 flags=volatile, execute-on-write

                          roi_x 0x00981905 (int)    : min=0 max=1376 step=8 default=0 value=0

                          roi_y 0x00981906 (int)    : min=0 max=1024 step=4 default=0 value=0

可以使用下面的方法设置和获取参数。

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl [ctrl_type]=[val]

v4l2-ctl -d /dev/v4l-subdev2 --get-ctrl [ctrl_type]

以上所有功能,均可使用mv_mipi_i2c.sh实现。

需要指出的是,以上参数在取图过程中均不可修改。下面进行逐个说明:

7.2.1 配置触发模式

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_mode=[0-2]

0:流模式

1:普通触发模式

2:快速连续触发模式

7.2.2 配置触发源

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_src=[0-1]

0: 软触发

1: 硬触发

7.2.3 软触发一次

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl soft_trgone=1

7.2.4 设置帧率

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl frame_rate=[1-max]

随分辨率的调整,最大帧率会自动更新。

7.2.5 设置ROI起始位置

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_x=0

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_y=0

ROI其实位置设置之后,需要通过media-ctl命令完成完整的ROI配置。

设置roi后,最大帧率会自动调整。请注意,摄像机roi参数需要符合摄像机手册中的要求。

7.3 使用media-ctl配置图像格式

可以通过下面的命令,配置摄像机的数据格式,分辨率,帧率。

media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam '"$I2C_BUS"'-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'

其中:"m00_b_mvcam 7-003b"指的相机的entity完整名称,Y8_1X8mbus-code'"$WIDTH"'x'"$HEIGHT"'指明了分辨率,1/'"$FPS"'指明了帧率。

此处的width和height配合v4l2-ctl命令的roi_xroi_y共同组成了ROI参数。

比如,对于MV-MIPI-IMX296M,这个命令经过变量替换后的结果是:

media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam 7-003b":0[fmt:Y8_1X8/1456x1088@1/60 field:none]'

不仅可以在一个命令中同时配置数据格式,分辨率,帧率,也可以单独修改某一项或某几项。

7.4 流模式

7.4.1 设置数据格式,分辨率,帧率

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_x=0

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_y=0

media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam '"$I2C_BUS"'-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'

7.4.2 帧率统计

v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=-1 --stream-to=/dev/null

或者

./yavta -c-1 --skip 0 -f Y8 -s ${WIDTH}x${HEIGHT} /dev/video0

7.4.3 保存图片到文件
  • raw8格式

v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-${WIDTH}x${HEIGHT}.raw

  • raw10格式

v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-${WIDTH}x${HEIGHT}.raw

  • raw12格式

v4l2-ctl -d /dev/video0 --set-fmt-video=$WIDTH,height=$HEIGHT,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to=y12-${WIDTH}x${HEIGHT}.raw

图片格式请参考前面章节的描述。

7.4.4 yavta应用范例
7.4.4.1 yavta安装

git clone git://git.ideasonboard.org/yavta.git

cd yavta;make

7.4.4.2 保存图片到文件

配置完数据格式,分辨率,帧率之后,执行:

./yavta -c1 -Fy8-${WIDTH}x${HEIGHT}.raw --skip 0 -f Y8 -s ${WIDTH}x${HEIGHT} /dev/video0

7.4.5 将相机数据导入OpenCV的范例

sudo apt install python3-opencv

详见github上的samples目录。

python3 ./v4l2dev_2_opencv_show_grey.py --width 1456 --height 1088 --fps 60 --i2c 7

注意需要使用合适的参数来执行上述程序。

7.4.6 gstreamer应用范例

我们提供了几个gstreamer例程,实现了预览功能。详见github上的samples目录。

7.5 触发模式

7.5.1 设置数据格式,分辨率,帧率

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_x=0

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl roi_y=0

media-ctl -d /dev/media0 --set-v4l2 '"m00_b_mvcam '"$I2C_BUS"'-003b":0[fmt:Y8_1X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'

7.5.2 软触发模式
7.5.2.1 设置模式

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_mode=1

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_src=0

7.5.2.2 开始取图

v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-${WIDTH}x${HEIGHT}.raw

7.5.2.3 进行软触发操作

在其他的shell终端,可以多次执行下面命令进行多次触发。

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl soft_trgone=1

7.5.3 硬触发模式
7.5.3.1 设置模式

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_mode=1

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_src=1

可以使用mv_mipi_i2c.sh脚本进行丰富的触发参数设置。

7.5.3.2 开始取图

v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-${WIDTH}x${HEIGHT}.raw

7.5.3.3 进行硬触发操作

将合适的触发信号连接到摄像机的trigger引脚并进行触发。

8 i2c脚本使用说明

我们提供了shell脚本来配置参数。

mv_mipi_i2c.sh user guide

9 问题反馈

我们致力于为嵌入式平台的图像应用提供更丰富的可能性。因此,我们在嵌入式平台的软件基于开源的原则而进行。

如对我们现有软件有任何的问题、建议,欢迎提交到论坛:,或者给我们的技术人员发邮件xumm#csoneplus.com。

10 参考资料

  • ROC-RK3588S-PC 手册

https://wiki.t-firefly.com/zh_CN/ROC-RK3588S-PC/

11 本文修改记录

  • 2024-07-09

支持RAW-MIPI-SC535M。

  • 2024-04-17

支持 RK3566。

  • 2024-03-10

增加新版本ADP-MV2的硬件连接的图片和说明。

  • 2023-08-30

增加对RAW-MIPI-IMX462M和RAW-MIPI-AR0234M的支持。

  • 2023-07-31

在ubuntu系统下,已经调通V-by-One连接的驱动。

  • 2023-04-12

第一个版本。