5 #include <linux/hiddev.h>
13 #define PRINT_FIELD(level, field) trace(level, #field ": %04x\n", field)
15 int hiddev_read(unsigned char *data, int bufsize, int fd)
17 struct hiddev_event readBuffer[READ_BUFFER_LENGTH];
20 ret = read(fd, readBuffer, sizeof(readBuffer));
24 n = ret / sizeof(readBuffer[0]);
25 for (i = 0; i < n && i < bufsize; i++)
26 data[i] = readBuffer[i].value;
30 int hiddev_write(const unsigned char data[64], int fd , int usage_code)
32 int rc = 0, uindex, error;
34 struct hiddev_usage_ref uref;
35 struct hiddev_report_info rinfo;
37 uref.report_id = *data++;
38 uref.report_type = HID_REPORT_TYPE_OUTPUT;
41 uref.usage_code = usage_code;
43 for (uindex = 0; uindex < 63; uindex++) {
44 uref.usage_index = uindex;
47 rc = ioctl(fd, HIDIOCSUSAGE, &uref);
52 rinfo.report_type = HID_REPORT_TYPE_OUTPUT;
53 rinfo.report_id = 0x0;
56 rc = ioctl(fd, HIDIOCSREPORT, &rinfo);
62 printf("HIDIOCSREPORT\n");
65 printf("Error in IOCTL: %s\n", strerror(error));
70 static int get_usagecode(int fd)
72 struct hiddev_usage_ref uref;
75 uref.report_type = HID_REPORT_TYPE_OUTPUT;
80 rc = ioctl(fd, HIDIOCGUCODE, &uref);
83 printf("Error gettin usage code: %s\n", strerror(error));
87 return uref.usage_code;
90 int hiddev_open(const char *device_path, int *usage_code)
92 struct hiddev_devinfo device_info;
93 struct hiddev_report_info rinfo;
96 fd = ret = open(device_path, O_RDWR);
102 rinfo.report_type = HID_REPORT_TYPE_OUTPUT;
103 rinfo.report_id = HID_REPORT_ID_FIRST;
104 ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo);
108 PRINT_FIELD(3, rinfo.report_type);
109 PRINT_FIELD(3, rinfo.report_id);
110 PRINT_FIELD(3, rinfo.num_fields);
112 *usage_code = get_usagecode(fd);
117 ret = ioctl(fd, HIDIOCGDEVINFO, &device_info);
122 PRINT_FIELD(3, device_info.bustype);
123 PRINT_FIELD(3, device_info.busnum);
124 PRINT_FIELD(3, device_info.devnum);
125 PRINT_FIELD(3, device_info.ifnum);
126 PRINT_FIELD(3, device_info.vendor);
127 PRINT_FIELD(3, device_info.product);
128 PRINT_FIELD(3, device_info.version);
129 PRINT_FIELD(3, device_info.num_applications);
135 printf("Error opening device %s: %s\n", device_path, strerror(error));