diff --git a/liblights/Android.mk b/liblights/Android.mk index 3acc7ba3..03af771a 100644 --- a/liblights/Android.mk +++ b/liblights/Android.mk @@ -12,17 +12,30 @@ # See the License for the specific language governing permissions and # limitations under the License. -ifneq ($(TARGET_PROVIDES_LIBLIGHT),true) - LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_SRC_FILES := lights.c +LOCAL_SRC_FILES := lights_helper.c LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include + +LOCAL_SHARED_LIBRARIES := liblog + +LOCAL_MODULE := liblights_helper +LOCAL_MODULE_TAGS := optional + +include $(BUILD_STATIC_LIBRARY) + +ifneq ($(TARGET_PROVIDES_LIBLIGHT),true) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := lights.c LOCAL_SHARED_LIBRARIES := liblog +LOCAL_STATIC_LIBRARIES := liblights_helper LOCAL_MODULE := lights.$(TARGET_BOOTLOADER_BOARD_NAME) LOCAL_MODULE_RELATIVE_PATH := hw diff --git a/liblights/include/liblights/samsung_lights_helper.h b/liblights/include/liblights/samsung_lights_helper.h new file mode 100644 index 00000000..4200207b --- /dev/null +++ b/liblights/include/liblights/samsung_lights_helper.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2016 The CyanogenMod 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 SAMSUNG_LIGHTS_HELPER_H +#define SAMSUNG_LIGHTS_HELPER_H + +#include + +/* + * Interfaces for other modules accessing lights HAL data. + * For documentation, see lights_helper.c + */ +extern int set_cur_button_brightness(const int brightness); +extern int get_cur_panel_brightness(); +extern int get_max_panel_brightness(); +extern int set_cur_panel_brightness(const int brightness); +extern int set_max_panel_brightness(const int brightness); + +#endif // SAMSUNG_LIGHTS_HELPER_H diff --git a/liblights/lights.c b/liblights/lights.c index 14946c5c..0b822566 100644 --- a/liblights/lights.c +++ b/liblights/lights.c @@ -30,6 +30,7 @@ #include #include +#include #include "samsung_lights.h" @@ -58,63 +59,6 @@ void init_g_lock(void) pthread_mutex_init(&g_lock, NULL); } -static int read_int(char const *path) -{ - int fd, len; - int num_bytes = 10; - char buf[11]; - int retval; - - fd = open(path, O_RDONLY); - if (fd < 0) { - ALOGE("%s: failed to open %s\n", __func__, path); - goto fail; - } - - len = read(fd, buf, num_bytes - 1); - if (len < 0) { - ALOGE("%s: failed to read from %s\n", __func__, path); - goto fail; - } - - buf[len] = '\0'; - close(fd); - - // no endptr, decimal base - retval = strtol(buf, NULL, 10); - return retval == 0 ? -1 : retval; - -fail: - if (fd >= 0) - close(fd); - return -1; -} - -static int write_int(char const *path, int value) -{ - int fd; - static int already_warned; - - already_warned = 0; - - ALOGV("write_int: path %s, value %d", path, value); - fd = open(path, O_RDWR); - - if (fd >= 0) { - char buffer[20]; - int bytes = sprintf(buffer, "%d\n", value); - int amt = write(fd, buffer, bytes); - close(fd); - return amt == -1 ? -errno : 0; - } else { - if (already_warned == 0) { - ALOGE("write_int failed to open %s\n", path); - already_warned = 1; - } - return -errno; - } -} - static int write_str(char const *path, const char* value) { int fd; @@ -165,7 +109,7 @@ static int set_light_backlight(struct light_device_t *dev __unused, } pthread_mutex_lock(&g_lock); - err = write_int(PANEL_BRIGHTNESS_NODE, brightness); + err = set_cur_panel_brightness(brightness); if (err == 0) g_backlight.cur_brightness = brightness; @@ -181,7 +125,7 @@ static int set_light_buttons(struct light_device_t* dev __unused, pthread_mutex_lock(&g_lock); - err = write_int(BUTTON_BRIGHTNESS_NODE, on ? 1 : 0); + err = set_cur_button_brightness(on ? 1 : 0); pthread_mutex_unlock(&g_lock); @@ -359,7 +303,7 @@ static int open_lights(const struct hw_module_t *module, char const *name, else return -EINVAL; - int max_brightness = read_int(PANEL_MAX_BRIGHTNESS_NODE); + int max_brightness = get_max_panel_brightness(); if (max_brightness < 0) { ALOGE("%s: failed to read max panel brightness, fallback to 255!", __func__); diff --git a/liblights/lights_helper.c b/liblights/lights_helper.c new file mode 100644 index 00000000..c3406ab8 --- /dev/null +++ b/liblights/lights_helper.c @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2016 The CyanogenMod 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 +#include +#include +#include +#include +#include +#include + +#include + +/* + * Reads an Integer from a file. + * + * @param path The absolute path string. + * @return The Integer with decimal base, -1 on error. + */ +int read_int(char const *path) +{ + int fd, len; + int num_bytes = 10; + char buf[11]; + int retval; + + fd = open(path, O_RDONLY); + if (fd < 0) { + ALOGE("%s: failed to open %s\n", __func__, path); + goto fail; + } + + len = read(fd, buf, num_bytes - 1); + if (len < 0) { + ALOGE("%s: failed to read from %s\n", __func__, path); + goto fail; + } + + buf[len] = '\0'; + close(fd); + + // no endptr, decimal base + retval = strtol(buf, NULL, 10); + return retval == 0 ? -1 : retval; + +fail: + if (fd >= 0) + close(fd); + return -1; +} + +/* + * Writes an Integer to a file. + * + * @param path The absolute path string. + * @param value The Integer value to be written. + * @return 0 on success, -1 or errno on error. + */ +int write_int(char const *path, const int value) +{ + int fd; + static int already_warned; + + already_warned = 0; + + ALOGV("write_int: path %s, value %d", path, value); + fd = open(path, O_RDWR); + + if (fd >= 0) { + char buffer[20]; + int bytes = sprintf(buffer, "%d\n", value); + int amt = write(fd, buffer, bytes); + close(fd); + return amt == -1 ? -errno : 0; + } else { + if (already_warned == 0) { + ALOGE("write_int failed to open %s\n", path); + already_warned = 1; + } + return -errno; + } +} + +/* + * Set the current button brightness via sysfs. + * + * @param brightness The brightness value. + * @return 0 on success, -1 or errno on error. + */ +inline int set_cur_button_brightness(const int brightness) +{ + return write_int(BUTTON_BRIGHTNESS_NODE, brightness); +} + +/* + * Read the current panel brightness from sysfs. + * + * @return The brightness as Integer, -1 on error. + */ +inline int get_cur_panel_brightness() +{ + return read_int(PANEL_BRIGHTNESS_NODE); +} + +/* + * Read the maximum panel brightness from sysfs. + * + * @return The brightness as Integer, -1 on error. + */ +inline int get_max_panel_brightness() +{ + return read_int(PANEL_MAX_BRIGHTNESS_NODE); +} + +/* + * Set the current panel brightness via sysfs. + * + * @param brightness The (scaled) brightness value. + * @return 0 on success, -1 or errno on error. + */ +inline int set_cur_panel_brightness(const int brightness) +{ + return write_int(PANEL_BRIGHTNESS_NODE, brightness); +} + +/* + * Set the maximum panel brightness via sysfs. + * + * @param brightness The brightness value. + * @return 0 on success, -1 or errno on error. + */ +inline int set_max_panel_brightness(const int brightness) +{ + return write_int(PANEL_MAX_BRIGHTNESS_NODE, brightness); +}