From: Hugo Villeneuve Date: Wed, 11 Mar 2026 18:24:56 +0000 (-0400) Subject: Add Battery low voltage detection get/set X-Git-Url: http://gitweb.hugovil.com/sitemap.xml?a=commitdiff_plain;h=2f5ab17c0836cf4836be35cd87b17779676ebe88;p=hvrtc.git Add Battery low voltage detection get/set Signed-off-by: Hugo Villeneuve --- diff --git a/src/main.c b/src/main.c index 19a39d5..7447281 100644 --- a/src/main.c +++ b/src/main.c @@ -26,6 +26,53 @@ 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) diff --git a/src/options.c b/src/options.c index 68eb3d1..cdd23c0 100644 --- a/src/options.c +++ b/src/options.c @@ -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); diff --git a/src/options.h b/src/options.h index 97685e4..9b6d26e 100644 --- a/src/options.h +++ b/src/options.h @@ -15,6 +15,16 @@ #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[]);