]> Untitled Git - hvrtc.git/commitdiff
Add Battery low voltage detection get/set batlow_param
authorHugo Villeneuve <hvilleneuve@dimonoff.com>
Wed, 11 Mar 2026 18:24:56 +0000 (14:24 -0400)
committerHugo Villeneuve <hvilleneuve@dimonoff.com>
Wed, 11 Mar 2026 18:42:36 +0000 (14:42 -0400)
Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
src/main.c
src/options.c
src/options.h

index 19a39d562d4fe3f9939a1a316832dfcf42159675..7447281be3cce9101aa8ad139b1987b7c9a2015a 100644 (file)
 
 extern struct options_t options;
 
+static int rtc_param_get_batlow(int fd)
+{
+       const char *mode;
+       struct rtc_param par;
+       int ret;
+
+       par.param = RTC_PARAM_BATTERY_LOW_DETECT;
+       ret = ioctl(fd, RTC_PARAM_GET, &par);
+       if (ret < 0) {
+               perror("get RTC_PARAM_BATTERY_LOW_DETECT");
+               return ret;
+       }
+
+       switch (par.uvalue) {
+       case RTC_BATTERY_LOW_DETECT_DISABLED:
+               mode = "disabled";
+               break;
+       case RTC_BATTERY_LOW_DETECT_ENABLED:
+               mode = "enabled";
+               break;
+       default:
+               mode = "unknown";
+               break;
+       };
+
+       printf("Battery low detection: %s\n", mode);
+
+       return 0;
+}
+
+static int rtc_param_set_batlow(int fd, int value)
+{
+       struct rtc_param par;
+       int ret;
+
+       par.param = RTC_PARAM_BATTERY_LOW_DETECT;
+       par.uvalue = value;
+
+       ret = ioctl(fd, RTC_PARAM_SET, &par);
+       if (ret < 0) {
+               perror("get RTC_PARAM_BATTERY_LOW_DETECT");
+               return ret;
+       }
+
+       return 0;
+}
+
 static int rtc_param_get_bsm(int fd)
 {
        const char *mode;
@@ -444,6 +491,18 @@ main(int argc, char **argv)
                }
        }
 
+       if (options.batlow) {
+               if (options.batlow_arg >= 0) {
+                       rc = rtc_param_set_batlow(fd, options.batlow_arg);
+                       if (rc < 0)
+                               exit(rc);
+               } else {
+                       rc = rtc_param_get_batlow(fd);
+                       if (rc < 0)
+                               exit(rc);
+               }
+       }
+
        if (options.vl_backup) {
                rc = rtc_param_get_vl_backup(fd);
                if (rc < 0)
index 68eb3d1e09675eb8be7fdb997c268264d2595caa..cdd23c005b80558b3e295b03d6bf560492b161cc 100644 (file)
@@ -55,12 +55,18 @@ static const char args_doc[] = "";
        "    level    RTC_BSM_LEVEL\n"                                  \
        "    standby  RTC_BSM_STANDBY"
 
+#define ARGP_BATLOW_STR                                \
+       "    enabled\n"                         \
+       "    disabled"
+
 /* The options we understand. */
 static struct argp_option argp_options[] = {
        {"bsm",   'b', "value",   OPTION_ARG_OPTIONAL, "Get/Set Backup Switch Mode (BSM):", 0},
        {0,       0,   0,         0,                   ARGP_BSM_STR, 0},
        {"clear", 'c', 0,         0, "Clear \"voltage low\" event", 0},
        {"dev",   'd', "path",    0, "RTC device path (optional)", 0},
+       {"lowbat",'l', "value",   OPTION_ARG_OPTIONAL, "Get/Set Battery low voltage detection:", 0},
+       {0,       0,   0,         0,                   ARGP_BATLOW_STR, 0},
        {"test",  'x', 0,         0, "Test RTC", 0},
        {"time",  't', 0,         0, "Get RTC time", 0},
        {"voltage-level", 'v', 0, 0, "Get battery backup voltage level", 0},
@@ -114,6 +120,19 @@ decode_bsm(char *arg, struct argp_state *state)
        }
 }
 
+static void
+decode_batlow(char *arg, struct argp_state *state)
+{
+       if (STREQ(arg, "enabled")) {
+               options.batlow_arg = RTC_BATTERY_LOW_DETECT_ENABLED;
+       } else if (STREQ(arg, "disabled")) {
+               options.batlow_arg = RTC_BATTERY_LOW_DETECT_DISABLED;
+       } else {
+               log_fail("Unknown battery low detection value: %s\n", arg);
+               argp_usage(state);
+       }
+}
+
 /* Parse a single option. */
 static error_t
 parse_opt(int key, char *arg, struct argp_state *state)
@@ -138,6 +157,11 @@ parse_opt(int key, char *arg, struct argp_state *state)
                /* We do not support any arguments after the options. */
                argp_usage(state);
                break;
+       case 'l':
+               options.batlow = true;
+               if (arg)
+                       decode_batlow(arg, state);
+               break;
        case 't':
                options.time = true;
                break;
@@ -167,6 +191,7 @@ int parse_command_line_options(int argc, char *argv[])
        bzero(&options, sizeof(struct options_t));
        options.rtc_path = "/dev/rtc0";
        options.bsm_arg = -1;
+       options.batlow_arg = -1;
 
        /* Parse our arguments. */
        rc = argp_parse(&argp, argc, argv, 0, 0, NULL);
index 97685e4c23bec0b9735959f2f2351a118fa45c29..9b6d26ef3f5c92155c3ab1f484eb78cd502d3c5b 100644 (file)
 
 #define PACKAGE_DESCRIPTION "RTC configuration/query tool"
 
+/*
+ * Temporary: from kernel headers.
+ * Remove once kernel headers incorporate these:
+ */
+#ifndef RTC_PARAM_BATTERY_LOW_DETECT
+#define RTC_PARAM_BATTERY_LOW_DETECT 3
+#define RTC_BATTERY_LOW_DETECT_DISABLED        0
+#define RTC_BATTERY_LOW_DETECT_ENABLED 1
+#endif
+
 struct options_t {
        char *rtc_path;
        int bsm;
@@ -23,6 +33,8 @@ struct options_t {
        int clear;
        int test;
        int time;
+       int batlow;
+       int batlow_arg;
 };
 
 int parse_command_line_options(int argc, char *argv[]);