blob: 8b4129de1d2d3d26176a322c74df0ec11aaccfd6 [file] [log] [blame]
Daniel Mack73969ff2009-03-04 23:27:14 -08001rotary-encoder - a generic driver for GPIO connected devices
2Daniel Mack <daniel@caiaq.de>, Feb 2009
3
40. Function
5-----------
6
7Rotary encoders are devices which are connected to the CPU or other
8peripherals with two wires. The outputs are phase-shifted by 90 degrees
9and by triggering on falling and rising edges, the turn direction can
10be determined.
11
12The phase diagram of these two outputs look like this:
13
14 _____ _____ _____
15 | | | | | |
16 Channel A ____| |_____| |_____| |____
17
18 : : : : : : : : : : : :
19 __ _____ _____ _____
20 | | | | | | |
21 Channel B |_____| |_____| |_____| |__
22
23 : : : : : : : : : : : :
24 Event a b c d a b c d a b c d
25
26 |<-------->|
27 one step
28
29
30For more information, please see
31 http://en.wikipedia.org/wiki/Rotary_encoder
32
33
341. Events / state machine
35-------------------------
36
37a) Rising edge on channel A, channel B in low state
38 This state is used to recognize a clockwise turn
39
40b) Rising edge on channel B, channel A in high state
41 When entering this state, the encoder is put into 'armed' state,
42 meaning that there it has seen half the way of a one-step transition.
43
44c) Falling edge on channel A, channel B in high state
45 This state is used to recognize a counter-clockwise turn
46
47d) Falling edge on channel B, channel A in low state
48 Parking position. If the encoder enters this state, a full transition
49 should have happend, unless it flipped back on half the way. The
50 'armed' state tells us about that.
51
522. Platform requirements
53------------------------
54
55As there is no hardware dependent call in this driver, the platform it is
56used with must support gpiolib. Another requirement is that IRQs must be
57able to fire on both edges.
58
59
603. Board integration
61--------------------
62
63To use this driver in your system, register a platform_device with the
64name 'rotary-encoder' and associate the IRQs and some specific platform
65data with it.
66
67struct rotary_encoder_platform_data is declared in
68include/linux/rotary-encoder.h and needs to be filled with the number of
69steps the encoder has and can carry information about externally inverted
H Hartley Sweetenbd3ce652009-04-17 20:12:35 -070070signals (because of an inverting buffer or other reasons). The encoder
71can be set up to deliver input information as either an absolute or relative
72axes. For relative axes the input event returns +/-1 for each step. For
73absolute axes the position of the encoder can either roll over between zero
74and the number of steps or will clamp at the maximum and zero depending on
75the configuration.
Daniel Mack73969ff2009-03-04 23:27:14 -080076
77Because GPIO to IRQ mapping is platform specific, this information must
Daniel Mack3ad2f3f2010-02-03 08:01:28 +080078be given in separately to the driver. See the example below.
Daniel Mack73969ff2009-03-04 23:27:14 -080079
80---------<snip>---------
81
82/* board support file example */
83
84#include <linux/input.h>
85#include <linux/rotary_encoder.h>
86
87#define GPIO_ROTARY_A 1
88#define GPIO_ROTARY_B 2
89
90static struct rotary_encoder_platform_data my_rotary_encoder_info = {
91 .steps = 24,
92 .axis = ABS_X,
H Hartley Sweetenbd3ce652009-04-17 20:12:35 -070093 .relative_axis = false,
94 .rollover = false,
Daniel Mack73969ff2009-03-04 23:27:14 -080095 .gpio_a = GPIO_ROTARY_A,
96 .gpio_b = GPIO_ROTARY_B,
97 .inverted_a = 0,
98 .inverted_b = 0,
99};
100
101static struct platform_device rotary_encoder_device = {
102 .name = "rotary-encoder",
103 .id = 0,
104 .dev = {
105 .platform_data = &my_rotary_encoder_info,
106 }
107};
108