From 333a4273eb26ffc47b29f3ea8ce3213d36803894 Mon Sep 17 00:00:00 2001 From: Jami Kettunen Date: Fri, 16 Oct 2020 23:54:54 +0300 Subject: flashlight: Add support for simpler sysfs toggles (#34) Unlike the overcomplicated Qualcomm mess, there are also simpler sysfs toggles which you can just write 1/0 to when enabling/disabling the flash. This is used by the MediaTek flashlight_core driver on the Volla Phone (Helio P23 / MT6763) for example, which this also adds support for. Pinephone also uses a simple sysfs toggle for flashlight. --- src/flashlight.c | 70 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 14 deletions(-) (limited to 'src/flashlight.c') diff --git a/src/flashlight.c b/src/flashlight.c index 55a108a..8aba2b5 100644 --- a/src/flashlight.c +++ b/src/flashlight.c @@ -26,6 +26,8 @@ #define QCOM_ENABLE "255" #define QCOM_DISABLE "0" +#define SIMPLE_ENABLE "1" +#define SIMPLE_DISABLE "0" const size_t qcom_sysfs_size = 5; const char* const qcom_sysfs[] = {"/sys/class/leds/torch-light/brightness", @@ -33,10 +35,14 @@ const char* const qcom_sysfs[] = {"/sys/class/leds/torch-light/brightness", "/sys/class/leds/flashlight/brightness", "/sys/class/leds/torch-light0/brightness", "/sys/class/leds/torch-light1/brightness"}; - const char* qcom_torch_enable = "/sys/class/leds/led:switch/brightness"; +const size_t simple_sysfs_size = 2; +const char* const simple_sysfs[] = {"/sys/class/flashlight_core/flashlight/flashlight_torch", + "/sys/class/leds/white:flash/brightness"}; + char* flash_sysfs_path = NULL; +enum TorchType torch_type = SIMPLE; gboolean activated = 0; int @@ -45,6 +51,13 @@ set_sysfs_path() for (size_t i = 0; i < qcom_sysfs_size; i++) { if (access(qcom_sysfs[i], F_OK ) != -1){ flash_sysfs_path = (char*)qcom_sysfs[i]; + torch_type = QCOM; + return 1; + } + } + for (size_t i = 0; i < simple_sysfs_size; i++) { + if (access(simple_sysfs[i], F_OK ) != -1){ + flash_sysfs_path = (char*)simple_sysfs[i]; return 1; } } @@ -57,22 +70,12 @@ flashlight_activated() return activated; } -void -toggle_flashlight_action(GAction *action, - GVariant *parameter G_GNUC_UNUSED, - gpointer data G_GNUC_UNUSED) +int +toggle_flashlight_action_qcom() { - GVariant *state; FILE *fd1 = NULL, *fd2 = NULL; - int needs_enable; - if (!set_sysfs_path()) - return; - - state = g_action_get_state(action); - activated = g_variant_get_boolean(state); - g_variant_unref(state); fd1 = fopen(flash_sysfs_path, "w"); if (fd1 != NULL) { needs_enable = access(qcom_torch_enable, F_OK ) != -1; @@ -91,8 +94,47 @@ toggle_flashlight_action(GAction *action, fclose(fd1); if (fd2 !=NULL) fclose(fd2); - g_action_change_state(action, g_variant_new_boolean(!activated)); + return 1; } + return 0; +} + +int +toggle_flashlight_action_simple() +{ + FILE *fd = NULL; + + fd = fopen(flash_sysfs_path, "w"); + if (fd != NULL) { + fprintf(fd, activated ? SIMPLE_DISABLE : SIMPLE_ENABLE); + fclose(fd); + return 1; + } + return 0; +} + +void +toggle_flashlight_action(GAction *action, + GVariant *parameter G_GNUC_UNUSED, + gpointer data G_GNUC_UNUSED) +{ + GVariant *state; + int toggled; + + if (!set_sysfs_path()) + return; + + state = g_action_get_state(action); + activated = g_variant_get_boolean(state); + g_variant_unref(state); + + if (torch_type == QCOM) + toggled = toggle_flashlight_action_qcom(); + else + toggled = toggle_flashlight_action_simple(); + + if (toggled) + g_action_change_state(action, g_variant_new_boolean(!activated)); } int -- cgit v1.2.3 From 2432f6b35d49b5f7f270a2408f26bbb658541a9d Mon Sep 17 00:00:00 2001 From: Jami Kettunen Date: Thu, 3 Dec 2020 03:27:13 +0200 Subject: flashlight: Add support for PM8998 based SoCs These sysfs and switch paths are used on Qualcomm SoCs which contain a PM8998 PMIC block. This at the very least includes the Snapdragon 835 (MSM8998) and Snapdragon 845 (SDM845). This was tested as working on the OnePlus 5 (MSM8998) and OnePlus 6 (SDM845) smartphones. --- src/flashlight.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/flashlight.c') diff --git a/src/flashlight.c b/src/flashlight.c index 8aba2b5..064bd31 100644 --- a/src/flashlight.c +++ b/src/flashlight.c @@ -29,19 +29,25 @@ #define SIMPLE_ENABLE "1" #define SIMPLE_DISABLE "0" -const size_t qcom_sysfs_size = 5; +const size_t qcom_sysfs_size = 7; const char* const qcom_sysfs[] = {"/sys/class/leds/torch-light/brightness", "/sys/class/leds/led:flash_torch/brightness", "/sys/class/leds/flashlight/brightness", "/sys/class/leds/torch-light0/brightness", - "/sys/class/leds/torch-light1/brightness"}; -const char* qcom_torch_enable = "/sys/class/leds/led:switch/brightness"; + "/sys/class/leds/torch-light1/brightness", + "/sys/class/leds/led:torch_0/brightness", + "/sys/class/leds/led:torch_1/brightness"}; +const size_t qcom_switch_size = 2; +const char* const qcom_switch[] = {"/sys/class/leds/led:switch/brightness", + "/sys/class/leds/led:switch_0/brightness"}; const size_t simple_sysfs_size = 2; const char* const simple_sysfs[] = {"/sys/class/flashlight_core/flashlight/flashlight_torch", "/sys/class/leds/white:flash/brightness"}; char* flash_sysfs_path = NULL; +char* qcom_switch_path = NULL; + enum TorchType torch_type = SIMPLE; gboolean activated = 0; @@ -52,6 +58,11 @@ set_sysfs_path() if (access(qcom_sysfs[i], F_OK ) != -1){ flash_sysfs_path = (char*)qcom_sysfs[i]; torch_type = QCOM; + /* Qualcomm torch; determine switch file (if one is needed) */ + for (size_t i = 0; i < qcom_switch_size; i++) { + if (access(qcom_switch[i], F_OK ) != -1) + qcom_switch_path = (char*)qcom_switch[i]; + } return 1; } } @@ -78,9 +89,9 @@ toggle_flashlight_action_qcom() fd1 = fopen(flash_sysfs_path, "w"); if (fd1 != NULL) { - needs_enable = access(qcom_torch_enable, F_OK ) != -1; + needs_enable = access(qcom_switch_path, F_OK ) != -1; if (needs_enable) - fd2 = fopen(qcom_torch_enable, "w"); + fd2 = fopen(qcom_switch_path, "w"); if (activated) if (needs_enable && fd2 != NULL) fprintf(fd2, "0"); -- cgit v1.2.3