mem2mem解析

我们都知道,V4L2是一种标准的多媒体驱动框架,但它只是起到了承接上层调用到设备驱动代码的作用,但是每个多媒体驱动的内存管理是独立的,比如fimc,jpeg,mfc等的内存都是自己独立申请,释放。
随着多媒体驱动的共性越来越多,为了抽象代码,便于开发和维护,内核现在在多媒体视音频驱动目录drivers/medis/video/下已经逐渐统一了规范。主要分为几大块,可以归纳为v4l2,subdev,mem2mem,videobuf2:
(1)v4L2 
包括像v4l2-common.c,v4l2-dev.c,v4l2-device.c, v4l2-ioctl.c等文件。这些代码是实现v4l2框架的。一般video设备驱动调用此框架的函数在上层/dev/下创建video设备。下面所说的实现video设备驱动也是指这个意思。
(2)subdev子设备模块
主要是V4L2-subdev.c,这是实现V4L2 i2c子设备的。可以举个例子来理解,fimc是AP上的平台设备,而camera是挂在fimc上的设备,可以把fimc实现为标准的v4l2驱动,而camera实现为subdev子设备驱动,fimc通过一个v4l2_subdev结构指针来调用camera驱动。上层应用只管跟fimc打交道就行了,不需要去跟camera交互。
(3)mem2mem内存管理模块
主要是v4l2-mem2mem.c文件,这是被实现video设备驱动调用的,它负责内存的管理。记住,它只是一个中间的管理者,因为真正分配内存的不是mem2mem,而是videobuf2。mem2mem是通过调用videobuf2模块管理内存的。
(4)videobuf2内存分配模块
主要包括videobuf2-xxx.c文件。这是最终分配内存的地方,旧版本是videobuf。它一般是被mem2mem或者实现video设备驱动调用。


mem2mem模块分析
首先要创建v4l2_m2m_dev结构:
struct v4l2_m2m_dev {
struct v4l2_m2m_ctx *curr_ctx;  /*当前运行的实例上下文*/


struct list_head job_queue;  /*所有要运行的实例的链表*/
spinlock_t job_spinlock;  /*自旋锁,保护job_queue链表的*/


struct v4l2_m2m_ops *m2m_ops;   /*mem2mem驱动回调函数,需要你自己写的驱动实现*/
};


struct v4l2_m2m_ops {
void (*device_run)(void *priv);  /*在这回调函数实现中,开始工作(数据流传输)。这个回调函数必须实现,并且这个函数调用完毕后,数据流不会停止工作,必须调用v4l2_m2m_job_finish()停止数据流工作*/
int (*job_ready)(void *priv);   /*这回调函数是可选实现的,一般不使用*/
void (*job_abort)(void *priv);  /*必须实现,异常处理函数,通知驱动马上停止数据流工作。当通知完成后,也必须调用v4l2_m2m_job_finish()*/
void (*lock)(void *priv);
void (*unlock)(void *priv);
};
v4l2_m2m_dev一般内嵌在你自己的设备驱动的私有结构体中,一般为指针。在我们自己的驱动中,一般是先实现v4l2_m2m_ops函数结构体,一般只实现device_run()和job_abort()函数。
然后在驱动probe时调用v4l2_m2m_init()函数初始化。主要是初始化v4l2_m2m_dev结构体和赋值v4l2_m2m_ops结构体,供回调使用。在驱动卸载时调用v4l2_m2m_release()函数释放。

我们之前已经说了,我们实现的是video设备驱动,也就是会在/dev/目录下创建video设备,它是一个字符设备,那肯定有open,close,poll,mmap,ioctl函数的实现啦。
我们逐渐来看在这些函数中,需要对mem2mem做些什么。
最首先是open()函数了,
一般先声明自己一个contex,并内嵌一个struct v4l2_m2m_ctx,如
struct jpeg_ctx {
。。。。。
struct jpeg_dev *dev;
struct v4l2_m2m_ctx *m2m_ctx;
。。。。。
};
struct v4l2_m2m_ctx定义如下:
struct v4l2_m2m_ctx {
struct v4l2_m2m_dev *m2m_dev;


/* Capture 队列上下文(也就是用来数据流要写进内存的) */
struct v4
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值