diff options
Diffstat (limited to 'power')
-rw-r--r-- | power/Android.mk | 4 | ||||
-rw-r--r-- | power/power.c | 70 | ||||
-rw-r--r-- | power/power_qemu.c | 51 | ||||
-rw-r--r-- | power/power_qemu.h | 27 |
4 files changed, 134 insertions, 18 deletions
diff --git a/power/Android.mk b/power/Android.mk index fe671a5..a524d0e 100644 --- a/power/Android.mk +++ b/power/Android.mk @@ -2,3 +2,7 @@ LOCAL_SRC_FILES += power/power.c +ifeq ($(QEMU_HARDWARE),true) + LOCAL_SRC_FILES += power/power_qemu.c + LOCAL_CFLAGS += -DQEMU_POWER=1 +endif diff --git a/power/power.c b/power/power.c index 907726a..4c5ebd3 100644 --- a/power/power.c +++ b/power/power.c @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #include <hardware/power.h> #include <fcntl.h> #include <errno.h> @@ -15,21 +30,30 @@ #define LOG_TAG "power" #include <utils/Log.h> +#include "qemu.h" +#ifdef QEMU_POWER +#include "power_qemu.h" +#endif + enum { ACQUIRE_PARTIAL_WAKE_LOCK = 0, - ACQUIRE_FULL_WAKE_LOCK, RELEASE_WAKE_LOCK, REQUEST_STATE, OUR_FD_COUNT }; -const char * const PATHS[] = { +const char * const OLD_PATHS[] = { "/sys/android_power/acquire_partial_wake_lock", - "/sys/android_power/acquire_full_wake_lock", "/sys/android_power/release_wake_lock", "/sys/android_power/request_state" }; +const char * const NEW_PATHS[] = { + "/sys/power/wake_lock", + "/sys/power/wake_unlock", + "/sys/power/state" +}; + const char * const AUTO_OFF_TIMEOUT_DEV = "/sys/android_power/auto_off_timeout"; const char * const LCD_BACKLIGHT = "/sys/class/leds/lcd-backlight/brightness"; @@ -41,6 +65,8 @@ static int g_initialized = 0; static int g_fds[OUR_FD_COUNT]; static int g_error = 1; +static const char *off_state = "mem"; +static const char *on_state = "on"; static int64_t systemTime() { @@ -50,21 +76,22 @@ static int64_t systemTime() return t.tv_sec*1000000000LL + t.tv_nsec; } -static void -open_file_descriptors(void) +static int +open_file_descriptors(const char * const paths[]) { int i; for (i=0; i<OUR_FD_COUNT; i++) { - int fd = open(PATHS[i], O_RDWR); + int fd = open(paths[i], O_RDWR); if (fd < 0) { - fprintf(stderr, "fatal error opening \"%s\"\n", PATHS[i]); + fprintf(stderr, "fatal error opening \"%s\"\n", paths[i]); g_error = errno; - return; + return -1; } g_fds[i] = fd; } g_error = 0; + return 0; } static inline void @@ -74,7 +101,11 @@ initialize_fds(void) //pthread_once(&g_initialized, open_file_descriptors); // XXX: not this: if (g_initialized == 0) { - open_file_descriptors(); + if(open_file_descriptors(NEW_PATHS) < 0) { + open_file_descriptors(OLD_PATHS); + on_state = "wake"; + off_state = "standby"; + } g_initialized = 1; } } @@ -93,9 +124,6 @@ acquire_wake_lock(int lock, const char* id) if (lock == PARTIAL_WAKE_LOCK) { fd = g_fds[ACQUIRE_PARTIAL_WAKE_LOCK]; } - else if (lock == FULL_WAKE_LOCK) { - fd = g_fds[ACQUIRE_FULL_WAKE_LOCK]; - } else { return EINVAL; } @@ -138,23 +166,29 @@ static void set_a_light(const char* path, int value) { int fd; + static int already_warned = 0; // LOGI("set_a_light(%s, %d)\n", path, value); fd = open(path, O_RDWR); - if (fd) { + if (fd >= 0) { char buffer[20]; int bytes = sprintf(buffer, "%d\n", value); write(fd, buffer, bytes); close(fd); } else { - LOGE("set_a_light failed to open %s\n", path); + if (already_warned == 0) { + LOGE("set_a_light failed to open %s\n", path); + already_warned = 1; + } } } int set_light_brightness(unsigned int mask, unsigned int brightness) { + QEMU_FALLBACK(set_light_brightness(mask,brightness)); + initialize_fds(); // LOGI("set_light_brightness mask=0x%08x brightness=%d now=%lld g_error=%s\n", @@ -179,6 +213,8 @@ set_light_brightness(unsigned int mask, unsigned int brightness) int set_screen_state(int on) { + QEMU_FALLBACK(set_screen_state(on)); + //LOGI("*** set_screen_state %d", on); initialize_fds(); @@ -191,14 +227,12 @@ set_screen_state(int on) char buf[32]; int len; if(on) - len = sprintf(buf, "wake"); + len = sprintf(buf, on_state); else - len = sprintf(buf, "standby"); + len = sprintf(buf, off_state); len = write(g_fds[REQUEST_STATE], buf, len); if(len < 0) { LOGE("Failed setting last user activity: g_error=%d\n", g_error); } return 0; } - - diff --git a/power/power_qemu.c b/power/power_qemu.c new file mode 100644 index 0000000..75f52b2 --- /dev/null +++ b/power/power_qemu.c @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "qemu.h" +#include "power_qemu.h" +#include <fcntl.h> +#include <errno.h> +#include <hardware/power.h> + +static void +set_a_light(const char* name, unsigned brightness) +{ + qemu_control_command( "power:light:brightness:%s:%d", + name, brightness ); +} + +int +qemu_set_light_brightness(unsigned int mask, unsigned int brightness) +{ + if (mask & KEYBOARD_LIGHT) { + set_a_light("keyboard_backlight", brightness); + } + if (mask & SCREEN_LIGHT) { + set_a_light("lcd_backlight", brightness); + } + if (mask & BUTTON_LIGHT) { + set_a_light("button_backlight", brightness); + } + return 0; +} + + +int +qemu_set_screen_state(int on) +{ + qemu_control_command( "power:screen_state:%s", on ? "wake" : "standby" ); + return 0; +} + diff --git a/power/power_qemu.h b/power/power_qemu.h new file mode 100644 index 0000000..3004950 --- /dev/null +++ b/power/power_qemu.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef _power_qemu_h +#define _power_qemu_h + +#include <stdint.h> + +extern int +qemu_set_light_brightness(unsigned int mask, unsigned int brightness); + +extern int +qemu_set_screen_state(int on); + +#endif /* _power_qemu_h */ |