Camera Driver analysis in the platform of MTK
Preliminary Information
九、 Camera 驱动工作流程:
下载Capture 下载Preview
Power On 参数为拍照
准备
参数为预览 做准备 做
Power Off
IIC Reset PDN
INIT 软件Reset
读ID 判断是否连 接到需要的 Sensor
从上图可以清晰的了解到 Camera 的一个工作流程主要分为这么七步: 1. 打开 Camera Power LDO,让 Camera 有能量保证。
2.
打开 IIC,设置 PDN 引脚,使 Camera 退出出 Standby 模式,按照要求让 Reset 脚
做一个复位动作。
3. 读一下 sensor 的版本 ID,这样可以让你确认是否连接上你想要的 sensor。 4. 对 Sensor 进行初始化下载最基本的参数让 Sensor 工作起来,可能包括软复位。 5. 下载 preview 的参数,为预览动作准备。 6. 下载 Capture 的参数,为拍照动作准备。
7.
设置 PDN 引脚,使 Sensor 进入 Standby 模式,或者关掉 LDO 等动作,退出 Camera。
我们都知道,Linux 内核是通过模块的机制来加载设备驱动的,那么接下来我们就从设
备模块加载的角度来看下 Camera 工作流程的驱动代码是如何工作的。
在-alps\\mediatek\\custom\\common\\kernel\\imgsensor\\src\\kd_sensorlist.c 中可以看到:
module_init(CAMERA_HW_i2C_init); module_exit(CAMERA_HW_i2C_exit); 在这里 Linux 内核加载和卸载 Camera 模块。
- 13 -
Ghong Confidential
Revision 0.1-Feb.14 2012
?2012 Ghong inc.
};
}
Camera Driver analysis in the platform of MTK
Preliminary Information
static struct platform_driver g_stCAMERA_HW_Driver = {
.probe .remove
= CAMERA_HW_probe, = CAMERA_HW_remove,
.suspend = CAMERA_HW_suspend, .resume .driver
.name
= CAMERA_HW_resume, = {
= \
.owner = THIS_MODULE,
Camera 模块初始化开始向总线注册驱动,在 Platform_driver 的成员函数.probe()中,通
过 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 设备操作的接口留给上层进 行调用:
- 14 -
Ghong Confidential
Revision 0.1-Feb.14 2012
?2012 Ghong inc.
驱动的入口:
Camera Driver analysis in the platform of MTK
Preliminary Information
其中成员函数 open()只是初始化一个原子变量留给系统调用。ioctl()才是整个 Camera
CAMERA_HW_Ioctl()是上层文件操作系统操作底层硬件的方法,它先对 Camera 需要的 Buffer 做一个初始化,然后建立对 Cameraopen、getinfo 等操作的接口:
通过判断 Sensor 状态的逻辑值来进行具体的操作,对于这个值的定义在: Mediatek\\custom\\common\\kernel\\imgsensor\\inc\\Kd_imgsensor.h 中
Ghong Confidential
Revision 0.1-Feb.14 2012
?2012 Ghong inc.
- 15 -
Camera Driver analysis in the platform of MTK
Preliminary Information
在 KdSetDriver()中通过判断 name 和 ID 匹配具体型号的 sensor 的驱动,判断它是主摄还 是次摄,并对它进行初始化:
通过 NAME 和 ID 匹配完成后会将 PSENSOR_FUNCTION_STRUCT *pfFunc 这个结构体匹 配到具体型号的驱动代码中:
到这里,整个 Camera 驱动从总线注册到完成具体 sensor 的初始化的流程就完成了,
CAMERA_HW_Ioctl()中其他的 ioctl 操作函数最后都会在$sensor$_sensor.c 中实现。
Ghong Confidential
Revision 0.1-Feb.14 2012
?2012 Ghong inc.
- 16 -
Camera Driver analysis in the platform of MTK
Preliminary Information
十、 Camera 驱动添加、调试流程:
1、 修改系统配置文件 ProjectConfig.mk:
-alps\\mediatek\\config\\$project$\\ProjectConfig.mk
Ghong Confidential
Revision 0.1-Feb.14 2012
?2012 Ghong inc.
- 17 -