FPGA通过MIPI CSI-2发送实时图像到RK3588,并HDMI显示

介绍FPGA通过MIPI CSI-2发送实时图像到RK3588,并HDMI显示。

FPGA本地产生动态图像模板,通过MIPI CSI-2接口发送到RK3588 MIPI CSI接口。RK3588注册成相机后,调用接口并在HDMI显示器上显示。

1、RK3588驱动调试

查看Media controller信息

Media controller API version 6.1.84

Media device information


driver rkcif

model rkcif-mipi-lvds

serial

bus info platform:rkcif-mipi-lvds

hw revision 0x0

driver version 6.1.84

Device topology

  • entity 1: stream_cif_mipi_id0 (1 pad, 11 links)

type Node subtype V4L flags 0

device node name /dev/video0

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/video1

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/video2

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/video3

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/video4

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/video5

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/video6

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/video7

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/video8

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/video9

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/video10

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-subdev0

pad0: Sink

[fmt:SBGGR8_1X8/2304x1296 field:none

crop.bounds:(0,0)/2304x1296

crop:(0,0)/2304x1296]

<- "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-subdev1

pad0: Sink

[fmt:SBGGR8_1X8/2304x1296@10000/300000 field:none

crop.bounds:(0,0)/2304x1296]

<- "m00_b_imx415 7-001a":0 ENABLED

pad1: Source

-> "rockchip-mipi-csi2":0 ENABLED

  • entity 63: m00_b_imx415 7-001a (1 pad, 1 link)

type V4L2 subdev subtype Sensor flags 0

device node name /dev/v4l-subdev2

pad0: Source

[fmt:SBGGR8_1X8/2304x1296@10000/300000 field:none

crop.bounds:(0,0)/2304x1296]

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

2、RK3588手动抓取FPGA图像

v4l2-ctl -d /dev/video0 --set-fmt-video=width=2304,height=1296,pixelformat=BA81 \--stream-mmap=3 \--stream-skip=3 \--stream-to=/tmp/cif888.out \--stream-count=1 \--stream-poll

14.624791 rockchip-mipi-csi2 fdd10000.mipi0-csi2: hzpd csi2_s_stream

14.624835 rockchip-mipi-csi2 fdd10000.mipi0-csi2: stream on, src_sd: 00000000d5480faf, sd_name:rockchip-csi2-dphy0

14.624847 rockchip-mipi-csi2 fdd10000.mipi0-csi2: stream ON

14.624856 rockchip-mipi-csi2 fdd10000.mipi0-csi2: hzpd csi2_start

14.624882 rockchip-mipi-csi2 fdd10000.mipi0-csi2: hzpd csi2_update_sensor_info

14.624904 rockchip-mipi-csi2: csi2->bus.num_data_lanes = 4

14.694384 rkcif-mipi-lvds: ERROR: csi size err, intstat:0x1000001, lastline:0!!

14.694434 mipi0-csi2 ERR1:0x10 (fs/fe mis,vc: 0)

<<<< 15.185394 rockchip-mipi-csi2 fdd10000.mipi0-csi2: hzpd csi2_s_stream

15.185458 rockchip-mipi-csi2 fdd10000.mipi0-csi2: stream off, src_sd: 00000000d5480faf, sd_name:rockchip-csi2-dphy0

15.185472 rockchip-mipi-csi2 fdd10000.mipi0-csi2: stream OFF

3、查看抓取的图像文件

tmp# ls -l

total 3624

-rw-r--r-- 1 root root 2985984 Mar 2 07:47 cif888.out

-rw-r--r-- 1 root root 695958 Mar 2 07:47 iq_dump.json

drwx------ 2 root root 4096 Mar 2 07:47 snap-private-tmp

drwx------ 3 root root 4096 Mar 2 07:47 systemd-private-54d04dbd901a4c6d9bf51f22a372453e-ModemManager.service-OohSfg

drwx------ 3 root root 4096 Mar 2 07:47 systemd-private-54d04dbd901a4c6d9bf51f22a372453e-systemd-logind.service-742rHg

drwx------ 3 root root 4096 Mar 2 07:47 systemd-private-54d04dbd901a4c6d9bf51f22a372453e-systemd-resolved.service-L1NO8e

drwx------ 3 root root 4096 Mar 2 07:47 systemd-private-54d04dbd901a4c6d9bf51f22a372453e-systemd-timesyncd.service-815p5g

drwx------ 3 root root 4096 Mar 2 07:47 systemd-private-54d04dbd901a4c6d9bf51f22a372453e-upower.service-24inCg

drwx------ 2 firefly firefly 4096 Mar 2 07:47 tracker-extract-files.1000

srwxr-xr-x 1 root root 0 Mar 2 07:47 UNIX.domain

4、运行GST测试,HDMI显示测试

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

Setting pipeline to PAUSED ...

Pipeline is PREROLLING ...

Pipeline is PREROLLED ...

Prerolled, waiting for async message to finish...

Setting pipeline to PLAYING ...

Redistribute latency...

New clock: GstSystemClock

^Chandling interrupt.

Interrupt: Stopping pipeline ...

Execution ended after 0:00:07.325302254

Setting pipeline to NULL ...

Freeing pipeline ...

测试效果如图。

5、运行GST,显示FPGA实时发送图像

RK3588和FPGA启动运行正常后,在RK3588输入命令。

gst-launch-1.0 v4l2src device=/dev/video-camera0 ! video/x-raw,for

root@rk3588:/#

root@rk3588:/#

rmat=RG10,width=2304,height=1296, framerate=30/1 ! waylandsink0 ! video/x-raw,for

WARNING: erroneous pipeline: could not link v4l2src0 to waylandsink0, neither element can handle caps video/x-raw, format=(string)RG10, width=(int)2304, height=(int)1296, framerate=(fraction)30/1

root@rk3588:/#

root@rk3588:/#

rmat=BA81,width=2304,height=1296, framerate=30/1 ! waylandsink0 ! video/x-raw,for

WARNING: erroneous pipeline: could not link v4l2src0 to waylandsink0, neither element can handle caps video/x-raw, format=(string)BA81, width=(int)2304, height=(int)1296, framerate=(fraction)30/1

root@rk3588:/#

root@rk3588:/#

root@rk3588:/#

rmat=UYVY,width=2304,height=1296, framerate=30/1 ! waylandsink0 ! video/x-raw,for

Setting pipeline to PAUSED ...

Using mplane plugin for capture

Pipeline is live and does not need PREROLL ...

Pipeline is PREROLLED ...

Setting pipeline to PLAYING ...

New clock: GstSystemClock

ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data stream error.

Additional debug info:

../libs/gst/base/gstbasesrc.c(3132): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:

streaming stopped, reason not-negotiated (-4)

Execution ended after 0:00:00.000817834

Setting pipeline to NULL ...

Freeing pipeline ...

实时显示FPGA发送的动态图像,效果如下。

6、欢迎讨论交流,方案定制设计。

相关推荐
szxinmai主板定制专家4 小时前
Zynq MPSoC实现半导体真空腔体状态监测|FPGA多传感器时序同步采集方案
fpga开发·zynq·控制器·mpsoc·半导体设备·fpga同步
学习FPGA的电气小兴兴6 小时前
基于FPGA的DDS信号发生器设计,生成频率可调的正弦波、三角波、锯齿波和方波
fpga开发·数字信号处理·fpga·vivado·dsp·dds·diy
szxinmai主板定制专家17 小时前
Zynq MPSoC半导体高精度运动控制方案|FPGA硬件插补实现亚微米级伺服实时控制
人工智能·嵌入式硬件·fpga开发·zynq·运动控制·ethercat
星夜离尘562 天前
ILA 在线调试:Vivado 抓取片内信号与定位下板问题(附完整实操)
fpga开发
jz_ddk2 天前
[学习] 深入理解 USB 通信与 FPGA 实现:从协议到逻辑设计
学习·fpga开发·xilinx·usb2.0
星夜离尘562 天前
PWM 信号生成与呼吸灯:占空比控制、按键调光与舵机扩展(附完整 Verilog 实操)
fpga开发
zlinear数据采集卡2 天前
ZLinear DABM-D223 通信协议与软件开发全解析:从 USB CDC 到 DDS 波形输出
arm开发·嵌入式硬件·fpga开发·开源
LCMICRO-133108477463 天前
国产长芯微LD3092完全pin-pin替代LT3092,是一款可编程两端电流源
arm开发·单片机·嵌入式硬件·fpga开发·硬件工程·恒流源·lt3092
nuoxin1143 天前
BL-M8812CU3 无线 WiFi 模块-富利威
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发