psmouse - focaltech pass finger width to userspace
Subsystems (2)
cover psmouse - focaltech pass finger width to userspace
Now I made it in a correct way. No need to count fingers. Just send width after an abs packet is received.
PATCH v6 1/1 psmouse - focaltech pass finger width to userspace Focaltech touchpads report finger width in packet[5] of absolute packet. Range for width in raw format is 0x10 - 0x70. Second half-byte is always 0. 0xff is reported, when a large contact area is detected. This can be handled in userspace.
--- drivers/input/mouse/focaltech.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/input/mouse/focaltech.c +14 -1
@@ -90,6 +90,13 @@ struct focaltech_finger_state {*/ unsigned int x;unsigned int y; + +/* +* Finger width 0-7 and 15 for 'latching' +* 15 value stays until the finger is released +* Width is reported only in absolute packets +*/ +unsigned int width; };/*
@@ -112,7 +119,7 @@ struct focaltech_data {struct focaltech_hw_state state; }; -static void focaltech_report_state (struct psmouse *psmouse) +static void focaltech_report_state (struct psmouse *psmouse,bool abs) {struct focaltech_data *priv = psmouse->private;struct focaltech_hw_state *state = &priv->state;
@@ -137,6 +144,7 @@ static void focaltech_report_state(struct psmouse *psmouse)input_report_abs (dev,ABS_MT_POSITION_X , clamped_x);input_report_abs (dev,ABS_MT_POSITION_Y , priv->y_max - clamped_y); +if (abs)input_report_abs (dev,ABS_TOOL_WIDTH , state->width); } }input_mt_report_pointer_emulation (dev, true);
@@ -187,6 +195,7 @@ static void focaltech_process_abs_packet(struct psmouse *psmouse, state->fingers[finger].x = ((packet[1 ] &0xf ) <<8 ) | packet[2 ]; state->fingers[finger].y = (packet[3 ] <<8 ) | packet[4 ]; + state->fingers[finger].width = packet[5 ] >>4 ; state->fingers[finger].valid = true; }
@@ -228,14 +237,17 @@ static void focaltech_process_packet(struct psmouse *psmouse)switch (packet[0 ] &0xf ) {case FOC_TOUCH :focaltech_process_touch_packet (psmouse, packet); +focaltech_report_state (psmouse, false);break ;case FOC_ABS :focaltech_process_abs_packet (psmouse, packet); +focaltech_report_state (psmouse, true);break ;case FOC_REL :focaltech_process_rel_packet (psmouse, packet); +focaltech_report_state (psmouse, false);break ;default :
@@ -331,6 +343,7 @@ static void focaltech_set_input_params(struct psmouse *psmouse)__set_bit (EV_ABS , dev->evbit);input_set_abs_params (dev,ABS_MT_POSITION_X ,0 , priv->x_max,0 ,0 );input_set_abs_params (dev,ABS_MT_POSITION_Y ,0 , priv->y_max,0 ,0 ); +input_set_abs_params (dev,ABS_TOOL_WIDTH ,0 ,15 ,0 ,0 );input_mt_init_slots (dev,5 ,INPUT_MT_POINTER );__set_bit (INPUT_PROP_BUTTONPAD , dev->propbit); }
Signature · 1 line
1.9.1