微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > L版本上AF Driver open及release函数要求

L版本上AF Driver open及release函数要求

时间:10-02 整理:3721RD 点击:

问题现象:

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;


}






顶顶顶顶顶顶顶顶顶

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top