summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Marshall <tdm.code@gmail.com>2020-11-13 14:30:23 -0800
committerTom Marshall <tdm.code@gmail.com>2022-06-04 08:17:22 -0700
commit42453691719fb9e3c168e924b8b757127f4ac26a (patch)
tree4100c39037af23651557223bb737942bd9bb6173
parent3dc8171cb2ce720dce2fe67acc504f36ba99c8c0 (diff)
Revert "pro1: lights: Enable support for keyboard brightness control"
This reverts commit cb7cc707eb3d2ac6dfa8281dd6dd3c30a01c5922. Backlight support has _not_ been added to Android frameworks in AICP.
-rw-r--r--light/Light.cpp108
-rw-r--r--light/Light.h7
-rw-r--r--light/android.hardware.light@2.0-service.pro1.rc2
-rw-r--r--sepolicy/vendor/hal_light_default.te2
4 files changed, 106 insertions, 13 deletions
diff --git a/light/Light.cpp b/light/Light.cpp
index f2ed9d1..b04a783 100644
--- a/light/Light.cpp
+++ b/light/Light.cpp
@@ -18,7 +18,11 @@
#include "Light.h"
+#include <fcntl.h>
+#include <sys/inotify.h>
+
#include <android-base/logging.h>
+#include <linux/input.h>
namespace {
@@ -52,6 +56,40 @@ static std::string getScaledDutyPcts(int brightness) {
return buf;
}
+static int openInputDeviceByName(const char* name) {
+ int fd;
+ unsigned int n;
+ char pathname[PATH_MAX];
+ char devname[256];
+
+ fd = -1;
+ n = 0;
+ while (fd < 0) {
+ sprintf(pathname, "/dev/input/event%u", n++);
+ fd = TEMP_FAILURE_RETRY(open(pathname, O_RDONLY | O_CLOEXEC));
+ if (fd < 0) {
+ // Fail: out of devices to try
+ break;
+ }
+ memset(devname, 0, sizeof(devname));
+ if (ioctl(fd, EVIOCGNAME(sizeof(devname) - 1), &devname) > 0) {
+ if (!strcmp(devname, name)) {
+ // Success
+ break;
+ }
+ }
+ close(fd);
+ fd = -1;
+ }
+
+ return fd;
+}
+
+static bool readEvent(int fd, input_event& ev) {
+ ssize_t len = TEMP_FAILURE_RETRY(read(fd, &ev, sizeof(ev)));
+ return (len == sizeof(ev));
+}
+
} // anonymous namespace
namespace android {
@@ -60,6 +98,39 @@ namespace light {
namespace V2_0 {
namespace implementation {
+static void* sliderMonitorThread(void* arg) {
+ Light* owner = (Light*)arg;
+ int fd;
+
+restart:
+ fd = openInputDeviceByName("gpio-keys");
+ if (fd < 0) {
+ LOG(ERROR) << "Cannot open slider input device";
+ sleep(1);
+ goto restart;
+ }
+
+ LOG(INFO) << "sliderMonitorThread enter loop";
+ while (1) {
+ struct input_event ev;
+ if (!readEvent(fd, ev)) {
+ LOG(ERROR) << "Failed to read slider event";
+ close(fd);
+ sleep(1);
+ goto restart;
+ }
+ // Ignore unwanted event types and codes (eg. EV_SYN)
+ if (ev.type != EV_SW || ev.code != SW_LID) {
+ continue;
+ }
+ bool open = (ev.value == 0);
+ owner->onSliderChanged(open);
+ }
+ close(fd);
+
+ return nullptr;
+}
+
static const std::string kSysLedPath = "/sys/class/leds";
Led::Led(int index, const std::string& name) :
@@ -126,17 +197,20 @@ Light::Light(std::pair<std::ofstream, uint32_t>&& lcd_backlight,
mRedLed(std::move(red_led)),
mGreenLed(std::move(green_led)),
mBlueLed(std::move(blue_led)),
- mRgbBlink(std::move(rgb_blink)) {
+ mRgbBlink(std::move(rgb_blink)),
+ mLcdBacklightOn(false),
+ mSliderOpen(false) {
auto attnFn(std::bind(&Light::setAttentionLight, this, std::placeholders::_1));
- auto keyboardBacklightFn(std::bind(&Light::setKeyboardBacklight, this, std::placeholders::_1));
- auto lcdBacklightFn(std::bind(&Light::setLcdBacklight, this, std::placeholders::_1));
+ auto backlightFn(std::bind(&Light::setLcdBacklight, this, std::placeholders::_1));
auto batteryFn(std::bind(&Light::setBatteryLight, this, std::placeholders::_1));
auto notifFn(std::bind(&Light::setNotificationLight, this, std::placeholders::_1));
mLights.emplace(std::make_pair(Type::ATTENTION, attnFn));
- mLights.emplace(std::make_pair(Type::BACKLIGHT, lcdBacklightFn));
+ mLights.emplace(std::make_pair(Type::BACKLIGHT, backlightFn));
mLights.emplace(std::make_pair(Type::BATTERY, batteryFn));
- mLights.emplace(std::make_pair(Type::KEYBOARD, keyboardBacklightFn));
mLights.emplace(std::make_pair(Type::NOTIFICATIONS, notifFn));
+
+ pthread_t th;
+ (void)pthread_create(&th, nullptr, sliderMonitorThread, this);
}
// Methods from ::android::hardware::light::V2_0::ILight follow.
@@ -164,6 +238,12 @@ Return<void> Light::getSupportedTypes(getSupportedTypes_cb _hidl_cb) {
return Void();
}
+void Light::onSliderChanged(bool open) {
+ std::lock_guard<std::mutex> lock(mLock);
+ mSliderOpen = open;
+ setKeyboardBacklightLocked();
+}
+
void Light::setAttentionLight(const LightState& state) {
std::lock_guard<std::mutex> lock(mLock);
mAttentionState = state;
@@ -173,6 +253,8 @@ void Light::setAttentionLight(const LightState& state) {
void Light::setLcdBacklight(const LightState& state) {
std::lock_guard<std::mutex> lock(mLock);
+ mLcdBacklightOn = (state.color != 0);
+
uint32_t brightness = rgbToBrightness(state);
// If max panel brightness is not the default (255),
@@ -184,14 +266,18 @@ void Light::setLcdBacklight(const LightState& state) {
}
mLcdBacklight.first << brightness << std::endl;
-}
-void Light::setKeyboardBacklight(const LightState& state) {
- std::lock_guard<std::mutex> lock(mLock);
-
- uint32_t brightness = isLit(state) ? MAX_BRIGHTNESS : 0;
+ setKeyboardBacklightLocked();
+}
- mKeyboardBacklight.first << brightness << std::endl;
+void Light::setKeyboardBacklightLocked() {
+ mKeyboardBacklight.second = (mSliderOpen && mLcdBacklightOn)
+ ? MAX_BRIGHTNESS
+ : 0;
+ LOG(INFO) << "setKeyboardBacklightLocked:" <<
+ " mSliderOpen=" << (mSliderOpen ? "true" : "false") <<
+ " mLcdBacklightOn=" << (mLcdBacklightOn ? "true" : "false");
+ mKeyboardBacklight.first << mKeyboardBacklight.second << std::endl;
}
void Light::setBatteryLight(const LightState& state) {
diff --git a/light/Light.h b/light/Light.h
index a5884e2..72a6d76 100644
--- a/light/Light.h
+++ b/light/Light.h
@@ -69,11 +69,13 @@ struct Light : public ILight {
Return<Status> setLight(Type type, const LightState& state) override;
Return<void> getSupportedTypes(getSupportedTypes_cb _hidl_cb) override;
+ void onSliderChanged(bool open);
+
private:
void setAttentionLight(const LightState& state);
void setBatteryLight(const LightState& state);
- void setKeyboardBacklight(const LightState& state);
void setLcdBacklight(const LightState& state);
+ void setKeyboardBacklightLocked();
void setNotificationLight(const LightState& state);
void setSpeakerBatteryLightLocked();
void setSpeakerLightLocked(const LightState& state);
@@ -91,6 +93,9 @@ struct Light : public ILight {
std::unordered_map<Type, std::function<void(const LightState&)>> mLights;
std::mutex mLock;
+
+ bool mLcdBacklightOn;
+ bool mSliderOpen;
};
} // namespace implementation
diff --git a/light/android.hardware.light@2.0-service.pro1.rc b/light/android.hardware.light@2.0-service.pro1.rc
index a607a79..90d2914 100644
--- a/light/android.hardware.light@2.0-service.pro1.rc
+++ b/light/android.hardware.light@2.0-service.pro1.rc
@@ -57,6 +57,6 @@ service vendor.light-hal-2-0 /vendor/bin/hw/android.hardware.light@2.0-service.p
interface android.hardware.light@2.0::ILight default
class hal
user system
- group system
+ group system input
# shutting off lights while powering-off
shutdown critical
diff --git a/sepolicy/vendor/hal_light_default.te b/sepolicy/vendor/hal_light_default.te
new file mode 100644
index 0000000..72fe06d
--- /dev/null
+++ b/sepolicy/vendor/hal_light_default.te
@@ -0,0 +1,2 @@
+allow hal_light_default input_device:dir search;
+allow hal_light_default input_device:chr_file rw_file_perms;