跳到主要内容

V4L2 使用

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

背景知识

HBN 框架

HBN 框架覆盖了 Camera Sensor 采集链路中大部分的模块,包括 VINISPVSEGDCN2D。其中VINISPVSE可以通过 V4L2 接口访问。

模块全称解释
VINVideo Input软件概念,包含 MIPI、 SIF,接收单路或多路 Camera sensor 数据,直接送给下游 ISP 或写到 DDR
SIFSensor Interface衔接 MIPI 口,把 MIPI 接口收到的数据帧送给下游 ISP 或直接写到 DDR
ISPImage Signal Processor图像信号处理器
VSEVideo Scaler图像的裁剪、缩放、颜色空间转换

VIN 用于图形采集,可以从 4 路SIF接口中采集到原生图形,一般为 RAW 格式;

ISP (Image Signal Processor) 用于图像信号处理,RDK X5 支持了多款 sensor,均已完成 ISP 调试,可以直接获取到处理后的 NV12 格式图像;

VSE (Video Scale Enginer) 用于图像缩放 支持 6 个缩放通道,可以获取到处理后的 NV12 格式图像,通道特性如下:

  • 最大处理能力: 3840x2160@60fps

  • 支持输入裁剪,分别在水平和垂直方向上进行缩放,并且对色度和亮度分量进行单独处理

  • 5 个 downscale 通道

  • 最大分辨率支持分别为 4K/1080P/1080P/720P/720P

  • 最小分辨率为 64x64,支持任意 downscale factor

  • 1 个 upscale 通道

  • 最大分辨率支持 4K,最大放大倍数 4X, 放大倍数支持 0 - 4

    输出通道编号类型通道功能
    0offline4K Downscale
    1offline1080P Downscale
    2offline1080P Downscale
    3offline720P Downscale
    4offline720P Downscale
    5offline4K Upscale

模式切换

使用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"

对于 RDK 板卡来说,拓扑关系可以简化为

image-v4l2-media

使用说明

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 示例代码

示例代码以源码形式提供,需要使用 make 命令进行编译后运行:

cd /app/cdev_demo/v4l2/
sudo make

参数说明

-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 会根据当前的驱动自动选择工作模式,两者的打印信息略有不同

注意

多媒体示例会根据srpi-config配置自动选择摄像头,请确保摄像头配置正确。如果cam0 cam1都配置,则默认选择cam1

支持的例程

涉及到 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,回灌图像,获取处理结果;