Re: [PATCH v3 1/8] drivers:input:tsc2007: add new common binding names, pre-calibration, flipping and rotation

From: H. Nikolaus Schaller
Date: Fri Sep 30 2016 - 10:40:44 EST

Hi Sebastian,

> Am 30.09.2016 um 16:16 schrieb Sebastian Reichel <sre@xxxxxxxxxx>:
> Hi,
> On Sat, Sep 24, 2016 at 07:55:27AM +0200, H. Nikolaus Schaller wrote:
>>> So ti,max-[xy] is basically the same as touchscreen-size-[xy],
>> No it is not the same and should be kept separate.
>>> except, that the generic bindings don't support min-[xy] != 0.
>> What would be the purpose of this? Every user-space I know
>> about (X11, Replicant) expects coordinates in some range
>> 0..max so setting min in device tree makes no sense to me.
>>> So maybe change the generic bindings like this:
>>> touchscreen-min-x: minimum value reported by X axis ADC (default 0)
>>> touchscreen-max-x: maximum value reported by Y axis ADC
>>> touchscreen-min-y: minimum value reported by Y axis ADC (default 0)
>>> touchscreen-max-y: maximum value reported by Y axis ADC
>>> touchscreen-size-x: deprecated alias for touchscreen-max-x
>>> touchscreen-size-y: deprecated alias for touchscreen-max-y
>> Initially I had thought about this but it does not solve the problems
>> with touch pre-calibration. Since it mixes raw coordinates with
>> system coordinates.
> touchscreen-size-x was actually refering to your definition of
> touchscreen-max-x and not system coordinates.

Ah, ok I see. It looks as if you have provided a hidden feature by mis-using
it to describe LCD size.

> For that it would
> make much more sense to use a phandle to the screen IMHO.

Well... phandles are evil as I have learned in different context.
And, there are many LCD devices that do not specify screen sizes in

I would more see it as a definition like a key matrix. You still have
both, the x/y raw coordinates and the processed KEY_something codes
in a single table.

>> To achieve the goal of having a roughly precalibrated touch which
>> should provide (0,0) at the lower left corner and
>> (touchscreen-size-x,touchscreen-size-y) in pixel coordinates of
>> the panel. Hence it roughly works without a calibration matrix in
>> user space (e.g. xorg.conf or Replicant).
> well I did not mean to use touchscreen-size-x/y for describing the
> size of screen, as visible in n900.dts (first implementation of the
> common binding), which sets the value to 4096.

Well, for my scheme it still works if you use it that way. Like keycodes
which can still be mapped in user space to anything desired.

>> Why do we need pre-calibration? Because some systems might need
>> touch interaction before they can offer (force) the user into
>> a touch calibration step. We use these drivers and approach in
>> our production kernels for GTA04, OpenPandora and Pyra for a while
>> and nobody was even missing a user-space calibration tool any more.
> I have nothing against the feature. OTOH I'm quite in of kernel
> based TS calibration. Note, that you can only add it for hardware
> without pre-existing touchscreen support, since you break peoples
> systems otherwise (We have that problem for N900).

Unless it takes missing ADC values as the same defaults that have been
the assumption. I.e. if it is missing, take e.g. 0 and 4095.

>> The underlaying problem is that you can have the same controller chip
>> in different board designs and there are different touch panel types.
>> Each one has certain physical properties but they can differ.
>> But you certainly want touchscreen-size-x/y to be a constant.
>> Now if we make touchscreen-max-x/y the same as touchscreen-size-x/y
>> and change the panel, we have to adjust user space transformation
>> each time we change the panel. This does not seem to be right
>> and can be done better by keeping them separately.
>> This is what this approach does: the roughly correct scaling of
>> raw values to pixel values.
>> ti,min-x -> 0
>> ...
>> x -> some value between 0 and touchscreen-size-x
>> calculated by
>> touchscreen-size-x * (x - min-x) / (max-x - min-x)
>> ...
>> ti,max-x -> touchscreen-size-x
>> Hence the ti,min/max values describe the range of expected input
>> values from the ADC and the touchscreen-size-x describes the touch
>> in LCD pixels passed as input events.
> so basically you use touchscreen-size-x to describe the screen and
> not the touchscreen.

> When I added it, I did mean the max ADC value.
> Actually I was under the impression, that X drivers would scale this
> to screen size automatically.

There is some default calibration or it can be set by entries in xorg.conf,
but since there is no intermediate "constant" scale, you promote any hardware
variation (different ADC max values) to user space.

> Since all my touchscreen HW required
> calibration I did never test this, though.
>> Example:
>> ti,min-x = 64
>> ti,max-x = 4016
>> touchscreen-size-x = 480
>> If we change the panel type which presents a slightly different ADC range:
>> ti,min-x = 100
>> ti,max-x = 3900
>> touchscreen-size-x = 480
>> and we still get a coordinate range (0 .. 480).
>> Note that this feature can be effectively disabled if ti,min-x=0 and
>> ti,max-x=4095 and touchscreen-size-x=4095, i.e. reports the full
>> range of ADC values because then it multiplies by 1.
>> Our proposed driver does use these values if they are missing from DT
>> and therefore it should not break old DT files which expect raw values
>> to be reported.
>> I hope this clarifies what we need to achieve and you can
>> agree.
> I did understand what you want, but I disagreed about
> using touchscreen-size-x/y for system coordinates. I
> now see, that it's too late for that, as other people
> already did so.
> I do agree with Rob, that the ti,min/max-x/y should become common,
> though. Also I would do s/minimum value/minimum raw value/g.

Yes, that is a good idea!

To me it seems as if "minimum-raw-value-x", "maximum-raw-value-y" could be good.

Or is the string too long (then we can drop the "-value" or the "imum")? It
might blow up the DTB and string constant for finding the property?

If we come to some consensus on this, I can update the patch set.

> Additionally touchscreen-size-x/y should mention, that it's used to
> scale the raw values.

Ok. It is also used as the default for maximim-raw-value-x/y if not specified
which means 1:1 scaling.

BR and thanks,

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail