14ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev/* 24ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * Copyright (C) 2012 The Android Open Source Project 34ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * 44ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 54ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * you may not use this file except in compliance with the License. 64ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * You may obtain a copy of the License at 74ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * 84ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 94ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * 104ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * Unless required by applicable law or agreed to in writing, software 114ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 124ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * See the License for the specific language governing permissions and 144ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev * limitations under the License. 154ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev */ 164ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 174ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev#define LOG_TAG "CHARGER_TOUCH" 184ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev#include <hardware_legacy/uevent.h> 194ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev#include <utils/Log.h> 204ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev#include <fcntl.h> 214ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 224ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev#define POWER_SUPPLY_PATH "/sys/class/power_supply" 234ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev#define TOUCH_PATH "/sys/devices/virtual/input/qcom_touch/charger" 244ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 254ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchevconst char* WIRELESS = "change@/devices/platform/bq51051b_wlc/power_supply/wireless"; 264ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchevconst char* USB = "change@/devices/platform/msm_ssbi.0/pm8921-core/pm8921-charger/power_supply/usb"; 274ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 284ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchevenum { 294ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev NO_CHARGER, 304ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev CHARGER_WIRELESS, 314ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev CHARGER_USB, 324ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev CHARGER_AC 334ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev}; 344ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 354ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchevstatic void read_path(const char* path, char* buf, size_t size) 364ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev{ 374ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev int fd = open(path, O_RDONLY, 0); 384ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev int count; 394ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 404ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev if (fd < 0) { 414ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev ALOGE("Could not open %s", path); 424ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev return; 434ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev } 444ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev count = read(fd, buf, size); 454ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 464ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev close(fd); 474ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev} 484ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 494ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchevstatic void write_path(int type) 504ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev{ 514ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev int fd = open(TOUCH_PATH, O_RDWR, 0); 524ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev char buf[2]; 534ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 544ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev if (fd < 0) { 554ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev ALOGE("Could not open %s", TOUCH_PATH); 564ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev return; 574ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev } 584ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 594ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev snprintf(buf, sizeof(buf), "%d", type); 604ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev write(fd, buf, 1); 614ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 624ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev close(fd); 634ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev} 644ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 654ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchevstatic void handle_uevent(const char* udata) 664ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev{ 674ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev const char *str = udata; 684ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev char path[PATH_MAX]; 694ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev char wlc[2], usb[2], ac[2]; 704ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev int type = NO_CHARGER; 714ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 724ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev memset(wlc, 0, 2); 734ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev memset(usb, 0, 2); 744ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev memset(ac, 0, 2); 754ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 764ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev if (!strncmp(str, WIRELESS, strlen(WIRELESS))) { 774ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev snprintf(path, sizeof(path), "%s/wireless/online", POWER_SUPPLY_PATH); 784ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev read_path(path, wlc, 1); 794ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev if (!strncmp(wlc, "1", 1)) 804ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev type = CHARGER_WIRELESS; 814ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 824ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev ALOGE("Type: %d", type); 834ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev write_path(type); 844ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev } else if (!strncmp(str, USB, strlen(USB))) { 854ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev snprintf(path, sizeof(path), "%s/usb/online", POWER_SUPPLY_PATH); 864ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev read_path(path, usb, 1); 874ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 884ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev snprintf(path, sizeof(path), "%s/pm8921-dc/online", POWER_SUPPLY_PATH); 894ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev read_path(path, ac, 1); 904ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 914ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev if (!strncmp(usb, "1", 1)) { 924ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev type = CHARGER_USB; 934ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev } else if (!strncmp(ac, "1", 1)) { 944ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev type = CHARGER_AC; 954ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev } 964ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 974ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev ALOGE("Type: %d", type); 984ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev write_path(type); 994ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev } 1004ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 1014ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev} 1024ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 1034ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchevstatic void event_loop(void) 1044ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev{ 1054ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev int len = 0; 1064ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev static char udata[4096]; 1074ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev memset(udata, 0, sizeof(udata)); 1084ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 1094ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev uevent_init(); 1104ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 1114ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev while (1) { 1124ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev len = uevent_next_event(udata, sizeof(udata) - 2); 1134ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev handle_uevent(udata); 1144ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev } 1154ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev} 1164ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev 1174ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchevint main() 1184ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev{ 1194ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev event_loop(); 1204ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev return 0; 1214ffa22bb4af373abff09b8c3423c67235f8e132dIliyan Malchev} 122