From fbc816ab7983e5783e8c8fe5abf66f9ec9906dbd Mon Sep 17 00:00:00 2001 From: BigMajster Date: Sun, 7 Dec 2014 15:53:43 +0100 Subject: [PATCH] Fix charger only mode Change-Id: Iaffc5cebc3261a2909bfa4a300d4bcc17bf4a019 --- BoardConfig.mk | 5 + charger/Android.mk | 54 ++ charger/charger.c | 1281 +++++++++++++++++++++++++++++ charger/images/battery_0.png | Bin 0 -> 13966 bytes charger/images/battery_1.png | Bin 0 -> 13955 bytes charger/images/battery_2.png | Bin 0 -> 13952 bytes charger/images/battery_3.png | Bin 0 -> 13942 bytes charger/images/battery_4.png | Bin 0 -> 13913 bytes charger/images/battery_5.png | Bin 0 -> 14225 bytes charger/images/battery_charge.png | Bin 0 -> 17042 bytes charger/images/battery_fail_0.png | Bin 0 -> 25986 bytes device_w7.mk | 5 + rootdir/init.w7.rc | 7 + 13 files changed, 1352 insertions(+) create mode 100644 charger/Android.mk create mode 100644 charger/charger.c create mode 100644 charger/images/battery_0.png create mode 100644 charger/images/battery_1.png create mode 100644 charger/images/battery_2.png create mode 100644 charger/images/battery_3.png create mode 100644 charger/images/battery_4.png create mode 100644 charger/images/battery_5.png create mode 100644 charger/images/battery_charge.png create mode 100755 charger/images/battery_fail_0.png diff --git a/BoardConfig.mk b/BoardConfig.mk index ef3347e..7927d81 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -54,6 +54,11 @@ BOARD_KERNEL_BASE := 0x00000000 BOARD_KERNEL_PAGESIZE := 2048 BOARD_MKBOOTIMG_ARGS := --ramdisk_offset 0x01000000 --tags_offset 0x00000100 +# Offmode Charging +COMMON_GLOBAL_CFLAGS += \ + -DBOARD_CHARGING_CMDLINE_NAME='"androidboot.mode"' \ + -DBOARD_CHARGING_CMDLINE_VALUE='"chargerlogo"' + # Enable dex-preoptimization to speed up first boot sequence WITH_DEXPREOPT := true diff --git a/charger/Android.mk b/charger/Android.mk new file mode 100644 index 0000000..98bcaa8 --- /dev/null +++ b/charger/Android.mk @@ -0,0 +1,54 @@ +# Copyright 2011 The Android Open Source Project + +ifneq ($(BUILD_TINY_ANDROID),true) + +LOCAL_PATH := $(call my-dir) + +define _add-w7-charger-image +include $$(CLEAR_VARS) +LOCAL_MODULE := device_w7_w7_charger_$(notdir $(1)) +LOCAL_MODULE_STEM := $(notdir $(1)) +_img_modules += $$(LOCAL_MODULE) +LOCAL_SRC_FILES := $1 +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $$(TARGET_ROOT_OUT)/res/images/charger +include $$(BUILD_PREBUILT) +endef + +_img_modules := +_images := +$(foreach _img, $(call find-subdir-subdir-files, "images", "*.png"), \ + $(eval $(call _add-w7-charger-image,$(_img)))) + +include $(CLEAR_VARS) +LOCAL_MODULE := charger_res_images_w7 +LOCAL_MODULE_TAGS := optional +LOCAL_REQUIRED_MODULES := $(_img_modules) +include $(BUILD_PHONY_PACKAGE) + +_add-charger-image := +_img_modules := + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + charger.c + +LOCAL_CFLAGS += -DCHARGER_ENABLE_SUSPEND + +LOCAL_MODULE := charger_w7 +LOCAL_MODULE_TAGS := optional +LOCAL_FORCE_STATIC_EXECUTABLE := true +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN) +LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED) +LOCAL_ADDITIONAL_DEPENDENCIES := charger_res_images_w7 +LOCAL_C_INCLUDES := $(call project-path-for,recovery) + +LOCAL_STATIC_LIBRARIES := libminui libpixelflinger_static libpng +LOCAL_STATIC_LIBRARIES += libsuspend +LOCAL_STATIC_LIBRARIES += libz libstdc++ libcutils liblog libm libc + +include $(BUILD_EXECUTABLE) + +endif diff --git a/charger/charger.c b/charger/charger.c new file mode 100644 index 0000000..18c2d56 --- /dev/null +++ b/charger/charger.c @@ -0,0 +1,1281 @@ +/* + * Copyright (C) 2011 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. + */ + +//#define DEBUG_UEVENTS +#define CHARGER_KLOG_LEVEL 6 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#ifdef CHARGER_ENABLE_SUSPEND +#include +#endif + +#include "minui/minui.h" + +#include +#include +#include + +#ifndef max +#define max(a,b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) ((a) < (b) ? (a) : (b)) +#endif + +#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) + +#define MSEC_PER_SEC (1000LL) +#define NSEC_PER_MSEC (1000000LL) + +#define BATTERY_UNKNOWN_TIME (2 * MSEC_PER_SEC) +#define POWER_ON_KEY_TIME (2 * MSEC_PER_SEC) +#define UNPLUGGED_SHUTDOWN_TIME (2 * MSEC_PER_SEC) + +#define BATTERY_FULL_THRESH 95 + +#define BACKLIGHT_TOGGLE_PATH "/sys/class/leds/lcd-backlight/brightness" + +#define LAST_KMSG_PATH "/proc/last_kmsg" +#define LAST_KMSG_MAX_SZ (32 * 1024) + +#if 1 +#define LOGE(x...) do { KLOG_ERROR("charger", x); } while (0) +#define LOGI(x...) do { KLOG_INFO("charger", x); } while (0) +#define LOGV(x...) do { KLOG_DEBUG("charger", x); } while (0) +#else +#define LOG_NDEBUG 0 +#define LOG_TAG "charger" +#include +#endif + +#define SYS_POWER_STATE "/sys/power/state" + +struct key_state { + bool pending; + bool down; + int64_t timestamp; +}; + +struct power_supply { + struct listnode list; + char name[256]; + char type[32]; + bool online; + bool valid; + char cap_path[PATH_MAX]; +}; + +struct frame { + const char *name; + int disp_time; + int min_capacity; + bool level_only; + + gr_surface surface; +}; + +struct animation { + bool run; + + struct frame *frames; + int cur_frame; + int num_frames; + + int cur_cycle; + int num_cycles; + + /* current capacity being animated */ + int capacity; +}; + +struct charger { + int64_t next_screen_transition; + int64_t next_key_check; + int64_t next_pwr_check; + + struct key_state keys[KEY_MAX + 1]; + int uevent_fd; + + struct listnode supplies; + int num_supplies; + int num_supplies_online; + + struct animation *batt_anim; + gr_surface surf_unknown; + + struct power_supply *battery; +}; + +struct uevent { + const char *action; + const char *path; + const char *subsystem; + const char *ps_name; + const char *ps_type; + const char *ps_online; +}; + +static struct frame batt_anim_frames[] = { + { + .name = "charger/battery_0", + .disp_time = 750, + .min_capacity = 0, + }, + { + .name = "charger/battery_1", + .disp_time = 750, + .min_capacity = 15, + }, + { + .name = "charger/battery_2", + .disp_time = 750, + .min_capacity = 35, + }, + { + .name = "charger/battery_3", + .disp_time = 750, + .min_capacity = 55, + }, + { + .name = "charger/battery_4", + .disp_time = 750, + .min_capacity = 75, + }, + { + .name = "charger/battery_5", + .disp_time = 750, + .min_capacity = 95, + }, +}; + +static struct animation battery_animation = { + .frames = batt_anim_frames, + .num_frames = ARRAY_SIZE(batt_anim_frames), + .num_cycles = 5, +}; + +static struct charger charger_state = { + .batt_anim = &battery_animation, +}; + +static int char_width; +static int char_height; + +/*On certain targets the FBIOBLANK ioctl does not turn off the + * backlight. In those cases we need to manually toggle it on/off + */ +static int set_backlight(int toggle) +{ + int fd; + char buffer[10]; + + memset(buffer, '\0', sizeof(buffer)); + fd = open(BACKLIGHT_TOGGLE_PATH, O_RDWR); + if (fd < 0) { + LOGE("Could not open backlight node : %s", strerror(errno)); + goto cleanup; + } + if (toggle) { + LOGI("Enabling backlight"); + snprintf(buffer, sizeof(int), "%d\n", 255); + } else { + LOGI("Disabling backlight"); + snprintf(buffer, sizeof(int), "%d\n", 100); + } + if (write(fd, buffer,strlen(buffer)) < 0) { + LOGE("Could not write to backlight node : %s", strerror(errno)); + goto cleanup; + } +cleanup: + if (fd >= 0) + close(fd); + return 0; +} +/* current time in milliseconds */ +static int64_t curr_time_ms(void) +{ + struct timespec tm; + clock_gettime(CLOCK_MONOTONIC, &tm); + return tm.tv_sec * MSEC_PER_SEC + (tm.tv_nsec / NSEC_PER_MSEC); +} + +static void clear_screen(void) +{ + gr_color(0, 0, 0, 255); + gr_fill(0, 0, gr_fb_width(), gr_fb_height()); +}; + +#define MAX_KLOG_WRITE_BUF_SZ 256 + +static void dump_last_kmsg(void) +{ + char *buf; + char *ptr; + unsigned sz = 0; + int len; + + LOGI("\n"); + LOGI("*************** LAST KMSG ***************\n"); + LOGI("\n"); + buf = load_file(LAST_KMSG_PATH, &sz); + if (!buf || !sz) { + LOGI("last_kmsg not found. Cold reset?\n"); + goto out; + } + + len = min(sz, LAST_KMSG_MAX_SZ); + ptr = buf + (sz - len); + + while (len > 0) { + int cnt = min(len, MAX_KLOG_WRITE_BUF_SZ); + char yoink; + char *nl; + + nl = memrchr(ptr, '\n', cnt - 1); + if (nl) + cnt = nl - ptr + 1; + + yoink = ptr[cnt]; + ptr[cnt] = '\0'; + klog_write(6, "<6>%s", ptr); + ptr[cnt] = yoink; + + len -= cnt; + ptr += cnt; + } + + free(buf); + +out: + LOGI("\n"); + LOGI("************* END LAST KMSG *************\n"); + LOGI("\n"); +} + +static int read_file(const char *path, char *buf, size_t sz) +{ + int fd; + size_t cnt; + + fd = open(path, O_RDONLY, 0); + if (fd < 0) + goto err; + + cnt = read(fd, buf, sz - 1); + if (cnt <= 0) + goto err; + buf[cnt] = '\0'; + if (buf[cnt - 1] == '\n') { + cnt--; + buf[cnt] = '\0'; + } + + close(fd); + return cnt; + +err: + if (fd >= 0) + close(fd); + return -1; +} + +static int read_file_int(const char *path, int *val) +{ + char buf[32]; + int ret; + int tmp; + char *end; + + ret = read_file(path, buf, sizeof(buf)); + if (ret < 0) + return -1; + + tmp = strtol(buf, &end, 0); + if (end == buf || + ((end < buf+sizeof(buf)) && (*end != '\n' && *end != '\0'))) + goto err; + + *val = tmp; + return 0; + +err: + return -1; +} + +static int write_file(const char *path, char *buf, size_t sz) +{ + int fd; + size_t cnt; + + fd = open(path, O_WRONLY, 0); + if (fd < 0) + goto err; + + cnt = write(fd, buf, sz); + if (cnt <= 0) + goto err; + + close(fd); + return cnt; + +err: + if (fd >= 0) + close(fd); + return -1; +} + +static int get_battery_capacity(struct charger *charger) +{ + int ret; + int batt_cap = -1; + + if (!charger->battery) + return -1; + + ret = read_file_int(charger->battery->cap_path, &batt_cap); + if (ret < 0 || batt_cap > 100) { + batt_cap = -1; + } + + return batt_cap; +} + +static struct power_supply *find_supply(struct charger *charger, + const char *name) +{ + struct listnode *node; + struct power_supply *supply; + + list_for_each(node, &charger->supplies) { + supply = node_to_item(node, struct power_supply, list); + if (!strncmp(name, supply->name, sizeof(supply->name))) + return supply; + } + return NULL; +} + +static struct power_supply *add_supply(struct charger *charger, + const char *name, const char *type, + const char *path, bool online) +{ + struct power_supply *supply; + + supply = calloc(1, sizeof(struct power_supply)); + if (!supply) + return NULL; + + strlcpy(supply->name, name, sizeof(supply->name)); + strlcpy(supply->type, type, sizeof(supply->type)); + snprintf(supply->cap_path, sizeof(supply->cap_path), + "/sys/%s/capacity", path); + supply->online = online; + list_add_tail(&charger->supplies, &supply->list); + charger->num_supplies++; + LOGV("... added %s %s %d\n", supply->name, supply->type, online); + return supply; +} + +static void remove_supply(struct charger *charger, struct power_supply *supply) +{ + if (!supply) + return; + list_remove(&supply->list); + charger->num_supplies--; + free(supply); +} + +#ifdef CHARGER_ENABLE_SUSPEND +static int request_suspend(bool enable) +{ + if (enable) + return autosuspend_enable(); + else + return autosuspend_disable(); +} +#else +static int request_suspend(bool enable) +{ + return 0; +} +#endif + +static void parse_uevent(const char *msg, struct uevent *uevent) +{ + uevent->action = ""; + uevent->path = ""; + uevent->subsystem = ""; + uevent->ps_name = ""; + uevent->ps_online = ""; + uevent->ps_type = ""; + + /* currently ignoring SEQNUM */ + while (*msg) { +#ifdef DEBUG_UEVENTS + LOGV("uevent str: %s\n", msg); +#endif + if (!strncmp(msg, "ACTION=", 7)) { + msg += 7; + uevent->action = msg; + } else if (!strncmp(msg, "DEVPATH=", 8)) { + msg += 8; + uevent->path = msg; + } else if (!strncmp(msg, "SUBSYSTEM=", 10)) { + msg += 10; + uevent->subsystem = msg; + } else if (!strncmp(msg, "POWER_SUPPLY_NAME=", 18)) { + msg += 18; + uevent->ps_name = msg; + } else if (!strncmp(msg, "POWER_SUPPLY_ONLINE=", 20)) { + msg += 20; + uevent->ps_online = msg; + } else if (!strncmp(msg, "POWER_SUPPLY_TYPE=", 18)) { + msg += 18; + uevent->ps_type = msg; + } + + /* advance to after the next \0 */ + while (*msg++) + ; + } + + LOGV("event { '%s', '%s', '%s', '%s', '%s', '%s' }\n", + uevent->action, uevent->path, uevent->subsystem, + uevent->ps_name, uevent->ps_type, uevent->ps_online); +} + +static void process_ps_uevent(struct charger *charger, struct uevent *uevent) +{ + int online; + char ps_type[32]; + struct power_supply *supply = NULL; + int i; + bool was_online = false; + bool battery = false; + + if (uevent->ps_type[0] == '\0') { + char *path; + int ret; + + if (uevent->path[0] == '\0') + return; + ret = asprintf(&path, "/sys/%s/type", uevent->path); + if (ret <= 0) + return; + ret = read_file(path, ps_type, sizeof(ps_type)); + free(path); + if (ret < 0) + return; + } else { + strlcpy(ps_type, uevent->ps_type, sizeof(ps_type)); + } + + if (!strncmp(ps_type, "Battery", 7)) + battery = true; + + online = atoi(uevent->ps_online); + supply = find_supply(charger, uevent->ps_name); + if (supply) { + was_online = supply->online; + supply->online = online; + } + + if (!strcmp(uevent->action, "add")) { + if (!supply) { + supply = add_supply(charger, uevent->ps_name, ps_type, uevent->path, + online); + if (!supply) { + LOGE("cannot add supply '%s' (%s %d)\n", uevent->ps_name, + uevent->ps_type, online); + return; + } + /* only pick up the first battery for now */ + if (battery && !charger->battery) + charger->battery = supply; + } else { + LOGE("supply '%s' already exists..\n", uevent->ps_name); + } + } else if (!strcmp(uevent->action, "remove")) { + if (supply) { + if (charger->battery == supply) + charger->battery = NULL; + remove_supply(charger, supply); + supply = NULL; + } + } else if (!strcmp(uevent->action, "change")) { + if (!supply) { + LOGE("power supply '%s' not found ('%s' %d)\n", + uevent->ps_name, ps_type, online); + } + } else { + return; + } + + /* allow battery to be managed in the supply list but make it not + * contribute to online power supplies. */ + if (!battery) { + if (was_online && !online) + charger->num_supplies_online--; + else if (supply && !was_online && online) + charger->num_supplies_online++; + } + LOGI("power supply %s (%s) %s (action=%s num_online=%d num_supplies=%d)\n", + uevent->ps_name, ps_type, battery ? "" : online ? "online" : "offline", + uevent->action, charger->num_supplies_online, charger->num_supplies); +} + +static void process_uevent(struct charger *charger, struct uevent *uevent) +{ + if (!strcmp(uevent->subsystem, "power_supply")) + process_ps_uevent(charger, uevent); +} + +#define UEVENT_MSG_LEN 1024 +static int handle_uevent_fd(struct charger *charger, int fd) +{ + char msg[UEVENT_MSG_LEN+2]; + int n; + + if (fd < 0) + return -1; + + while (true) { + struct uevent uevent; + + n = uevent_kernel_multicast_recv(fd, msg, UEVENT_MSG_LEN); + if (n <= 0) + break; + if (n >= UEVENT_MSG_LEN) /* overflow -- discard */ + continue; + + msg[n] = '\0'; + msg[n+1] = '\0'; + + parse_uevent(msg, &uevent); + process_uevent(charger, &uevent); + } + + return 0; +} + +static int uevent_callback(int fd, short revents, void *data) +{ + struct charger *charger = data; + + if (!(revents & POLLIN)) + return -1; + return handle_uevent_fd(charger, fd); +} + +/* force the kernel to regenerate the change events for the existing + * devices, if valid */ +static void do_coldboot(struct charger *charger, DIR *d, const char *event, + bool follow_links, int max_depth) +{ + struct dirent *de; + int dfd, fd; + + dfd = dirfd(d); + + fd = openat(dfd, "uevent", O_WRONLY); + if (fd >= 0) { + write(fd, event, strlen(event)); + close(fd); + handle_uevent_fd(charger, charger->uevent_fd); + } + + while ((de = readdir(d)) && max_depth > 0) { + DIR *d2; + + LOGV("looking at '%s'\n", de->d_name); + + if ((de->d_type != DT_DIR && !(de->d_type == DT_LNK && follow_links)) || + de->d_name[0] == '.') { + LOGV("skipping '%s' type %d (depth=%d follow=%d)\n", + de->d_name, de->d_type, max_depth, follow_links); + continue; + } + LOGV("can descend into '%s'\n", de->d_name); + + fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY); + if (fd < 0) { + LOGE("cannot openat %d '%s' (%d: %s)\n", dfd, de->d_name, + errno, strerror(errno)); + continue; + } + + d2 = fdopendir(fd); + if (d2 == 0) + close(fd); + else { + LOGV("opened '%s'\n", de->d_name); + do_coldboot(charger, d2, event, follow_links, max_depth - 1); + closedir(d2); + } + } +} + +static void coldboot(struct charger *charger, const char *path, + const char *event) +{ + char str[256]; + + LOGV("doing coldboot '%s' in '%s'\n", event, path); + DIR *d = opendir(path); + if (d) { + snprintf(str, sizeof(str), "%s\n", event); + do_coldboot(charger, d, str, true, 1); + closedir(d); + } +} + +static int draw_text(const char *str, int x, int y) +{ + int str_len_px = gr_measure(str); + + if (x < 0) + x = (gr_fb_width() - str_len_px) / 2; + if (y < 0) + y = 455; + gr_text(x, y, str, 1); + + return y + char_height; +} + +static void draw_capacity(struct charger *charger) +{ + char cap_str[64]; + int x, y; + int str_len_px; + + snprintf(cap_str, sizeof(cap_str), "%d%%", charger->batt_anim->capacity); + str_len_px = gr_measure(cap_str); + x = (gr_fb_width() - str_len_px) / 2; + y = 442; + gr_color(0xff, 0xff, 0xff, 255); + gr_text(x, y, cap_str, 0); +} + +/* returns the last y-offset of where the surface ends */ +static int draw_surface_centered(struct charger *charger, gr_surface surface) +{ + int w; + int h; + int x; + int y; + + w = gr_get_width(surface); + h = gr_get_height(surface); + x = (gr_fb_width() - w) / 2 ; + y = (gr_fb_height() - h) / 2 ; + + LOGV("drawing surface %dx%d+%d+%d\n", w, h, x, y); + gr_blit(surface, 0, 0, w, h, x, y); + return y + h; +} + +static void draw_unknown(struct charger *charger) +{ + int y; + if (charger->surf_unknown) { + draw_surface_centered(charger, charger->surf_unknown); + } else { + gr_color(0xff, 0xff, 0xff, 255); + y = draw_text("Charging!", -1, -1); + draw_text("?\?/100", -1, y + 25); + } +} + +static void draw_battery(struct charger *charger) +{ + struct animation *batt_anim = charger->batt_anim; + struct frame *frame = &batt_anim->frames[batt_anim->cur_frame]; + + if (batt_anim->num_frames != 0) { + draw_surface_centered(charger, frame->surface); + LOGV("drawing frame #%d name=%s min_cap=%d time=%d\n", + batt_anim->cur_frame, frame->name, frame->min_capacity, + frame->disp_time); + } +} + +static void redraw_screen(struct charger *charger) +{ + struct animation *batt_anim = charger->batt_anim; + + clear_screen(); + + /* try to display *something* */ + if (batt_anim->capacity < 0 || batt_anim->num_frames == 0) + draw_unknown(charger); + else { + draw_battery(charger); + draw_capacity(charger); + } + gr_flip(); +} + +static void kick_animation(struct animation *anim) +{ + anim->run = true; +} + +static void reset_animation(struct animation *anim) +{ + anim->cur_cycle = 0; + anim->cur_frame = 0; + anim->run = false; +} + +static void update_screen_state(struct charger *charger, int64_t now) +{ + struct animation *batt_anim = charger->batt_anim; + int cur_frame; + int disp_time; + + if (!batt_anim->run || now < charger->next_screen_transition) + return; + + /* animation is over, blank screen and leave */ + if (batt_anim->cur_cycle == batt_anim->num_cycles) { + reset_animation(batt_anim); + charger->next_screen_transition = -1; + set_backlight(false); + gr_fb_blank(true); + + LOGV("[%lld] animation done\n", now); + if (charger->num_supplies_online > 0) + request_suspend(true); + return; + } + + disp_time = batt_anim->frames[batt_anim->cur_frame].disp_time; + + /* animation starting, set up the animation */ + if (batt_anim->cur_frame == 0) { + int batt_cap; + int ret; + + LOGV("[%lld] animation starting\n", now); + batt_cap = get_battery_capacity(charger); + if (batt_cap >= 0 && batt_anim->num_frames != 0) { + int i; + + /* find first frame given current capacity */ + for (i = 1; i < batt_anim->num_frames; i++) { + if (batt_cap < batt_anim->frames[i].min_capacity) + break; + } + batt_anim->cur_frame = i - 1; + + /* show the first frame for twice as long */ + disp_time = batt_anim->frames[batt_anim->cur_frame].disp_time * 2; + } + + batt_anim->capacity = batt_cap; + } + + /* unblank the screen on first cycle */ + if (batt_anim->cur_cycle == 0) { + gr_fb_blank(false); + set_backlight(true); + } + + + /* draw the new frame (@ cur_frame) */ + redraw_screen(charger); + + /* if we don't have anim frames, we only have one image, so just bump + * the cycle counter and exit + */ + if (batt_anim->num_frames == 0 || batt_anim->capacity < 0) { + LOGV("[%lld] animation missing or unknown battery status\n", now); + charger->next_screen_transition = now + BATTERY_UNKNOWN_TIME; + batt_anim->cur_cycle++; + return; + } + + /* schedule next screen transition */ + charger->next_screen_transition = now + disp_time; + + /* advance frame cntr to the next valid frame + * if necessary, advance cycle cntr, and reset frame cntr + */ + batt_anim->cur_frame++; + + /* if the frame is used for level-only, that is only show it when it's + * the current level, skip it during the animation. + */ + while (batt_anim->cur_frame < batt_anim->num_frames && + batt_anim->frames[batt_anim->cur_frame].level_only) + batt_anim->cur_frame++; + if (batt_anim->cur_frame >= batt_anim->num_frames) { + batt_anim->cur_cycle++; + batt_anim->cur_frame = 0; + + /* don't reset the cycle counter, since we use that as a signal + * in a test above to check if animation is over + */ + } +} + +static int set_key_callback(int code, int value, void *data) +{ + struct charger *charger = data; + int64_t now = curr_time_ms(); + int down = !!value; + + if (code > KEY_MAX) + return -1; + + /* ignore events that don't modify our state */ + if (charger->keys[code].down == down) + return 0; + + /* only record the down even timestamp, as the amount + * of time the key spent not being pressed is not useful */ + if (down) + charger->keys[code].timestamp = now; + charger->keys[code].down = down; + charger->keys[code].pending = true; + if (down) { + LOGV("[%lld] key[%d] down\n", now, code); + } else { + int64_t duration = now - charger->keys[code].timestamp; + int64_t secs = duration / 1000; + int64_t msecs = duration - secs * 1000; + LOGV("[%lld] key[%d] up (was down for %lld.%lldsec)\n", now, + code, secs, msecs); + } + + return 0; +} + +static void update_input_state(struct charger *charger, + struct input_event *ev) +{ + if (ev->type != EV_KEY) + return; + set_key_callback(ev->code, ev->value, charger); +} + +static void set_next_key_check(struct charger *charger, + struct key_state *key, + int64_t timeout) +{ + int64_t then = key->timestamp + timeout; + + if (charger->next_key_check == -1 || then < charger->next_key_check) + charger->next_key_check = then; +} + +static void process_key(struct charger *charger, int code, int64_t now) +{ + struct animation *batt_anim = charger->batt_anim; + struct key_state *key = &charger->keys[code]; + int64_t next_key_check; + + if (code == KEY_POWER) { + if (key->down) { + int64_t reboot_timeout = key->timestamp + POWER_ON_KEY_TIME; + if (now >= reboot_timeout) { + LOGI("[%lld] rebooting\n", now); + android_reboot(ANDROID_RB_RESTART, 0, 0); + } else { + /* if the key is pressed but timeout hasn't expired, + * make sure we wake up at the right-ish time to check + */ + set_next_key_check(charger, key, POWER_ON_KEY_TIME); + } + } else { + /* if the power key got released, force screen state cycle */ + if (key->pending) { + if (!batt_anim->run) { + request_suspend(false); + kick_animation(charger->batt_anim); + } else { + reset_animation(batt_anim); + charger->next_screen_transition = -1; + gr_fb_blank(true); + set_backlight(false); + if (charger->num_supplies_online > 0) + request_suspend(true); + } + } + } + } else { + if (key->pending) { + request_suspend(false); + kick_animation(charger->batt_anim); + } + } + + key->pending = false; +} + +static void handle_input_state(struct charger *charger, int64_t now) +{ + process_key(charger, KEY_POWER, now); + process_key(charger, KEY_HOME, now); + process_key(charger, KEY_HOMEPAGE, now); + + if (charger->next_key_check != -1 && now > charger->next_key_check) + charger->next_key_check = -1; +} + +static void handle_power_supply_state(struct charger *charger, int64_t now) +{ + if (charger->num_supplies_online == 0) { + request_suspend(false); + if (charger->next_pwr_check == -1) { + charger->next_pwr_check = now + UNPLUGGED_SHUTDOWN_TIME; + LOGI("[%lld] device unplugged: shutting down in %lld (@ %lld)\n", + now, UNPLUGGED_SHUTDOWN_TIME, charger->next_pwr_check); + } else if (now >= charger->next_pwr_check) { + LOGI("[%lld] shutting down\n", now); + android_reboot(ANDROID_RB_POWEROFF, 0, 0); + } else { + /* otherwise we already have a shutdown timer scheduled */ + } + } else { + /* online supply present, reset shutdown timer if set */ + if (charger->next_pwr_check != -1) { + LOGI("[%lld] device plugged in: shutdown cancelled\n", now); + kick_animation(charger->batt_anim); + } + charger->next_pwr_check = -1; + } +} + +static void wait_next_event(struct charger *charger, int64_t now) +{ + int64_t next_event = INT64_MAX; + int64_t timeout; + struct input_event ev; + int ret; + + LOGV("[%lld] next screen: %lld next key: %lld next pwr: %lld\n", now, + charger->next_screen_transition, charger->next_key_check, + charger->next_pwr_check); + + if (charger->next_screen_transition != -1) + next_event = charger->next_screen_transition; + if (charger->next_key_check != -1 && charger->next_key_check < next_event) + next_event = charger->next_key_check; + if (charger->next_pwr_check != -1 && charger->next_pwr_check < next_event) + next_event = charger->next_pwr_check; + + if (next_event != -1 && next_event != INT64_MAX) + timeout = max(0, next_event - now); + else + timeout = -1; + LOGV("[%lld] blocking (%lld)\n", now, timeout); + ret = ev_wait((int)timeout); + if (!ret) + ev_dispatch(); +} + +static int input_callback(int fd, short revents, void *data) +{ + struct charger *charger = data; + struct input_event ev; + int ret; + + ret = ev_get_input(fd, revents, &ev); + if (ret) + return -1; + update_input_state(charger, &ev); + return 0; +} + +static void event_loop(struct charger *charger) +{ + int ret; + + while (true) { + int64_t now = curr_time_ms(); + + LOGV("[%lld] event_loop()\n", now); + handle_input_state(charger, now); + handle_power_supply_state(charger, now); + + /* do screen update last in case any of the above want to start + * screen transitions (animations, etc) + */ + update_screen_state(charger, now); + + wait_next_event(charger, now); + } +} + +static int alarm_open_alm_dev() +{ + int fd; + + fd = open("/dev/alarm", O_RDWR); + if(fd < 0 ) + LOGE("Can't open alarm devfs node\n"); + + return fd; +} + +static void alarm_close_alm_dev(int fd) +{ + close(fd); +} + +static int alarm_open_rtc_dev() +{ + int fd; + + fd = open("/dev/rtc0", O_RDWR); + if (fd < 0 ) + LOGE("Can't open rtc devfs node\n"); + + return fd; +} + +static void alarm_close_rtc_dev(int fd) +{ + close(fd); +} + +static int alarm_set_reboot_time(int fd, int type, time_t secs) +{ + struct timespec ts; + ts.tv_sec = secs; + ts.tv_nsec = 0; + int ret; + + ret = ioctl(fd, ANDROID_ALARM_SET(type), &ts); + if (ret < 0) + LOGE("Unable to set reboot time to %d\n", secs); + return ret; +} + +static int alarm_get_alm_time(int fd, time_t *secs) +{ + struct tm alm_tm; + int ret; + + ret = ioctl(fd, RTC_ALM_READ, &alm_tm); + if (ret < 0) { + LOGE("Unable to get alarm time\n"); + goto err; + } + + *secs = mktime(&alm_tm) + alm_tm.tm_gmtoff; + if (*secs < 0) { + LOGE("Invalid alarm seconds = %ld\n", *secs); + goto err; + } + + return 0; + +err: + return -1; +} + +static int alarm_get_rtc_time(int fd, time_t *secs) +{ + struct tm rtc_tm; + int ret; + + ret = ioctl(fd, RTC_RD_TIME, &rtc_tm); + if (ret < 0) { + LOGE("Unable to get rtc time\n"); + goto err; + } + + *secs = mktime(&rtc_tm) + rtc_tm.tm_gmtoff; + if (*secs < 0) { + LOGE("Invalid rtc seconds = %ld\n", *secs); + goto err; + } + + return 0; + +err: + return -1; +} + +static int alarm_wait(int fd) +{ + int ret = 0; + + do { + ret = ioctl(fd, ANDROID_ALARM_WAIT); + } while (ret < 0 && errno == EINTR); + + if (ret < 0) { + LOGE("Unable to wait on alarm\n"); + return 0; + } + + return ret; +} + +static void alarm_reboot() +{ + android_reboot(ANDROID_RB_RESTART, 0, 0); +} + +void *alarm_thread(void *p) +{ + int alm_fd, rtc_fd, ret; + time_t g_alm_secs, g_rtc_secs, s_rb_secs; + + rtc_fd = alarm_open_rtc_dev(); + if (rtc_fd < 0) + goto rtc_err; + + ret = alarm_get_alm_time(rtc_fd, &g_alm_secs); + if (ret < 0 || !g_alm_secs) + goto rtc_err; + + ret = alarm_get_rtc_time(rtc_fd, &g_rtc_secs); + if (ret < 0) + goto rtc_err; + + s_rb_secs = g_alm_secs - g_rtc_secs; + if (s_rb_secs <= 0) + goto rtc_err; + + alm_fd = alarm_open_alm_dev(); + if (alm_fd < 0) + goto rtc_err; + + ret = alarm_set_reboot_time(alm_fd, + ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP, + s_rb_secs); + if (ret < 0) + goto alm_err; + + ret = alarm_wait(alm_fd); + if (ret) { + LOGI("Exit from power off charging, reboot the phone!\n"); + alarm_reboot(); + } + +alm_err: + alarm_close_alm_dev(alm_fd); + +rtc_err: + alarm_close_rtc_dev(rtc_fd); + + LOGE("Exit from alarm thread\n"); + return NULL; +} + +void alarm_thread_create() +{ + pthread_t tid; + int ret; + + ret = pthread_create(&tid, NULL, alarm_thread, NULL); + if (ret < 0) + LOGE("Create alarm thread failed\n"); +} + +int main(int argc, char **argv) +{ + int ret; + struct charger *charger = &charger_state; + int64_t now = curr_time_ms() - 1; + int fd; + int i; + + list_init(&charger->supplies); + + klog_init(); + klog_set_level(CHARGER_KLOG_LEVEL); + + dump_last_kmsg(); + + alarm_thread_create(); + + LOGI("--------------- STARTING CHARGER MODE ---------------\n"); + + gr_init(); + gr_font_size(&char_width, &char_height); + + ev_init(input_callback, charger); + + fd = uevent_open_socket(64*1024, true); + if (fd >= 0) { + fcntl(fd, F_SETFL, O_NONBLOCK); + ev_add_fd(fd, uevent_callback, charger); + } + charger->uevent_fd = fd; + coldboot(charger, "/sys/class/power_supply", "add"); + + ret = res_create_display_surface("charger/battery_fail_0", &charger->surf_unknown); + if (ret < 0) { + LOGE("Cannot load image\n"); + charger->surf_unknown = NULL; + } + + for (i = 0; i < charger->batt_anim->num_frames; i++) { + struct frame *frame = &charger->batt_anim->frames[i]; + + ret = res_create_display_surface(frame->name, &frame->surface); + if (ret < 0) { + LOGE("Cannot load image %s\n", frame->name); + /* TODO: free the already allocated surfaces... */ + charger->batt_anim->num_frames = 0; + charger->batt_anim->num_cycles = 1; + break; + } + } + + ev_sync_key_state(set_key_callback, charger); + + set_backlight(false); + gr_fb_blank(true); + + charger->next_screen_transition = now - 1; + charger->next_key_check = -1; + charger->next_pwr_check = -1; + reset_animation(charger->batt_anim); + kick_animation(charger->batt_anim); + + event_loop(charger); + + return 0; +} diff --git a/charger/images/battery_0.png b/charger/images/battery_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf0ff264feadd4a244d1adb2361a81139c8aad6 GIT binary patch literal 13966 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 literal 0 HcmV?d00001 diff --git a/charger/images/battery_2.png b/charger/images/battery_2.png new file mode 100644 index 0000000000000000000000000000000000000000..82e789c59fd36fcf3e131df716ba9cd468ef6a68 GIT binary patch literal 13952 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 Id5hQo2QnkMUjP6A literal 0 HcmV?d00001 diff --git a/charger/images/battery_3.png b/charger/images/battery_3.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9522ed2861b659c63e446e724f0b9a025f6507 GIT binary patch literal 13942 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 literal 0 HcmV?d00001 diff --git a/charger/images/battery_4.png b/charger/images/battery_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d78868e601d33784398b133e5a320d633116dbd3 GIT binary patch literal 13913 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 literal 0 HcmV?d00001 diff --git a/charger/images/battery_5.png b/charger/images/battery_5.png new file mode 100644 index 0000000000000000000000000000000000000000..9635227c8dd7a9c6c8a03c4bb671c447ea415d84 GIT binary patch literal 14225 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 literal 0 HcmV?d00001 diff --git a/charger/images/battery_charge.png b/charger/images/battery_charge.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9b4e8e2722a08302812ad60eec53a06b99572e GIT binary patch literal 17042 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 Q5trm;l%E$#8NdI(0LbTpt^fc4 literal 0 HcmV?d00001 diff --git a/charger/images/battery_fail_0.png b/charger/images/battery_fail_0.png new file mode 100755 index 0000000000000000000000000000000000000000..6e922109e875544e25d9a00f6f6c1ae8f5235eda GIT binary patch literal 25986 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 DN>y~$ literal 0 HcmV?d00001 diff --git a/device_w7.mk b/device_w7.mk index f1cd136..520ae3f 100644 --- a/device_w7.mk +++ b/device_w7.mk @@ -127,6 +127,11 @@ PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \ device/lge/w7/rootdir/twrp.fstab:recovery/root/etc/twrp.fstab +# Offmode Charging +PRODUCT_PACKAGES += \ + charger_res_w7 \ + charger_w7 + # Audio PRODUCT_PACKAGES += \ audio.primary.msm8226 \ diff --git a/rootdir/init.w7.rc b/rootdir/init.w7.rc index 9c23a12..9127300 100755 --- a/rootdir/init.w7.rc +++ b/rootdir/init.w7.rc @@ -106,6 +106,13 @@ service audiod /system/bin/audiod user system group system +service charger /sbin/charger_w7 + class charger + critical + +on charger + class_start charger + on boot chown system system /sys/class/power_supply/battery/pseudo_batt