跳到主要内容

V4L2使用

RDK X5支持V4L2接口,用户可以通过V4L2接口访问RDK X5的mipi接口摄像头,获取VIN、ISP、VSE等阶段的图像数据。

模式切换

使用srpi-config配置camera采集模式
进入3 Interface Options->I7 V4L2
选择I1 V4L2 Enable/disable V4L2 interface for camera img-20250523-191348

模式介绍

HBN 常规模式
Camera是单独一套API,Camera之后的模块用vnode来抽象,vnode抽象的模块包括VIN、ISP、VSE、GDC、Codec。 多个vnode组成一条vflow(类似于一条pipeline)。Camera和VIN通过attach接口绑定起来。 用户只需要调用HBN接口完成模块的初始化和绑定,vflow建立并启动后,用户无须关心数据帧的传递,X5内部会将数据帧由上游传递到下游。

V4L2 sif-isp-vse V4L2数据流模式
camera 通过 V4l2 snesor 驱动添加,VIN、ISP、VSE都提供了对应的v4l2 video设备节点,用户可以直接通过v4l2 api获取相应的数据。

V4L2 vse alone V4L2 VSE 单独使用模式
提供VSE通道的v4l2 video设备节点,用户可以直接通过v4l2 api回灌图像给VSE模块进行处理。

配置Camera

如果选择sif-isp-vse 会弹出CAM0,CAM1摄像头选择
X5 RDK cam0 靠近网口,cam1 远离网口;
X5 MD 可以观察载板的丝印;

img-20250523-191636

img-20250523-191648

配置完成后,重启板卡;
确认V4L2模式生效:
使用lsmod 查看驱动,可以看到v4l相关驱动,和sensor相关驱动

img-20250523-1918

设备拓扑

V4L2 sif-isp-vse模式生效后,可以通过以下命令查看设备拓扑图,它展示了 /dev/media0 设备的 媒体管道(Media Pipeline) 结构,包括 传感器、ISP、视频节点、数据流路径 等信息。

media-ctl -d /dev/media0 --print-dot > media0.dot
dot -Tpng media0.dot -o media0.png

img-media0

也可以直接在下表中查询:

VIDEO_DEV_CSI0_SIF "/dev/video0"
VIDEO_DEV_CSI0_ISP "/dev/video4"
VIDEO_DEV_CSI0_VSE0 "/dev/video8"
VIDEO_DEV_CSI0_VSE1 "/dev/video9"
VIDEO_DEV_CSI0_VSE2 "/dev/video10"
VIDEO_DEV_CSI0_VSE3 "/dev/video11"
VIDEO_DEV_CSI0_VSE4 "/dev/video12"
VIDEO_DEV_CSI0_VSE5 "/dev/video13"

VIDEO_DEV_CSI1_SIF "/dev/video1"
VIDEO_DEV_CSI1_ISP "/dev/video5"
VIDEO_DEV_CSI1_VSE0 "/dev/video14"
VIDEO_DEV_CSI1_VSE1 "/dev/video15"
VIDEO_DEV_CSI1_VSE2 "/dev/video16"
VIDEO_DEV_CSI1_VSE3 "/dev/video17"
VIDEO_DEV_CSI1_VSE4 "/dev/video18"
VIDEO_DEV_CSI1_VSE5 "/dev/video19"

VIDEO_DEV_CSI2_SIF "/dev/video2"
VIDEO_DEV_CSI2_ISP "/dev/video6"
VIDEO_DEV_CSI2_VSE0 "/dev/video20"
VIDEO_DEV_CSI2_VSE1 "/dev/video21"
VIDEO_DEV_CSI2_VSE2 "/dev/video22"
VIDEO_DEV_CSI2_VSE3 "/dev/video23"
VIDEO_DEV_CSI2_VSE4 "/dev/video24"
VIDEO_DEV_CSI2_VSE5 "/dev/video25"

VIDEO_DEV_CSI3_SIF "/dev/video3"
VIDEO_DEV_CSI3_ISP "/dev/video7"
VIDEO_DEV_CSI3_VSE0 "/dev/video26"
VIDEO_DEV_CSI3_VSE1 "/dev/video27"
VIDEO_DEV_CSI3_VSE2 "/dev/video28"
VIDEO_DEV_CSI3_VSE3 "/dev/video29"
VIDEO_DEV_CSI3_VSE4 "/dev/video30"
VIDEO_DEV_CSI3_VSE5 "/dev/video31"

使用说明

V4L2-CTL指令

1,使用v4l2-ctl --list-formats-ext 查询支持的分辨率,编码方式,也让驱动完成初始化;
2,使用v4l2-ctl -d /dev/video4获取视频数据;

v4l2-ctl --list-formats-ext --device /dev/video4
v4l2-ctl -d /dev/video4 \
--set-fmt-video=width=640,height=480,pixelformat=NV12 \
--stream-mmap=3 \
--stream-skip=3 \
--stream-to=/tmp/nv12.yuv \
--stream-count=1 \
--stream-poll

V4L2 示例代码

示例代码位于 v4l2_demo.c

参数说明

-w sensor输出宽
-h sensor输出高
-c 采集图片数量
-n sensor采集video节点
-o 输入NV12图像video节点
-i 输入NV12图像路径

1,V4L2 sif-isp-vse模式 采集图像,保存为文件

./v4l2 -w 1920 -h 1080 -c 10 -n 4

2,V4L2 vse alone模式,单独使用VSE节点,1080p.yuv作为输入图像,缩放后的图片保存为文件

./v4l2 -w 1920 -h 1080 -c 10 -n 2 -o 2 -i ./1080p.yuv

多媒体应用

hbn模式和V4L2 sif-isp-vse模式使用同一套示例程序,hobot-spdev会根据当前的驱动自动选择工作模式,两者的打印信息略有不同

支持的例程

涉及到hdmi显示,需要先关闭桌面

sudo systemctl stop lightdm
/app/cdev_demo/vio2display
/app/cdev_demo/vio_capture
/app/cdev_demo/vio2encoder
/app/cdev_demo/bpu ./sample -f /app/model/basic/yolov5s_672x672_nv12.bin -m 0
/app/pydev_demo/03_mipi_camera_sample

已知问题

1,取VSE流时,强制选择1920x1080分辨率的ISP sensor 配置文件;
2,V4L2 vse alone模式,仅支持使用VSE通道2,回灌图像,获取处理结果;