am335x LCD背光问题

/****************************************************************
 *              am335x backlight problem
 *
 * 本问记录am335x背光问题的解决过程。
 *
 *                          Tony Liu, 2016-4-21, Shenzhen
 ***************************************************************/

1.现象
    在app中,根据QSlider的变化,调节背光的亮度。变化范围10-100。
    当QSlider调节到最低时,背光变量。

2.问题分析
2.1 查看QSlider的变化,此时的值其实是0,而不是label显示的10。
    在串口中输入:
       echo 100 > /sys/class/backlight/pwm-backlight/brightness 
       echo 50 > /sys/class/backlight/pwm-backlight/brightness 
    发现背光的亮度随着输入的值减小,逐渐变暗。
    输入0,却发现背光变亮。
       echo 0 > /sys/class/backlight/pwm-backlight/brightness 
    进一步确定当出入参数为0时有问题。

2.2 驱动代码如下,目前只跟到这里,有时间再跟。
    //每次设置pwm都会调用下面的函数                                              
    kernel/driver/video/backlight/pwm_bl.c                                                          
static int pwm_backlight_update_status(struct backlight_device *bl)  
{                                                                                                   
    struct pwm_bl_data *pb = dev_get_drvdata(&bl->dev);                                             
    int brightness = bl->props.brightness;                                                          
    int max = bl->props.max_brightness;                                                             
                                                                                                    
    if (bl->props.power != FB_BLANK_UNBLANK)                                                        
        brightness = 0;                                                                             
                                                                                                    
    if (bl->props.fb_blank != FB_BLANK_UNBLANK)                                                     
        brightness = 0;                                                                             
                                                                          
    if (pb->notify)                                                                                
        brightness = pb->notify(pb->dev, brightness);                                              
                                                                                                   
    if (brightness == 0) {              //当传入的参数为0时调用,问题就出在这里                                                     
        pwm_set_duty_ns(pb->pwm, 0);                                   
        pwm_stop(pb->pwm);                                                                          
    } else {                            //传入参数是1-100时,调用                                     
        brightness = pb->lth_brightness +                                                           
            (brightness * (pb->period - pb->lth_brightness) / max);                                 
        pwm_set_period_ns(pb->pwm, pb->period);                                                     
        pwm_set_duty_ns(pb->pwm, brightness);                                                       
        pwm_start(pb->pwm);                                                                         
    }                                                                                               
                                                                                                    
    if (pb->notify_after)                                                                           
        pb->notify_after(pb->dev, brightness);                                                      
                                                                                                    
    return 0;                                                                                       
}                                                                                                   

3.解决方法:
  在QT中进行更改,设置slider的最大值和最小值,并更新到显示的label.
        ui->slider->setMaximum(100);
        ui->slider->setMinimum(10);
        //transform int to QString, base 10
        ui->label->setText(QString::number(ui->slider->minimum(), 10));
        ui->label_2->setText(QString::number(ui->slider->maximum(), 10));
  这样一来,就不会出现QSlider的值是0的情况,传给底层的参数也不会为0。

 

posted @ 2016-04-21 16:45  SuperTao1024  阅读(1241)  评论(0编辑  收藏  举报