Re: hid-pidff bug: fails to find all required reports of saitek gamepad

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux