[PATCH v4 6/8] drivers:input:ads7846(+tsc2046): add new common binding names, pre-calibration and flipping
commit b98abe52fa8e ("Input: add common DT binding for touchscreens") introduced common DT bindings for touchscreens [1] and a helper function to parse the DT. commit ed7c9870c9bc ("Input: of_touchscreen - add support for inverted / swapped axes") added another helper for parsing axis inversion and swapping and applying them to x and y coordinates. Both helpers have been integrated to accommodate any orientation of the touch panel in relation to the LCD. A new feature is to introduce scaling the min/max ADC values to the screen size. This makes it possible to pre-calibrate the touch so that is (almost) exactly matches the LCD pixel coordinates it is glued onto. This allows to well enough operate the touch before a user space calibration step can improve the precision. [1]: Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt Signed-off-by: H. Nikolaus Schaller--- .../devicetree/bindings/input/ads7846.txt | 9 +++- drivers/input/touchscreen/ads7846.c| 60 ++ 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/Documentation/devicetree/bindings/input/ads7846.txt b/Documentation/devicetree/bindings/input/ads7846.txt index 9fc47b0..29f91ed 100644 --- a/Documentation/devicetree/bindings/input/ads7846.txt +++ b/Documentation/devicetree/bindings/input/ads7846.txt @@ -26,6 +26,12 @@ Additional required properties: Optional properties: +You can optionally specify any of the touchscreen parameters described in + + Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt + +This allows to scale, invert or swap coordinates and define the fuzz factors. + ti,vref-delay-usecs vref supply delay in usecs, 0 for external vref (u16). ti,vref-mv The VREF voltage, in millivolts (u16). @@ -33,7 +39,7 @@ Optional properties: (ADS7846). ti,keep-vref-on set to keep vref on for differential measurements as well - ti,swap-xy swap x and y axis + ti,swap-xy deprecated name for touchscreen-swapped-x-y ti,settle-delay-usecSettling time of the analog signals; a function of Vcc and the capacitance on the X/Y drivers. If set to non-zero, @@ -82,6 +88,7 @@ Example for a TSC2046 chip connected to an McSPI controller of an OMAP SoC:: pendown-gpio = < 8 0>; vcc-supply = <_vcc3>; + touchscreen-swapped-x-y; ti,x-min = /bits/ 16 <0>; ti,x-max = /bits/ 16 <8000>; ti,y-min = /bits/ 16 <0>; diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 1ce3ecb..400e421 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c @@ -34,6 +34,7 @@ #include #include #include +#include #include /* @@ -109,8 +110,13 @@ struct ads7846 { u16 vref_delay_usecs; u16 x_plate_ohms; u16 pressure_max; + u16 x_min; + u16 x_max; + u16 y_min; + u16 y_max; + + struct touchscreen_properties prop; - boolswap_xy; booluse_internal; struct ads7846_packet *packet; @@ -825,22 +831,36 @@ static void ads7846_report_state(struct ads7846 *ts) */ if (Rt) { struct input_dev *input = ts->input; + int sx, sy; + + dev_dbg(>spi->dev, + "Raw point(%4d,%4d), pressure (%4u)\n", + x, y, Rt); + + /* scale ADC values to desired output range */ + sx = (ts->prop.max_x * (x - ts->x_min)) + / (ts->x_max - ts->x_min); + sy = (ts->prop.max_y * (y - ts->y_min)) + / (ts->y_max - ts->y_min); - if (ts->swap_xy) - swap(x, y); + dev_dbg(>spi->dev, + "Scaled point(%4d,%4d), pressure (%4u)\n", + sx, sy, Rt); + /* report event */ if (!ts->pendown) { input_report_key(input, BTN_TOUCH, 1); ts->pendown = true; dev_vdbg(>spi->dev, "DOWN\n"); } - input_report_abs(input, ABS_X, x); - input_report_abs(input, ABS_Y, y); + touchscreen_report_pos(ts->input, >prop, + (unsigned int)
[PATCH v4 6/8] drivers:input:ads7846(+tsc2046): add new common binding names, pre-calibration and flipping
commit b98abe52fa8e ("Input: add common DT binding for touchscreens") introduced common DT bindings for touchscreens [1] and a helper function to parse the DT. commit ed7c9870c9bc ("Input: of_touchscreen - add support for inverted / swapped axes") added another helper for parsing axis inversion and swapping and applying them to x and y coordinates. Both helpers have been integrated to accommodate any orientation of the touch panel in relation to the LCD. A new feature is to introduce scaling the min/max ADC values to the screen size. This makes it possible to pre-calibrate the touch so that is (almost) exactly matches the LCD pixel coordinates it is glued onto. This allows to well enough operate the touch before a user space calibration step can improve the precision. [1]: Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt Signed-off-by: H. Nikolaus Schaller --- .../devicetree/bindings/input/ads7846.txt | 9 +++- drivers/input/touchscreen/ads7846.c| 60 ++ 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/Documentation/devicetree/bindings/input/ads7846.txt b/Documentation/devicetree/bindings/input/ads7846.txt index 9fc47b0..29f91ed 100644 --- a/Documentation/devicetree/bindings/input/ads7846.txt +++ b/Documentation/devicetree/bindings/input/ads7846.txt @@ -26,6 +26,12 @@ Additional required properties: Optional properties: +You can optionally specify any of the touchscreen parameters described in + + Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt + +This allows to scale, invert or swap coordinates and define the fuzz factors. + ti,vref-delay-usecs vref supply delay in usecs, 0 for external vref (u16). ti,vref-mv The VREF voltage, in millivolts (u16). @@ -33,7 +39,7 @@ Optional properties: (ADS7846). ti,keep-vref-on set to keep vref on for differential measurements as well - ti,swap-xy swap x and y axis + ti,swap-xy deprecated name for touchscreen-swapped-x-y ti,settle-delay-usecSettling time of the analog signals; a function of Vcc and the capacitance on the X/Y drivers. If set to non-zero, @@ -82,6 +88,7 @@ Example for a TSC2046 chip connected to an McSPI controller of an OMAP SoC:: pendown-gpio = < 8 0>; vcc-supply = <_vcc3>; + touchscreen-swapped-x-y; ti,x-min = /bits/ 16 <0>; ti,x-max = /bits/ 16 <8000>; ti,y-min = /bits/ 16 <0>; diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 1ce3ecb..400e421 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c @@ -34,6 +34,7 @@ #include #include #include +#include #include /* @@ -109,8 +110,13 @@ struct ads7846 { u16 vref_delay_usecs; u16 x_plate_ohms; u16 pressure_max; + u16 x_min; + u16 x_max; + u16 y_min; + u16 y_max; + + struct touchscreen_properties prop; - boolswap_xy; booluse_internal; struct ads7846_packet *packet; @@ -825,22 +831,36 @@ static void ads7846_report_state(struct ads7846 *ts) */ if (Rt) { struct input_dev *input = ts->input; + int sx, sy; + + dev_dbg(>spi->dev, + "Raw point(%4d,%4d), pressure (%4u)\n", + x, y, Rt); + + /* scale ADC values to desired output range */ + sx = (ts->prop.max_x * (x - ts->x_min)) + / (ts->x_max - ts->x_min); + sy = (ts->prop.max_y * (y - ts->y_min)) + / (ts->y_max - ts->y_min); - if (ts->swap_xy) - swap(x, y); + dev_dbg(>spi->dev, + "Scaled point(%4d,%4d), pressure (%4u)\n", + sx, sy, Rt); + /* report event */ if (!ts->pendown) { input_report_key(input, BTN_TOUCH, 1); ts->pendown = true; dev_vdbg(>spi->dev, "DOWN\n"); } - input_report_abs(input, ABS_X, x); - input_report_abs(input, ABS_Y, y); + touchscreen_report_pos(ts->input, >prop, + (unsigned int) sx, (unsigned int)