andorid之摄像头驱动流程--MTK平台

原文地址:andorid之摄像头驱动流程--MTK平台 作者:守候心田

camera成像原理:

景物通过镜头生产光学图像投射到sensor表面上,然后转为模拟电信号,经过数模变成数字图像信号,在经过DSP加工出来,然后在通过IO接口传输到CPU处理。  由于摄像头满足总线、驱动、设备模型,那么看看andorid是怎么去实现摄像头的流程。

1.  注册Camera的platform平台设备

点击(此处)折叠或打开

  1. CAMERA_HW_i2C_init
  2. platform_driver_register(&g_stCAMERA_HW_Driver)
  3. static struct platform_driver g_stCAMERA_HW_Driver = {
  4. .probe        = CAMERA_HW_probe,
  5. .remove     = CAMERA_HW_remove,
  6. .suspend    = CAMERA_HW_suspend,
  7. .resume     = CAMERA_HW_resume,
  8. .driver        = {
  9. .name    = "image_sensor",
  10. .owner    = THIS_MODULE,
  11. }
  12. };

2.  注册Camera的platform平台设备驱动

点击(此处)折叠或打开

  1. platform_device_register(&sensor_dev);
  2. static struct platform_device sensor_dev = {
  3. .name         = "image_sensor",
  4. .id         = -1,
  5. };

在    在mt6575_board_init这个函数中注册了很多平台设备,包括上面的平台设备。camera的平台设备与平台驱动匹配后,就会调用drv的probe函数,其probe函数主要完成的是i2c平台驱动的注册

点击(此处)折叠或打开

  1. static int CAMERA_HW_probe(struct platform_device *pdev)
  2. {
  3. return i2c_add_driver(&CAMERA_HW_i2c_driver);
  4. }
  5. struct i2c_driver CAMERA_HW_i2c_driver = {
  6. .probe = CAMERA_HW_i2c_probe,
  7. .remove = CAMERA_HW_i2c_remove,
  8. .detect = CAMERA_HW_i2c_detect,
  9. .driver.name = CAMERA_HW_DRVNAME,
  10. .id_table = CAMERA_HW_i2c_id,
  11. .address_data = &addr_data,
  12. };

怎么去做i2c驱动与设备的匹配呢?内核中对于这块有详细的讲解,文件为instantiating-devices,现在i2c的平台驱动已经注册了,下面来分析下是怎么注册平台设备的。应该使用内核的第3种方法,在内核注册i2c驱动的时候,最终会遍历总线设备的driver成员,调用__attach_adapter函数。

点击(此处)折叠或打开

  1. static int __attach_adapter(struct device *dev, void *data)
  2. {
  3. struct i2c_adapter *adapter;
  4. struct i2c_driver *driver = data;
  5. if (dev->type != &i2c_adapter_type)
  6. return 0;
  7. adapter = to_i2c_adapter(dev);
  8. i2c_detect(adapter, driver);
  9. /* Legacy drivers scan i2c busses directly */
  10. if (driver->attach_adapter)
  11. driver->attach_adapter(adapter);
  12. return 0;
  13. }

这个函数最主要的是调用了CAMERA_HW_i2c_driver的detect函数,完成设备与驱动的匹配,最终会调用CAMERA_HW_i2c_probe。

点击(此处)折叠或打开

  1. static int CAMERA_HW_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info*info)
  2. {
  3. strcpy(info->type, CAMERA_HW_DRVNAME);
  4. return 0;
  5. }

在probe函数中最只做了一件事件RegisterCAMERA_HWCharDrv,这个函数会注册字符设备,注册设备节点,并在设备节点下创建类,重点的东西出现了

点击(此处)折叠或打开

  1. static const struct file_operations g_stCAMERA_HW_fops =
  2. {
  3. .owner = THIS_MODULE,
  4. .open = CAMERA_HW_Open,
  5. .release = CAMERA_HW_Release,
  6. #ifdef USE_NEW_IOCTL
  7. .unlocked_ioctl = CAMERA_HW_Ioctl
  8. #else
  9. .ioctl = CAMERA_HW_Ioctl
  10. #endif
  11. };

Open只是初始化一个原子变量留给系统调用,ioctrl才是核心,CAMERA_HW_Ioctl是上层文件操作底层硬件的方法。以上是andorid上摄像头i2c设备的过程。

时间: 2024-08-03 04:05:09

andorid之摄像头驱动流程--MTK平台的相关文章

andriod之摄像头驱动流程

camera成像原理: 景物通过镜头生产光学图像投射到sensor表面上,然后转为模拟电信号,经过数模变成数字图像信号,在经过DSP加工出来,然后在通过IO接口传输到CPU处理. 由于摄像头满足总线.驱动.设备模型,那么看看andorid是怎么去实现摄像头的流程. 1.  注册Camera的platform平台设备 点击(此处)折叠或打开 CAMERA_HW_i2C_init platform_driver_register(&g_stCAMERA_HW_Driver) static struc

MTK平台LCD驱动框架详解(二)

前篇博客链接:http://blog.csdn.net/xuan_h/article/details/38519975 上篇博文说到了mtkfb_probe函数,本文在说mtkfb_probe函数之前.我还是打算在从应用程序的调用开始分析下具体的调用过程.这是我们理解驱动框架的核心,而并不是简单的接受. 一.驱动核心Fbmem.c(alps\kernel\drivers\video\Fbmem.c)分析 下面先摘取一部分源码,源码包括:入口函数.fb_fops.fb_fops中的open函数.用

MTK平台LCD驱动框架详解(一)

许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生.在MTK平台上你可以简简单单几分钟就点亮一块屏.加上MTK快速开发的节奏,也很少有时间自己整理学习.如果不思进取,不加班加点学习.很容易就慢慢--.这也难怪有些人说MTK造就了一批懒人,毁掉了一批工程师.但其实都是基于linux开发,核心的东西都是一样一样的.我刚入行业,在迷茫之际,自己整理跟踪源码.想慢慢找回自己熟悉的感觉,掌握MTK的整体框架.也希望能给有需要的人带来些帮助.好吧!前话说到这,开始正题. 本文肯定有不少地方会出现错误

MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率

1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\mediatek\config\project**\ 该文件中配置了当前项目中使用的硬件芯片等信息 //如这个是指收音机所使用的芯片信息 CUSTOM_HAL_FMRADIO = mt6628 //下面这个是指当前项目所采用的 ROM 芯片CUSTOM_HAL_EEPROM=IMX111OTP_EE

MTK平台tp驱动详解

MTK平台tp驱动详解 本博文将讲解基于goodix9157触控芯片的tp驱动程序.这里有对应的驱动程序. 初始化 static int __init tpd_driver_init(void) { GTP_INFO("MediaTek gt91xx touch panel driver init\n"); #if defined(TPD_I2C_NUMBER) i2c_register_board_info(TPD_I2C_NUMBER, &i2c_tpd, 1); #els

Linux USB摄像头驱动【转】

本文转载自:http://www.itdadao.com/articles/c15a509940p0.html 在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 USB 接口的摄像头.这一章主要是介绍 USB 摄像头的设备驱动程序.在我们印象中,驱动程序都是一个萝卜一个坑,拿到一个硬件就需要去安装它相对应的驱动程序.有时候稍有不对还会导致电脑崩溃,是不是让人很郁闷?这一章我们讲 USB 摄像头设备驱动,那么是不是支持所有的 USB 摄像头驱动呢?带着这个疑问

基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读

作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 FIMC这个名字应该是从S5P100开始出现的,在s5pv210里面的定义是摄像头接口,但是它同样具有图像数据颜色空间转换的作用.而exynos4412对它的定义看起来更清晰些,摄像头接口被定义为FIMC-LITE .颜色空间转换的硬件结构被定义为FIMC-IS.不多说了,我们先来看看Linux3.0.8 三星的BSP包中与fimc驱动相关的文件. 上面的源码文件组成了整个fimc的驱动框架.通

有容云:容器驱动的PaaS平台实现方案(下)

编者注: 本文基于上海容器大会现场演讲内容,立足于实战跟大家分享了新一代PaaS平台构建中遇到的问题.当下主流PaaS平台解析.企业交付经验及心得体会等.文章较长,分为上.下两个部分,本文为下篇. 前文阅读请点击:容器驱动的PaaS平台实现方案(上) 下面我花一点时间跟大家分享下比较干货的东西.比如说容器的网络,之前我们也听了一些专家谈到Flannel,Calico 等等,但是我不知道大家有没有注意到,国内外在谈容器网络的时候更多的时候会再谈Overlay网的构建,比如IPSec.VXLAN等等

V4L2学习5--VIVI虚拟摄像头驱动

概述 前面简单分析了内核中虚拟摄像头驱动 vivi 的框架与实现,本文参考 vivi 来写一个虚拟摄像头驱动,查询.设置视频格式相对简单,难点在于 vb2_buf 的处理过程. 数据采集流程分析 在我的程序中,大概的数据采集流程如上图所示,启动视频采集之后,创建了一个内核线程,内核线程每30ms 唤醒一次,每一次唤醒都会尝试用 queue_list 中取出一个 buffer 填充数据之后挂入 done_list ,挂入 done_list 之后就会唤醒应用程序(poll 中休眠),应用程序唤醒之