Re: [PATCH 05/12] Input: synaptics - process button bits in AGM packets

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

 



Hi Henrik,

On Tue, Jul 5, 2011 at 5:24 AM, Henrik Rydberg <rydberg@xxxxxxxxxxx> wrote:
> Hi Daniel,
>
>> AGM packets contain valid button bits, too.
>> This patch refactors packet processing to parse button bits in AGM packets.
>> However, they aren't actually used or reported.
>>
>> The point is to more completely process AGM packets,
>> and prepare for future patches that may actually use AGM packet button bits.
>>
>> Signed-off-by: Daniel Kurtz <djkurtz@xxxxxxxxxxxx>
>> ---
>>  drivers/input/mouse/synaptics.c |   35 ++++++++++++++++++-----------------
>>  1 files changed, 18 insertions(+), 17 deletions(-)
>>
>> diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
>> index 1ce47b7..74b1222 100644
>> --- a/drivers/input/mouse/synaptics.c
>> +++ b/drivers/input/mouse/synaptics.c
>> @@ -408,27 +408,10 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
>>       memset(hw, 0, sizeof(struct synaptics_hw_state));
>>
>>       if (SYN_MODEL_NEWABS(priv->model_id)) {
>> -             hw->x = (((buf[3] & 0x10) << 8) |
>> -                      ((buf[1] & 0x0f) << 8) |
>> -                      buf[4]);
>> -             hw->y = INVERT_Y((((buf[3] & 0x20) << 7) |
>> -                      ((buf[1] & 0xf0) << 4) |
>> -                      buf[5]));
>> -
>> -             hw->z = buf[2];
>
> Any particular reason to move these and leave them unassigned for clickpads?

Yes.  The current implementation incorrectly parses the x, y, z of AGM
packets and assigns junk values to the corresponding fields of the
temporary hw struct.  Luckily, this struct is then just discarded upon
return (synaptics_parse_hw_state returns 1 causing
synaptics_process_packet() to exit immediately).

Instead, this patch parses the w value first to determine the packet
type, and then use this packet type information to parse the remaining
position and pressure fields correctly...

Notice that the "else" clause is taken for SGM packets (w != 2), even
for clickpads.

-Dan

>
>>               hw->w = (((buf[0] & 0x30) >> 2) |
>>                        ((buf[0] & 0x04) >> 1) |
>>                        ((buf[3] & 0x04) >> 2));
>>
>> -             if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) && hw->w == 2) {
>> -                     /* Gesture packet: (x, y, z) at half resolution */
>> -                     priv->mt.x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1;
>> -                     priv->mt.y = INVERT_Y((((buf[4] & 0xf0) << 4)
>> -                                           | buf[2]) << 1);
>> -                     priv->mt.z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1;
>> -                     return 1;
>> -             }
>> -
>>               hw->left  = (buf[0] & 0x01) ? 1 : 0;
>>               hw->right = (buf[0] & 0x02) ? 1 : 0;
>>
>> @@ -451,6 +434,24 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
>>                       hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0;
>>               }
>>
>> +             if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) && hw->w == 2) {
>> +                     /* Gesture packet: (x, y, z) at half resolution */
>> +                     priv->mt.x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1;
>> +                     priv->mt.y = INVERT_Y((((buf[4] & 0xf0) << 4)
>> +                                           | buf[2]) << 1);
>> +                     priv->mt.z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1;
>> +                     return 1;
>> +             } else {
>> +                     hw->x = (((buf[3] & 0x10) << 8) |
>> +                              ((buf[1] & 0x0f) << 8) |
>> +                              buf[4]);
>> +                     hw->y = INVERT_Y((((buf[3] & 0x20) << 7) |
>> +                                      ((buf[1] & 0xf0) << 4) |
>> +                                      buf[5]));
>> +
>> +                     hw->z = buf[2];
>> +             }
>> +
>>               if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) &&
>>                   ((buf[0] ^ buf[3]) & 0x02)) {
>>                       switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) {
>> --
>> 1.7.3.1
>>
>
> Thanks,
> Henrik
>
--
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


[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