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;
}
}
+ 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)
" 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},
}
}
+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)
/* 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;
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);