一、綜述
天蒼蒼猜丹,野茫茫翘悉,風吹草低見牛羊,以前總會想一個問題:
人活著有什么意義嗎居触?
最近才明白妖混,其實是沒什么意義的老赤。
好吧,做傳音項目制市,提了個需求抬旺,
閃光燈設(shè)置3種不同的亮度
一開始也是蒙蔽的,不知道怎么去設(shè)置亮度祥楣,后來看了規(guī)格書以及和硬件工程師溝通开财,才弄懂了。
一误褪、硬件原理圖
前閃光燈用的芯片是AW36402责鳍,只要拉高這個CAM_FLASH_EN_GPIO腳就可以讓閃光燈正常工作了。
二兽间、規(guī)格書
1.電流限制
閃光燈最大電流限制為200mA
2.亮度設(shè)置
得出以下信息
0.5us<EN腳拉高時間<10us
1.0.5us<EN腳拉低時間<10us
隨著不斷增加的EN脈沖上升邊緣數(shù)历葛,LED電流逐漸下降。
(拉高EN腳再拉低EN腳就會形成一個脈沖)
在當前的設(shè)置過程中嘀略,EN引腳應(yīng)設(shè)置高電平恤溶。
LED電流可計算如下:
ILED=12.5*N(N<=16)
也就是說脈沖(或者說方波)越多,電流越低帜羊,
閃光燈的亮度跟電流有關(guān)
電流越大咒程,閃光燈越亮,反之越暗
三.代碼實現(xiàn)
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
}
}
源碼中會去調(diào)用FL_Sub_Enable()去使能en腳讼育,F(xiàn)L_Sub_Disable()關(guān)閉en腳帐姻,因此我們就可以在FL_Sub_Enable去設(shè)置脈沖
(通過先拉高在拉低EN腳即可)
static void sflash_set_gpio_output(unsigned int GPIO, unsigned int output)
{
gpio_direction_output(GPIO, output);
gpio_set_value(GPIO, output);
}
/*
參數(shù)n:代表形成的上升沿數(shù),也就相當于規(guī)格書的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()方法,去設(shè)置閃光燈亮度
在FL_Sub_Enable()相應(yīng)的位置去調(diào)用該方法即可
注意拉高拉低時間范圍(0.5um,10um)词裤,我這里設(shè)置成5um
n越大刺洒,電流越小,閃光燈越暗吼砂,反之亦然
如果要設(shè)置成3個等級
分別設(shè)置
n=5逆航,n=10,n=15三個亮度
或者
n=1渔肩,n=8因俐,n=13也可以
其實就是根據(jù)圖3來寫的代碼。
Stay hungry,Stay foolish!
荊軻刺秦王