L版本上AF Driver open及release函数要求
问题现象:
1. AF不工作
2.开机慢
关键字:AF不工作、权限修改不成功、开机慢
分析:
1. L版本上init.rc的chmod及chown命令执行跟之前的版本不同,使用android原生函数,即执行chmod及chown命令时会先做open动作,open失败的话,chmod和chown命令就没有成功执行
2. init进程中不会对VCM IC上电,这样就对open和release函数存在要求,即没有上电时也能正常成功执行且执行时间比较短,否则会导致权限修改不成功或开机慢问题。以前有些AF Driver有如下写法,
A:open中做初始化操作
B:为避免退出CAMERA时马达撞击基座声音,release函数中加入缓慢退回到原点的机制
现在这种写法需要修改,因为init进程在没有上电的情况下调用到open及release,会发生I2C timeout,影响开机时间
[Solution]
A:初始化改到第一次move lens时执行,假设初始化函数为XXXAF_init(),修改后如下
inline static int moveXXXAF(unsigned long a_u4Position)
{
if((a_u4Position > g_u4XXXAF_MACRO) || (a_u4Position < g_u4XXXAF_INF))
{
XXXAFDB("[XXXAF] out of range \n");
return -EINVAL;
}
if (g_s4XXXAF_Opened == 1)
{
XXXAF_init();
SPIn_lock(&g_XXXAF_SpinLock);
…
g_s4XXXAF_Opened = 2;
spin_unlock(&g_XXXAF_SpinLock);
}
…
}
static int XXXAF_Open(struct inode * a_pstInode, struct file * a_pstFile)
{
…
spin_lock(&g_XXXAF_SpinLock);
…
g_s4XXXAF_Opened = 1;
spin_unlock(&g_XXXAF_SpinLock);
…
return 0;
}
static int XXXAF_Release(struct inode * a_pstInode, struct file * a_pstFile)
{
…
if (g_s4XXXAF_Opened)
{
…
spin_lock(&g_XXXAF_SpinLock);
g_s4XXXAF_Opened = 0;
spin_unlock(&g_XXXAF_SpinLock);
}
…
return 0;
}
第一次move lens时,g_s4XXXAF_Opened 值为1,之后值改为2。
B:为避免退出camera时马达撞击基座声音,release函数中加入缓慢回退到原点的机制,把这个回退机制改成通过if (g_s4XXXAF_Opened == 2) 包起来,确保推了lens之后才执行,避掉open之后直接关掉AF driver的情况。
static int XXXAF_Release(struct inode *a_pstInode, struct file *a_pstFile)
{
if (g_s4XXXAF_Opened == 2) {
s4XXXAF_WriteReg();
msleep(10);
s4XXXAF_WriteReg();
msleep(10);
}
if (g_s4XXXAF_Opened) {
…
spin_lock(&g_XXXAF_SpinLock);
g_s4XXXAF_Opened = 0;
spin_unlock(&g_XXXAF_SpinLock);
}
…
return 0;
}
顶顶顶顶顶顶顶顶顶