zoukankan      html  css  js  c++  java
  • 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节

    周六的中午还是依旧来了公司,本来也没有打算来的,既然来了,那就把上次遗留下来的一些问题给解决吧,把android下的pwmlcd背光给总结下吧。关于android的背光,是用pwm波来控制的,通过占空比的不同,得到不同的电压值,从而点亮的lcd的亮度就不同了。具体的也就是控制了电压值而已。

               要在android上层搞定背光的调节,那么必须准备底层驱动了,首先就是那个backlight了,这个linux驱动的模型已经做好了,只要选上就ok了。

          Device下的graphics support

     

    选上那个backlight就好了

     

            还有要准备相应平台的pwm的驱动,准备好这些后,就ok了。然后跑一下就会生成一个节点:

    [html] view plain copy
    1. /sys/class/backlight/pwm-backlight/brightness  


    只要

    [html] view plain copy
    1. echo 100 >  /sys/class/backlight/pwm-backlight/brightness  
    2.   
    3.     echo 50 >  /sys/class/backlight/pwm-backlight/brightness  


            如果背光改变了,那么就说明驱动OK了,也可以用示波器看pwm引脚,是否有变换。

            如果不成功,那么就继续调试底层驱动吧。接着就是要上android了。

           对于背光,android代码中主要是:

    [html] view plain copy
    1. Frameworks/base/services/jni/com_android_server_LightsService.cpp  
    2.   
    3. Frameworks/base/services/java/com/android/server/LightsServer.java  


            这里就不用太去关注了,移植到android主要就是硬件抽象层的事情了,java层会调用jni层,jni层会调到相应的硬件抽象层,硬件抽象层再继续调用底层驱动。好了,还是看看lcd背光的硬件抽象层吧。

    对于不同平台那个lights.c是放在不同地方的,比如你的是samsungtuna平台,那么就  

            在/device/Samsung/tuna/liblights/lights.c下。

    [html] view plain copy
    1. #define LOG_TAG "lights"  
    2. #include <cutils/log.h>  
    3. #include <stdint.h>  
    4. #include <string.h>  
    5. #include <errno.h>  
    6. #include <fcntl.h>  
    7. #include <pthread.h>  
    8. #include <sys/ioctl.h>  
    9. #include <sys/types.h>  
    10. #include <hardware/lights.h>  
    11. #include <linux/leds-an30259a.h>  
    12.   
    13. static pthread_once_t g_init = PTHREAD_ONCE_INIT;  
    14. static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;  
    15.   
    16. char const *const LCD_FILE = "/sys/class/backlight/s6e8aa0/brightness";  
    17.   
    18. char const *const LED_FILE = "/dev/an30259a_leds";  
    19.   
    20. #define IMAX 0 // 12.75mA power consumption  
    21.   
    22. // Slope values, based on total blink of 1000ms  
    23.   
    24. #define SLOPE_UP_1          450  
    25.   
    26. #define SLOPE_UP_2          (500-SLOPE_UP_1)  
    27.   
    28. #define SLOPE_DOWN_1    SLOPE_UP_2  
    29.   
    30. #define SLOPE_DOWN_2    SLOPE_UP_1  
    31.   
    32. // brightness at mid-slope, on 0 - 127 scale  
    33.   
    34. #define MID_BRIGHTNESS  31  
    35.   
    36. void init_g_lock(void)  
    37. {  
    38.        pthread_mutex_init(&g_lock, NULL);  
    39. }  
    40.   
    41. static int write_int(char const *path, int value)  
    42. {  
    43.        int fd;  
    44.        static int already_warned;  
    45.    
    46.        already_warned = 0;  
    47.   
    48.        LOGV("write_int: path %s, value %d", path, value);  
    49.   
    50.        fd = open(path, O_RDWR);  
    51.        if (fd >= 0) {  
    52.               char buffer[20];  
    53.               int bytes = sprintf(buffer, "%d ", value);  
    54.               int amt = write(fd, buffer, bytes);  
    55.               close(fd);  
    56.               return amt == -1 ? -errno : 0;  
    57.        } else {  
    58.               if (already_warned == 0) {  
    59.                      LOGE("write_int failed to open %s ", path);  
    60.                      already_warned = 1;  
    61.               }  
    62.               return -errno;  
    63.        }  
    64. }  
    65.   
    66.    
    67. static int rgb_to_brightness(struct light_state_t const *state)  
    68. {  
    69.        int color = state->color & 0x00ffffff;  
    70.   
    71.        return ((77*((color>>16) & 0x00ff))  
    72.   
    73.               + (150*((color>>8) & 0x00ff)) + (29*(color & 0x00ff))) >> 8;  
    74. }  
    75.    
    76. static int set_light_backlight(struct light_device_t *dev,  
    77.                      struct light_state_t const *state)  
    78. {  
    79.        int err = 0;  
    80.        int brightness = rgb_to_brightness(state);  
    81.    
    82.        pthread_mutex_lock(&g_lock);  
    83.        err = write_int(LCD_FILE, brightness);  
    84.        pthread_mutex_unlock(&g_lock);  
    85.   
    86.        return err;  
    87. }  
    88.    
    89. static int close_lights(struct light_device_t *dev)  
    90. {  
    91.        LOGV("close_light is called");  
    92.        if (dev)  
    93.               free(dev);  
    94.    
    95.        return 0;  
    96. }  
    97.   
    98.   
    99. /* LEDs */  
    100. static int write_leds(struct an30259a_pr_control *led)  
    101. {  
    102.        int err = 0;  
    103.        int imax = IMAX;  
    104.        int fd;  
    105.    
    106.        pthread_mutex_lock(&g_lock);  
    107.    
    108.        fd = open(LED_FILE, O_RDWR);  
    109.        if (fd >= 0) {  
    110.               err = ioctl(fd, AN30259A_PR_SET_IMAX, &imax);  
    111.               if (err)  
    112.                      LOGE("failed to set imax");  
    113.               err = ioctl(fd, AN30259A_PR_SET_LED, led);  
    114.               if (err < 0)  
    115.                      LOGE("failed to set leds!");  
    116.               close(fd);  
    117.        } else {  
    118.               LOGE("failed to open %s!", LED_FILE);  
    119.               err =  -errno;  
    120.        }  
    121.        pthread_mutex_unlock(&g_lock);  
    122.    
    123.        return err;  
    124. }  
    125.   
    126. static int set_light_leds(struct light_state_t const *state, int type)  
    127. {  
    128.        struct an30259a_pr_control led;  
    129.    
    130.        memset(&led, 0, sizeof(led));  
    131.   
    132.        switch (state->flashMode) {  
    133.        case LIGHT_FLASH_NONE:  
    134.               led.state = LED_LIGHT_OFF;  
    135.               break;  
    136.        case LIGHT_FLASH_TIMED:  
    137.        case LIGHT_FLASH_HARDWARE:  
    138.               led.state = LED_LIGHT_SLOPE;  
    139.               led.color = state->color & 0x00ffffff;  
    140.               // tweak to eliminate purplish tint from white color  
    141.               if (led.color == 0x00ffffff)  
    142.                   led.color = 0x80ff80;  
    143.               // scale slope times based on flashOnMS  
    144.               led.time_slope_up_1 = (SLOPE_UP_1 * state->flashOnMS) / 1000;  
    145.               led.time_slope_up_2 = (SLOPE_UP_2 * state->flashOnMS) / 1000;  
    146.               led.time_slope_down_1 = (SLOPE_DOWN_1 * state->flashOnMS) / 1000;  
    147.               led.time_slope_down_2 = (SLOPE_DOWN_2 * state->flashOnMS) / 1000;  
    148.               led.mid_brightness = MID_BRIGHTNESS;  
    149.               led.time_off = state->flashOffMS;  
    150.               break;  
    151.        default:  
    152.               return -EINVAL;  
    153.        }   
    154.       return write_leds(&led);  
    155. }  
    156.   
    157. static int set_light_leds_notifications(struct light_device_t *dev,  
    158.                      struct light_state_t const *state)  
    159. {  
    160.        return set_light_leds(state, 0);  
    161. }  
    162.    
    163. static int set_light_leds_attention(struct light_device_t *dev,  
    164.                      struct light_state_t const *state)  
    165. {  
    166.        return set_light_leds(state, 1);  
    167. }  
    168.   
    169. static int open_lights(const struct hw_module_t *module, char const *name,  
    170.                                           struct hw_device_t **device)  
    171. {  
    172.        int (*set_light)(struct light_device_t *dev,  
    173.               struct light_state_t const *state);  
    174.        if (0 == strcmp(LIGHT_ID_BACKLIGHT, name))  
    175.               set_light = set_light_backlight;  
    176.        else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name))  
    177.               set_light = set_light_leds_notifications;  
    178.        else if (0 == strcmp(LIGHT_ID_ATTENTION, name))  
    179.               set_light = set_light_leds_attention;  
    180.        else  
    181.               return -EINVAL;  
    182.    
    183.        pthread_once(&g_init, init_g_lock);  
    184.    
    185.        struct light_device_t *dev = malloc(sizeof(struct light_device_t));  
    186.        memset(dev, 0, sizeof(*dev));  
    187.        dev->common.tag = HARDWARE_DEVICE_TAG;  
    188.        dev->common.version = 0;  
    189.        dev->common.module = (struct hw_module_t *)module;  
    190.        dev->common.close = (int (*)(struct hw_device_t *))close_lights;  
    191.        dev->set_light = set_light;  
    192.        *device = (struct hw_device_t *)dev;  
    193.        return 0;  
    194. }  
    195.   
    196. static struct hw_module_methods_t lights_module_methods = {  
    197.        .open =  open_lights,  
    198. };  
    199.   
    200. const struct hw_module_t HAL_MODULE_INFO_SYM = {  
    201.        .tag = HARDWARE_MODULE_TAG,  
    202.        .version_major = 1,  
    203.        .version_minor = 0,  
    204.        .id = LIGHTS_HARDWARE_MODULE_ID,  
    205.        .name = "lights Module",  
    206.        .author = "Google, Inc.",  
    207.        .methods = &lights_module_methods,  
    208. };  


            对于这个代码,主要是修改下

    [html] view plain copy
    1. char const *const LCD_FILE = "/sys/class/backlight/s6e8aa0/brightness";  


            背光其实就是打开这个节点,往里面写数据而已,所以,要把这个节点改为自己的平台的节点就可以了。

    这里我们改为

    [html] view plain copy
    1. char const *const LCD_FILE = "/sys/class/backlight/pwm-backlight/brightness";  

     

            至于

    [html] view plain copy
    1. char const *const LED_FILE = "/dev/an30259a_leds";  


             这个,应该就是提示灯的节点吧,不管他。然后再mm下,得到了一个lights.default.so,然后替换掉这个.so就好了。

             还有就是权限问题了,打开这个节点是要权限的,那么我们可以在init.xxx.rc中加上权限就好了。

    [html] view plain copy
    1. chown system system /sys/class/backlight/pwm-backlight/brightness  

     

            OK,这样,那么android那个调节屏幕亮度的UI界面就可以控制lcd的背光了。

  • 相关阅读:
    第一次作业
    习题3 作业
    人工智能原理及其运用习题3.8
    人工智能原理及其应用习题3.5
    人工智能第一次作业
    ASP.NET MVC 之CodeFirst 数据迁移
    实用小程序技巧
    通过Blogilo来写博客园的设置方法
    抢票应用总结
    微信开发--结对编程
  • 原文地址:https://www.cnblogs.com/muhuacat/p/8022838.html
Copyright © 2011-2022 走看看