@@ -338,6 +338,7 @@ void read_touchpad_in_report(void)
338338 int need_reset = 0 ;
339339 uint8_t data [128 ];
340340 int xfer_len = 0 ;
341+ int report_mode = PS2MOUSE_REPORT_UNKNOWN ;
341342 int16_t x , y ;
342343 uint8_t response_byte = 0x08 ;
343344
@@ -368,7 +369,11 @@ void read_touchpad_in_report(void)
368369 CPRINTS ("PS2M Touchpad need to reset" );
369370 xfer_len = 6 ;
370371 need_reset = 1 ;
371- }
372+ } else if (xfer_len == 7 )
373+ report_mode = PS2MOUSE_REPORT_HYBRID ;
374+ else if (xfer_len == 8 )
375+ report_mode = PS2MOUSE_REPORT_PARALLEL ;
376+
372377 xfer_len = MIN (126 , xfer_len - 2 );
373378 rv = i2c_xfer_unlocked (I2C_PORT_TOUCHPAD ,
374379 TOUCHPAD_I2C_HID_EP | I2C_FLAG_ADDR16_LITTLE_ENDIAN ,
@@ -412,8 +417,20 @@ void read_touchpad_in_report(void)
412417 if (rv == EC_SUCCESS && data [2 ] == 0x02 ) {
413418 /*0x0800 02 04 feff 0000
414419 *0x0800 02 04 fdff ffff */
415- x = (int16_t )(data [4 ] + (data [5 ] << 8 ));
416- y = - (int16_t )(data [6 ] + (data [7 ] << 8 ));
420+ if (report_mode == PS2MOUSE_REPORT_HYBRID ) {
421+
422+ if (data [4 ] & 0x80 )
423+ x = (int16_t )(data [4 ] + (0xff << 8 ));
424+ else
425+ x = (int16_t )data [4 ];
426+ if (data [5 ] & 0x80 )
427+ y = - (int16_t )(data [5 ] + (0xff << 8 ));
428+ else
429+ y = - (int16_t )data [5 ];
430+ } else {
431+ x = (int16_t )(data [4 ] + (data [5 ] << 8 ));
432+ y = - (int16_t )(data [6 ] + (data [7 ] << 8 ));
433+ }
417434 x = MIN (255 , MAX (x , -255 ));
418435 y = MIN (255 , MAX (y , -255 ));
419436 /*button data*/
0 commit comments