一、综述
天苍苍,野茫茫,风吹草低见牛羊,以前总会想一个问题:
人活着有什么意义吗?
最近才明白,其实是没什么意义的。
好吧,做传音项目,提了个需求,
闪光灯设置3种不同的亮度
一开始也是蒙蔽的,不知道怎么去设置亮度,后来看了规格书以及和硬件工程师沟通,才弄懂了。
一、硬件原理图
前闪光灯用的芯片是AW36402,只要拉高这个CAM_FLASH_EN_GPIO脚就可以让闪光灯正常工作了。
二、规格书
1.电流限制
闪光灯最大电流限制为200mA
2.亮度设置
得出以下信息
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来写的代码。
Stay hungry,Stay foolish!
荆轲刺秦王