Dmitriy Geels wrote: > 2009/2/2 Anssi Hannula <anssi.hannula@xxxxxxxxx>: >>> I don't understand yet, how to fix this bug, so I'm posting this to >>> maillist with hope on someones help. >> The error message means that it can't find reports 0xab (create new >> effect), 0x89 (pid block load), 0x90 (pid block free), that according to >> your html page are in fact there. >> >> Could you provide the output with parameter debug=1 for hid module when >> device is initialized? It prints the raw HID descriptor and the kernel's >> interpretation of it. >> (If you have the hid module built-in, you can use "echo 1 > >> /sys/modules/hid/parameters/debug") > > I'm discovering this situation, but haven't got much progress. Now I > consider, that problem is not in hid-pidff, but somewhere deeper, like > in hid_parse_report(). > > I saw strange things: report for usage 0x90 has empty field->logical > field (should be 0x000f0090, was seen as "checking field->logical == > 0x00000000" earlier), that's why it's ignored. Reports, which are 0x25 > and 0x8b, are feature reports and I have no clue yet, why wrong usages > were put into field->logical. It is because those collections are defined as "Report collections" instead of "Logical collections". Linux doesn't know about "Report collections", but according to HID spec it is also a Logical collection: "Defines a logical collection that wraps all the fields in a report. A unique report ID will be contained in this collection. An application can easily determine whether a device supports a certain function. Note that any valid Report ID value can be declared for a Report collection." Try the attached patch, which simply changes the collection type for such collections. > Here is decoded hid descriptor with raw data: > http://docs.google.com/Doc?id=dhk68r8j_2gvttgsr8 > Here is just raw data: http://docs.google.com/Doc?id=dhk68r8j_38stwrngm -- Anssi Hannula
--- linux/drivers/hid/hid-core.c.old 2009-02-07 14:17:49.000000000 +0200 +++ linux/drivers/hid/hid-core.c 2009-02-07 14:22:45.000000000 +0200 @@ -142,6 +142,12 @@ parser->collection_stack[parser->collection_stack_ptr++] = parser->device->maxcollection; + /* Report collections (0x03), Named Array collections (0x04) and Usage + * Switch collections (0x05) are subtypes of logical collections + * according to the HID specification */ + if (type >= 0x03 && type <= 0x05) + type = HID_COLLECTION_LOGICAL; + collection = parser->device->collection + parser->device->maxcollection++; collection->type = type;