andorid之摄像头驱动流程--MTK平台
原文地址:andorid之摄像头驱动流程--MTK平台 作者:守候心田
camera成像原理:
景物通过镜头生产光学图像投射到sensor表面上,然后转为模拟电信号,经过数模变成数字图像信号,在经过DSP加工出来,然后在通过IO接口传输到CPU处理。 由于摄像头满足总线、驱动、设备模型,那么看看andorid是怎么去实现摄像头的流程。
点击(此处)折叠或打开
- CAMERA_HW_i2C_init
- platform_driver_register(&g_stCAMERA_HW_Driver)
- static struct platform_driver g_stCAMERA_HW_Driver = {
- .probe = CAMERA_HW_probe,
- .remove = CAMERA_HW_remove,
- .suspend = CAMERA_HW_suspend,
- .resume = CAMERA_HW_resume,
- .driver = {
- .name = "image_sensor",
- .owner = THIS_MODULE,
- }
- };
2. 注册Camera的platform平台设备驱动
点击(此处)折叠或打开
- platform_device_register(&sensor_dev);
- static struct platform_device sensor_dev = {
- .name = "image_sensor",
- .id = -1,
- };
在 在mt6575_board_init这个函数中注册了很多平台设备,包括上面的平台设备。camera的平台设备与平台驱动匹配后,就会调用drv的probe函数,其probe函数主要完成的是i2c平台驱动的注册
点击(此处)折叠或打开
- static int CAMERA_HW_probe(struct platform_device *pdev)
- {
- return i2c_add_driver(&CAMERA_HW_i2c_driver);
- }
- struct i2c_driver CAMERA_HW_i2c_driver = {
- .probe = CAMERA_HW_i2c_probe,
- .remove = CAMERA_HW_i2c_remove,
- .detect = CAMERA_HW_i2c_detect,
- .driver.name = CAMERA_HW_DRVNAME,
- .id_table = CAMERA_HW_i2c_id,
- .address_data = &addr_data,
- };
怎么去做i2c驱动与设备的匹配呢?内核中对于这块有详细的讲解,文件为instantiating-devices,现在i2c的平台驱动已经注册了,下面来分析下是怎么注册平台设备的。应该使用内核的第3种方法,在内核注册i2c驱动的时候,最终会遍历总线设备的driver成员,调用__attach_adapter函数。
点击(此处)折叠或打开
- static int __attach_adapter(struct device *dev, void *data)
- {
- struct i2c_adapter *adapter;
- struct i2c_driver *driver = data;
- if (dev->type != &i2c_adapter_type)
- return 0;
- adapter = to_i2c_adapter(dev);
- i2c_detect(adapter, driver);
- /* Legacy drivers scan i2c busses directly */
- if (driver->attach_adapter)
- driver->attach_adapter(adapter);
- return 0;
- }
这个函数最主要的是调用了CAMERA_HW_i2c_driver的detect函数,完成设备与驱动的匹配,最终会调用CAMERA_HW_i2c_probe。
点击(此处)折叠或打开
- static int CAMERA_HW_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info*info)
- {
- strcpy(info->type, CAMERA_HW_DRVNAME);
- return 0;
- }
在probe函数中最只做了一件事件RegisterCAMERA_HWCharDrv,这个函数会注册字符设备,注册设备节点,并在设备节点下创建类,重点的东西出现了
点击(此处)折叠或打开
- static const struct file_operations g_stCAMERA_HW_fops =
- {
- .owner = THIS_MODULE,
- .open = CAMERA_HW_Open,
- .release = CAMERA_HW_Release,
- #ifdef USE_NEW_IOCTL
- .unlocked_ioctl = CAMERA_HW_Ioctl
- #else
- .ioctl = CAMERA_HW_Ioctl
- #endif
- };
Open只是初始化一个原子变量留给系统调用,ioctrl才是核心,CAMERA_HW_Ioctl是上层文件操作底层硬件的方法。以上是andorid上摄像头i2c设备的过程。
andorid之摄像头驱动流程--MTK平台的更多相关文章
- andriod之摄像头驱动流程
camera成像原理: 景物通过镜头生产光学图像投射到sensor表面上,然后转为模拟电信号,经过数模变成数字图像信号,在经过DSP加工出来,然后在通过IO接口传输到CPU处理. 由于摄像头满足总线. ...
- MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率
1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\ ...
- Linux USB摄像头驱动【转】
本文转载自:http://www.itdadao.com/articles/c15a509940p0.html 在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 ...
- Linux USB 摄像头驱动
在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 USB 接口的摄像头.这一章主要是介绍 USB 摄像头的设备驱动程序.在我们印象中,驱动程序都是一个萝卜一个坑, ...
- s5k4ba摄像头驱动分析
注释: 本驱动是基于S5PV310的,但是全天下的摄像头驱动都是采用V4L2,因此驱动框架流程基本差不多.其中fimc_init_camera()函数会回调.init函数,该函数主要就是通过IIC总线 ...
- Hi3559AV100外接UVC/MJPEG相机实时采图设计(一):Linux USB摄像头驱动分析
下面将给出Hi3559AV100外接UVC/MJPEG相机实时采图设计的整体流程,主要实现是通过V4L2接口将UVC/MJPEG相机采集的数据送入至MPP平台,经过VDEC.VPSS.VO最后通过HD ...
- 基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读(一)
作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 FIMC这个名字应该是从S5PC1x0開始出现的.在s5pv210里面的定义是摄像头接口.可是它相 ...
- 关于MTK平台CC相关的Log查询
关于MTK平台CC相关的Log查询 在外场问题中,经常会出现通话相关的故障.这里简单总结一下通话相关log的分析点: 主叫方:主叫方,是指主动发起通话的一方. 初步定位问题, 用户发起通话时,AP端的 ...
- 【Linux高级驱动】linux设备驱动模型之平台设备驱动机制
[1:引言: linux字符设备驱动的基本编程流程] 1.实现模块加载函数 a.申请主设备号 register_chrdev(major,name,file_operations); b.创 ...
随机推荐
- Linux系统的时区和时间调整
linux调整系统时区: 1)tzselect命令 找到相应的时区文件/usr/share/zoneinfo/Asia/Shanghai,用这个文件替换当前的/etc/localtime文件. 或者 ...
- s7-300 第9讲 定时器
- curl continue
http://www.cyberciti.biz/faq/curl-command-resume-broken-download/
- Sanatorium
Sanatorium time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- Polycarp's problems
Polycarp's problems time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- linux的学习系列 6---打印文件和发送邮件
文件打印 如果你希望打印文本文件,最好预先处理一下,包括调整边距.设置行高.设置标题等,这样打印出来的文件更加美观,易于阅读.当然,不处理也可以打印,但是可能会比较丑陋. 大部分的Linux自带了 n ...
- postgresql 在linux上的源码安装
http://my.oschina.net/hippora/blog/375292 下载源码并解压 [root@fnddb ~]# wget https://ftp.postgresql.org/pu ...
- C#,js数据排序及其操作
List<int> listint=new List<int>{2,1,7,3,8,5,4,6};listint.Sort((x, y) => x - y); var a ...
- UVALive 2522 Chocolate(概率DP)
思路:定义DP方程dp[i][j]标记选到第i个巧克力的时候,桌面上还剩下j个巧克力,状态转移有两个方向,dp[i-1][j-1],dp[i-1]lj+1],分别表示桌面上多了一个和消了一个,乘上需要 ...
- cocos2d-x-2.2.6创建工程
1.下载并安装Python,我的版本是2.7.3,不要太高,据说不能用.2.配置环境变量,将Python的安装的根目录加入系统环境变量的Path路径中(不赘述,自行配置)3.配置好之后打开cmd命令行 ...