From patchwork Tue Sep 20 05:21:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 76576 Delivered-To: patches@linaro.org Received: by 10.140.106.72 with SMTP id d66csp1301019qgf; Mon, 19 Sep 2016 22:22:05 -0700 (PDT) X-Received: by 10.66.11.167 with SMTP id r7mr52669743pab.136.1474348925866; Mon, 19 Sep 2016 22:22:05 -0700 (PDT) Return-Path: Received: from mail-pa0-x230.google.com (mail-pa0-x230.google.com. [2607:f8b0:400e:c03::230]) by mx.google.com with ESMTPS id gp4si26991540pac.58.2016.09.19.22.22.05 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Sep 2016 22:22:05 -0700 (PDT) Received-SPF: pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c03::230 as permitted sender) client-ip=2607:f8b0:400e:c03::230; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c03::230 as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: by mail-pa0-x230.google.com with SMTP id wk8so3091226pab.1 for ; Mon, 19 Sep 2016 22:22:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=fTBJvMBGvG/qcLVHn6FNVBksKQCXNdf26K7TPZipONc=; b=PvnB0Nm73jU4ble359p0Mh4sjg9yci1FpIrfTrsSAS11G9hzRe86z1OWW7qEuDiWUU +Is5cnvbly1PSP+3FxOtOlL1cgtO6EzRqRayetMkz6Viwe3/vWKn2yEQ1XMkXLp8izuX h0Zb/nKS/dAZKOatM2aGML/44aZeiqyY3VRls= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=fTBJvMBGvG/qcLVHn6FNVBksKQCXNdf26K7TPZipONc=; b=c9ZxG86Fj20gXak7OSJkVBUb0/cjmhjZyxU2jpEnTei3JdPtKvUVsTR0pwxNwLt/k1 T03SFTWS0ZwMQTmSX65yg5YlloYGav1Ilm32o4PBHfwDEZ+1EWsVeaNhC6vEZC6rmmi6 YmS8w3TbxlK1GaIl9jR5Nji13IyCWUlHKvFeuJck60rCFzm0rUJ/Qpo+ZC0EK+6k4z36 N/DW91PbAE1PHwNkRN8qcBDlgc018dy0WA6V2YGb5BXs4HIjbv+Z1CS9AkEqA6Ikd4yb Szd0VsxEM4pDk2+ikVrLY1x54YdVwyphoMj+SmTB9gX4mnVRB2KX7YA54pOks+RWD4qO 1EKw== X-Gm-Message-State: AE9vXwNnM8q4Xbr6S71ne/Fzfb5XLnbiXO4VDRHJNofkweOSGHl7aHv4+G8kmmyLBbLQsYA5EBA= X-Received: by 10.66.157.166 with SMTP id wn6mr21359620pab.42.1474348925358; Mon, 19 Sep 2016 22:22:05 -0700 (PDT) Return-Path: Received: from localhost.localdomain (c-73-67-244-238.hsd1.or.comcast.net. [73.67.244.238]) by smtp.gmail.com with ESMTPSA id bx9sm35320231pab.17.2016.09.19.22.22.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 19 Sep 2016 22:22:04 -0700 (PDT) From: John Stultz To: Rob Herring , Amit Pundir , Michael Scott , Vishal Bhoj Cc: John Stultz Subject: [PATCH] generic: First pass at adding lightsHAL for backlight Date: Mon, 19 Sep 2016 22:21:59 -0700 Message-Id: <1474348919-23865-1-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 1.9.1 Grabs first backlight device and uses it. Signed-off-by: John Stultz --- device.mk | 2 +- lights/Android.mk | 33 +++++++++++ lights/device.mk | 4 ++ lights/lights.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ueventd.rc | 1 + 5 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 lights/Android.mk create mode 100644 lights/device.mk create mode 100644 lights/lights.c -- 1.9.1 diff --git a/device.mk b/device.mk index 5675608..fd1ae4e 100644 --- a/device.mk +++ b/device.mk @@ -65,7 +65,7 @@ PRODUCT_PROPERTY_OVERRIDES += \ dalvik.vm.heapminfree=512k \ dalvik.vm.heapmaxfree=$(CONFIG_DALVIK_VM_HEAPMAXFREE)m -subdirs-true := +subdirs-true := lights subdirs-$(CONFIG_WIFI) += wifi subdirs-$(CONFIG_ETHERNET) += ethernet subdirs-$(CONFIG_SENSOR) += sensor diff --git a/lights/Android.mk b/lights/Android.mk new file mode 100644 index 0000000..dcea097 --- /dev/null +++ b/lights/Android.mk @@ -0,0 +1,33 @@ +# 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. + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +# HAL module implemenation, not prelinked and stored in +# hw/..so + +LOCAL_SRC_FILES := lights.c + +LOCAL_MODULE_RELATIVE_PATH := hw + +LOCAL_MODULE_TAGS := optional + +LOCAL_SHARED_LIBRARIES := liblog + +LOCAL_MODULE := lights.default + +include $(BUILD_SHARED_LIBRARY) + diff --git a/lights/device.mk b/lights/device.mk new file mode 100644 index 0000000..406c668 --- /dev/null +++ b/lights/device.mk @@ -0,0 +1,4 @@ +PRODUCT_PACKAGES += lights.default +PRODUCT_PACKAGES += lights.rc + + diff --git a/lights/lights.c b/lights/lights.c new file mode 100644 index 0000000..44c8f90 --- /dev/null +++ b/lights/lights.c @@ -0,0 +1,163 @@ +/* + * 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. + */ + +#define LOG_TAG "lights" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER; +char const* const BACKLIGHT_PATH_BASE = "/sys/class/backlight/"; + +char backlight_path[1024]; + +static int write_int(char const *path, int value) +{ + int fd; + static int already_warned = -1; + fd = open(path, O_RDWR); + if (fd >= 0) { + char buffer[20]; + int bytes = snprintf(buffer, 20, "%d\n", value); + int amt = write(fd, buffer, bytes); + close(fd); + return amt == -1 ? -errno : 0; + } else { + if (already_warned == -1) { + ALOGE("write_int failed to open %s\n", path); + already_warned = 1; + } + return -errno; + } +} + +static int rgb_to_brightness(struct light_state_t const *state) +{ + int color = state->color & 0x00ffffff; + return ((77 * ((color >> 16) & 0x00ff)) + + (150 * ((color >> 8) & 0x00ff)) + + (29 * (color & 0x00ff))) >> 8; +} + +static int set_light_notifications(struct light_device_t* dev, + struct light_state_t const* state) +{ + int err = 0; + return err; +} + +static int set_light_backlight(struct light_device_t *dev, + struct light_state_t const *state) +{ + int err; + int brightness = rgb_to_brightness(state); + + pthread_mutex_lock(&g_lock); + err = write_int(backlight_path, brightness); + pthread_mutex_unlock(&g_lock); + + return err; +} + +/** Close the lights device */ +static int close_lights(struct light_device_t *dev) +{ + if (dev) + free(dev); + return 0; +} + +/** Open a new instance of a lights device using name */ +static int open_lights(const struct hw_module_t *module, char const *name, + struct hw_device_t **device) +{ + struct light_device_t *dev = malloc(sizeof(struct light_device_t)); + int (*set_light) (struct light_device_t *dev, + struct light_state_t const *state); + pthread_t lighting_poll_thread; + DIR *dir; + struct dirent *entry; + + if (dev == NULL) { + ALOGE("failed to allocate memory"); + return -1; + } + memset(dev, 0, sizeof(*dev)); + + if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) + set_light = set_light_backlight; + else + return -EINVAL; + + + if(!(dir = opendir(BACKLIGHT_PATH_BASE))) + return -EINVAL; + if (!(entry = readdir(dir))) + return -EINVAL; + + do { + if (entry->d_type == DT_DIR) { + continue; + } + sprintf(backlight_path, "%s%s/brightness", BACKLIGHT_PATH_BASE, entry->d_name); + } while (entry = readdir(dir)); + closedir(dir); + + + pthread_mutex_init(&g_lock, NULL); + + dev->common.tag = HARDWARE_DEVICE_TAG; + dev->common.version = 0; + dev->common.module = (struct hw_module_t *)module; + dev->common.close = (int (*)(struct hw_device_t *))close_lights; + dev->set_light = set_light; + + *device = (struct hw_device_t *)dev; + + return 0; +} + +static struct hw_module_methods_t lights_methods = +{ + .open = open_lights, +}; + +/* + * The backlight Module + */ +struct hw_module_t HAL_MODULE_INFO_SYM = +{ + .tag = HARDWARE_MODULE_TAG, + .version_major = 1, + .version_minor = 0, + .id = LIGHTS_HARDWARE_MODULE_ID, + .name = "Flo/mainline lights module", + .author = "NVIDIA,Linaro", + .methods = &lights_methods, +}; diff --git a/ueventd.rc b/ueventd.rc index ea76741..c56b776 100644 --- a/ueventd.rc +++ b/ueventd.rc @@ -13,6 +13,7 @@ /sys/bus/iio/devices/iio:device* scan_elements/in_anglvel_y_en 0660 system system /sys/bus/iio/devices/iio:device* scan_elements/in_anglvel_z_en 0660 system system /sys/bus/iio/devices/trigger* name 0660 system system +/sys/class/backlight* brightness 0664 system system /dev/sw_sync 0660 root graphics /dev/iio:device0 0660 system system