charge-thresholds.c (1860B)
1 /* suid tool for setting battery charge thresholds 2 * GPL-3 3 */ 4 #include <stdio.h> 5 #include <string.h> 6 #include <stdlib.h> 7 8 #include "arg.h" 9 #include "common.h" 10 11 static const char *START_FD = "/sys/class/power_supply/BAT0/charge_control_start_threshold"; 12 static const char *END_FD = "/sys/class/power_supply/BAT0/charge_control_end_threshold"; 13 14 char *argv0; 15 16 static void usage(void) 17 { 18 die("usage: %s full-charge|balanced|max-lifespan\n\n" 19 "full-charge:\n" 20 "Battery is charged to its full capacity for longest possible use on\n" 21 "battery power. Charging resumes when the battery falls below 96%%.\n\n" 22 23 "balanced:\n" 24 "Use this threshold when you unplug frequently but don't need the\n" 25 "full battery capacity. Charging stops when the battery reaches 90%%\n" 26 "capacity and resumes when it falls below 85%%\n\n" 27 28 "max-lifespan:\n" 29 "Use this threshold if you rarely use the system on battery for\n" 30 "extended periods. Charging stops when the battery reaches 60%%\n" 31 "capacity and resumes when battery falls below 50%%\n", argv0); 32 } 33 34 int main(int argc, char *argv[]) 35 { 36 int start, end; 37 38 ARGBEGIN { 39 } ARGEND; 40 41 if (argc != 1) 42 usage(); 43 44 if (!strcmp(argv[0], "full-charge")) { 45 start = 96; 46 end = 100; 47 } else if (!strcmp(argv[0], "balanced")) { 48 start = 86; 49 end = 90; 50 } else if (!strcmp(argv[0], "max-lifespan")) { 51 start = 50; 52 end = 60; 53 } else { 54 usage(); 55 return 1; 56 } 57 58 /* Without this, setting start threshold may fail if the previous end 59 * threshold is higher */ 60 if (write_oneshot_int(END_FD, 100)) 61 die("Could not open %s for writing:", END_FD); 62 63 if (write_oneshot_int(START_FD, start)) 64 die("Could not open %s for writing:", START_FD); 65 66 if (write_oneshot_int(END_FD, end)) 67 die("Could not open %s for writing:", END_FD); 68 69 return 0; 70 }