diff options
author | Maxim Levitsky <maximlevitsky@gmail.com> | 2010-10-16 18:56:28 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-10-21 08:59:47 -0400 |
commit | 4651918a4afdd49bdea21d2f919b189ef17a6399 (patch) | |
tree | 73a4e3b5f7da1d655a059bb9b69135cf6f395e02 /include/media | |
parent | fb249ca61d469a9cb666ba7e1d992787dc6bad82 (diff) |
[media] IR: extend ir_raw_event and do refactoring
Add new event types for timeout & carrier report
Move timeout handling from ir_raw_event_store_with_filter to
ir-lirc-codec, where it is really needed.
Now lirc bridge ensures proper gap handling.
Extend lirc bridge for carrier & timeout reports
Note: all new ir_raw_event variables now should be initialized
like that: DEFINE_IR_RAW_EVENT(ev);
To clean an existing event, use init_ir_raw_event(&ev);
Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Acked-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'include/media')
-rw-r--r-- | include/media/ir-core.h | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/include/media/ir-core.h b/include/media/ir-core.h index 4dd43d44ec5e..6dc37fae6606 100644 --- a/include/media/ir-core.h +++ b/include/media/ir-core.h | |||
@@ -60,6 +60,7 @@ enum rc_driver_type { | |||
60 | * @s_idle: optional: enable/disable hardware idle mode, upon which, | 60 | * @s_idle: optional: enable/disable hardware idle mode, upon which, |
61 | device doesn't interrupt host until it sees IR pulses | 61 | device doesn't interrupt host until it sees IR pulses |
62 | * @s_learning_mode: enable wide band receiver used for learning | 62 | * @s_learning_mode: enable wide band receiver used for learning |
63 | * @s_carrier_report: enable carrier reports | ||
63 | */ | 64 | */ |
64 | struct ir_dev_props { | 65 | struct ir_dev_props { |
65 | enum rc_driver_type driver_type; | 66 | enum rc_driver_type driver_type; |
@@ -82,8 +83,9 @@ struct ir_dev_props { | |||
82 | int (*s_tx_duty_cycle)(void *priv, u32 duty_cycle); | 83 | int (*s_tx_duty_cycle)(void *priv, u32 duty_cycle); |
83 | int (*s_rx_carrier_range)(void *priv, u32 min, u32 max); | 84 | int (*s_rx_carrier_range)(void *priv, u32 min, u32 max); |
84 | int (*tx_ir)(void *priv, int *txbuf, u32 n); | 85 | int (*tx_ir)(void *priv, int *txbuf, u32 n); |
85 | void (*s_idle)(void *priv, int enable); | 86 | void (*s_idle)(void *priv, bool enable); |
86 | int (*s_learning_mode)(void *priv, int enable); | 87 | int (*s_learning_mode)(void *priv, int enable); |
88 | int (*s_carrier_report) (void *priv, int enable); | ||
87 | }; | 89 | }; |
88 | 90 | ||
89 | struct ir_input_dev { | 91 | struct ir_input_dev { |
@@ -163,22 +165,48 @@ u32 ir_g_keycode_from_table(struct input_dev *input_dev, u32 scancode); | |||
163 | /* From ir-raw-event.c */ | 165 | /* From ir-raw-event.c */ |
164 | 166 | ||
165 | struct ir_raw_event { | 167 | struct ir_raw_event { |
166 | unsigned pulse:1; | 168 | union { |
167 | unsigned duration:31; | 169 | u32 duration; |
170 | |||
171 | struct { | ||
172 | u32 carrier; | ||
173 | u8 duty_cycle; | ||
174 | }; | ||
175 | }; | ||
176 | |||
177 | unsigned pulse:1; | ||
178 | unsigned reset:1; | ||
179 | unsigned timeout:1; | ||
180 | unsigned carrier_report:1; | ||
168 | }; | 181 | }; |
169 | 182 | ||
170 | #define IR_MAX_DURATION 0x7FFFFFFF /* a bit more than 2 seconds */ | 183 | #define DEFINE_IR_RAW_EVENT(event) \ |
184 | struct ir_raw_event event = { \ | ||
185 | { .duration = 0 } , \ | ||
186 | .pulse = 0, \ | ||
187 | .reset = 0, \ | ||
188 | .timeout = 0, \ | ||
189 | .carrier_report = 0 } | ||
190 | |||
191 | static inline void init_ir_raw_event(struct ir_raw_event *ev) | ||
192 | { | ||
193 | memset(ev, 0, sizeof(*ev)); | ||
194 | } | ||
195 | |||
196 | #define IR_MAX_DURATION 0xFFFFFFFF /* a bit more than 4 seconds */ | ||
171 | 197 | ||
172 | void ir_raw_event_handle(struct input_dev *input_dev); | 198 | void ir_raw_event_handle(struct input_dev *input_dev); |
173 | int ir_raw_event_store(struct input_dev *input_dev, struct ir_raw_event *ev); | 199 | int ir_raw_event_store(struct input_dev *input_dev, struct ir_raw_event *ev); |
174 | int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type); | 200 | int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type); |
175 | int ir_raw_event_store_with_filter(struct input_dev *input_dev, | 201 | int ir_raw_event_store_with_filter(struct input_dev *input_dev, |
176 | struct ir_raw_event *ev); | 202 | struct ir_raw_event *ev); |
177 | void ir_raw_event_set_idle(struct input_dev *input_dev, int idle); | 203 | void ir_raw_event_set_idle(struct input_dev *input_dev, bool idle); |
178 | 204 | ||
179 | static inline void ir_raw_event_reset(struct input_dev *input_dev) | 205 | static inline void ir_raw_event_reset(struct input_dev *input_dev) |
180 | { | 206 | { |
181 | struct ir_raw_event ev = { .pulse = false, .duration = 0 }; | 207 | DEFINE_IR_RAW_EVENT(ev); |
208 | ev.reset = true; | ||
209 | |||
182 | ir_raw_event_store(input_dev, &ev); | 210 | ir_raw_event_store(input_dev, &ev); |
183 | ir_raw_event_handle(input_dev); | 211 | ir_raw_event_handle(input_dev); |
184 | } | 212 | } |