zoukankan      html  css  js  c++  java
  • MTK6573 闪光灯测试

    /*******************************************************************************/
    以下的代码加在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_ONE);
    		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(" start\n");
    
        //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 mode\n");
                    }
                }
                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 failed\n");
                    return -EFAULT;
                }
                break;
                
        	default :
        		PK_DBG(" No such command \n");
        		i4RetValue = -EPERM;
        		break;
        }
    
        //PK_DBG(" done\n");
        return i4RetValue;
    
    strobe_ioctl_error:
        PK_DBG(" Error or ON state!\n");
        return -EPERM;
    }
    



  • 相关阅读:
    C# 0xC0000005 捕获
    “Task”未包含“Run”的定义
    Win10 清理自带APP
    SQLServer 2014 内存优化表
    PHP 常用函数
    Android开发之旅:环境搭建及HelloWorld
    C# PropertyGrid控件应用心得
    SQL Server 连接池 (ADO.NET) MSDN
    查看数据库连接池函数
    WCF客户端调用服务器端错误:"服务器已拒绝客户端凭据"。
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124305.html
Copyright © 2011-2022 走看看