From 3f77b7bb06f914d402004b824d07f7bbb81cfdc3 Mon Sep 17 00:00:00 2001 From: xxx Date: Tue, 29 Jan 2013 17:37:12 +0800 Subject: [PATCH] add max limit and brightness updata mode in rk29 bl --- arch/arm/mach-rk30/board-rk3168-tb.c | 3 + arch/arm/plat-rk/include/plat/board.h | 2 + drivers/video/backlight/rk29_backlight.c | 99 ++++++++++++++++++++---- 3 files changed, 90 insertions(+), 14 deletions(-) diff --git a/arch/arm/mach-rk30/board-rk3168-tb.c b/arch/arm/mach-rk30/board-rk3168-tb.c index 396b1e4037eb..42c7046cc415 100755 --- a/arch/arm/mach-rk30/board-rk3168-tb.c +++ b/arch/arm/mach-rk30/board-rk3168-tb.c @@ -196,6 +196,9 @@ static int rk29_backlight_pwm_resume(void) static struct rk29_bl_info rk29_bl_info = { .pwm_id = PWM_ID, + .min_brightness=20, + .max_brightness=255, + .brightness_mode =1, .bl_ref = PWM_EFFECT_VALUE, .io_init = rk29_backlight_io_init, .io_deinit = rk29_backlight_io_deinit, diff --git a/arch/arm/plat-rk/include/plat/board.h b/arch/arm/plat-rk/include/plat/board.h index 31abdb4a7679..520ff55ef807 100755 --- a/arch/arm/plat-rk/include/plat/board.h +++ b/arch/arm/plat-rk/include/plat/board.h @@ -64,6 +64,8 @@ struct rk29_bl_info { int (*pwm_suspend)(void); int (*pwm_resume)(void); int min_brightness; /* 0 ~ 255 */ + int max_brightness; /* 0 ~ 255 */ + int brightness_mode; unsigned int delay_ms; /* in milliseconds */ int pre_div; }; diff --git a/drivers/video/backlight/rk29_backlight.c b/drivers/video/backlight/rk29_backlight.c index 9a8fedf254d1..67cecf3dba44 100755 --- a/drivers/video/backlight/rk29_backlight.c +++ b/drivers/video/backlight/rk29_backlight.c @@ -30,7 +30,8 @@ #define PWM_DIV PWM_DIV2 #define PWM_APB_PRE_DIV 1000 -#define BL_STEP 255 +#define BL_STEP (255) +#define MAX_BRIGHTNESS_CORRECT (50) /* * Debug @@ -84,6 +85,64 @@ static DEVICE_ATTR(rk29backlight, 0660, backlight_read, backlight_write); static DEFINE_MUTEX(backlight_mutex); +static inline void rk29_bl_min_brightness_check(struct rk29_bl_info *rk29_bl_info) +{ + + if (rk29_bl_info->min_brightness < 0 || rk29_bl_info->min_brightness > BL_STEP) + rk29_bl_info->min_brightness = MAX_BRIGHTNESS_CORRECT; + + +} +static inline void rk29_bl_max_brightness_check(struct rk29_bl_info *rk29_bl_info) +{ + if (rk29_bl_info->max_brightness <= 0 || rk29_bl_info->max_brightness > BL_STEP) + rk29_bl_info->max_brightness = BL_STEP; +} + + + +int rk29_bl_val_scalor_line(struct rk29_bl_info *rk29_bl_info,int brightness) +{ + //rk29_bl_min_brightness_check(rk29_bl_info); + //rk29_bl_max_brightness_check(rk29_bl_info); + if(rk29_bl_info->max_brightnessmin_brightness) + rk29_bl_info->max_brightness=rk29_bl_info->min_brightness; + + if(brightness>rk29_bl_info->max_brightness) + brightness=rk29_bl_info->max_brightness; + else if(brightnessmin_brightness) + brightness=rk29_bl_info->min_brightness; + #if 0 + brightness = brightness*(rk29_bl_info->max_brightness - rk29_bl_info->min_brightness); + brightness = (brightness/255) + rk29_bl_info->min_brightness; + #endif + return brightness; +} +int rk29_bl_val_scalor_conic(struct rk29_bl_info *rk29_bl_info,int brightness) +{ + + //rk29_bl_min_brightness_check(rk29_bl_info); + //rk29_bl_max_brightness_check(rk29_bl_info); + + if(rk29_bl_info->max_brightnessmin_brightness) + rk29_bl_info->max_brightness=rk29_bl_info->min_brightness; + #if 0 + brightness = (brightness*brightness)*(rk29_bl_info->max_brightness - rk29_bl_info->min_brightness); + brightness = (brightness/(BL_STEP*BL_STEP)) + rk29_bl_info->min_brightness; + #else + if(brightnessmin_brightness) + brightness=rk29_bl_info->min_brightness; + brightness = (brightness-rk29_bl_info->min_brightness)*(brightness-rk29_bl_info->min_brightness); + brightness = (brightness/(rk29_bl_info->max_brightness - rk29_bl_info->min_brightness)) + rk29_bl_info->min_brightness; + #endif + + if(brightness > rk29_bl_info->max_brightness) + brightness = rk29_bl_info->max_brightness; + if(brightness < rk29_bl_info->min_brightness) + brightness = rk29_bl_info->min_brightness; + + return brightness; +} static int rk29_bl_update_status(struct backlight_device *bl) { u32 divh,div_total; @@ -93,19 +152,18 @@ static int rk29_bl_update_status(struct backlight_device *bl) int brightness = 0; mutex_lock(&backlight_mutex); -//BL_CORE_DRIVER2 is the flag if backlight is into early_suspend. + //BL_CORE_DRIVER2 is the flag if backlight is into early_suspend. if (suspend_flag && (bl->props.state & BL_CORE_DRIVER2)) goto out; brightness = bl->props.brightness; - if(rk29_bl_info->min_brightness){ - if(brightness){ - brightness = brightness*(256 - rk29_bl_info->min_brightness); - brightness = (brightness>>8) + rk29_bl_info->min_brightness; - } - if(brightness > 255) - brightness = 255; - } + + + if(!rk29_bl_info->brightness_mode) + brightness=rk29_bl_val_scalor_line(rk29_bl_info,brightness); + else + brightness=rk29_bl_val_scalor_conic(rk29_bl_info,brightness); + //printk("%s,req brightness=%d,real is=%d\n",__FUNCTION__,bl->props.brightness,brightness); if (bl->props.power != FB_BLANK_UNBLANK) brightness = 0; @@ -260,10 +318,23 @@ static int rk29_backlight_probe(struct platform_device *pdev) if (!rk29_bl_info->delay_ms) rk29_bl_info->delay_ms = 100; - - if (rk29_bl_info->min_brightness < 0 || rk29_bl_info->min_brightness > BL_STEP) - rk29_bl_info->min_brightness = 52; - + + rk29_bl_min_brightness_check(rk29_bl_info); + rk29_bl_max_brightness_check(rk29_bl_info); + #if 0 + { + int temp,temp_val; + rk29_bl_info->max_brightness=180; + rk29_bl_info->min_brightness=20; + for(temp=0;temp<=255;temp++) + { + temp_val=rk29_bl_val_scalor_conic(rk29_bl_info,temp); + //if(temp_val<=rk29_bl_info->max_brightness) + printk("conic req %d,get %d\n",temp,temp_val); + } + } + #endif + if (rk29_bl_info && rk29_bl_info->io_init) { rk29_bl_info->io_init(); } -- 2.34.1