RE: [PATCH] add REL_* axes support to the rotary encoder driver

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

 



On Monday, April 13, 2009 10:51 PM, Daniel Mack wrote:
> On Mon, Apr 13, 2009 at 07:06:24PM -0400, H Hartley Sweeten wrote:
>> Add REL_* axes support to the rotary encoder driver.
>> 
>> The rotary encoder driver only supports returning input events
>> for ABS_* axes, this adds support for REL_* axes.  The relative
>> axis input event is reported as -1 for each counter-clockwise
>> step and +1 for each clockwise step.
>> 
>> In addition the private data structure has been rearranged and
>> modified to use less memory.
>> 
>> Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx>
>> Cc: Daniel Mack <daniel@xxxxxxxx>
>
> Your patch was line wrapped and did only apply with fuzz 1i againt
> the current Linus master, but apart from that ...
>
> Acked-by: Daniel Mack <daniel@xxxxxxxx>
>
> Thanks :)
>
> Daniel

I'll add your Acked-by and repost the patch later today.  I'll also
attach the patch to avoid the line wrapping issue.

I've been fighting with my email provider on that issue.  It appears
one of the servers they use is doing the wrapping when the message
bounces through it.  If anyone has an idea to get around that I would
appreciate the input.

Regards,
Hartley


> ---
> 
> diff --git a/Documentation/input/rotary-encoder.txt
> b/Documentation/input/rotary-encoder.txt
> index 435102a..1b90ac7 100644
> --- a/Documentation/input/rotary-encoder.txt
> +++ b/Documentation/input/rotary-encoder.txt
> @@ -67,7 +67,11 @@ data with it.
>  struct rotary_encoder_platform_data is declared in
>  include/linux/rotary-encoder.h and needs to be filled with the number
> of
>  steps the encoder has and can carry information about externally
> inverted
> -signals (because of used invertig buffer or other reasons).
> +signals (because of an inverting buffer or other reasons). The
encoder
> +can be set up to deliver input information as either an absolute or
> relative
> +axes. For absolute axes the position of the encoder rolls over
between
> zero
> +and the number of steps. For relative axes the input event returns
+/-1
> for
> +each step.
>  
>  Because GPIO to IRQ mapping is platform specific, this information
must
>  be given in seperately to the driver. See the example below.
> @@ -84,7 +88,7 @@ be given in seperately to the driver. See the
example
> below.
>  
>  static struct rotary_encoder_platform_data my_rotary_encoder_info = {
>  	.steps		= 24,
> -	.axis		= ABS_X,
> +	.axis		= ROTARY_ENCODER_ABS | ABS_X,
>  	.gpio_a		= GPIO_ROTARY_A,
>  	.gpio_b		= GPIO_ROTARY_B,
>  	.inverted_a	= 0,
> diff --git a/drivers/input/misc/rotary_encoder.c
> b/drivers/input/misc/rotary_encoder.c
> index 5bb3ab5..fff9c1c 100644
> --- a/drivers/input/misc/rotary_encoder.c
> +++ b/drivers/input/misc/rotary_encoder.c
> @@ -26,13 +26,18 @@
>  #define DRV_NAME "rotary-encoder"
>  
>  struct rotary_encoder {
> -	unsigned int irq_a;
> -	unsigned int irq_b;
> -	unsigned int pos;
> -	unsigned int armed;
> -	unsigned int dir;
> -	struct input_dev *input;
> -	struct rotary_encoder_platform_data *pdata;
> +	struct input_dev			*input;
> +	struct rotary_encoder_platform_data	*pdata;
> +
> +	unsigned int	axis;
> +	unsigned int	pos;
> +
> +	unsigned int	irq_a;
> +	unsigned int	irq_b;
> +
> +	unsigned int	abs:1;
> +	unsigned int	dir:1;
> +	unsigned int	armed:1;
>  };
>  
>  static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
> @@ -55,16 +60,29 @@ static irqreturn_t rotary_encoder_irq(int irq,
void
> *dev_id)
>  
>  		if (encoder->dir) {
>  			/* turning counter-clockwise */
> -			encoder->pos += pdata->steps;
> -			encoder->pos--;
> -			encoder->pos %= pdata->steps;
> +			if (encoder->abs) {
> +				encoder->pos += pdata->steps;
> +				encoder->pos--;
> +				encoder->pos %= pdata->steps;
> +				input_report_abs(encoder->input,
> +						encoder->axis,
> encoder->pos);
> +			} else {
> +				input_report_rel(encoder->input,
> +						encoder->axis, -1);
> +			}
>  		} else {
>  			/* turning clockwise */
> -			encoder->pos++;
> -			encoder->pos %= pdata->steps;
> +			if (encoder->abs) {
> +				encoder->pos++;
> +				encoder->pos %= pdata->steps;
> +				input_report_abs(encoder->input,
> +						encoder->axis,
> encoder->pos);
> +			} else {
> +				input_report_rel(encoder->input,
> +						encoder->axis, 1);
> +			}
>  		}
>  
> -		input_report_abs(encoder->input, pdata->axis,
> encoder->pos);
>  		input_sync(encoder->input);
>  
>  		encoder->armed = 0;
> @@ -108,14 +126,23 @@ static int __devinit rotary_encoder_probe(struct
> platform_device *pdev)
>  	encoder->pdata = pdata;
>  	encoder->irq_a = gpio_to_irq(pdata->gpio_a);
>  	encoder->irq_b = gpio_to_irq(pdata->gpio_b);
> +	encoder->abs = !!(pdata->axis & ROTARY_ENCODER_ABS);
>  
>  	/* create and register the input driver */
>  	input->name = pdev->name;
>  	input->id.bustype = BUS_HOST;
>  	input->dev.parent = &pdev->dev;
> -	input->evbit[0] = BIT_MASK(EV_ABS);
> -	input_set_abs_params(encoder->input,
> -			     pdata->axis, 0, pdata->steps, 0, 1);
> +	if (encoder->abs) {
> +		encoder->axis = pdata->axis & ABS_MAX;
> +		input->evbit[0] = BIT_MASK(EV_ABS);
> +		input->absbit[0] = BIT_MASK(encoder->axis);
> +		input_set_abs_params(encoder->input,
> +				     encoder->axis, 0, pdata->steps, 0,
> 1);
> +	} else {
> +		encoder->axis = pdata->axis & REL_MAX;
> +		input->evbit[0] = BIT_MASK(EV_REL);
> +		input->relbit[0] = BIT_MASK(encoder->axis);
> +	}
>  
>  	err = input_register_device(input);
>  	if (err) {
> diff --git a/include/linux/rotary_encoder.h
> b/include/linux/rotary_encoder.h
> index 12d63a3..ae668db 100644
> --- a/include/linux/rotary_encoder.h
> +++ b/include/linux/rotary_encoder.h
> @@ -1,6 +1,9 @@
>  #ifndef __ROTARY_ENCODER_H__
>  #define __ROTARY_ENCODER_H__
>  
> +#define ROTARY_ENCODER_REL	(0<<31)
> +#define ROTARY_ENCODER_ABS	(1<<31)
> +
>  struct rotary_encoder_platform_data {
>  	unsigned int steps;
>  	unsigned int axis; 
--
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