#include #include #include #include #include #include #include #include #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 : ""); } } 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); }