加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

MTK6573 闪光灯测试

发布时间:2020-12-15 06:35:56 所属栏目:百科 来源:网络整理
导读:/*******************************************************************************/ 以下的代码加在kd_flashlightlist.c 里面的probe函数里面。 开启LDO函数声明 extern void upmu_ldo_enable(upmu_ldo_list_enum ldo,kal_bool enable);extern void upmu_
/*******************************************************************************/
以下的代码加在kd_flashlightlist.c 里面的probe函数里面。

开启LDO函数声明
	extern void upmu_ldo_enable(upmu_ldo_list_enum ldo,kal_bool enable);
		extern void upmu_ldo_vol_sel(upmu_ldo_list_enum ldo,upmu_ldo_vol_enum vol);





//开启PMU供电,使能camera模块接口。这样我们的GPIO95 才可以开启,之前没开启这个LDO,试了一下不行。
PMU分模块的供电原理设计还是不错的,省电!
	upmu_ldo_vol_sel(MT65XX_POWER_LDO_VCAMD2,VOL_1800);


	upmu_ldo_enable(MT65XX_POWER_LDO_VCAMD2,KAL_TRUE);




	upmu_ldo_vol_sel(MT65XX_POWER_LDO_VCAMD,VOL_1500);


	upmu_ldo_enable(MT65XX_POWER_LDO_VCAMD,KAL_TRUE);


	upmu_ldo_vol_sel(MT65XX_POWER_LDO_VCAMA,VOL_1800);


	upmu_ldo_enable(MT65XX_POWER_LDO_VCAMA,KAL_TRUE);



//根据BB的GPIO定义,使用的是GPIO95这引脚。并且要设置GPIO的工作模式,和方向,以及输出值。 这是暂时的配置,
fixme: when dct is done!
注意: 这的定义是暂时的,并且要在DCT的配置工具里面对着Io口配置为GPIO模式。而不是cmflash模式!

#define GPIO_CAMERA_FLASH_EN_PIN  GPIO95 // 46
	 
 	mt_set_gpio_mode(GPIO_CAMERA_FLASH_EN_PIN,GPIO_CTP_EN_PIN_M_GPIO);
    mt_set_gpio_dir(GPIO_CAMERA_FLASH_EN_PIN,GPIO_DIR_OUT);
	mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN,GPIO_OUT_ONE);
while (1)
	 {

	循环测试,启动内核时停在flashlight的 probe函数里面。这很有用的哈。
		mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN,GPIO_OUT_ONE);
		mdelay(20);
		mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN,GPIO_OUT_ZERO);
		mdelay(20);
		mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN,GPIO_OUT_ZERO);
	 }
	 


?// ******************************************************************************
附加:DCT配置后的参数。 如果要使用这里面的参数 请加头文件cust_gpio_usage.h
#define GPIO_CAMERA_FLASH_EN_PIN ? ? ? ? GPIO95
#define GPIO_CAMERA_FLASH_EN_PIN_M_GPIO ? GPIO_MODE_00
#define GPIO_CAMERA_FLASH_EN_PIN_M_EINT ? GPIO_MODE_03
#define GPIO_CAMERA_FLASH_EN_PIN_M_PWM ? GPIO_MODE_02
#define GPIO_CAMERA_FLASH_EN_PIN_M_CMFLASH ? GPIO_MODE_01

这是具体型号的驱动。 在总的makefile里面配置的是
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight
在mediatech/common/kernel/flashlight/  文件里面有对闪光灯的接口函数。

ssize_t gpio_FL_Enable(void) {
    //Enable
    if(mt_set_gpio_out(GPIO_CAMERA_FLASH_EN,GPIO_OUT_ONE)){PK_DBG(" set gpio failed!! n");} //开启闪光灯
    return 0;
}


#define FL_Enable()         gpio_FL_Enable() 封装底层函数。



static int constant_flashlight_ioctl(MUINT32 cmd,MUINT32 arg)
{
    int i4RetValue = 0;
    int iFlashType = (int)FLASHLIGHT_NONE;
    
    //PK_DBG(" startn");

    //when ON state,only disable command is permitted.
    if ( (TRUE == g_strobe_On) && !((FLASHLIGHTIOC_T_ENABLE == cmd) && (0 == arg)) )

    {
        PK_DBG("  is already ON OR check parameters!n");
        //goto strobe_ioctl_error;
        return i4RetValue;
    }

    switch(cmd)
    {
    	case FLASHLIGHTIOC_T_ENABLE :
            if ( arg && strobe_width ) {
                if ( (FLASHLIGHTDRV_STATE_PREVIEW == strobe_eState ) || 
                      (FLASHLIGHTDRV_STATE_STILL   == strobe_eState && KD_FLASHLIGHT_FLASH_MODE_STROBE_WIDTH != strobe_width) ) { 

                    //enable strobe watchDog timer. 
                    strobe_WDTConfig(); 
                    if (FLASH_LIGHT_WDT_DISABLE != g_WDTTimeout_ms) { 
                        strobe_WDTStart(); 
                    } 
                    FL_Enable(); //通过这个ioctl函数对上层提供接口。 这里就是具体的操作。

                    g_strobe_On = TRUE;
                    PK_DBG(" FLASHLIGHTIOC_T_ENABLE(1)n");
                }
                else {
                    PK_DBG(" FLASHLIGHTIOC_T_ENABLE(1) skip due to FLASH moden");
                }
            }
            else{
                //reset to LED low current torch mode
                FL_Init();

                if(FL_Disable()){
                    PK_ERR(" FL_Disable fail!n");
                    goto strobe_ioctl_error;
                }
                g_strobe_On = FALSE;
                PK_DBG(" FLASHLIGHTIOC_T_ENABLE(0)n");
                //disable strobe watchDog timer.
                strobe_WDTStop();
            }
    		break;
        case FLASHLIGHTIOC_T_LEVEL:
            PK_DBG(" level:%x n",(int)arg);
            if (KD_FLASHLIGHT_FLASH_MODE_STROBE_WIDTH == arg) {
                //set high current flash mode
                strobe_width = KD_FLASHLIGHT_FLASH_MODE_STROBE_WIDTH;
                FL_Flash_Mode();
                PK_DBG(" FL_Flash_Mode() n");
            }
            else {
                if(arg>32) {arg=32;}
                strobe_width = arg;
                if (arg > 0)
                {
                    //reset to LED low current torch mode
                    FL_Init();

                    if(FL_dim_duty((kal_int8)arg-1)){
                        //0(weak)~31(strong)
                        PK_ERR(" FL_dim_duty fail!n");
                        //i4RetValue = -EINVAL;
                        goto strobe_ioctl_error;
                    }
                }
            }
            break;
        case FLASHLIGHTIOC_T_FLASHTIME:
            strobe_Timeus = (u32)arg;
            PK_DBG(" strobe_Timeus:%d n",(int)strobe_Timeus);
            break;
        case FLASHLIGHTIOC_T_STATE:
            strobe_eState = (eFlashlightState)arg;
            break;
        case FLASHLIGHTIOC_G_FLASHTYPE:
            iFlashType = FLASHLIGHT_LED_CONSTANT;
            if(copy_to_user((void __user *) arg,(void*)&iFlashType,_IOC_SIZE(cmd)))
            {
                PK_DBG(" ioctl copy to user failedn");
                return -EFAULT;
            }
            break;
            
    	default :
    		PK_DBG(" No such command n");
    		i4RetValue = -EPERM;
    		break;
    }

    //PK_DBG(" donen");
    return i4RetValue;

strobe_ioctl_error:
    PK_DBG(" Error or ON state!n");
    return -EPERM;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读