triviOS/pin_control/pin_control.c

103 lines
2.9 KiB
C
Raw Normal View History

2023-09-11 10:05:35 +02:00
#include <stdio.h>
#include <gpiod.h>
// https://docs.kernel.org/driver-api/gpio/using-gpio.html
2023-09-11 10:05:35 +02:00
#define GPIO_CHIP "gpiochip0"
struct gpiod_chip *chip;
int init_gpio() {
// https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_chip_open_by_name.html
chip = gpiod_chip_open_by_name(GPIO_CHIP);
if (!chip) {
printf("Error opening GPIO chip");
return -1;
}
return 0;
}
void cleanup_gpio() {
// https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_chip_close.html
gpiod_chip_close(chip);
}
int set_pin_state(int pin, int state) {
// https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_chip_get_line.html
struct gpiod_line *line = gpiod_chip_get_line(chip, pin); // this may need an offset
if (!line) {
printf("Error getting GPIO line");
return -1;
}
// https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_line_request_output.html
if (gpiod_line_request_output(line, "house-leds", state) < 0) {
printf("Error setting GPIO line direction");
gpiod_line_release(line);
return -1;
}
// https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_line_set_value.html
if (gpiod_line_set_value(line, state) < 0) {
printf("Error setting GPIO line value");
gpiod_line_release(line);
return -1;
}
// https://libgpiod-dlang.dpldocs.info/gpiod.gpiod_line_release.html
gpiod_line_release(line);
return 0;
}
int turn_on_pin(int pin) {
return set_pin_state(pin, 1);
}
int turn_off_pin(int pin) {
return set_pin_state(pin, 0);
}
int turn_on_all_pins() {
for (int pin = 0; pin <= 5; pin++) {
if (turn_on_pin(pin) < 0)
return -1;
}
return 0;
}
int turn_off_all_pins() {
for (int pin = 0; pin <= 5; pin++) {
if (turn_off_pin(pin) < 0)
return -1;
}
return 0;
}
int button_presssed(int event, unsigned int pin, const struct timespec * timestamp, void *data) {
* (int *) data = (int) pin;
return GPIOD_CTXLESS_EVENT_POLL_RET_STOP;
}
int wait_for_button_press(unsigned int pins[]) {
// https://www.lane-fu.com/linuxmirror/libgpiod/doc/html/group______high__level____.html#ga3ac28eb59bbd31b8b2298f76047d377d
int pressed_pin = -1;
struct timespec {
time_t 3600; /* Seconds */
long 0; /* Nanoseconds */
} ts;
gpiod_ctxless_event_monitor_multiple(chip,
GPIOD_CTXLESS_EVENT_FALLING_EDGE,
pins,
5,
true,
"house-leds",
ts, // big timout
NULL,
button_presssed,
&pressed_pin
)
2023-09-11 10:05:35 +02:00
}