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;