说明:以下说明均是在android 6.0 ,mt6580平台为例。
Data: 2016-07-21 星期四
一、前言
在昨天调试摄像头的时候,发现摄像头不对焦。原本以为很简单的事,只要给摄像头上电,再在
\vendor\mediatek\proprietary\custom\mt6580\hal\lens\lenslist.cpp 文件里添加一点东西就OK了。结果发现还是不能对焦,
而且确定摄像头在硬件上是有AF功能的。这就奇怪了,上电是没问题的。后来FAE说可能是IIC没通,这个就有点令我吃惊了。
AF功能也需要IIC通信来控制的吗?之前怎么没印象呢?后来想想也了然,如果你单单只给AF上电,它又怎么知道要对焦多少呢?
马达要转多少才合适呢?所以它必需要由系统来给它控制,那系统和马达之间自然就需要用通讯来控制了。
二、现实
1,首先我们要在ProjectConfig.mk 里配置好摄像头的AF功能,例如:
CUSTOM_KERNEL_LENS = ad5820af dw9714af dummy_lens
CUSTOM_KERNEL_MAIN_LENS = dw9714af
CUSTOM_KERNEL_SUB_LENS = dummy_lens
CUSTOM_HAL_LENS = ad5820af dw9714af dummy_lens
CUSTOM_HAL_MAIN_LENS = dw9714af
CUSTOM_HAL_SUB_LENS = dummy_lens
2,还要在 Kernel 的项目配置文件里配置好,例如:ww826_80_weg_m_defconfig
CONFIG_MTK_LENS=y
CONFIG_MTK_LENS_DUMMYLENS_SUPPORT=y
CONFIG_MTK_LENS_AD5820AF_SUPPORT=y
CONFIG_MTK_LENS_DW9714AF_SUPPORT=y
事实上我们硬件上用到的是 DW9714AF。
3,我们找到AF的驱动文件目录: \kernel-3.18\drivers\misc\mediatek\lens\common\ 在这个目录下面放着源码当前
所有的AF驱动代码。我们找到 dw9714af 目录。
我们再继续去代码里跟下去! 就会发现 在 DW9714AF.c 里,最重要的是这个函数!
再找 DW9714AF_Ioctl这个函数是在那里被调用
现在我们只有后摄像头有AF的功能,所以我们只需要跟进 main_lens.c 这个文件里 ~
4,kernel-3.18\drivers\misc\mediatek\lens\main_lens.c
我们再跟 g_stAF_DrvList[MAX_NUM_OF_LENS] 这个结构体数组 !!!
5,我们再找 AF_SetMotorName 这个函数
原来它是受这个节点控制的!!!
....................................
是在这里注册AF的字符设备~
6,它就是在AF的IIC proble里做的!
这个比较重要!!!,这个就是要和生成的.dts文件里的相对应的。这个要我们自己用 DCT 工具去配置的!
例如:
这里涉及到平台驱动以及I2C子系统驱动的知识点,如有不太明白的要去了解一下相关的知识。这里的问题只要是I2C能通讯成功就问题不大了,至于要微调AF功能得看合入的参数。