On 10/08/2013 10:05 PM, Nikolai Kondrashov wrote:
Revert "HID: fix unit exponent parsing" as it is based on incorrect understanding of the HID specification and breaks resolution calculation at least on graphics tablets. There are two "unit exponents" in HID specification and it is important not to mix them. One is the global "Unit Exponent" item and another is nibble values in the global "Unit" item. See 6.2.2.7 Global Items. The "Unit Exponent" value is just a signed integer and is used to scale the integer resolution unit values, so fractions can be expressed.
I see now that the official "HID Descriptor Tool" writes the "Unit Exponent" as a two's complement nibble and Microsoft cites binary representations as such (although they seem to be made with that tool). This likely means most report descriptors in the wild store it as such. Which probably means that it is more practical to expect them to be so, but I don't have any statistically-significant data. However, I still think that this interpretation of the standard is incorrect (the standard is vague in this part). First, the specification says about "Unit Exponent": Value of the unit exponent in base 10. See the table later in this section for more information. I.e. nothing about nibbles. It refers to a table, but doesn't say which one. However, the first table appearing later is a mouse example mentioning an exponent. The specification also mentions the one-byte prefix for the item to be "0101 01 nn", where "nn" is the size value, which would be pointless to have anything different from 1 byte, if it was limited to a nibble. And lastly and most importantly there is no point in limiting the "Unit Exponent" to a nibble where you have a full 32-bit signed integer available, thus complicating encoding/decoding and limiting the possible reported unit scale. From what data I have on various non-Wacom graphics tablets, most of the older ones provide incorrect "unit" item value, so "unit exponent" doesn't apply. However, some recent ones, such as made by Huion, do have correct units, and nibble-stored "unit exponent". And I was wondering where that strange data came from. Sigh... I'll try to reach usb.org for comments on this. Meanwhile, can I suggest a hybrid approach? As positive unit exponent beyond 7 is unlikely to appear for axes which have their resolution calculated currently, can we assume anything higher than 7 to be nibble-stored negative exponents and anything else normal signed integers? Sincerely, Nick -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html