跳到主要内容

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