6 #include <linux/hiddev.h>
15 #define PRINT_FIELD(level, field) trace(level, #field ": %04x\n", field)
17 #define HIDDEV_PATH "/dev/usb/"
19 int hiddev_read(unsigned char *data, int bufsize, int fd)
21 struct hiddev_event readBuffer[READ_BUFFER_LENGTH];
24 ret = read(fd, readBuffer, sizeof(readBuffer));
28 n = ret / sizeof(readBuffer[0]);
29 for (i = 0; i < n && i < bufsize; i++)
30 data[i] = readBuffer[i].value;
34 int hiddev_write(const unsigned char data[64], int fd , int usage_code)
36 int rc = 0, uindex, error;
38 struct hiddev_usage_ref uref;
39 struct hiddev_report_info rinfo;
41 uref.report_id = *data++;
42 uref.report_type = HID_REPORT_TYPE_OUTPUT;
45 uref.usage_code = usage_code;
47 for (uindex = 0; uindex < 63; uindex++) {
48 uref.usage_index = uindex;
51 rc = ioctl(fd, HIDIOCSUSAGE, &uref);
56 rinfo.report_type = HID_REPORT_TYPE_OUTPUT;
57 rinfo.report_id = 0x0;
60 rc = ioctl(fd, HIDIOCSREPORT, &rinfo);
66 printf("HIDIOCSREPORT\n");
69 printf("Error in IOCTL: %s\n", strerror(error));
74 static int get_usagecode(int fd)
76 struct hiddev_usage_ref uref;
79 uref.report_type = HID_REPORT_TYPE_OUTPUT;
84 rc = ioctl(fd, HIDIOCGUCODE, &uref);
87 printf("Error gettin usage code: %s\n", strerror(error));
91 return uref.usage_code;
94 static int _hiddev_open(const char *device_path, int *usage_code,
95 int vendor_id, int product_id)
97 struct hiddev_devinfo device_info;
98 struct hiddev_report_info rinfo;
102 trace(3, "Opening device %s\n", device_path);
103 fd = ret = open(device_path, O_RDWR);
108 rinfo.report_type = HID_REPORT_TYPE_OUTPUT;
109 rinfo.report_id = HID_REPORT_ID_FIRST;
110 ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo);
114 PRINT_FIELD(3, rinfo.report_type);
115 PRINT_FIELD(3, rinfo.report_id);
116 PRINT_FIELD(3, rinfo.num_fields);
118 *usage_code = get_usagecode(fd);
123 ret = ioctl(fd, HIDIOCGDEVINFO, &device_info);
128 PRINT_FIELD(3, device_info.bustype);
129 PRINT_FIELD(3, device_info.busnum);
130 PRINT_FIELD(3, device_info.devnum);
131 PRINT_FIELD(3, device_info.ifnum);
132 PRINT_FIELD(3, device_info.vendor);
133 PRINT_FIELD(3, device_info.product);
134 PRINT_FIELD(3, device_info.version);
135 PRINT_FIELD(3, device_info.num_applications);
137 if (product_id && vendor_id) {
138 if (product_id == device_info.product &&
139 vendor_id == device_info.vendor)
141 trace(3, "Vendor and product IDs don't match\n");
153 printf("Error opening device %s: %s\n", device_path,
158 int hiddev_open(const char *device_path, int *usage_code)
160 return _hiddev_open(device_path, usage_code, 0, 0);
163 int hiddev_open_by_id(int vendor_id, int product_id, int *usage_code)
165 struct dirent *dirent;
170 dir = opendir(HIDDEV_PATH);
173 printf("Failed to open directory %s: %s\n", HIDDEV_PATH,
178 while ((dirent = readdir(dir))) {
179 if (strncmp(dirent->d_name, "hiddev", sizeof("hiddev") - 1))
183 strncat(path, HIDDEV_PATH, sizeof(path) - 1);
184 strncat(path, dirent->d_name, sizeof(path) - 1);
186 fd = _hiddev_open(path, usage_code, product_id, vendor_id);
194 trace(0, "Error reading directory %s: %s\n", HIDDEV_PATH,
199 trace(0, "Canno't find any mathing hiddev devices\n");