/* * Poll-free SLV-IN (GPIO1/CD) edge monitor using POG422 driver ioctl. * * ./gpio1_hs_monitor /dev/ttyXRUSB1 */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include "../xr_usb_serial_ioctl.h" int main(int argc, char **argv) { const char *port = (argc > 1) ? argv[1] : "/dev/ttyXRUSB1"; int fd; struct xr_pog422_gpio1_event ev; fd = open(port, O_RDWR | O_NOCTTY); if (fd < 0) { fprintf(stderr, "open %s: %s\n", port, strerror(errno)); return 1; } printf("gpio1_hs_monitor on %s (Ctrl-C to stop)\n", port); printf("waiting for XR_USB_SERIAL_WAIT_GPIO1 edges...\n"); for (;;) { memset(&ev, 0, sizeof(ev)); if (ioctl(fd, XR_USB_SERIAL_WAIT_GPIO1, &ev) != 0) { if (errno == EINTR) continue; fprintf(stderr, "WAIT_GPIO1: %s\n", strerror(errno)); if (errno == EOPNOTSUPP) fprintf(stderr, "Driver may be BrainlyTree 1C without POG422 GPIO int.\n"); close(fd); return 1; } printf("edge ns=%" PRIu64 " gpio_state=0x%04x gpio_int=0x%04x slv_in_active=%u\n", (uint64_t)ev.timestamp_ns, (unsigned)ev.gpio_state, (unsigned)ev.gpio_int, (unsigned)ev.slv_in_active); } close(fd); return 0; }