MTK Camera Power

/*最近在搞Camera,上電這塊比較混亂。特寫此文章,梳理一下;
平臺:MTK6589 IC: 5648
目錄在:mediatek/custom/xxx/kernel/camer/camer/kd_camera_hw.c
首先必然要看:
*/
int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, BOOL On, char* mode_name)

{
//上面的爲camera上電與下電的主要函數,
//進入這個函數後:看到下面幾個變量:
 
u32 pinSetIdx = 0;//default main sensor  0爲默認的後置主Camera。
                                        // 1爲前置Camera,
                                        //2爲back main Camera(目前還沒有用到)

#define IDX_PS_CMRST 0   
#define IDX_PS_CMPDN 4

#define IDX_PS_MODE 1
#define IDX_PS_ON   2
#define IDX_PS_OFF  3     //上面的一些變量是爲了下面的數組好區分成員變量的,

u32 pinSet[3][8] = {
                    //for main sensor
                       //0
					{
                       /*0*/GPIO_CAMERA_CMRST_PIN, // main camera reset pin
                       /*1*/ GPIO_CAMERA_CMRST_PIN_M_GPIO,   /* mode */
                       /*2*/ GPIO_OUT_ONE,                   /* ON state */
                       /*3*/ GPIO_OUT_ZERO,                  /* OFF state */
                       /*4*/ GPIO_CAMERA_CMPDN_PIN, 	//main camera power down pin.
                       /*5*/ GPIO_CAMERA_CMPDN_PIN_M_GPIO,
                       /*6*/ GPIO_OUT_ONE,
                       /*7*/  GPIO_OUT_ZERO,
                    },
                    //for sub sensor
  		 //1
                    {
					 /*0*/ GPIO_CAMERA_CMRST1_PIN, //sub camer reset pin
                     /*1*/ GPIO_CAMERA_CMRST1_PIN_M_GPIO,
                     /*2*/ GPIO_OUT_ONE,
                     /*3*/ GPIO_OUT_ZERO,
                     /*4*/ GPIO_CAMERA_CMPDN1_PIN, //sub camer power down pin.
                     /*5*/ GPIO_CAMERA_CMPDN1_PIN_M_GPIO,
                     /*6*/ GPIO_OUT_ONE,
                     /*7*/   GPIO_OUT_ZERO,
                    },
		 //2
                    //for main_2 sensor
                    {GPIO_CAMERA_2_CMRST_PIN,
                        GPIO_CAMERA_2_CMRST_PIN_M_GPIO,   /* mode */
                        GPIO_OUT_ONE,                   /* ON state */
                        GPIO_OUT_ZERO,                  /* OFF state */
                     GPIO_CAMERA_2_CMPDN_PIN,
                        GPIO_CAMERA_2_CMPDN_PIN_M_GPIO,
                        GPIO_OUT_ONE,
                        GPIO_OUT_ZERO,
                    }
                   };
    
 //接下來是對我們的pinSetIdx進行賦值,爲下面的上電下電進行區分
    if (DUAL_CAMERA_MAIN_SENSOR == SensorIdx){
        pinSetIdx = 0; //如果爲後置的話,則爲0
    }
    else if (DUAL_CAMERA_SUB_SENSOR == SensorIdx) {
        pinSetIdx = 1; //如果爲前置的話,則爲1
    }
    else if (DUAL_CAMERA_MAIN_2_SENSOR == SensorIdx) {
       // pinSetIdx = 2; //如果爲main2的話,則爲2
    }
 
if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5648_MIPI_RAW,currSensorName))) //這裏判斷當前的SensorIC是那顆。
{
    	//AVDD
    	if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800,mode_name))
    	{
    		PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");
    		//return -EIO;
    		goto _kdCISModulePowerOn_exit_;
    	}
    	mdelay(10); //這裏的delay需要根據spec來定義
  #if 0  	//john modify :OV5648 DVDD pin is NC 
    	//DVDD
    	if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1500,mode_name))
    	{
    		 PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");
    		 //return -EIO;
    		 goto _kdCISModulePowerOn_exit_;
    	}
    	mdelay(10);
#endif
    	//DOVDD
    	if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800,mode_name))
    	{
    		PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");
    		//return -EIO;
    		goto _kdCISModulePowerOn_exit_;
    	}
    	mdelay(10);

    	//AF_VCC
    	if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_2800,mode_name))
    	{
    		PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");
    		//return -EIO;
    		goto _kdCISModulePowerOn_exit_;
    	}


    	mdelay(10);

//以上爲對Camera的AVDD,DVDD,DOVDD,以及AF的AF_VCC進行上電,按照不同模組有不同的設置;根據模組的原理圖來進行設置,包括上電的先後順序有的Camera是有特殊要求的。
 
//這裏:pinSetIdx=0;
    	//PDN/STBY pin
    	if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) //此條件成立
    	{
			mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])   
			//mt_set_gpio_mode(pinSer[0][4],pinSer[0][5]) -->mt_set_gpio_mode(GPIO_CAMERA_CMPDN_PIN,GPIO_CAMERA_CMPDN_PIN_M_GPIO)
			mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT])   		
			mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_OFF]) 
	         //對應的是PIO_OUT_ZERO   			         
            msleep(10);
    		mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_ON]) 	
			//對應的是 GPIO_OUT_ONE
 	        msleep(1);
   		//RST pin
    		mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])   		 		
			mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT])    		
            mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_OFF])    			         
			mdelay(10);
    		mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_ON])    		 		
			mdelay(1);
    	}

        //disable inactive sensor
        if(pinSetIdx == 0 || pinSetIdx == 2) {//disable sub
            if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST]) {
                if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_MODE]))
                if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_MODE]))
                if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMRST],GPIO_DIR_OUT))
                if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMPDN],GPIO_DIR_OUT)){
                if(mt_set_gpio_out(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_OFF])) //low == reset sensor
                if(mt_set_gpio_out(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_OFF])) //high == power down lens module
            }
        }
    	else {
            if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) {
                if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_MODE]))
                if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_MODE]))
                if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMRST],GPIO_DIR_OUT))
                if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMPDN],GPIO_DIR_OUT))
                if(mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_OFF])) //low == reset sensor
                if(mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_OFF]))//high == power down lens module
            }
            
    	}

    }



 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章