1、MTK平台camera摄像头调试教程解读Contents一、 手机 CAMERA 的物理结构: . - 4 -二、 CAMERA 的成像原理: . - 4 -三、 CAMERA 常见的数据输出格式:. - 5 -四、 阅读 CAMERA 的规格书(以 TRULY 模组 OV5647_RAW 为例): . - 6 -五、 CAMERA 的硬件原理图及引脚 . - 7 - 1、 电源部分:. - 7 - 2、 SENSOR INPUT 部分: . - 7 - 3、 SENSOR OUTPUT 部分: . - 7 - 4、 I2C 部分:SCL,I2C 时钟信号线和 SDA,I2C 数据信号线。 .
2、 - 7 -六、 MTK 平台 CAMERA 驱动架构: . - 8 -七、 MTK 平台 CAMERA 相关代码文件(以下代码均为 MTK6575 平台): . - 9 - 1、 CAMERASENSOR 驱动相关文件 . - 9 - 2、 SENSOR ID 和一些枚举类型的定义 . - 9 - 3、 SENSOR 供电 . - 9 - 4、 KERNEL SPACE 的 SENSORLIST,IMGSENSOR 模块注册 . - 9 - 5、 USER SPACE 的 SENSORLIST,向用户空间提供支持的 SENSORLIST . - 10 - 6、 SENSOR 效果调整的接口
3、. - 10 -八、 CAMERA 模块驱动、设备与总线结构: . - 11 - A) 驱动的注册: . - 11 - B) 设备的注册: . - 11 - C) 总线的匹配: . - 12 -九、 CAMERA 驱动工作流程: . - 13 -十、 CAMERA 驱动添加、调试流程:. - 17 -Ghong ConfidentialRevision 0.1-Feb.14 2012- 3 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information一、 手机 Camera 的物理结构:
4、FPC: Flexible Printed Circuit 可挠性印刷电路板Sensor:图象传感器IR:红外滤波片Holder:基座Lens:镜头二、 Camera 的成像原理:景物通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为模拟的电信号,经过 A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过 IO 接口传输到 CPU 中处理,通过 LCD 就可以看到图像了。Ghong ConfidentialRevision 0.1-Feb.14 2012- 4 -2012 Ghong inc.Camera Driver a
5、nalysis in the platform of MTKPreliminary Information图像传感器(SENSOR)是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。光电二极管受到光照射时,就会产生电荷。目前的 SENSOR 类型有两种:CCD(Charge Couple Device), 电荷耦合器件,它是目前高像素类 sensor 中比较成熟的成像器件,是以一行为单位的电流信号。CMOS(Complementary Metal Oxide Semiconductor),互补金属氧化物半导体。CMOS的信号是以点为单位的电荷信号,更为敏感,速度也更快,更为省电。ISP
6、 的性能是决定影像流畅的关键,JPEG encoder 的性能也是关键指标之一。而 JPEGencoder 又分为硬件 JPEG 压缩方式,和软件 RGB 压缩方式。DSP 控制芯片的作用是:将感光芯片获取的数据及时快速地传到 baseband 中并刷新感光芯片,因此控制芯片的好坏,直接决定画面品质(比如色彩饱和度、清晰度)与流畅度。三、 Camera 常见的数据输出格式:常见的数据输出格式有:Rawdata 格式、YUV 格式、RGB 格式。RGB 格式:采用这种编码方法,每种颜色都可用三个变量来表示红色、绿色以及蓝色的强度。每一个像素有三原色 R 红色、G 绿色、B 蓝色组成。YUV 格式
7、:其中“Y”表示明亮度(Luminance 或 Luma),就是灰阶值;而“U”和“V”表示色度(Chrominance 或 Chroma),是描述影像色彩及饱和度,用于指定像素的颜色。RAW DATA 格式:是 CCD 或 CMOS 在将光信号转换为电信号时的电平高低的原始记 录,单纯地将没有进行任何处理的图像数据,即摄像元件直接得到的电信号进行数字化处理而得到的。支持 YUV/RGB 格式的模组,一般会在模组上集成 ISP(Image Single Processor),经过A/D 转换过的原始数据经过 ISP 处理生成 YUV 标准格式传到 BB。一般来说,这种设计适 用于低像素 Cam
8、era 的要求,会在主板上省去一个 DSP,可降低成本。在调试过程中,YUV/RGB 格式的摄像头,其所有参数都可在 kernel 层通过寄存器来控制。调试一般由 sensor的原厂支持。支持 RawData 格式的模组,由于感光区域的需求,不会再模组内集成 ISP 以最大程度 的增大感光区域的面积,提高照片质量。模组把原始的数字信号传给 BB 上的 DSP 进行处 理,MTK 自带的 DSP 一般包含 ISP、JPEG encoder、和 DSP 控制芯片。在调试的时候图像的效果需要 MTK 在 HAL 层的参数进行支持。Ghong ConfidentialRevision 0.1-Feb.
9、14 2012- 5 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information四、 阅读 Camera 的规格书(以 Truly 模组 OV5647_Raw 为例):Ghong ConfidentialRevision 0.1-Feb.14 2012- 6 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information五、 Camera 的硬件原理图及引脚(以 W19S 项目 M
10、ainCameraOV5647 为例):从上面可看出,连接 Camera 的 30 根 Pin 脚可大致分为以下几类:1、 电源部分:a)VCAMD 就是 DVDD 数字供电,主要给 ISP 供电,由于 RAWDATA 格式 的 sensor 其 ISP 是在 BB 端,所以将其引脚将其 NC。从上面的规格书上 可以看出 DVDD 是内部 BB 端供电。模组已将其 NC 掉了; b)VCAM_IO 就是 VDDIO 数字 IO 电源主要给 I2C 部分供电; c)VCAMA 就是 AVDD 模拟供电,主要给感光区和 ADC 部分供电; d)VCAM_AF 是对 Camera 自动对焦马达的供电
11、。 2、 Sensor Input 部分:a)Reset 信号,用于复位、初始化。 b)Standby/PowerDown 信号,用于进入待机模式,降低功耗。 c)Mclk,即 MasterClock 信号,是由 BB 端提供。 3、 Sensor OutPut 部分:a)Pclk,即 PixelClock 信号,由 MCLK 分频得到,作为外部时钟控制图像 传输帧率 b)HSYNC,行同步信号,其上升沿表示新一列行图像数据的开始。 c)VSYNC,帧同步信号,其下降沿表示新的一帧图片的开始。 d)D0-D9 一共 10 根数据线(8/10 根等); 4、 I2C 部分:SCL,I2C 时钟信
12、号线和 SDA,I2C 数据信号线。Ghong ConfidentialRevision 0.1-Feb.14 2012- 7 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information六、 MTK 平台 Camera 驱动架构:上图的架构相信大家都有了一定的了解,android 将系统大致分为应用层、库文件和硬件抽象层、Linux 内核三层。在底层的内核空间,Camera 的 driver 将其驱动起来以后,将硬件驱动的接口交给硬件抽象层,android 上层的 Camera 应用程
13、序在 android 实时系统中的虚拟机中,加载 android 留给 Camera 公用的一些库文件,调用硬件抽象层的接口来控制 Camera硬件来实现功能。当然,如果是 Raw 模式的 Camera,还需要在硬件抽象层调用一些参数来控制 Camera 的效果。Ghong ConfidentialRevision 0.1-Feb.14 2012- 8 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information七、 MTK 平台 Camera 相关代码文件(以下代码均为 MTK6575
14、 平台):1、 CameraSensor 驱动相关文件2、 Sensor ID 和一些枚举类型的定义3、 Sensor 供电4、 Kernel Space 的 SensorList,imgsensor 模块注册Ghong ConfidentialRevision 0.1-Feb.14 2012- 9 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information5、 User Space 的 SensorList,向用户空间提供支持的 SensorList6、 Sensor 效果调整的接口
15、Ghong ConfidentialRevision 0.1-Feb.14 2012- 10 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information八、 Camera 模块驱动、设备与总线结构:一般在 Linux 设备驱动模型中,我们只需要关心总线、设备、驱动这三个实体。总线会充当红娘对加载于其上的设备与驱动进行配对,对于 Camera 模块也不例外,下面从总线、设备、驱动的角度来分析 Camera 模块驱动的注册、匹配与加载过程。a) 驱动的注册:在(customcommonke
16、rnelimgsensorsrcKd_sensorlist.c)CAMERA_HW_i2C_init 这个函数里通过 Platform_driver_register(&g_stCAMERA_HW_Driver)把 Camera 模块驱动注册 到 Platform 总线上。而 g_stCAMERA_HW_Driver 是对结构体 Platform_driver 这个结构体的填充。(KernelincludelinuxPlatform_device.h)Platform_driver 这个结构体包含 Probe()、Remove()等函数来完成驱动的填充。b) 设备的注册:对 platform_
17、device 的定义通常在 BSP 的板级文件:(kernelarchshboardsmach-ap325rxaSetup.c)中实现,在板级文件中,将 platform_device归纳为一个数组,最终通过 platform_add_device()函数统一注册:Ghong ConfidentialRevision 0.1-Feb.14 2012- 11 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Informationc) 总线的匹配:既 然 是 驱 动 Platform_device 那
18、 对 应 的 设 备 必 然 是 挂 载 Platform 总 线 上 的Platform_device,Platform 总线是 Linux 系统提供的一种机制,不同于 I2C、I2S 等总线,它 是一种虚拟的总线。Linux 系统为 Platform 总线定义了一个 bus_type 的实例 Platform_bus_type:(Kerneldriversbaseplatform.c)Platform 总线通过 platform_match 这个成员函数来确定 platform_device 与 platform_driver 如何进行匹配:Ghong ConfidentialRevisi
19、on 0.1-Feb.14 2012- 12 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information九、 Camera 驱动工作流程:下载Capture 下载PreviewPower On 参数为拍照 参数为预览 做准备 做准备PowerOffIICINITReset软件ResetPDN读ID判断是否连接到需要的Sensor从上图可以清晰的了解到 Camera 的一个工作流程主要分为这么七步:1.打开 Camera Power LDO,让 Camera 有能量保证。 2.打开 II
20、C,设置 PDN 引脚,使 Camera 退出出 Standby 模式,按照要求让 Reset 脚 做一个复位动作。 3.读一下 sensor 的版本 ID,这样可以让你确认是否连接上你想要的 sensor。 4.对 Sensor 进行初始化下载最基本的参数让 Sensor 工作起来,可能包括软复位。 5.下载 preview 的参数,为预览动作准备。 6.下载 Capture 的参数,为拍照动作准备。 7.设置 PDN 引脚,使 Sensor 进入 Standby 模式,或者关掉 LDO 等动作,退出 Camera。 我们都知道,Linux 内核是通过模块的机制来加载设备驱动的,那么接下来我
21、们就从设备模块加载的角度来看下 Camera 工作流程的驱动代码是如何工作的。在-alpsmediatekcustomcommonkernelimgsensorsrckd_sensorlist.c 中可以看到:module_init(CAMERA_HW_i2C_init);module_exit(CAMERA_HW_i2C_exit);在这里 Linux 内核加载和卸载 Camera 模块。Ghong ConfidentialRevision 0.1-Feb.14 2012- 13 -2012 Ghong inc.Camera Driver analysis in the platform o
22、f MTKPreliminary Informationstatic 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,;Camera 模块初始化开始向总线注册驱动,在 Platform_driver 的成员函数.probe()中,通过
23、i2c_add_driver(&CAMERA_HW_i2c_driver)向 I2C 申请,而 CAMERA_HW_i2c_driver 这个结构体里填充的是将 Camera 作为一个字符设备在 I2C 上进行注册:在 RegisterCAMERA_HWCharDrv()中cdev_init(g_pCAMERA_HW_CharDrv, &g_stCAMERA_HW_fops);对设备进行初始化,并将g_stCAMERA_HW_fops 这个文件操作函数作为上层对 Camera 设备操作的接口留给上层进 行调用:Ghong ConfidentialRevision 0.1-Feb.14 2012
24、- 14 -2012 Ghong inc.Camera Driver analysis in the platform of MTKPreliminary Information其中成员函数 open()只是初始化一个原子变量留给系统调用。ioctl()才是整个 Camera驱动的入口:CAMERA_HW_Ioctl()是上层文件操作系统操作底层硬件的方法,它先对 Camera 需要的Buffer 做一个初始化,然后建立对 Cameraopen、getinfo 等操作的接口:通过判断 Sensor 状态的逻辑值来进行具体的操作,对于这个值的定义在:MediatekcustomcommonkernelimgsensorincKd_imgsensor.h 中Ghong ConfidentialRevision 0.1-Feb.14 2012- 15
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1