/*最近在搞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
}
}
}
MTK Camera Power
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.