/* * Hidraw Userspace Example * * Copyright (c) 2010 Alan Ott * Copyright (c) 2010 Signal 11 Software * * The code may be used by anyone for any purpose, * and can serve as a starting point for developing * applications using hidraw. */ /* Linux */ #include #include #include /* * Ugly hack to work around failing compilation on systems that don't * yet populate new version of hidraw.h to userspace. * * If you need this, please have your distro update the kernel headers. */ #ifndef HIDIOCSFEATURE #define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) #define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) #endif /* Unix */ #include #include #include #include #include /* C */ #include #include #include #include const char *bus_str(int bus); int main(int argc, char **argv) { int fd; int i, res, desc_size = 0; unsigned char buf[256]; struct hidraw_report_descriptor rpt_desc; struct hidraw_devinfo info; if (argc != 2) { fprintf(stderr, "usage: %s \n", argv[0]); return 1; } /* Open the Device with non-blocking reads. In real life, don't use a hard coded path; use libudev instead. */ fd = open(argv[1], O_RDONLY); if (fd < 0) { perror("Unable to open device"); return 1; } memset(&rpt_desc, 0x0, sizeof(rpt_desc)); memset(&info, 0x0, sizeof(info)); memset(buf, 0x0, sizeof(buf)); retry: /* Get a report from the device */ res = read(fd, buf, 16); if (res < 0) { perror("read"); } else { printf("read() read %d bytes:\n\t", res); for (i = 0; i < res; i++) printf("%02x ", buf[i]); puts("\n"); } goto retry; close(fd); return 0; } const char * bus_str(int bus) { switch (bus) { case BUS_USB: return "USB"; break; case BUS_HIL: return "HIL"; break; case BUS_BLUETOOTH: return "Bluetooth"; break; case BUS_VIRTUAL: return "Virtual"; break; default: return "Other"; break; } }