关键词:android  camera CMM 模组 camera参数  CAMIF   V4L2  
平台信息:
内核:
linux
系统:android

平台:S5PV310(samsung exynos 4210)

作者:xubin341719(欢迎转载,请注明作者)

android camera(一):camera模组CMM介绍

android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

android camera(三):camera V4L2 FIMC

android camera(四):camera 驱动 GT2005

下载:常用摄像头规格书(个别有android驱动程序)  :bf3703 30W、gc0308 30W、ov7670、gt2005 200W、gt2015 200W、NT99250 200W、s5k5ba 200W、s5k4ba

前面两篇说的有点多了,不过多了解点东西也挺好的,遇到问题时可以有更多的思路,真正驱动是从这一块开始。一般BSP的camera都是完好的,我们只用关心驱动这些就可以了。

1. V4L2

1)简介

在Linux中,摄像头方面的标准化程度比较高,这个标准就是V4L2驱动程序,这也是业界比较公认的方式。

V4L全称是Video for Linux,是Linux内核中标准的关于视频驱动程序,目前使用比较多的版本是Video for Linux 2,简称V4L2。它为Linux下的视频驱动提供了统一的接口,使得应用程序可以使用统一的API操作不同的视频设备。从内核空间到用户空间,主要的数据流和控制类均由V4L2驱动程序的框架来定义。

V4L2驱动程序一般只提供Video数据的获得,而如何实现视频预览,如何向上层发送数据,如何把纯视频流和取景器、视频录制等实际业务组织起来,都是camera的硬件抽象层需要负责的工作。

V4L2驱动核心实现为如下文件:drivers/media/video/v4l2-dev.c。

V4l2-dev.h中定义的video_device是V4L2驱动程序的核心数据结构,它为具体的摄像头sensor驱动提供了接口调用。

V4l2的采集过程(应用程序):

1)     打开设备,获得文件描述符;

2)     设置图片格式;

3)     分配缓冲区;

4)     启动采集过程,读取数据;

5)     停止采集,关闭设备。

2)数据结构

V4L2的主要数据结构是video_device,定义在v4l2_dev.h中:

  1. struct video_device
  2. {
  3. /* device ops */
  4. const struct v4l2_file_operations *fops; /*接口函数指针*/
  5.  
  6. /* sysfs */
  7. struct device dev; /* v4l 设备结构 */
  8. struct cdev *cdev; /* 字符设备结构*/
  9.  
  10. /* Set either parent or v4l2_dev if your driver uses v4l2_device */
  11. struct device *parent; /* 设备父指针 */
  12. struct v4l2_device *v4l2_dev; /* v4l2设备指针*/
  13.  
  14. /* device info */
  15. char name[]; /*设备名称*/
  16. int vfl_type;
  17. /* 'minor' is set to -1 if the registration failed */
  18. int minor; /*次设备号*/
  19. u16 num;
  20. /* use bitops to set/clear/test flags */
  21. unsigned long flags;
  22. /* attribute to differentiate multiple indices on one physical device */
  23. int index;
  24.  
  25. /* V4L2 file handles */
  26. spinlock_t fh_lock; /* Lock for all v4l2_fhs */
  27. struct list_head fh_list; /* List of struct v4l2_fh */
  28.  
  29. int debug; /* debug 级别*/
  30.  
  31. /* Video 标准变量 */
  32. v4l2_std_id tvnorms; /* Supported tv norms */
  33. v4l2_std_id current_norm; /* Current tvnorm */
  34.  
  35. /* 回调函数 */
  36. void (*release)(struct video_device *vdev);
  37.  
  38. /* ioctl 回调函数 */
  39. const struct v4l2_ioctl_ops *ioctl_ops;
  40. };

int video_register_device(struct video_device *vdev, int type, int nr);

static int v4l2_ioctl(struct inode *inode, struct file *filp,       unsigned int cmd, unsigned long arg);

2.  FIMC                     

1)简介

FIMC这个模块不仅仅是一个摄像头的控制接口,它还承担着V4L2的output功能和overlay的功能。

FIMC的驱动在内核中的位置:drivers/media/video/samsung/fimc

它包含下边的文件:

fimc_regs.c
      fimc_capture.c
      fimc_dev.c
      fimc_output.c
      fimc_overlay.c
      fimc_v4l2.c

它们的组织关系如下:

可以看到,FIMC的驱动实现了v4l2所有的接口,可以分为v4l2-input设备接口,v4l2-output设备接口以及v4l2-overlay设备接口。这里我们主要关注v4l2-input设备接口,因为摄像头属于视频输入设备。

fimc_v4l2.c里面注册了很多的回调函数,都是用于实现v4l2的标准接口的,但是这些回调函数基本上都不是在fimc_v4l2.c里面实现的,而是有相应的.c分别去实现。比如:

  v4l2-input设备的操作实现:fimc_capture.c
      v4l2-output设备的操作实现: fimc_output.c
      v4l2-overlay设备的操作实现: fimc_overlay.c

这些代码其实都是和具体硬件操作无关的,这个驱动把所有操作硬件寄存器的代码都写到一个文件里面了,就是fimc40_regs.c。这样把硬件相关的代码和硬件无关的代码分开来实现是非常好的方式,可以最大限度的实现代码复用。

 2) 数据结构 

FIMC的主要数据结构fimc_control,定义在fimc.h中:

  1. struct fimc_control {
  2. int id; /* 控制器 id */
  3. char name[];
  4. atomic_t in_use;
  5. void __iomem *regs; /* 寄存器 i/o */
  6. struct clk *clk; /* interface clock */
  7. struct regulator *regulator; /* pd regulator */
  8. struct fimc_meminfo mem; /* for reserved mem */
  9.  
  10. /* kernel helpers */
  11. struct mutex lock; /* controller lock */
  12. struct mutex alloc_lock;
  13. struct mutex v4l2_lock;
  14. wait_queue_head_t wq;
  15. struct device *dev;
  16. int irq;
  17.  
  18. /* v4l2 related */
  19. struct video_device *vd;
  20. struct v4l2_device v4l2_dev;
  21.  
  22. /* fimc specific */
  23. struct fimc_limit *limit; /* H/W limitation */
  24. struct s3c_platform_camera *cam; /* activated camera */
  25. struct fimc_capinfo *cap; /* capture dev info */
  26. struct fimc_outinfo *out; /* output dev info */
  27. struct fimc_fbinfo fb; /* fimd info */
  28. struct fimc_scaler sc; /* scaler info */
  29. struct fimc_effect fe; /* fimc effect info */
  30.  
  31. enum fimc_status status;
  32. enum fimc_log log;
  33.  
  34. u32 ctx_busy[FIMC_MAX_CTXS];
  35. };

因为FIMC一共有三套一样的控制器(fimc0, fimc1, fimc2),所以驱动里使用了一个数组来描述:

  1. struct video_device fimc_video_device[FIMC_DEVICES] = {
  2. [] = {
  3. .fops = &fimc_fops,
  4. .ioctl_ops = &fimc_v4l2_ops,
  5. .release = fimc_vdev_release,
  6. },
  7. [] = {
  8. .fops = &fimc_fops,
  9. .ioctl_ops = &fimc_v4l2_ops,
  10. .release = fimc_vdev_release,
  11. },
  12. [] = {
  13. .fops = &fimc_fops,
  14. .ioctl_ops = &fimc_v4l2_ops,
  15. .release = fimc_vdev_release,
  16. },
  17. };

fb_ops结构体是针对v4l2设备的基本操作,定义如下:

  1. static const struct v4l2_file_operations fimc_fops = {
  2. .owner = THIS_MODULE,
  3. .open = fimc_open,
  4. .release = fimc_release,
  5. .ioctl = video_ioctl2,
  6. .read = fimc_read,
  7. .write = fimc_write,
  8. .mmap = fimc_mmap,
  9. .poll = fimc_poll,
  10. };

3)FIMC初始设置

在S5PV210中,FIMC初始设置代码在 /drivers/ arch/arm/mach-s5pv210/mach-smdkv310.c中:

  1. static struct s3c_platform_fimc fimc_plat = {
  2. .srclk_name = "mout_mpll",
  3. .clk_name = "sclk_fimc",
  4. .lclk_name = "sclk_fimc_lclk",
  5. .clk_rate = ,
  6. .default_cam = CAMERA_CSI_C,
  7. .camera = {
  8. &mt9p111,//5M back cam
  9. &s5k6aafx,///1.3M front cam
  10. },
  11. .hw_ver = 0x43,
  12. };

对于GPIO的配置代码在 /drivers/ arch/arm/mach-s5pv210/setup-fimc0.c中:

FIMC的主要回调函数如下,实现在fimc_v4l2.c中:

  1. onst struct v4l2_ioctl_ops fimc_v4l2_ops = {
  2. .vidioc_querycap = fimc_querycap,
  3. .vidioc_reqbufs = fimc_reqbufs,
  4. .vidioc_querybuf = fimc_querybuf,
  5. .vidioc_g_ctrl = fimc_g_ctrl,
  6. .vidioc_s_ctrl = fimc_s_ctrl,
  7. .vidioc_s_ext_ctrls = fimc_s_ext_ctrls,
  8. .vidioc_cropcap = fimc_cropcap,
  9. .vidioc_g_crop = fimc_g_crop,
  10. .vidioc_s_crop = fimc_s_crop,
  11. .vidioc_streamon = fimc_streamon,
  12. .vidioc_streamoff = fimc_streamoff,
  13. .vidioc_qbuf = fimc_qbuf,
  14. .vidioc_dqbuf = fimc_dqbuf,
  15. .vidioc_enum_fmt_vid_cap = fimc_enum_fmt_vid_capture,
  16. .vidioc_g_fmt_vid_cap = fimc_g_fmt_vid_capture,
  17. .vidioc_s_fmt_vid_cap = fimc_s_fmt_vid_capture,
  18. .vidioc_try_fmt_vid_cap = fimc_try_fmt_vid_capture,
  19. .vidioc_enum_input = fimc_enum_input,
  20. .vidioc_g_input = fimc_g_input,
  21. .vidioc_s_input = fimc_s_input,
  22. .vidioc_g_parm = fimc_g_parm,
  23. .vidioc_s_parm = fimc_s_parm,
  24. .vidioc_queryctrl = fimc_queryctrl,
  25. .vidioc_querymenu = fimc_querymenu,
  26. .vidioc_g_fmt_vid_out = fimc_g_fmt_vid_out,
  27. .vidioc_s_fmt_vid_out = fimc_s_fmt_vid_out,
  28. .vidioc_try_fmt_vid_out = fimc_try_fmt_vid_out,
  29. .vidioc_g_fbuf = fimc_g_fbuf,
  30. .vidioc_s_fbuf = fimc_s_fbuf,
  31. .vidioc_try_fmt_vid_overlay = fimc_try_fmt_overlay,
  32. .vidioc_g_fmt_vid_overlay = fimc_g_fmt_vid_overlay,
  33. .vidioc_s_fmt_vid_overlay = fimc_s_fmt_vid_overlay,
  34. };

对于寄存器的操作,实现都在fimc_regs.c文件中,如

【转】android camera(三):camera V4L2 FIMC的更多相关文章

  1. sc7731 Android 5.1 Camera 学习之一Camera 两个对象

    众所周知,在Android中Camera采用了C/S架构,其中Camera server 与 Camera client之间通过Android Binder IPC机制进行通信.在Camera实现的框 ...

  2. 【转】[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

    参考http://stackoverflow.com/questions/18460647/android-setfocusarea-and-auto-focus http://blog.csdn.n ...

  3. Android 自带 camera 详解

    在本文中 需要考虑的问题 概述 Manifest声明 使用内置的摄像头应用程序 捕获图像的intent 捕获视频的intent 接收摄像头intent的结果 创建摄像头应用程序 检测摄像头硬件 访问摄 ...

  4. Android中利用Camera与Matrix实现3D效果详解

    本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...

  5. [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

    写在前面 最近在从零开始写一个移动端的AR系统,坑实在是太多了!!!整个项目使用了OpenCV第三方库,但对于摄像机来说,和原生Camera的方法基本相同. 实现 以OpenCV的JavaCamera ...

  6. Android 5.1 Camera 架构学习之Camera初始化

    Android Camera 采用C/S架构,client 与server两个独立的线程之间(CameraService)使用Binder通信. 一 CameraService的注册. 1.手机开机后 ...

  7. Android开发技巧——Camera拍照功能

    本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...

  8. Android 自定义属性动画&Camera动画

      摘要: Android 自定义属性动画&Camera动画 1.相关知识点 对于Androi的帧动画,可以制作gif图片,有时为了能够动态的生成帧动画,就得需要使用代码构建了 Animati ...

  9. Cesium案例解析(三)——Camera相机

    目录 1. 概述 2. 实例 2.1. Camera.html 2.2. Camera.js 2.2.1. 飞行至某一点 2.2.2. 飞行至某区域 2.2.3. 两地之间飞行 2.2.4. 设置视图 ...

随机推荐

  1. 减少GC开销的5个编码技巧

    在这篇文章中,我们来了解一下让代码变得高效的五种技巧,这些技巧可以使我们的垃圾收集器(GC)在分配内存以及释放内存上面,占用更少的CPU时间,减少GC的开销.当内存被回收的时候,GC处理很长时间经常会 ...

  2. UGUI 过渡动画插件,模仿NGUI的Tween (转载)

    最近在相亲,后来好朋友跟我说他写了一个好插件,于是我就把女朋友甩了,看看他的插件,可以在UGUI制作简单过渡动画. 我看了下是模仿NGUI的Tween, 我在筱程的基础上稍微改到人性化, 简单支持的让 ...

  3. 【网络协议】TCP连接的建立和释放

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20 ...

  4. iOS8 Core Image In Swift:更复杂的滤镜

    iOS8 Core Image In Swift:自动改善图像以及内置滤镜的使用 iOS8 Core Image In Swift:更复杂的滤镜 iOS8 Core Image In Swift:人脸 ...

  5. 2016 ACM/ICPC Asia Regional Shenyang Online

    I:QSC and Master 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5900 题意: 给出n对数keyi,vali表示当前这对数的键值和权值 ...

  6. java进程

    package com.process;   public class ProcessTest { public static void main(String[] args) { new Proce ...

  7. C++中const

    [const] 0.普通const对象定义在栈空间中 { ; ; cout << &a << ' ' << &b; } Result: 0x22ab ...

  8. Lenovo Y430P安装Linux无线网卡

    新买了一台Lenovo Y430P的笔记本,笔记本自带的无线网卡型号是BCM43142.安装了CentOS6.5的操作系统后,按照网上搜索到的网址http://zh-cn.broadcom.com/s ...

  9. SeekBar和RatingBar

    今天在看一个音乐播放器的源代码时候用到了SeekBar,就翻出来mars老师的视频复习了一下,然后综合使用了一下. 首先先看下运行效果:   下来我们看看布局文件的设计: main.xml: < ...

  10. Mysql开发技巧之删除重复数据

    Mysql利用联表查询和分组来删除重复数据 //删除表中重复的id,保留最大的id mysql> select * from user; +----+------+ | id | name | ...