一、概述

Media 子系统是一个用于处理多媒体设备的框架,它提供了一组 API 和驱动程序,用于管理和控制视频、音频和其他多媒体设备。而 V4L2 是 media 子系统的一部分,用于处理视频相关的功能。

了解 MIPI 摄像头后,发现 linux 系统下的流媒体驱动很复杂,而 MIPI 摄像头主要分为感光模组和 ISP 处理器,其中感光模组是用于生成 Bayer 数据(拜耳阵列),ISP 用于处理感光模组产生的数据(功能比较复杂这里就不介绍了)。对于 MIPI 摄像头而言,ISP 可以在摄像头前端或集成在SOC中,对于这两种情况,所需的驱动程序是不一样的。

Media 子系统刚好解决了这个问题,采用了分层式架构,可以粗暴的理解成为产线上的工位,每个工位处理的工作不一样,而每个工位之间通过传送带连接,只需要改变传送带的连接方式,即可实现不同的功能,接下来我们对 Media 的链路进行分析,目前我只用过 RV1126 开发板,不知道其他厂商的实现是方式是否一样

二、测试环境

  1. 开发板:RV1126
  2. ARM Linux 版本:4.19.111

三、Media 设备

  1. Media 设备节点在 /dev 目录下,如下图所示

  2. Media 设备之间的连接方式如下图所示

  3. Media 设备信息

    • entity:抽象的硬件设备模块(类比电路板上面的某个元器件)
    • pad: 抽象的硬件设备端口(类比某个元器件的管脚)
    • link: 抽象的硬件设备的连线(类比元器件管脚之间的连线)

四、节点关系

  1. 查看节点之间的拓扑关系,如下图所示

    media-ctl -p -d /dev/mediaX

    注意:

    • Source和符号“->”表示输出
    • Sink和符号“<-”就表示输入
    • link表示连接,或者表示链路
  2. 根据上面关系很容易画出拓扑图,如下所示

五、RV1126 链路关系

通过查看设备树信息,可以得出开发板的链路关系,如下图所示



注意:从上面可以看出 RV1126 开发板中,imx415 摄像头的数据流向,只需要知道每个模块对应的节点,即可抓出我们想要的视屏数据

六、media 和 video 节点对应关系

  1. 查询 video 节点和 ISP/ISPP 节点的对应关系

    grep "" /sys/class/video4linux/*/name
  2. 名称相同的 ISP 节点,可能属于不同的 media 设备下

    media-ctl -d /dev/media3 -e "rkispp_scale1"
    media-ctl -d /dev/media4 -e "rkispp_scale1"
  3. 筛选

    media-ctl -p -d /dev/media4 | grep rkispp_scale0
  4. 查看对应 video 节点支持的格式

    v4l2-ctl --list-formats-ext --device /dev/videoX

七、抓图测试

v4l2-ctl 抓图命令

v4l2-ctl -d /dev/video30 \
--set-fmt-video=width=3840,height=2160,\
pixelformat=NV12 \
--stream-mmap=3 \
--stream-skip=3 \
--stream-to=/tmp/bypass0.raw \
--stream-count=1 \
--stream-poll # -d:指定摄像头的设备节点
# --set-fmt-video:指定了宽高及pxielformat(用FourCC表示)。NV12即用FourCC表示的pixelformat;
# --Pixelformat:指定文件格式,NV12;
# --stream-mmap:指定 buffer 的类型为 mmap;
# --stream-skip:指定丢弃(不保存到文件)前3帧;
# --stream-to:指定帧数保存的文件路径;
# --stream-count:指定抓取的帧数,不包括--stream-skip丢弃的数量;
# --stream-poll:v4l2-ctl 采用异步 IO。
  1. 使用 v4l2-ctl 从 rkispp_m_bypass 抓 YUV 图

    # 查看对应video节点支持的格式
    media-ctl -d /dev/media3 -e "rkispp_m_bypass"
    v4l2-ctl --list-formats-ext --device /dev/video30 # 要开启ispserver,否则报错RKISP找不到iq
    ispserver & # 抓帧(IMX415摄像头插在MIPI CSI0接口上)
    v4l2-ctl -d /dev/video30 \
    --set-fmt-video=width=2592,height=1944,\
    pixelformat=NV12 \
    --stream-mmap=3 \
    --stream-skip=30 \
    --stream-to=/tmp/bypass0.raw \
    --stream-count=1 \
    --stream-poll # 通过adb命令把文件拷贝到Ubuntu下
    adb pull /tmp/bypass0.raw .
    # Ubuntu上查看
    ffplay -f rawvideo -video_size 2592x1944 -pixel_format nv12 bypass0.raw
  2. 从 VICAP 抓 RAW 图

     # 显示video0节点所有信息
    v4l2-ctl -d /dev/video0 --all
    # 查看对应video0节点支持的格式
    v4l2-ctl --list-formats-ext --device /dev/video0
    # 设置数据以非紧凑型存储
    echo 0 > /sys/devices/platform/rkcif_mipi_lvds/compact_test v4l2-ctl -d /dev/video0 \
    --set-fmt-video=width=2592,height=1944,\
    pixelformat=GB10 \
    --stream-mmap=3 \
    --stream-skip=30 \
    --stream-to=/tmp/vicap.raw \
    --stream-count=1 \
    --stream-poll # 图片转换
    ./test vicap.raw vicap_GB10.pgm 2592 1944 65535 1
    # 图片显示
    eog vicap_GB10.pgm

八、注意事项

(1)抓取 ISP 图像时需要开启 ispserver 服务
  1. 查看 ispserver 服务是否开启

    ps -aux | grep ispserver
  2. 开启 ispserver 服务

    # 表示不开启数据库服务dbserver
    ispserver --no-sync-db &
    # 或者
    ispserver &
  3. 关闭 ispserver 服务

    kill -9 PID

(2)抓图是链路之间必须是 ENABLED 状态

  1. 抓图时 rkisp-bridge-ispp 必须是ENABLED 的(1表示[ENABLED],0表示disable [ ]),设置命令如下

    # 对应MIPI CSI0
    media-ctl -d /dev/media1 -l '"rkisp-isp-subdev":2->"rkisp_mainpath":0[0]'
    media-ctl -d /dev/media1 -l '"rkisp-isp-subdev":2->"rkisp_selfpath":0[1]'
    media-ctl -d /dev/media1 -l '"rkisp-isp-subdev":2->"rkisp-bridge-ispp":0[1]'
    media-ctl -d /dev/media3 -l '"rkispp_input_image":0->"rkispp-subdev":0[0]' # 对应MIPI CSI1
    media-ctl -d /dev/media2 -l '"rkisp-isp-subdev":2->"rkisp_mainpath":0[0]'
    media-ctl -d /dev/media2 -l '"rkisp-isp-subdev":2->"rkisp_selfpath":0[1]'
    media-ctl -d /dev/media2 -l '"rkisp-isp-subdev":2->"rkisp-bridge-ispp":0[1]'
    media-ctl -d /dev/media4 -l '"rkispp_input_image":0->"rkispp-subdev":0[0]'

(3)RKMedia 例程测试注意事项

  1. 开启和关闭 mediaserver

    # 开启摄像头应用
    /oem/RkLunch.sh &
    # 关闭摄像头应用
    /oem/RkLunch-stop.sh &

(4)RAW 数据查看

在抓图 RAW 数据图像时,可以使用正点原子提供的 raw 转 pgm 图工具处理后,进行查看

参看资料

正点原子 PPT 课件

RV1126 相关手册

Linux Media 子系统链路分析的更多相关文章

  1. Linux输入子系统框架分析(1)

    在Linux下的输入设备键盘.触摸屏.鼠标等都能够用输入子系统来实现驱动.输入子系统分为三层,核心层和设备驱动层.事件层.核心层和事件层由Linux输入子系统本身实现,设备驱动层由我们实现.我们在设备 ...

  2. linux网络子系统内核分析

    1.选择路由 若要将数据包发至PC2,则linux系统通过查询路由表可知168.1.1.10(目的地址)的网关地址为192.168.1.1,此时linux系统选择网卡1发送数据包. 2.邻居子系统(通 ...

  3. Linux input子系统实例分析(二)

    紧接着上一节的实例我们来分析调用的input子系统的接口: 1. input_dev,用来标识输入设备 1: struct input_dev { 2: const char *name; //设备名 ...

  4. Linux input子系统实例分析(一)

    这是一个简单的输入设备驱动实例.这个输入设备只有一个按键,按键被连接到一条中断线上,当按键被按下时,将产生一个中断,内核将检测到这个中断,并对其进行处理.该实例的代码如下:     1: #inclu ...

  5. 【分析笔记】Linux input 子系统原理分析

    一.input 子系统简介 输入子系统主要用于支持各种输入设备,可大大简化这类设备驱动的开发难度.以下为个人的理解,可能不同的内核版本会略有差异,在这里分析的内核为 linux-4.9. 无论在 Li ...

  6. Linux ubi子系统原理分析

    本文思维导图总纲: 综述 关于ubi子系统,早已有比较正式的介绍,也提供非常形象的介绍ubi子系统ppt 国内的前辈 alloysystem 不辞辛劳为我们提供了部分正式介绍的中文译文,以及找不到原文 ...

  7. 【转】 linux iio子系统

    原文网址:http://blog.csdn.net/tsy20100200/article/details/47101661 最近由于工作的需要,接触了Linux iio子系统,对于这个目录其实以前是 ...

  8. linux iio子系统

    //============================================================================\\ || 系            统:W ...

  9. linux input输入子系统应用分析

    输入设备(如按键.键盘.触摸屏.鼠标等)是典型的字符设备,其一般的工作机理是底层在按键.触摸等动作发送时产生一个中断(或驱动通过timer定时查询),然后CPU通过SPI.I2 C或外部存储器总线读取 ...

  10. Linux input子系统分析

    输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见.同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分 ...

随机推荐

  1. ROS的通信机制

    通信机制 节点--执行单元 执行具体任务的进程.独立运行的可执行文件: 不同节点可以使用不同的编程语言,可分布式运行在不同的主机上. 节点在系统中的名称是必须是唯一的. 节点管理器(ROS Maste ...

  2. 掌握Spring条件装配的秘密武器

    本文分享自华为云社区<Spring高手之路9--掌握Spring条件装配的秘密武器>,作者:砖业洋__. 在Spring框架中,条件装配是一个强大的功能,可以帮助我们更好地管理和控制Bea ...

  3. FreeRTOS 基于 ARMv8-M 对 MPU 的应用

    一.前言 ARMv8-M 支持 MPU,FreeRTOS 也添加了对这些 MPU 的应用代码.这里用来记录 FreeRTOS 对 MPU 应用方式的探究结果. 二.ArmV8-M MPU 介绍 ARM ...

  4. RocketMQ Linux单机测试:简易快速部署指南及Dashboard控制台部署

    目录 简介 开始 下载 增加环境变量 修改启动文件jvm大小 修改rocketmq配置文件 启动 快速测试 关闭 Dashboard 下载Dashboard 已编译jar包网盘下载 启动命令 可能遇到 ...

  5. windows和linux键值表

    windows系统下对应键值 {8,KEY_BACKSPACE}, {9,KEY_TAB}, {13,KEY_ENTER}, {16,KEY_LEFTSHIFT}, {17,KEY_LEFTCTRL} ...

  6. uniapp 地图如何添加?你要的教程来喽!

    地图在 app 中使用还是很广泛的,常见的应用常见有: 1.获取自己的位置,规划路线. 2.使用标记点进行标记多个位置. 3.绘制多边形,使用围墙标记位置等等. 此篇文章就以高德地图为例,以上述三个常 ...

  7. 用shell命令绘制三角形

    本文旨在通过几个经典的图案来练习shell编程,涉及知识点:for循环,大小比较,基本的数学公式计算,echo小技巧.update:2019-10-17 10:13:54 初次绘制 $ for ((l ...

  8. Vue源码学习(五):<templete>渲染第四步,生成虚拟dom并将其转换为真实dom

    好家伙,   前情提要: 在上一篇我们已经成功将ast语法树转换为渲染函数  现在我们继续   1.项目目录 代码已开源https://github.com/Fattiger4399/analytic ...

  9. vue2和vue3使用echarts时无数据,怎么显示暂无数据图片或文字

    一开始也经历了用v-if和v-show,v-show的话echarts还会留出暂无数据图片的位置,导致echarts变形,v-if在加载和不加载切换时,dom会获取不到:后来也是在网上找的方法,时间有 ...

  10. DHorse v1.4.0 发布,基于 k8s 的发布平台

    版本说明 新增特性 提供Fabric8客户端操作k8s(预览)的功能,可以通过指定-Dkubernetes-client=fabric8参数开启: Vue.React应用增加Pnpm.Yarn的构建方 ...