* [PATCH 0/2] some updates for newer elantech touchpads @ 2011-11-17 10:16 JJ Ding 2011-11-17 10:16 ` [PATCH 1/2] Input: elantech - add support for elantech fast command JJ Ding 2011-11-17 10:16 ` [PATCH 2/2] Input: elantech - add resolution query support for v4 hardware JJ Ding 0 siblings, 2 replies; 5+ messages in thread From: JJ Ding @ 2011-11-17 10:16 UTC (permalink / raw) To: Dmitry Torokhov, Aaron Huang, Tom Lin, Éric Piel Cc: linux-input, JJ Ding Hi, These two are my last pending patches for newer elantech touchpads. The first patch adds support for a shorter and faster send_cmd, available since v3 hardware. The other one teaches the driver to query resolution data from v4 hardware. Patches are against Dmitry's current -next tree. Any comment is welcome, thank you very much. JJ Ding (2): Input: elantech - add support for elantech fast command Input: elantech - add resolution query support for v4 hardware drivers/input/mouse/elantech.c | 70 +++++++++++++++++++++++++++++++++++---- drivers/input/mouse/elantech.h | 2 + 2 files changed, 64 insertions(+), 8 deletions(-) -- 1.7.8-rc2 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] Input: elantech - add support for elantech fast command 2011-11-17 10:16 [PATCH 0/2] some updates for newer elantech touchpads JJ Ding @ 2011-11-17 10:16 ` JJ Ding 2011-11-17 10:16 ` [PATCH 2/2] Input: elantech - add resolution query support for v4 hardware JJ Ding 1 sibling, 0 replies; 5+ messages in thread From: JJ Ding @ 2011-11-17 10:16 UTC (permalink / raw) To: Dmitry Torokhov, Aaron Huang, Tom Lin, Éric Piel Cc: linux-input, JJ Ding Starting with v3 hardware, the firmware supports this shorter elantech_send_cmd. Teach the driver to use it. Signed-off-by: JJ Ding <jj_ding@emc.com.tw> --- drivers/input/mouse/elantech.c | 38 ++++++++++++++++++++++++++++++-------- drivers/input/mouse/elantech.h | 1 + 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index b562392..dae020c 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c @@ -43,6 +43,24 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, } /* + * V3 and later support this fast command + */ +static int elantech_send_cmd(struct psmouse *psmouse, unsigned char c, + unsigned char *param) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + + if (ps2_command(ps2dev, NULL, ETP_PS2_CUSTOM_COMMAND) || + ps2_command(ps2dev, NULL, c) || + ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) { + psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c); + return -1; + } + + return 0; +} + +/* * A retrying version of ps2_command */ static int elantech_ps2_command(struct psmouse *psmouse, @@ -863,13 +881,13 @@ static int elantech_set_range(struct psmouse *psmouse, i = (etd->fw_version > 0x020800 && etd->fw_version < 0x020900) ? 1 : 2; - if (synaptics_send_cmd(psmouse, ETP_FW_ID_QUERY, param)) + if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param)) return -1; fixed_dpi = param[1] & 0x10; if (((etd->fw_version >> 16) == 0x14) && fixed_dpi) { - if (synaptics_send_cmd(psmouse, ETP_SAMPLE_QUERY, param)) + if (etd->send_cmd(psmouse, ETP_SAMPLE_QUERY, param)) return -1; *x_max = (etd->capabilities[1] - i) * param[1] / 2; @@ -888,7 +906,7 @@ static int elantech_set_range(struct psmouse *psmouse, break; case 3: - if (synaptics_send_cmd(psmouse, ETP_FW_ID_QUERY, param)) + if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param)) return -1; *x_max = (0x0f & param[0]) << 8 | param[1]; @@ -896,7 +914,7 @@ static int elantech_set_range(struct psmouse *psmouse, break; case 4: - if (synaptics_send_cmd(psmouse, ETP_FW_ID_QUERY, param)) + if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param)) return -1; *x_max = (0x0f & param[0]) << 8 | param[1]; @@ -1220,9 +1238,13 @@ static int elantech_set_properties(struct elantech_data *etd) else return -1; - /* - * Turn on packet checking by default. - */ + /* decide which send_cmd we're gonna use early */ + if (etd->hw_version > 2) + etd->send_cmd = elantech_send_cmd; + else + etd->send_cmd = synaptics_send_cmd; + + /* Turn on packet checking by default */ etd->paritycheck = 1; /* @@ -1278,7 +1300,7 @@ int elantech_init(struct psmouse *psmouse) "assuming hardware version %d (with firmware version 0x%02x%02x%02x)\n", etd->hw_version, param[0], param[1], param[2]); - if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY, + if (etd->send_cmd(psmouse, ETP_CAPABILITIES_QUERY, etd->capabilities)) { psmouse_err(psmouse, "failed to query capabilities.\n"); goto init_fail; diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h index 9e5f1aa..08d00bd 100644 --- a/drivers/input/mouse/elantech.h +++ b/drivers/input/mouse/elantech.h @@ -135,6 +135,7 @@ struct elantech_data { unsigned int width; struct finger_pos mt[ETP_MAX_FINGERS]; unsigned char parity[256]; + int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param); }; #ifdef CONFIG_MOUSE_PS2_ELANTECH -- 1.7.8-rc2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] Input: elantech - add resolution query support for v4 hardware 2011-11-17 10:16 [PATCH 0/2] some updates for newer elantech touchpads JJ Ding 2011-11-17 10:16 ` [PATCH 1/2] Input: elantech - add support for elantech fast command JJ Ding @ 2011-11-17 10:16 ` JJ Ding 2011-11-18 8:08 ` Daniel Kurtz 1 sibling, 1 reply; 5+ messages in thread From: JJ Ding @ 2011-11-17 10:16 UTC (permalink / raw) To: Dmitry Torokhov, Aaron Huang, Tom Lin, Éric Piel Cc: linux-input, JJ Ding It turns out that v4's firmware provides a command so we can query the resolution. Let's use it. Signed-off-by: JJ Ding <jj_ding@emc.com.tw> --- drivers/input/mouse/elantech.c | 32 ++++++++++++++++++++++++++++++++ drivers/input/mouse/elantech.h | 1 + 2 files changed, 33 insertions(+), 0 deletions(-) diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index dae020c..7c00c1a 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c @@ -931,6 +931,30 @@ static int elantech_set_range(struct psmouse *psmouse, } /* + * (value from firmware) * 10 + 790 = dpi + * we also have to convert dpi to dots/mm (*10/254 to avoid floating point) + */ +static inline unsigned int convert_res(unsigned int val) +{ + return (val * 10 + 790) * 10 / 254; +} + +static int set_resolution_v4(struct psmouse *psmouse, + unsigned int *x_res, + unsigned int *y_res) +{ + unsigned char param[3]; + + if (elantech_send_cmd(psmouse, ETP_RESOLUTION_QUERY, param)) + return -1; + + *x_res = convert_res(param[1] & 0x0f); + *y_res = convert_res((param[1] & 0xf0) >> 4); + + return 0; +} + +/* * Set the appropriate event bits for the input subsystem */ static int elantech_set_input_params(struct psmouse *psmouse) @@ -938,6 +962,7 @@ static int elantech_set_input_params(struct psmouse *psmouse) struct input_dev *dev = psmouse->dev; struct elantech_data *etd = psmouse->private; unsigned int x_min = 0, y_min = 0, x_max = 0, y_max = 0, width = 0; + unsigned int x_res = 0, y_res = 0; if (elantech_set_range(psmouse, &x_min, &y_min, &x_max, &y_max, &width)) return -1; @@ -985,10 +1010,15 @@ static int elantech_set_input_params(struct psmouse *psmouse) break; case 4: + if (set_resolution_v4(psmouse, &x_res, &y_res)) + return -1; + __set_bit(BTN_TOOL_QUADTAP, dev->keybit); /* For X to recognize me as touchpad. */ input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); + input_abs_set_res(dev, ABS_X, x_res); + input_abs_set_res(dev, ABS_Y, y_res); /* * range of pressure and width is the same as v2, * report ABS_PRESSURE, ABS_TOOL_WIDTH for compatibility. @@ -1001,6 +1031,8 @@ static int elantech_set_input_params(struct psmouse *psmouse) input_mt_init_slots(dev, ETP_MAX_FINGERS); input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0); input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0); + input_abs_set_res(dev, ABS_MT_POSITION_X, x_res); + input_abs_set_res(dev, ABS_MT_POSITION_Y, y_res); input_set_abs_params(dev, ABS_MT_PRESSURE, ETP_PMIN_V2, ETP_PMAX_V2, 0, 0); /* diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h index 08d00bd..46db3be 100644 --- a/drivers/input/mouse/elantech.h +++ b/drivers/input/mouse/elantech.h @@ -20,6 +20,7 @@ #define ETP_FW_VERSION_QUERY 0x01 #define ETP_CAPABILITIES_QUERY 0x02 #define ETP_SAMPLE_QUERY 0x03 +#define ETP_RESOLUTION_QUERY 0x04 /* * Command values for register reading or writing -- 1.7.8-rc2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] Input: elantech - add resolution query support for v4 hardware 2011-11-17 10:16 ` [PATCH 2/2] Input: elantech - add resolution query support for v4 hardware JJ Ding @ 2011-11-18 8:08 ` Daniel Kurtz 2011-11-18 10:19 ` JJ Ding 0 siblings, 1 reply; 5+ messages in thread From: Daniel Kurtz @ 2011-11-18 8:08 UTC (permalink / raw) To: JJ Ding; +Cc: Dmitry Torokhov, Aaron Huang, Tom Lin, Éric Piel, linux-input Hi JJ, On Thu, Nov 17, 2011 at 6:16 PM, JJ Ding <jj_ding@emc.com.tw> wrote: > It turns out that v4's firmware provides a command so we can query > the resolution. Let's use it. > > Signed-off-by: JJ Ding <jj_ding@emc.com.tw> > --- > drivers/input/mouse/elantech.c | 32 ++++++++++++++++++++++++++++++++ > drivers/input/mouse/elantech.h | 1 + > 2 files changed, 33 insertions(+), 0 deletions(-) > > diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c > index dae020c..7c00c1a 100644 > --- a/drivers/input/mouse/elantech.c > +++ b/drivers/input/mouse/elantech.c > @@ -931,6 +931,30 @@ static int elantech_set_range(struct psmouse *psmouse, > } > > /* > + * (value from firmware) * 10 + 790 = dpi > + * we also have to convert dpi to dots/mm (*10/254 to avoid floating point) > + */ > +static inline unsigned int convert_res(unsigned int val) > +{ > + return (val * 10 + 790) * 10 / 254; > +} > + > +static int set_resolution_v4(struct psmouse *psmouse, > + unsigned int *x_res, > + unsigned int *y_res) > +{ > + unsigned char param[3]; > + > + if (elantech_send_cmd(psmouse, ETP_RESOLUTION_QUERY, param)) > + return -1; > + > + *x_res = convert_res(param[1] & 0x0f); > + *y_res = convert_res((param[1] & 0xf0) >> 4); > + > + return 0; > +} > + > +/* > * Set the appropriate event bits for the input subsystem > */ > static int elantech_set_input_params(struct psmouse *psmouse) > @@ -938,6 +962,7 @@ static int elantech_set_input_params(struct psmouse *psmouse) > struct input_dev *dev = psmouse->dev; > struct elantech_data *etd = psmouse->private; > unsigned int x_min = 0, y_min = 0, x_max = 0, y_max = 0, width = 0; > + unsigned int x_res = 0, y_res = 0; > > if (elantech_set_range(psmouse, &x_min, &y_min, &x_max, &y_max, &width)) > return -1; > @@ -985,10 +1010,15 @@ static int elantech_set_input_params(struct psmouse *psmouse) > break; > > case 4: > + if (set_resolution_v4(psmouse, &x_res, &y_res)) > + return -1; You might consider allowing this command to fail, but just log a warning message. Then only do the input_abs_set_res() if x_res / y_res != 0. Otherwise, for both patches in this set: Reviewed-by: Daniel Kurtz <djkurtz@chromium.org> > + > __set_bit(BTN_TOOL_QUADTAP, dev->keybit); > /* For X to recognize me as touchpad. */ > input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); > input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); > + input_abs_set_res(dev, ABS_X, x_res); > + input_abs_set_res(dev, ABS_Y, y_res); > /* > * range of pressure and width is the same as v2, > * report ABS_PRESSURE, ABS_TOOL_WIDTH for compatibility. > @@ -1001,6 +1031,8 @@ static int elantech_set_input_params(struct psmouse *psmouse) > input_mt_init_slots(dev, ETP_MAX_FINGERS); > input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0); > input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0); > + input_abs_set_res(dev, ABS_MT_POSITION_X, x_res); > + input_abs_set_res(dev, ABS_MT_POSITION_Y, y_res); > input_set_abs_params(dev, ABS_MT_PRESSURE, ETP_PMIN_V2, > ETP_PMAX_V2, 0, 0); > /* > diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h > index 08d00bd..46db3be 100644 > --- a/drivers/input/mouse/elantech.h > +++ b/drivers/input/mouse/elantech.h > @@ -20,6 +20,7 @@ > #define ETP_FW_VERSION_QUERY 0x01 > #define ETP_CAPABILITIES_QUERY 0x02 > #define ETP_SAMPLE_QUERY 0x03 > +#define ETP_RESOLUTION_QUERY 0x04 > > /* > * Command values for register reading or writing > -- > 1.7.8-rc2 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] Input: elantech - add resolution query support for v4 hardware 2011-11-18 8:08 ` Daniel Kurtz @ 2011-11-18 10:19 ` JJ Ding 0 siblings, 0 replies; 5+ messages in thread From: JJ Ding @ 2011-11-18 10:19 UTC (permalink / raw) To: Daniel Kurtz Cc: Dmitry Torokhov, Aaron Huang, Tom Lin, Éric Piel, linux-input Hi Daniel, Thanks for your suggestion, I'll send new patches to do this next week. jj On Fri, 18 Nov 2011 16:08:53 +0800, Daniel Kurtz <djkurtz@chromium.org> wrote: > Hi JJ, > > > You might consider allowing this command to fail, but just log a > warning message. > Then only do the input_abs_set_res() if x_res / y_res != 0. > > Otherwise, for both patches in this set: > > Reviewed-by: Daniel Kurtz <djkurtz@chromium.org> > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-11-18 10:21 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-11-17 10:16 [PATCH 0/2] some updates for newer elantech touchpads JJ Ding 2011-11-17 10:16 ` [PATCH 1/2] Input: elantech - add support for elantech fast command JJ Ding 2011-11-17 10:16 ` [PATCH 2/2] Input: elantech - add resolution query support for v4 hardware JJ Ding 2011-11-18 8:08 ` Daniel Kurtz 2011-11-18 10:19 ` JJ Ding
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.