[moved to nut-upsdev while we figure out the protocol] > On Mar 9, 2017, at 11:22 AM, Drew from Zhrodague > <drewzhroda...@zhrodague.net> wrote: > > I'm able to cat /dev/usb/hiddev0 and /dev/hidraw0 - I pipe this through > hexdump and I get different types of data from each: > > > hiddev: > > 0002420 00a7 ffa0 00ff 0000 00a7 ffa0 00ff 0000 > 0002430 00a7 ffa0 00a3 0000 00a7 ffa0 0001 0000 > 0002440 00a6 ffa0 0080 0000 00a7 ffa0 0011 0000 > 0002450 00a7 ffa0 00bd 0000 00a7 ffa0 0057 0000 > 0002460 00a7 ffa0 00ff 0000 00a7 ffa0 00ff 0000 > 0002470 00a7 ffa0 00a3 0000 00a7 ffa0 0001 0000 > > > hidraw: > > 0000000 1180 59e1 ffff 01a3 1180 59e2 ffff 01a3 > 0000010 1180 5ae3 ffff 01a3 1180 5ae4 ffff 01a3 > 0000020 1180 5ae5 ffff 01a3 1180 5ae6 ffff 01a3 > 0000030 1180 5ae7 ffff 01a3 1180 5ae8 ffff 01a3 > 0000040 1180 5ae9 ffff 01a3 1180 5aea ffff 01a3 > 0000050 1180 5aeb ffff 01a3 1180 5aec ffff 01a3
I was trying to reconcile this with your earlier information from usbhid-dump, and it looks like hexdump is swapping bytes: $ printf 12345678|hexdump 0000000 3231 3433 3635 3837 0000008 You can do one of the following to get the natural order, plus an ASCII dump: $ printf 12345678|hexdump -C 00000000 31 32 33 34 35 36 37 38 |12345678| 00000008 $ printf 12345678|hd 00000000 31 32 33 34 35 36 37 38 |12345678| 00000008 > I haven't been able to figure out what the differences between hiddev > and hidraw are, but the first one has the state (0001), and the second one > has the timers (59e2). It also looks like there are two sentences per line. > > I have put together a bash script to fetch a few lines from the hiddev, > and look for a key/value - sometimes what I'm using as a key changes between > boots. It may not be a key/value pair. Here's the kernel documentation: https://www.kernel.org/doc/Documentation/hid/hiddev.txt https://www.kernel.org/doc/Documentation/hid/hidraw.txt In both cases, "cat" is triggering the "read()" operation in each driver. > In its basic mode, the hiddev will make these individual > usage changes available to the reader using a struct hiddev_event: > > struct hiddev_event { > unsigned hid; > signed int value; > }; I think the "hid" value in the hiddev output is one of "ffa000a6" or "ffa000a7", but byte-swapped (still i686, right?) and hexdump-swapped to "00a6 ffa0" and "00a7 ffa0". The next four bytes are the zero-padded version of each byte that shows up in the hidraw output. I'm not sure what the difference between the ...a6 and ...a7 parts are -- the HID Report Descriptor is not well-formed. It does look like the a6 part comes right before the 80, which seems to be at the beginning of the message. For hidraw, it looks like we could just read 8 bytes at once, and be done. >> If you are interested in taking a look at related code, these two drivers >> are probably good starting points: >> >> * >> https://github.com/networkupstools/nut/blob/libusb-1.0/drivers/nutdrv_atcl_usb.c >> >> * >> https://github.com/networkupstools/nut/blob/libusb-1.0/drivers/richcomm_usb.c I mention these two drivers because, as I recall, they are also for non-PDC HID devices. For portability, NUT tends to use libusb rather than the Linux-specific hiddev/hidraw APIs. We have a few options: * Use hidraw, which is only available on Linux, but is known to work with this device. This would require a bit of autoconf plumbing in order to prevent other platforms from building the new driver. * Use HIDAPI, a portability library written by Alan Ott (author of the hidraw.txt kernel documentation). Adds another dependency that we haven't used yet. * Use libhid, which involves detaching the hiddev/hidraw driver from the device. We do this all the time with PDC HID devices. It might take a little more experimenting to find the libusb command to send. NUT developers: anyone else want to weigh in here? I'm leaning towards the third option, but I'm open to suggestions. _______________________________________________ Nut-upsdev mailing list Nut-upsdev@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/nut-upsdev