Linux V4l2 框架 一

v4l2的框架图

1.Linux Media Framework( 媒体框架)

1.基本概念

media framework 是嵌入到lv4l2 框架中,主要分成entity pad link三大部分,entity设备的实例

pad 用来作为entity的连接点 link 用来连接entity 下图可以直观的看到

2.media的源码

1.注册media总线

首先看media-devnode.c文件,在/sys/bus/下注册了media总线,后续相关的media设备都会注册到下面

Z:\RV1109\kernel\drivers\media\media-devnode.c
subsys_initcall(media_devnode_init);static int __init media_devnode_init(void)
{int ret;pr_info("Linux media interface: v0.10\n");ret = alloc_chrdev_region(&media_dev_t, 0, MEDIA_NUM_DEVICES,MEDIA_NAME);if (ret < 0) {pr_warn("unable to allocate major\n");return ret;}ret = bus_register(&media_bus_type);if (ret < 0) {unregister_chrdev_region(media_dev_t, MEDIA_NUM_DEVICES);pr_warn("bus_register failed\n");return -EIO;}return 0;
}

2.注册media实例

注册完总线后需要把媒体设备实例化,调用注册媒体设备接口在media总线下注册

Z:\RV1109\kernel\drivers\media\media-device.c
//初始化media device下的 entity pad link  链表
void media_device_init(struct media_device *mdev)
{INIT_LIST_HEAD(&mdev->entities);INIT_LIST_HEAD(&mdev->interfaces);INIT_LIST_HEAD(&mdev->pads);INIT_LIST_HEAD(&mdev->links);INIT_LIST_HEAD(&mdev->entity_notify);mutex_init(&mdev->graph_mutex);ida_init(&mdev->entity_internal_idx);dev_dbg(mdev->dev, "Media device initialized\n");
}
//将媒体实例化注册到media总线下 实际调用media_devnode_register 注册media节点
int __must_check __media_device_register(struct media_device *mdev,struct module *owner)
{struct media_devnode *devnode;int ret;devnode = kzalloc(sizeof(*devnode), GFP_KERNEL);if (!devnode)return -ENOMEM;/* Register the device node. */mdev->devnode = devnode;devnode->fops = &media_device_fops;devnode->parent = mdev->dev;devnode->release = media_device_release;/* Set version 0 to indicate user-space that the graph is static */mdev->topology_version = 0;ret = media_devnode_register(mdev, devnode, owner);if (ret < 0) {/* devnode free is handled in media_devnode_*() */mdev->devnode = NULL;return ret;}ret = device_create_file(&devnode->dev, &dev_attr_model);if (ret < 0) {/* devnode free is handled in media_devnode_*() */mdev->devnode = NULL;media_devnode_unregister_prepare(devnode);media_devnode_unregister(devnode);return ret;}dev_dbg(mdev->dev, "Media device registered\n");return 0;
}
//注册media node节点
int __must_check media_devnode_register(struct media_device *mdev,struct media_devnode *devnode,struct module *owner)
{int minor;int ret;/* Part 1: Find a free minor number */mutex_lock(&media_devnode_lock);minor = find_next_zero_bit(media_devnode_nums, MEDIA_NUM_DEVICES, 0);if (minor == MEDIA_NUM_DEVICES) {mutex_unlock(&media_devnode_lock);pr_err("could not get a free minor\n");kfree(devnode);return -ENFILE;}set_bit(minor, media_devnode_nums);mutex_unlock(&media_devnode_lock);devnode->minor = minor;devnode->media_dev = mdev;/* Part 1: Initialize dev now to use dev.kobj for cdev.kobj.parent */devnode->dev.bus = &media_bus_type;devnode->dev.devt = MKDEV(MAJOR(media_dev_t), devnode->minor);devnode->dev.release = media_devnode_release;if (devnode->parent)devnode->dev.parent = devnode->parent;dev_set_name(&devnode->dev, "media%d", devnode->minor);device_initialize(&devnode->dev);/* Part 2: Initialize the character device */cdev_init(&devnode->cdev, &media_devnode_fops);devnode->cdev.owner = owner;/* Part 3: Add the media and char device */ret = cdev_device_add(&devnode->cdev, &devnode->dev);if (ret < 0) {pr_err("%s: cdev_device_add failed\n", __func__);goto cdev_add_error;}/* Part 4: Activate this minor. The char device can now be used. */set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);return 0;cdev_add_error:mutex_lock(&media_devnode_lock);clear_bit(devnode->minor, media_devnode_nums);devnode->media_dev = NULL;mutex_unlock(&media_devnode_lock);put_device(&devnode->dev);return ret;
}

3.初始化entity 实例相关

//pads entity links 头文件
media/media-entity.h
//entity init
int media_entity_init(struct media_entity *entity, u16 num_pads,struct media_pad *pads, u16 extra_links)
//entity pad init
int media_entity_pads_init(struct media_entity *entity, u16 num_pads,struct media_pad *pads)
{struct media_device *mdev = entity->graph_obj.mdev;unsigned int i;if (num_pads >= MEDIA_ENTITY_MAX_PADS)return -E2BIG;entity->num_pads = num_pads;entity->pads = pads;if (mdev)mutex_lock(&mdev->graph_mutex);for (i = 0; i < num_pads; i++) {pads[i].entity = entity;pads[i].index = i;if (mdev)media_gobj_create(mdev, MEDIA_GRAPH_PAD,&entity->pads[i].graph_obj);}if (mdev)mutex_unlock(&mdev->graph_mutex);return 0;
}
//控制pipeline开启
__must_check int media_pipeline_start(struct media_entity *entity,struct media_pipeline *pipe)
{struct media_device *mdev = entity->graph_obj.mdev;int ret;mutex_lock(&mdev->graph_mutex);ret = __media_pipeline_start(entity, pipe);mutex_unlock(&mdev->graph_mutex);return ret;
}
//控制pipeline 关闭
void media_pipeline_stop(struct media_entity *entity)
{struct media_device *mdev = entity->graph_obj.mdev;mutex_lock(&mdev->graph_mutex);__media_pipeline_stop(entity);mutex_unlock(&mdev->graph_mutex);
}

4.links的连接

//entity的相关连接是通过pad之间的连接
//创建pad -> pad 的连接
media_create_pad_link()
//remove link
media_entity_remove_links()
//interface to entity的连接
media_create_intf_link()
//remove
media_remove_intf_links()

2.linux V4l2 Framework

1.v4l2 device

1.V4L2 device 实例基本概念

每个设备实体都代表着一个struct v4l2_device,在linux中我们往往把这个结构嵌入到大框架中,旗下包含着设备实体

2.v4l2 设备的注册以及相关操作

//注册v4l2 device
int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev)
{if (v4l2_dev == NULL)return -EINVAL;INIT_LIST_HEAD(&v4l2_dev->subdevs);spin_lock_init(&v4l2_dev->lock);v4l2_prio_init(&v4l2_dev->prio);kref_init(&v4l2_dev->ref);get_device(dev);v4l2_dev->dev = dev;if (dev == NULL) {/* If dev == NULL, then name must be filled in by the caller */if (WARN_ON(!v4l2_dev->name[0]))return -EINVAL;return 0;}/* Set name to driver name + device name if it is empty. */if (!v4l2_dev->name[0])snprintf(v4l2_dev->name, sizeof(v4l2_dev->name), "%s %s",dev->driver->name, dev_name(dev));if (!dev_get_drvdata(dev))dev_set_drvdata(dev, v4l2_dev);return 0;
}
//初始化v4l2 device name
int v4l2_device_set_name(struct v4l2_device *v4l2_dev, const char *basename,atomic_t *instance)
{int num = atomic_inc_return(instance) - 1;int len = strlen(basename);if (basename[len - 1] >= '0' && basename[len - 1] <= '9')snprintf(v4l2_dev->name, sizeof(v4l2_dev->name),"%s-%d", basename, num);elsesnprintf(v4l2_dev->name, sizeof(v4l2_dev->name),"%s%d", basename, num);return num;
}

2.v4l2 subdevice

相对于一个监控系统来说,v4l2 subdevice 通常是作为一个sensor来做相应的操作

1.v4l2 sudevice相关操作

//v4l2 subdevice init
void v4l2_subdev_init(struct v4l2_subdev *sd, const struct v4l2_subdev_ops *ops)
{INIT_LIST_HEAD(&sd->list);BUG_ON(!ops);sd->ops = ops;sd->v4l2_dev = NULL;sd->flags = 0;sd->name[0] = '\0';sd->grp_id = 0;sd->dev_priv = NULL;sd->host_priv = NULL;
#if defined(CONFIG_MEDIA_CONTROLLER)sd->entity.name = sd->name;sd->entity.obj_type = MEDIA_ENTITY_TYPE_V4L2_SUBDEV;sd->entity.function = MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN;
#endif
}
//v4l2 subdevice通常引入media framework
//注册subdevice到v4l2 框架中
v4l2_device_register_subdev();

2.I2c subdevice 相关操作

//初始化device
v4l2_i2c_subdev_init()
//v4l2_subdev struct to the i2c_client struct
struct i2c_client *client = v4l2_get_subdevdata(sd);
//i2c_client to a v4l2_subdev struct
struct v4l2_subdev *sd = i2c_get_clientdata(client);

work
//注册subdevice到v4l2 框架中
v4l2_device_register_subdev();


#### 2.I2c subdevice 相关操作```c
//初始化device
v4l2_i2c_subdev_init()
//v4l2_subdev struct to the i2c_client struct
struct i2c_client *client = v4l2_get_subdevdata(sd);
//i2c_client to a v4l2_subdev struct
struct v4l2_subdev *sd = i2c_get_clientdata(client);

Linux 媒体框架(Media Framework)一相关推荐

  1. Linux驱动学习--V4L2设备(二)subdev的ops介绍及media framework深入解析

    目录 一.引言 二.v4l2_subdev_ops介绍 ------>v4l2_subdev_ops ------>v4l2_subdev_internal_ops ------>使 ...

  2. 浅谈Linux media framework

    基本概念 通过调试camera过程中对接触的v4l2,意外发现了Linux一个不是很起眼的子系统--Linux media framework,那它存在的意义是什么? 节选一段来自Linux源码中的文 ...

  3. Java Media Framework 基础教程

    Java Media Framework 基础教程 作者:Eric Olson     来源:ibm 摘要: 很少发现有关于jmf方面的中文资料,这是在IBM上面找的一本书,可作为jmf的入门学习,业 ...

  4. JMF(java media framework)综述

    摘要: 本文先简述了JMF发展的历史,后对JMF的基本构架做了综述.对重要的类和接口都有详细的介绍. 关键字:JMF(java media framework).具有时域约束关系的媒体数据 正文: J ...

  5. java jmf 视屏监控的核心代码_JMF(Java Media Framework)使用摄像头

    JMF(Java Media Framework)是Java平台使用摄像头.麦克风等媒体设备的应用程序框架,但到了2.1.1e就不再更新,在Windows 7 X64上还能正常运行,只是安装的界面让你 ...

  6. Linux v4l2框架分析

    背景 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述 V4L2(Video for Linu ...

  7. Android Media Framework(1): 总纲

    转自:http://www.jianshu.com/users/5ba48666a89d/latest_articles Android系统整体架构: 我们先看一下多媒体框架在整个Android系统所 ...

  8. css3的媒体查询(Media Queries)

    css3的媒体查询(Media Queries) 我今天就总结一下响应式设计的核心CSS技术Media(媒体查询器)的用法. 先看一个简单的例子: <link rel="stylesh ...

  9. Linux DMA 框架介绍,demengine.c文件

    Linux DMA 框架介绍(demengine.c) 1.介绍 从我们的直观感受来说,DMA并不是一个复杂的东西,要做的事情也很单纯直白.因此Linux kernel对它的抽象和实现,也应该简洁.易 ...

  10. JMF介绍之媒体框架

    JMF(Java Media Framework) 是Sun 公司提出的Java 媒体架构.它是对应Java 2 平台标准版(J2SE) 的一种可选用的应用编程接口(API) .JMF 的源代码通过S ...

最新文章

  1. 关于DMA,TCM(ITCM和DTCM)和Cache的理解
  2. Linux shell去除字符串中所有空格
  3. python画六边形
  4. jdk8 获取上一个月时间_JDK 10:FutureTask获取一个toString()
  5. 各种说明方法的答题格式_语文万能答题公式,给孩子收藏吧!
  6. 商业智能在公安交通管理领域的应用
  7. 解决fullgc_CMS发生FullGc分析
  8. Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
  9. 电脑常用截图方法(含长截图)
  10. 学生简单个人博客网页DW模板 简单HTML静态网页设计个人主页制作 大学生个人网站模板下载 网页作业个人主页制作
  11. 计算机键盘盲打方法,电脑键盘盲打练习方法 盲打键盘指法练习技巧
  12. 小爱同学脱离局域网远程控制开关?
  13. Spring Cloud 系列之 Netflix Eureka 注册中心(一)
  14. 电脑在使用b站的时候插入耳机,耳机没有声音,只能外放,其他软件可以正常使用。
  15. Ubuntu 18.04安装全面战争三国游戏 (by quqi99)
  16. [kuangbin带你飞]专题六 最小生成树
  17. 浅谈PHP如何实现网站文章或博客浏览量页面访问量+1
  18. PHP开发Android应用程序
  19. freertos使用基础
  20. Android解析服务器Json数据实例

热门文章

  1. Lambda表达式与函数式接口详解
  2. python可视化(2-1)绘图对象(条形图、直方图、柏拉图)
  3. 六大IT运维服务管理问题总结
  4. sqlmap的简单使用(sql注入)
  5. 苹果mac隐藏文件夹怎么显示?
  6. Linux 性能调试 之 drop_caches
  7. Java反射学习笔记
  8. 如何在 Mac 上使用屏幕保护程序?
  9. 计算机网络物理地址,4-3 查询计算机网卡物理地址的方法
  10. cosx sinx 泰勒展开 C++