RE: [PATCH] generic driver for rotary encoders on GPIOs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wednesday, March 04, 2009 2:51 AM, Daniel Mack wrote:
> On Wed, Mar 04, 2009 at 12:48:52AM -0800, Dmitry Torokhov wrote:
>> On Tue, Mar 03, 2009 at 10:59:27AM +0100, Daniel Mack wrote:
>>> This patch adds a generic driver for rotary encoders connected to
GPIO
>>> pins of a system. It relies on gpiolib and generic hardware irqs.
The
>>> documentation that also comes with this patch explains the concept
and
>>> how to use the driver.
>>> 
>>> Signed-off-by: Daniel Mack <daniel@xxxxxxxx>
>>> Cc: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
>>> Cc: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx>
>>> ---
>>>  New version with Dmitry's change requests included:
>>> 
>>>   * calling input_free_device() in case input_register_device()
fails
>>>   * calling input_unregister_device() in all other cases
>>>   * made the axis information part of the platform data
>>> 
>> 
>> I fiddled with the driver a little bit more changing formatting,
please
>> take a look and if you are still OK with it I will apply to 'next'.

Couple of comments, none should hold up committing this driver.

1) For an absolute encoder shouldn't the position clamp to the
minimum/maximum values?  Currently the driver is setup to report the
events going from 0 to 'steps' then the count rolls over (in both
directions).  Maybe this should be a platform optional flag?  Also,
maybe the minimum/maximum of the axis should be platform configurable
instead of just having the 'steps' of the encoder?

2) I have a patch to the driver that allows the axis to be a REL_* type.
I will post this patch for review after the driver is committed.

3) Are both 'inverted_*' flags really needed?  It appears that the end
effect of these just reverses the logical direction of the encoder.

	inverted_a	inverted_b	result
	0		0		normal encoder
	0		1		backwards encoder
	1		0		backwards encoder
	1		1		normal encoder

The same effect should be attainable with one flag to reverse the
direction, or just reverse the wires on the encoder.

3) It might be possible to reconstruct the interrupt handler so that
only one gpio needs to be interrupt capable.

Looking at the phase diagram you could consider one of the channel
inputs as a 'step' interrupt and the other as the 'direction' of the
step.  On the positive edge of any 'step' if the 'direction' is low it's
going one way, high it's going the other way.

This would double the effective number of encoders that could be
connected.  And it removes the added overhead of the extra interrupt
handler and needing to keep track of the 'armed' and 'dir' states.
Actually with both interrupts sharing the same handler the 'armed' and
'dir' variables seem a little bit racy.

Once the driver is committed I will mess with the interrupt code and see
if this is possible.

Regards,
Hartley
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux