当前位置: 代码迷 >> 综合 >> Android模拟器学framework和driver之battery backlight-----6. backlight in hal
  详细解决方案

Android模拟器学framework和driver之battery backlight-----6. backlight in hal

热度:75   发布时间:2024-01-10 08:06:02.0

这里我们来介绍下backlight hal层,和之前一样,跟之前我们介绍的temperature的hal差不多,比sensor的hal还简单,这里我就不多说hal的介绍了,之前都有介绍的比较详细了,不清楚的可以参考前面的文章:

http://blog.csdn.net/zhangjie201412/article/details/7225617

首先要明确我们的目标,这里主要是封装一些方法,然后给android framework层使用(jni layer),打开一个sysfs中的节点,然后read/write,

明白这点就够了,直接贴代码:

/hardware/libhardware/module/lights/android_light.c

[cpp] view plain copy print ?
  1. #define LOG_TAG "light"   
  2.   
  3. #include <hardware/lights.h>   
  4. #include <fcntl.h>   
  5. #include <errno.h>   
  6. #include <stdlib.h>   
  7. #include <cutils/log.h>   
  8. #include <cutils/atomic.h>   
  9. #include <cutils/properties.h>   
  10.   
  11.   
  12.   
  13. #define MAX_BRIGHTNESS  255   
  14. #define DEF_BACKLIGHT_DEV   "android-backlight"   
  15. #define DEF_BACKLIGHT_PATH  "/sys/class/backlight/"   
  16.   
  17. /***************************************************************/  
  18. struct lights_module_t{  
  19.     struct hw_module_t common;  
  20. };  
  21.   
  22. static int lights_device_open(const struct hw_module_t* module,  
  23.         const char* name,struct hw_device_t** device);  
  24.   
  25. static struct hw_module_methods_t lights_module_methods = {  
  26.     .open=lights_device_open  
  27. };  
  28.   
  29. const struct lights_module_t HAL_MODULE_INFO_SYM = {  
  30.     .common= {  
  31.         .tag= HARDWARE_MODULE_TAG,  
  32.         .version_major= 1,  
  33.         .version_minor= 0,  
  34.         .id= LIGHTS_HARDWARE_MODULE_ID,  
  35.         .name= "Lights module",  
  36.         .author= "Freescale Semiconductor",  
  37.         .methods= &lights_module_methods,  
  38.     }  
  39. };  
  40.   
  41. static char max_path[256], path[256];  
  42. // ****************************************************************************   
  43. // module   
  44. // ****************************************************************************   
  45. static int set_light_backlight(struct light_device_t* dev,  
  46.                                struct light_state_t const* state)  
  47. {  
  48.     int result = -1;  
  49.     unsigned int color = state->color;  
  50.     unsigned int brightness = 0, max_brightness = 0;  
  51.     FILE *file;  
  52.   
  53.     brightness = ((77*((color>>16)&0x00ff)) + (150*((color>>8)&0x00ff)) +  
  54.                  (29*(color&0x00ff))) >> 8;  
  55.     LOGV("set_light, get brightness=%d", brightness);  
  56.   
  57.     file = fopen(max_path, "r");  
  58.     if (!file) {  
  59.         LOGE("can not open file %s\n", max_path);  
  60.     return result;  
  61.     }  
  62.     fread(&max_brightness, 1, 3, file);  
  63.     fclose(file);  
  64.   
  65.     max_brightness = atoi((char *) &max_brightness);  
  66.     brightness = brightness * max_brightness / MAX_BRIGHTNESS;  
  67.     LOGV("set_light, max_brightness=%d, target brightness=%d",  
  68.         max_brightness, brightness);  
  69.   
  70.     file = fopen(path, "w");  
  71.     if (!file) {  
  72.         LOGE("can not open file %s\n", path);  
  73.         return result;  
  74.     }  
  75.     fprintf(file, "%d", brightness);  
  76.     fclose(file);  
  77.   
  78.     result = 0;  
  79.     return result;  
  80. }  
  81.   
  82. static int light_close_backlight(struct hw_device_t *dev)  
  83. {  
  84.     struct light_device_t *device = (struct light_device_t*)dev;  
  85.     if (device)  
  86.         free(device);  
  87.     return 0;  
  88. }  
  89.   
  90. /*****************************************************************************/  
  91. static int lights_device_open(const struct hw_module_t* module,  
  92.                               const char* name, struct hw_device_t** device)  
  93. {  
  94.     int status = -EINVAL;  
  95.     LOGV("lights_device_open\n");  
  96.     if (!strcmp(name, LIGHT_ID_BACKLIGHT)) {  
  97.         struct light_device_t *dev;  
  98.         char value[PROPERTY_VALUE_MAX];  
  99.   
  100.         dev = malloc(sizeof(*dev));  
  101.   
  102.         /* initialize our state here */  
  103.         memset(dev, 0, sizeof(*dev));  
  104.   
  105.         /* initialize the procs */  
  106.         dev->common.tag = HARDWARE_DEVICE_TAG;  
  107.         dev->common.version = 0;  
  108.         dev->common.module = (struct hw_module_t*) module;  
  109.         dev->common.close = light_close_backlight;  
  110.   
  111.         dev->set_light = set_light_backlight;  
  112.   
  113.     *device = &dev->common;  
  114.   
  115. //        property_get("hw.backlight.dev", value, DEF_BACKLIGHT_DEV);   
  116. //        strcpy(path, DEF_BACKLIGHT_PATH);   
  117. //        strcat(path, value);   
  118. //        strcpy(max_path, path);   
  119. //        strcat(max_path, "/max_brightness");   
  120. //        strcat(path, "/brightness");   
  121.     strcpy(path, "/sys/devices/platform/android-backlight.0/backlight/android-backlight.0/brightness");  
  122.     strcpy(max_path, "/sys/devices/platform/android-backlight.0/backlight/android-backlight.0/max_brightness");  
  123.     LOGI("max backlight file is %s\n", max_path);  
  124.         LOGI("backlight brightness file is %s\n", path);  
  125.   
  126.         status = 0;  
  127.     }  
  128.   
  129.     /* todo other lights device init */  
  130.     return status;  
  131. }  

接下来是android.mk

[cpp] view plain copy print ?
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. # HAL module implemenation, not prelinked and stored in hw/   
  4. include $(CLEAR_VARS)  
  5. LOCAL_MODULE_TAGS := optional  
  6. LOCAL_PRELINK_MODULE := false  
  7. LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw  
  8. LOCAL_SHARED_LIBRARIES := liblog libcutils  
  9. LOCAL_SRC_FILES := android_light.c  
  10. LOCAL_MODULE := lights.default  
  11. #LOCAL_MODULE_TAGS := eng   
  12. include $(BUILD_SHARED_LIBRARY)  

这里我要声明的是,在读写之前先把文件的权限打开,在init.rc中去做

[cpp] view plain copy print ?
  1. #add by Jay   
  2.     chmod 777 /sys/bus/iio/devices/device0/lux  
  3.     chmod 777 /sys/bus/iio/devices/device1/value  
  4.     chmod 777 /sys/bus/iio/devices/device1/active  
  5.     chmod 777 /sys/class/backlight/android-backlight.0/brightness  
  6.     chmod 777 /sys/class/backlight/android-backlight.0/max_brightness  

好了,hal层我们就添加到这边,我们来重新编译,然后打开我们的模拟器,

打开setting中的display,然后调节屏幕亮度,然后再cat brightness会发现节点中的值改变了


把亮度调到最高,值变成了255.

结束!!!!下面会分析android framework中jni去实现lightService。


  相关解决方案