#ifdef WITH_LIBGPIOD
static void
-init_libgpiod(char const *gpio_name)
+init_libgpiod(char const *chip_name, char const *line_name, int line_num)
{
-
- libgpiod_line = gpiod_line_find(gpio_name);
- if (libgpiod_line == NULL)
- err(1, "GPIO line '%s'", gpio_name);
+ struct gpiod_chip * chip;
+
+ if (chip_name != NULL) {
+ chip = gpiod_chip_open_lookup(chip_name);
+ if (chip == NULL)
+ err(1, "GPIO chip '%s'", chip_name);
+ if (line_name != NULL) {
+ libgpiod_line = gpiod_chip_find_line(chip, line_name);
+ if (libgpiod_line == NULL)
+ err(1, "GPIO line '%s'", line_name);
+
+ } else {
+ libgpiod_line = gpiod_chip_get_line(chip, line_num);
+ if (libgpiod_line == NULL)
+ err(1, "GPIO line %d", line_num);
+ }
+ } else {
+ libgpiod_line = gpiod_line_find(line_name);
+ if (libgpiod_line == NULL)
+ err(1, "GPIO line '%s'", line_name);
+ }
if (gpiod_line_request_output(libgpiod_line, "clunk", false) == -1)
- err(1, "requesting '%s'", gpio_name);
+ err(1, "requesting GPIO line");
outfn = &libgpiod_out;
}
#endif /* WITH_LIBGPIOD */
.sigev_signo = SIGALRM
};
char *statefile = NULL, *statestr = NULL;
+#ifdef WITH_LIBGPIOD
+ char *gpiod_chip = NULL, *gpiod_line_name = NULL;
+ int gpiod_line_num = -1;
+#endif
int opt;
tzset();
while ((opt = getopt(argc, argv, "f:s:Y:"
#ifdef WITH_LIBGPIOD
- "G:"
+ "G:C:L:"
#endif /* WITH_LIBGPIOD */
)) != -1) {
switch (opt) {
break;
#ifdef WITH_LIBGPIOD
case 'G':
- init_libgpiod(optarg);
+ gpiod_line_name = optarg;
+ break;
+ case 'C':
+ gpiod_chip = optarg;
+ break;
+ case 'L':
+ gpiod_line_num = atoi(optarg);
break;
#endif /* WITH_LIBGPIOD */
case 'Y':
err(1, "localtime_r");
displayed.tm_sec = (displayed.tm_sec >= 30) ? 30 : 0;
}
+#ifdef WITH_LIBGPIOD
+ if (gpiod_line_name != NULL || gpiod_chip != NULL)
+ init_libgpiod(gpiod_chip, gpiod_line_name, gpiod_line_num);
+#endif
}
enum need_adjust { STOP, TICK, ADVANCE };