美文网首页
修改闪光灯亮度(芯片AW36402)

修改闪光灯亮度(芯片AW36402)

作者: c枫_撸码的日子 | 来源:发表于2018-08-01 16:31 被阅读0次

    一、综述

    天苍苍,野茫茫,风吹草低见牛羊,以前总会想一个问题:
    人活着有什么意义吗?
    最近才明白,其实是没什么意义的。
    好吧,做传音项目,提了个需求,
    闪光灯设置3种不同的亮度

    一开始也是蒙蔽的,不知道怎么去设置亮度,后来看了规格书以及和硬件工程师沟通,才弄懂了。

    一、硬件原理图

    前闪

    前闪光灯用的芯片是AW36402,只要拉高这个CAM_FLASH_EN_GPIO脚就可以让闪光灯正常工作了。

    二、规格书

    1.电流限制

    AW36402规格书
    闪光灯最大电流限制为200mA

    2.亮度设置

    AW36402规格书
    得出以下信息
    0.5us<EN脚拉高时间<10us
    1.0.5us<EN脚拉低时间<10us

    随着不断增加的EN脉冲上升边缘数,LED电流逐渐下降。
    (拉高EN脚再拉低EN脚就会形成一个脉冲)
    在当前的设置过程中,EN引脚应设置高电平。
    LED电流可计算如下:

    ILED=12.5*N(N<=16)
    也就是说脉冲(或者说方波)越多,电流越低,
    闪光灯的亮度跟电流有关
    电流越大,闪光灯越亮,反之越暗

    三.代码实现

    kernel-3.18/drivers/misc/mediatek/flashlight/src/mt6580/
    {项目名}/constant_flashlight/sub_strobe.c

    #define GPIO_OUT_ZERO 0 
    #define GPIO_OUT_ONE 1
    
    static int sub_strobe_ioctl(unsigned int cmd, unsigned long arg)
    {
       //省略...部分代码
      switch (cmd)
      {
            case FLASH_IOC_SET_ONOFF :
            PK_DBG("FLASHLIGHT_ONOFF: %ld\n",arg);
            if (arg==1)
            {
                if (g_timeOutTimeMs!=0)
                {
                    ktime_t ktime;
                    ktime = ktime_set( 0, g_timeOutTimeMs*1000000 );
                    hrtimer_start( &g_timeOutTimer, ktime, HRTIMER_MODE_REL );
                }
                FL_Sub_Enable();
            }
            else
            {
                FL_Sub_Disable();
                hrtimer_cancel( &g_timeOutTimer );
            }
            break;
            default :
            PK_DBG(" No such command \n");
            i4RetValue = -EPERM;
            break
      }
    }
    

    源码中会去调用FL_Sub_Enable()去使能en脚,FL_Sub_Disable()关闭en脚,因此我们就可以在FL_Sub_Enable去设置脉冲
    (通过先拉高在拉低EN脚即可)

    static void sflash_set_gpio_output(unsigned int GPIO, unsigned int output)
    {
        gpio_direction_output(GPIO, output);
        gpio_set_value(GPIO, output);
    }
    /*
    参数n:代表形成的上升沿数,也就相当于规格书的N
    n越大,形成的上升沿越多,电流越低,闪光灯越暗
    电流=200mA-12.5*n
    反之亦然
    */
    set_fl_level(int n)
    {
        int i;
        for(i=0;i<n;i++)
        {
            //先拉高EN脚 形成上升沿
            sflash_set_gpio_output(GPIO_SUB_ENF,GPIO_OUT_ONE);
            udelay(5);//延迟5微秒
            //在拉低EN脚
            sflash_set_gpio_output(GPIO_SUB_ENF,GPIO_OUT_ZERO);
            udelay(5);//延迟5微秒
        }
        mdelay(500);//闪光灯亮的时间
        //最后拉低EN脚 
        sflash_set_gpio_output(GPIO_SUB_ENF,GPIO_OUT_ZERO);
    }
    int FL_Sub_Enable(void)
    {
        if (g_duty==0)
        {
           //改变n就可以改变亮度
            set_fl_level(5); //形成5个上升沿,电流=200mA-12.5*5
            PK_DBG(" FL_Enable line=%d\n",__LINE__);
        }
        else
        {
            set_fl_level(5);//形成5个上升沿,电流=200mA-12.5*5
            PK_DBG(" FL_Enable line=%d\n",__LINE__);
        }
    
        return 0;
    }
    

    这里写了一个 set_fl_level()方法,去设置闪光灯亮度
    在FL_Sub_Enable()相应的位置去调用该方法即可
    注意拉高拉低时间范围(0.5um,10um),我这里设置成5um
    n越大,电流越小,闪光灯越暗,反之亦然
    如果要设置成3个等级
    分别设置
    n=5,n=10,n=15三个亮度
    或者
    n=1,n=8,n=13也可以


    图3

    其实就是根据图3来写的代码。

    Stay hungry,Stay foolish!
    荆轲刺秦王

    相关文章

      网友评论

          本文标题:修改闪光灯亮度(芯片AW36402)

          本文链接:https://www.haomeiwen.com/subject/zoqrvftx.html