60 lines
1.9 KiB
C
60 lines
1.9 KiB
C
#include <fcntl.h>
|
|
#include <inttypes.h>
|
|
#include <linux/gpio.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <sys/ioctl.h>
|
|
#include <unistd.h>
|
|
|
|
#define check(e) \
|
|
({ \
|
|
int ec = (e); \
|
|
if (ec < 0) { \
|
|
perror(#e); \
|
|
exit(1); \
|
|
} \
|
|
ec; \
|
|
})
|
|
|
|
void gpio_info(int gpio_fd) {
|
|
struct gpiochip_info chip_info;
|
|
check(ioctl(gpio_fd, GPIO_GET_CHIPINFO_IOCTL, &chip_info));
|
|
|
|
printf("Name: %s, Label: %s, %" PRIu32 " lines\n", chip_info.name,
|
|
chip_info.label, chip_info.lines);
|
|
|
|
for (__u32 i = 0; i != chip_info.lines; ++i) {
|
|
struct gpio_v2_line_info line_info = {
|
|
.offset = i,
|
|
};
|
|
check(ioctl(gpio_fd, GPIO_V2_GET_LINEINFO_IOCTL, &line_info));
|
|
printf("Line %" PRIu32 ": '%s'. Consumer: %s\n", i, line_info.name,
|
|
line_info.consumer[0] ? line_info.consumer : "<none>");
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
int gpio0 = check(open("/dev/gpiochip0", O_RDWR));
|
|
|
|
gpio_info(gpio0);
|
|
|
|
#if 0
|
|
struct gpio_v2_line_request line_request = {
|
|
.offsets = {18},
|
|
.num_lines = 1,
|
|
.consumer = "my-super-cool-gpio",
|
|
};
|
|
check(ioctl(gpio0, GPIO_V2_GET_LINE_IOCTL, &line_request));
|
|
|
|
struct gpio_v2_line_info line_info = {
|
|
.offset = 18,
|
|
};
|
|
check(ioctl(gpio0, GPIO_V2_GET_LINEINFO_IOCTL, &line_info));
|
|
printf("Line 18: '%s'. Consumer: '%s'\n", line_info.name, line_info.consumer);
|
|
|
|
close(line_request.fd);
|
|
#endif
|
|
close(gpio0);
|
|
}
|