目前我们调过的一线脉冲的背光方式均是16个亮度等级的,所以以此为例。
先解释一下,一线脉冲的背光调节方式简单的讲就是,来一个脉冲,亮度发生一次变化。
当第一个脉冲发生后,此时会有最大电流,也就是背光亮度的最大等级;此后,每来一个脉冲,亮度就降一级,这个过程是循环出现的,解释见下图:
正是因为这个过程是可循环的,所以计算当前亮度调节需要的脉冲个数时,还要考虑当前所在的亮度等级,
具体代码如下:
static void mdss_dsi_panel_bklt_pulse(struct mdss_dsi_ctrl_pdata *ctrl, int level)
{
int int_level;
int pulse_num_need;
int pulse_num_actrul;
int i;
/*计算需要配置的亮度等级按16级算的话,应该是等级几*/
int_level = level * 16;
int_level /= ctrl->bklt_max;
int_level += 1;
if (int_level >= 16)
int_level = 16;
if(level == 0){
if (gpio_is_valid(ctrl->bl_gpio)){
gpio_set_value((ctrl->bl_gpio), 0);
mdelay(2.5);//msleep(2.5);
}
ctrl->bl_old_pulse_num = 0;
return;
}
/*计算需要的相对脉冲个数,亮度等级越高,需要的脉冲数越少*/
pulse_num_need = 16 - int_level;
/*需要的相对脉冲和当期脉冲数一样时,无需调节,直接退出*/
if((pulse_num_need + 1) == ctrl->bl_old_pulse_num)
return;
/*计算绝对脉冲个数,需要的相对脉冲大于当前脉冲数时,发送需要脉冲个数的差值*/
if((pulse_num_need + 1 ) > ctrl->bl_old_pulse_num){
pulse_num_actrul = pulse_num_need + 1 - ctrl->bl_old_pulse_num - 1;
}else{ /*否则把当前周期需要的脉冲补满,再发送需要的相对脉冲个数*/
pulse_num_actrul = 16 - ctrl->bl_old_pulse_num + pulse_num_need;
}
ctrl->bl_old_pulse_num = pulse_num_need + 1;
gpio_set_value((ctrl->bl_gpio), 0);
udelay(0.5);//usleep(0.5);
/*发送需要的绝对脉冲个数,注意当前计算少一个脉冲,最后发*/
for(i = 0; i < pulse_num_actrul; i++){
if (gpio_is_valid(ctrl->bl_gpio)){
gpio_set_value((ctrl->bl_gpio), 1);
udelay(0.5);//usleep(0.5);
gpio_set_value((ctrl->bl_gpio), 0);
udelay(0.5);//usleep(0.5);
}
}
/*计算差值问题,最后一个脉冲需要的延时更长,单独拿出来*/
if (gpio_is_valid(ctrl->bl_gpio)){
gpio_set_value((ctrl->bl_gpio), 1);
mdelay(2);//msleep(2);
}
}