Hi

On Sun, Sep 14, 2014 at 6:45 PM, David Herrmann <dh.herrm...@gmail.com> wrote:
> Hi
>
> On Sun, Aug 10, 2014 at 11:56 AM, Fredrik Hallenberg
> <megahal...@gmail.com> wrote:
>> Here is my attempt on a fix for bug 70181, please review it. It is
>> tested on my nordic Corsair K70, if this solution is deemed acceptable
>> I can ask some people with other problematic keyboards to test it.
>>
>> Signed-off-by: Fredrik Hallenberg <megahal...@gmail.com>
>> ---
>>  drivers/hid/hid-input.c | 14 ++++++++++++++
>>  include/linux/hid.h     |  1 +
>>  2 files changed, 15 insertions(+)
>>
>> diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
>> index 2619f7f..56429c0 100644
>> --- a/drivers/hid/hid-input.c
>> +++ b/drivers/hid/hid-input.c
>> @@ -1085,6 +1085,20 @@ void hidinput_hid_event(struct hid_device *hid, 
>> struct hid_field *field, struct
>>                 return;
>>         }
>>
>> +       /*
>> +        * Some keyboards will report both HID keys 0x31 (\ and |) and
>> +        * 0x32 (Non-US # and ~) which are both mapped to
>> +        * KEY_BACKSLASH. This will cause spurious events causing
>> +        * repeated backslash key presses. Handle this by tracking the
>> +        * active HID code and ignoring the other one.
>> +        */
>> +       if (usage->type == EV_KEY && usage->code == KEY_BACKSLASH) {
>> +               if (value)
>> +                       field->hidinput->backslash_usage = usage->hid;
>> +               else if (field->hidinput->backslash_usage != usage->hid)
>> +                       return;
>> +       }
>> +
>
> Ok, I have looked through some more reports and at a bunch of AT
> keyboards and how the HID standard maps them. The backslash/pipe key
> is the only key affected by this. There _might_ be some similar
> overlap with Korean 106 and Japanese 109 layouts, but as there haven't
> been any reports, we probably don't care right now.
>
> And indeed, I'm kinda reluctant to add an hwdb entry for the reported
> keyboards as I couldn't find anyone with non-105 keyboards to compare
> VID/PID. Furthermore, similar issues will probably show up again in
> the future. However, I still dislike the quick hack in this patch. I
> especially dislike matching on KEY_BACKSLASH while we really want to
> match on 0x31 and 0x32. If users use setkeycode() to change a mapping,
> this should not trigger our quirk. We could easily change the patch to
> match on usage, but I think there's a better way:
>
> hid-core.c: hid_input_field()
> This is the main entry point for data that is matched on HID fields.
> We already have a RollOver quirk in there, which is extremely bad
> documented and I have no idea what it does.. However, this function
> saves the reported values so we can retrieve them on a following
> report. Why don't we skip events that have the same value reported as
> before? Obviously, we should do this only for absolute data, not
> relative. So I think something like this should work (sorry for
> line-wraps):
>
> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
> index 12b6e67..000a768 100644
> --- a/drivers/hid/hid-core.c
> +++ b/drivers/hid/hid-core.c
> @@ -1220,7 +1220,10 @@
>         for (n = 0; n < count; n++) {
>
>                 if (HID_MAIN_ITEM_VARIABLE & field->flags) {
> -                       hid_process_event(hid, field,
> &field->usage[n], value[n], interrupt);
> +                       /* ignore absolute values if they didn't change */
> +                       if (HID_MAIN_ITEM_RELATIVE & field->flags ||
> +                           value[n] != field->value[n])
> +                               hid_process_event(hid, field,
> &field->usage[n], value[n], interrupt);

This should probably be:
  (HID_MAIN_ITEM_RELATIVE | HID_MAIN_ITEM_BUFFERED_BYTE)
..though I wonder whether buffered-byte makes much sense without "relative"..
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to