diff options
author | Daniel Mack <daniel@caiaq.de> | 2009-03-05 02:27:14 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-03-08 19:35:53 -0400 |
commit | 73969ff0eda233f140bcbed1251431387b43f383 (patch) | |
tree | b7dd2b670d9e03916b04469e9d38b71d69c6cd60 /Documentation/input/rotary-encoder.txt | |
parent | b0ecc7309443dbcf1a0ce2d93f39f5d92c124d42 (diff) |
Input: generic driver for rotary encoders on GPIOs
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@caiaq.de>
Tested-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'Documentation/input/rotary-encoder.txt')
-rw-r--r-- | Documentation/input/rotary-encoder.txt | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/Documentation/input/rotary-encoder.txt b/Documentation/input/rotary-encoder.txt new file mode 100644 index 000000000000..435102a26d96 --- /dev/null +++ b/Documentation/input/rotary-encoder.txt | |||
@@ -0,0 +1,101 @@ | |||
1 | rotary-encoder - a generic driver for GPIO connected devices | ||
2 | Daniel Mack <daniel@caiaq.de>, Feb 2009 | ||
3 | |||
4 | 0. Function | ||
5 | ----------- | ||
6 | |||
7 | Rotary encoders are devices which are connected to the CPU or other | ||
8 | peripherals with two wires. The outputs are phase-shifted by 90 degrees | ||
9 | and by triggering on falling and rising edges, the turn direction can | ||
10 | be determined. | ||
11 | |||
12 | The 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 | |||
30 | For more information, please see | ||
31 | http://en.wikipedia.org/wiki/Rotary_encoder | ||
32 | |||
33 | |||
34 | 1. Events / state machine | ||
35 | ------------------------- | ||
36 | |||
37 | a) Rising edge on channel A, channel B in low state | ||
38 | This state is used to recognize a clockwise turn | ||
39 | |||
40 | b) 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 | |||
44 | c) Falling edge on channel A, channel B in high state | ||
45 | This state is used to recognize a counter-clockwise turn | ||
46 | |||
47 | d) 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 | |||
52 | 2. Platform requirements | ||
53 | ------------------------ | ||
54 | |||
55 | As there is no hardware dependent call in this driver, the platform it is | ||
56 | used with must support gpiolib. Another requirement is that IRQs must be | ||
57 | able to fire on both edges. | ||
58 | |||
59 | |||
60 | 3. Board integration | ||
61 | -------------------- | ||
62 | |||
63 | To use this driver in your system, register a platform_device with the | ||
64 | name 'rotary-encoder' and associate the IRQs and some specific platform | ||
65 | data with it. | ||
66 | |||
67 | struct rotary_encoder_platform_data is declared in | ||
68 | include/linux/rotary-encoder.h and needs to be filled with the number of | ||
69 | steps the encoder has and can carry information about externally inverted | ||
70 | signals (because of used invertig buffer or other reasons). | ||
71 | |||
72 | Because GPIO to IRQ mapping is platform specific, this information must | ||
73 | be given in seperately to the driver. See the example below. | ||
74 | |||
75 | ---------<snip>--------- | ||
76 | |||
77 | /* board support file example */ | ||
78 | |||
79 | #include <linux/input.h> | ||
80 | #include <linux/rotary_encoder.h> | ||
81 | |||
82 | #define GPIO_ROTARY_A 1 | ||
83 | #define GPIO_ROTARY_B 2 | ||
84 | |||
85 | static struct rotary_encoder_platform_data my_rotary_encoder_info = { | ||
86 | .steps = 24, | ||
87 | .axis = ABS_X, | ||
88 | .gpio_a = GPIO_ROTARY_A, | ||
89 | .gpio_b = GPIO_ROTARY_B, | ||
90 | .inverted_a = 0, | ||
91 | .inverted_b = 0, | ||
92 | }; | ||
93 | |||
94 | static struct platform_device rotary_encoder_device = { | ||
95 | .name = "rotary-encoder", | ||
96 | .id = 0, | ||
97 | .dev = { | ||
98 | .platform_data = &my_rotary_encoder_info, | ||
99 | } | ||
100 | }; | ||
101 | |||