Xiaoyang Yu (Max) wrote:
> Current Android code for backlight adjustment do not work properly for
> systems other than G1. This is mainly because:
>
> 1) The corresponding sysfs file changed. In "mydroid/hardware/
> libhardware/power/power.c", LCD_BACKLIGHT is hard coded to "/sys/class/
> leds/lcd-backlight/brightness". While it should be "/sys/class/
> backlight/eeepc/backlight/brightness" for Eee PC.
>
> 2) The backlight range is assumed to be from 0 - 255 as in "mydroid/
> packages/apps/Settings/src/com/android/settings/
> BrightnessPreference.java". While it should be from 0 - 7 for Eee PC.
>
> For 1), we can use a property to set the value for the LCD_BACKLIGHT,
> instead of hard code it.
> For 2), we can check sysfs file "max_brightness" to get the max
> backlight level

Interesting idea. You mean something like the attached? :)

Cheers,
Sean


--~--~---------~--~----~------------~-------~--~----~
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting
-~----------~----~----~----~------~----~------~--~---

diff --git a/power/power.c b/power/power.c
index 4c5ebd3..e078bb6 100644
--- a/power/power.c
+++ b/power/power.c
@@ -29,6 +29,9 @@
 
 #define LOG_TAG "power"
 #include <utils/Log.h>
+#include <cutils/properties.h>
+
+#define MAX_BRIGHTNESS 255
 
 #include "qemu.h"
 #ifdef QEMU_POWER
@@ -56,9 +59,13 @@ const char * const NEW_PATHS[] = {
 
 const char * const AUTO_OFF_TIMEOUT_DEV = "/sys/android_power/auto_off_timeout";
 
-const char * const LCD_BACKLIGHT = "/sys/class/leds/lcd-backlight/brightness";
-const char * const BUTTON_BACKLIGHT = "/sys/class/leds/button-backlight/brightness";
-const char * const KEYBOARD_BACKLIGHT = "/sys/class/leds/keyboard-backlight/brightness";
+const char * const LCD_BACKLIGHT = "/sys/class/leds/lcd-backlight";
+const char * const BUTTON_BACKLIGHT = "/sys/class/leds/button-backlight";
+const char * const KEYBOARD_BACKLIGHT = "/sys/class/leds/keyboard-backlight";
+
+char lcdBacklight[PROPERTY_VALUE_MAX];
+char buttonBacklight[PROPERTY_VALUE_MAX];
+char keyboardBacklight[PROPERTY_VALUE_MAX];
 
 //XXX static pthread_once_t g_initialized = THREAD_ONCE_INIT;
 static int g_initialized = 0;
@@ -76,6 +83,14 @@ static int64_t systemTime()
     return t.tv_sec*1000000000LL + t.tv_nsec;
 }
 
+static void
+get_backlight_properties(void)
+{
+    property_get ("backlight.lcd", lcdBacklight, LCD_BACKLIGHT);
+    property_get ("backlight.button", buttonBacklight, BUTTON_BACKLIGHT);
+    property_get ("backlight.keyboard", keyboardBacklight, KEYBOARD_BACKLIGHT);
+}
+
 static int
 open_file_descriptors(const char * const paths[])
 {
@@ -101,6 +116,7 @@ initialize_fds(void)
     //pthread_once(&g_initialized, open_file_descriptors);
     // XXX: not this:
     if (g_initialized == 0) {
+        get_backlight_properties();
         if(open_file_descriptors(NEW_PATHS) < 0) {
             open_file_descriptors(OLD_PATHS);
             on_state = "wake";
@@ -166,11 +182,37 @@ static void
 set_a_light(const char* path, int value)
 {
     int fd;
+    int max = MAX_BRIGHTNESS;
+    char filename[PROPERTY_VALUE_MAX];
     static int already_warned = 0;
 
     // LOGI("set_a_light(%s, %d)\n", path, value);
 
-    fd = open(path, O_RDWR);
+    /* We don't have this device, so skip it
+     */
+    if (strlen(path) == 0)
+        return;
+
+    strcpy (filename, path);
+    strncat (filename, "/max_brightness", PROPERTY_VALUE_MAX);
+
+    fd = open(path, O_RDONLY);
+    if (fd) {
+        char    buffer[20];
+        if (read(fd, buffer, sizeof(buffer)) > 0)
+            max = atol(buffer);
+        close(fd);
+    }
+
+    /* Normalize to what the device can handle
+     * instead of between 0..255.
+     */
+    value = value * max / MAX_BRIGHTNESS;
+
+    strcpy (filename, path);
+    strncat (filename, "/brightness", PROPERTY_VALUE_MAX);
+
+    fd = open(filename, O_RDWR);
     if (fd >= 0) {
         char    buffer[20];
         int bytes = sprintf(buffer, "%d\n", value);
@@ -195,15 +237,15 @@ set_light_brightness(unsigned int mask, unsigned int brightness)
 //            mask, brightness, systemTime(), strerror(g_error));
 
     if (mask & KEYBOARD_LIGHT) {
-        set_a_light(KEYBOARD_BACKLIGHT, brightness);
+        set_a_light(keyboardBacklight, brightness);
     }
 
     if (mask & SCREEN_LIGHT) {
-        set_a_light(LCD_BACKLIGHT, brightness);
+        set_a_light(lcdBacklight, brightness);
     }
 
     if (mask & BUTTON_LIGHT) {
-        set_a_light(BUTTON_BACKLIGHT, brightness);
+        set_a_light(buttonBacklight, brightness);
     }
 
     return 0;

Reply via email to