fs_s5pc100平台linux摄像头驱动开发详解

上传人:子 文档编号:44507372 上传时间:2018-06-09 格式:DOC 页数:21 大小:21.35KB
返回 下载 相关 举报
fs_s5pc100平台linux摄像头驱动开发详解_第1页
第1页 / 共21页
fs_s5pc100平台linux摄像头驱动开发详解_第2页
第2页 / 共21页
fs_s5pc100平台linux摄像头驱动开发详解_第3页
第3页 / 共21页
fs_s5pc100平台linux摄像头驱动开发详解_第4页
第4页 / 共21页
fs_s5pc100平台linux摄像头驱动开发详解_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《fs_s5pc100平台linux摄像头驱动开发详解》由会员分享,可在线阅读,更多相关《fs_s5pc100平台linux摄像头驱动开发详解(21页珍藏版)》请在金锄头文库上搜索。

1、FS_S5PC100FS_S5PC100 平台平台 linuxlinux 摄像头驱动开发详解摄像头驱动开发详解家用吸氧机价格 说明 理解摄像头驱动需要四个前提 1摄像头基本的工作原理和 S5PC100 集成的 Camera 控制器的工作原理 2platform_device 和 platform_driver 工作原理 3Linux 内核 V4L2 驱动架构 4Linux 内核 I2C 驱动架构 1. 摄像头工作原理 OV9650/9655 是 CMOS 接口的图像传感器芯片可以感知外部的视觉信号并将其转换为数字信号并输出。通过下面的框图可以清晰的看到它的工作原理 我们需要通过 XVCLK1

2、给摄像头提供时钟RESET 是复位线PWDN 在摄像头工作时应该始终为低。HREF 是行参考信号PCLK 是像素时钟VSYNC 是场同步信号。一旦给摄像头提供了时钟并且复位摄像头摄像头就开始工作了通过HREFPCLK 和 VSYNC同步传输数字图像信号。数据是通过 D0D7 这八根数据线并行送出的。 OV9650 向外传输的图像格式是 YUV 的格式YUV 是一种压缩后的图像数据格式它里面还包含很多具体的格式类型我们的摄像头对应的是 YCbCr8 bits, 4:2:2, Interpolated color.一定要搞清楚格式后面的驱动里面设置的格式一定要和这个格式一致。 家用吸氧机价格 O

3、V9650 里面有很多寄存器需要配置配置这些寄存器就需要通过芯片里面的 SCCB 总线去配置。SCCB 其实是一种弱化的 I2C 总线。我们可以直接把摄像头接在 S5PC100 的 I2C控制器上利用 I2C 总线去读写寄存器当然直接使用 GPIO 模拟I2C 也可以实现读写。我们的驱动代码里两种操作模式都实现了。 从 OV9650 采集过来的数据没法直接交给 CPU 处理。S5PC100 芯片里面集成了 Camera控制器叫 FIMCFully Interactive Mobile Camera。摄像头需要先把图像数据传给控制器经过控制器处理裁剪拉升后直接预览或者编码之后交给CPU 处理。

4、实际上摄像头工作需要的时钟也是 FIMC 给它提供的。 2. 驱动开发思路 因为驱动程序是承接硬件和软件的桥梁因此开发摄像头驱动我们要搞清楚两方面的内容第一是摄像头的硬件接口也就是它是怎么和芯片连接的如何控制它如何给摄像头复位以及传送数据的格式等等第二是摄像头的软件接口Linux 内核里面摄像头属于标准的V4L2 设备但是这个摄像头只是一个传感器具体的操作都需要通过 FIMC 来控制这看起来关系比较复杂。 相比较而言硬件接口容易搞懂通过读芯片手册和原理图基本上就没有问题了软件接口比较复杂主要中间有一个 Camera 控制器。下面主要集中分析软件接口。 3. 硬件接口 摄像头的硬件原理图如下

5、家用吸氧机价格 拿到原理图我们需要关注的是1、2 两个管脚分别连接到 I2C_SDA1 和 I2C_SCL1这说明可以通过 I2C 控制器 1 来配置摄像头。另外调试摄像头的时候可以根据这个原理图使用示波器来测量波形以验证代码是否正确。 这里还需要注意的是开发驱动之前最好用万用表测量摄像头的各个管脚是否和芯片连接正确否则即使代码没有问题也看不到图像。 另外还需要仔细阅读芯片手册里 Camera 控制器一章的描述。主要是明确以下信息 FIMC 支持以上三种视频工业标准OV9650 支持 ITU-R 601 YcbCr 8-bit mode这对后面的驱动编写非常重要。 家用吸氧机价格 家用吸氧

6、机价格 MPLL 和 APLL 都可以作为摄像头的时钟源不过推荐使用 MPLL。这对后面的驱动开发也有帮助。 4. 软件接口如何和 FIMC 驱动对接 硬件的问题搞清楚之后就可以集中精力关注软件的接口了。驱动可以有两种实现方法第一种是把摄像头驱动做成普通的 V4L2 设备直接调用 FIMC 里的寄存器实现视频数据的捕捉和处理第二种利用内核已经实现好的 FIMC 的驱动通过某种接口形式把我们的摄像头驱动挂接在 FIMC 驱动之下。 这两种方法第一种实现起来代码量比较大因为需要直接操作 FIMC的寄存器难度也大一些第二种方法是利用内核已经做好的 FIMC 驱动难点在于如何把摄像头驱动和 FIMC

7、驱动整合起来。 在 Android 下面第一种方法并不可行因为 FIMC 这个模块不仅仅是一个摄像头的控制接口它还承担着 V4L2 的 output 功能和 overlay显示叠层的功能这两个功能对 Android的显示系统非常重要。因此最好的方案还是第二种找到摄像头驱动和 FIMC 驱动对接的接口只要明确了这个接口后面的事情就好办了工作量也不大。 4-1 FIMC 驱动的总体结构分析 FIMC 的驱动在内核中的位置 家用吸氧机价格 drivers/media/video/samsung/fimc fimc40_regs.c fimc43_regs.c fimc_capture.c fimc

8、_dev.c fimc_output.c fimc_overlay.c fimc_v4l2.c 这些源码里面最基础的是 fimc_dev.c这里面注册了一个platform_driver在相应的平台代码里面有对应的 platform_device 的描述。这种 SOC 上的控制器一般都会挂接在platform_bus 上以实现在系统初始化时的 device 和 driver 的匹配。在 driver 的 probe 函数里面主要完成了资源获取以及 v4l2 设备的注册。因为 FIMC 一共有三套一样的控制器fimc0, fimc1, fimc2所以驱动里使用了一个数组来描述 struct vi

9、deo_device fimc_video_deviceFIMC_DEVICES = 0 = .fops = 家用吸氧机价格 在 probe 函数里调用 video_register_device()来注册这三个 video_device在用户空间里就会在/dev 下看到三个 video 设备节点video0,video1,video2. 每个 video_device 的成员fops 对应的是针对 v4l2 设备的基本操作定义如下 static const struct v4l2_file_operations fimc_fops = .owner = THIS_MODULE, .open

10、 = fimc_open, .release = fimc_release, .ioctl = video_ioctl2, .read = fimc_read, .write = fimc_write, .mmap = fimc_mmap, .poll = fimc_poll, ; 另一个成员 ioctl_ops 非常重要因为它是对 v4l2 的所有 ioctl 操作集合的描述。fimc_v4l2_ops 定义在 fimc_v4l2.c 里面 const struct v4l2_ioctl_ops fimc_v4l2_ops = .vidioc_querycap = fimc_querycap

11、, .vidioc_reqbufs = fimc_reqbufs, .vidioc_querybuf = fimc_querybuf, .vidioc_g_ctrl = fimc_g_ctrl, .vidioc_s_ctrl = fimc_s_ctrl, .vidioc_cropcap = fimc_cropcap, .vidioc_g_crop = fimc_g_crop, .vidioc_s_crop = fimc_s_crop, .vidioc_streamon = fimc_streamon, .vidioc_streamoff = fimc_streamoff, .vidioc_qb

12、uf = fimc_qbuf, .vidioc_dqbuf = fimc_dqbuf, .vidioc_enum_fmt_vid_cap = fimc_enum_fmt_vid_capture, .vidioc_g_fmt_vid_cap = fimc_g_fmt_vid_capture, .vidioc_s_fmt_vid_cap = fimc_s_fmt_vid_capture, .vidioc_try_fmt_vid_cap = fimc_try_fmt_vid_capture, .vidioc_enum_input = fimc_enum_input, 家用吸氧机价格 .vidioc

13、_g_input = fimc_g_input, .vidioc_s_input = fimc_s_input, .vidioc_g_parm = fimc_g_parm, .vidioc_s_parm = fimc_s_parm, .vidioc_g_fmt_vid_out = fimc_g_fmt_vid_out, .vidioc_s_fmt_vid_out = fimc_s_fmt_vid_out, .vidioc_try_fmt_vid_out = fimc_try_fmt_vid_out, .vidioc_g_fbuf = fimc_g_fbuf, .vidioc_s_fbuf =

14、fimc_s_fbuf, .vidioc_try_fmt_vid_overlay = fimc_try_fmt_overlay, .vidioc_g_fmt_vid_overlay = fimc_g_fmt_vid_overlay, .vidioc_s_fmt_vid_overlay = fimc_s_fmt_vid_overlay, ; 可以看到FIMC 的驱动实现了 v4l2 所有的接口可以分为 v4l2-input 设备接口v4l2-output设备接口以及 v4l2-overlay 设备接口。这里我们主要关注 v4l2-input 设备接口因为摄像头属于视频输入设备。 fimc_v4l

15、2.c 里面注册了很多的回调函数都是用于实现 v4l2 的标准接口的但是这些回调函数基本上都不是在 fimc_v4l2.c 里面实现的而是有相应的.c 分别去实现。比如 v4l2-input 设备的操作实现 fimc_capture.c v4l2-output 设备的操作实现 fimc_output.c v4l2-overlay 设备的操作实现 fimc_overlay.c 这些代码其实都是和具体硬件操作无关的这个驱动把所有操作硬件寄存器的代码都写到一个文件里面了就是 fimc40_regs.c。这样把硬件相关的代码和硬件无关的代码分开来实现是非常好的方式可以最大限度的实现代码复用。 这些驱动源码的组织关系如下 家用吸氧机价格 4-2 FIMC 驱动的 Camera 接口分析 接口的关键还是在于 fimc_

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号