Data: 2016-04-12 星期二
说明:以下说明均是在android 5.1 ,mt6580平台为例。由于笔记是很久之前写的,到现在已经记不起当初的很多细节。以至于不能很好的总结出来,在这里只能说一声抱歉了。
a)驱动注册
在(alps\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt6580\Kd_sensorlist.c)CAMERA_HW_i2C_init 这个函数里通过Platform_driver_register(&g_stCAMERA_HW_Driver)把 Camera 模块驱动注册 到 Platform 总线上。而 g_stCAMERA_HW_Driver 是对结构体Platform_driver 这个结构体的填充。
b)设备注册
我们在mt_devs.c这个文件里找不到名为"image_sensor"的平台设备注册,于是我们找到了 mt6580.dtsi 这个文件。
它是在这里完成设备注册的,即是他们是以 .of_match_table 来匹配成功的。
c)总线的匹配
既然是驱动Platform_device 那对应的设备必然是挂载Platform 总线上的Platform_device,Platform 总线是 Linux系统提供的一种机制,
不同于 I2C、I2S 等总线,它 是一种虚拟的总线。Linux 系统为 Platform 总线定义了一个 bus_type 的实例 Platform_bus_type:
(Kernel-3.10\drivers\base\platform.c)
Platform 总线通过 platform_match 这个成员函数来确定 platform_device 与 platform_driver 如何进行匹配:
二、 Camera 驱动工作流程:(以下这个图来源于网络,非原创!)
从上图可以清晰的了解到 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\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt6580\kd_sensorlist.c 中可以看到:
module_init(CAMERA_HW_i2C_init);
module_exit(CAMERA_HW_i2C_exit);在这里 Linux 内核加载和卸载 Camera 模块。
a),我们先来看看Camera的上电部分
首先,在上面的基础上走到了执行 :
static struct platform_driver g_stCAMERA_HW_Driver = {
.probe = CAMERA_HW_probe,
接着我们就跟下去:
I2c的注册和匹配我们就先不跟了,我们直接跟到它的 probe 函数: .probe = CAMERA_HW_i2c_probe,
那我们直接跟 RegisterCAMERA_HWCharDrv() 这个函数:
在 RegisterCAMERA_HWCharDrv()中, cdev_init(g_pCAMERA_HW_CharDrv, &g_stCAMERA_HW_fops);
对设备进行初始化,并将 g_stCAMERA_HW_fops 这个文件操作函数作为上层对 Camera 设备操作的接口留给上层进行调用:
其中成员函数 open()只是初始化一个原子变量留给系统调用。ioctl()才是整个 Camera驱动的入口:
CAMERA_HW_Ioctl()是上层文件操作系统操作底层硬件的方法,它先对 Camera 需要的Buffer 做一个初始化,
然后建立对 Cameraopen、getinfo 等操作的接口:
我们跟进 1 里的 adopt_CAMERA_HW_Open() 函数:
那么,这个 g_pSensorFunc 指针是从那里来的呢?
于是又去找 kd_MultiSensorFunc
跟到 kd_MultiSensorOpen 函数:
再看看这个函数里边是什么:
再跟到 kdCISModulePowerOn 这个函数,看明白了吧,这个就是我们要找的东西了,它在 kd_camera_hw.c 这个文件里。