Blame view

include/media/rc-core.h 9.96 KB
446e4a64d   Mauro Carvalho Chehab   V4L/DVB (13613): ...
1
2
3
  /*
   * Remote Controller core header
   *
37e59f876   Mauro Carvalho Chehab   [media, edac] Cha...
4
   * Copyright (C) 2009-2010 by Mauro Carvalho Chehab
995187bed   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
5
   *
446e4a64d   Mauro Carvalho Chehab   V4L/DVB (13613): ...
6
7
8
9
10
11
12
13
14
   * This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation version 2 of the License.
   *
   *  This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   */
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
15
16
  #ifndef _RC_CORE
  #define _RC_CORE
446e4a64d   Mauro Carvalho Chehab   V4L/DVB (13613): ...
17

446e4a64d   Mauro Carvalho Chehab   V4L/DVB (13613): ...
18
  #include <linux/spinlock.h>
a3572c34d   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
19
20
  #include <linux/kfifo.h>
  #include <linux/time.h>
9f1547829   Mauro Carvalho Chehab   V4L/DVB: saa7134:...
21
  #include <linux/timer.h>
02858eedc   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
22
  #include <media/rc-map.h>
446e4a64d   Mauro Carvalho Chehab   V4L/DVB (13613): ...
23

6bda96447   Mauro Carvalho Chehab   [media] rc: renam...
24
  extern int rc_core_debug;
86b0dbef7   Joe Perches   [media] rc-core.h...
25
26
27
  #define IR_dprintk(level, fmt, ...)				\
  do {								\
  	if (rc_core_debug >= level)				\
7cec72ce0   Mauro Carvalho Chehab   [media] rc-core: ...
28
  		printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__);	\
86b0dbef7   Joe Perches   [media] rc-core.h...
29
  } while (0)
446e4a64d   Mauro Carvalho Chehab   V4L/DVB (13613): ...
30

5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
31
32
33
34
35
36
37
  /**
   * enum rc_driver_type - type of the RC output
   *
   * @RC_DRIVER_SCANCODE:	Driver or hardware generates a scancode
   * @RC_DRIVER_IR_RAW:	Driver or hardware generates pulse/space sequences.
   *			It needs a Infra-Red pulse/space decoder
   */
626cf6979   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
38
  enum rc_driver_type {
5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
39
40
  	RC_DRIVER_SCANCODE = 0,
  	RC_DRIVER_IR_RAW,
626cf6979   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
41
  };
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
42
  /**
00942d1a1   James Hogan   [media] media: rc...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
   * struct rc_scancode_filter - Filter scan codes.
   * @data:	Scancode data to match.
   * @mask:	Mask of bits of scancode to compare.
   */
  struct rc_scancode_filter {
  	u32 data;
  	u32 mask;
  };
  
  /**
   * enum rc_filter_type - Filter type constants.
   * @RC_FILTER_NORMAL:	Filter for normal operation.
   * @RC_FILTER_WAKEUP:	Filter for waking from suspend.
   * @RC_FILTER_MAX:	Number of filter types.
   */
  enum rc_filter_type {
  	RC_FILTER_NORMAL = 0,
  	RC_FILTER_WAKEUP,
  
  	RC_FILTER_MAX
  };
  
  /**
d8b4b5822   David Härdeman   [media] ir-core: ...
66
67
   * struct rc_dev - represents a remote control device
   * @dev: driver model's view of this device
078600f51   Mauro Carvalho Chehab   [media] rc-core: ...
68
   * @initialized: 1 if the device init has completed, 0 otherwise
99b0f3c96   David Härdeman   [media] rc-core: ...
69
   * @sysfs_groups: sysfs attribute groups
d8b4b5822   David Härdeman   [media] ir-core: ...
70
71
72
73
74
   * @input_name: name of the input child device
   * @input_phys: physical path to the input child device
   * @input_id: id of the input child device (struct input_id)
   * @driver_name: name of the hardware driver which registered this device
   * @map_name: name of the default keymap
b088ba658   Mauro Carvalho Chehab   [media] rc: Prope...
75
   * @rc_map: current scan/key table
08aeb7c9a   Jarod Wilson   [media] rc: add l...
76
77
   * @lock: used to ensure we've filled in all protocol details before
   *	anyone can call show_protocols or store_protocols
fcb130978   David Härdeman   [media] rc-core: ...
78
   * @minor: unique minor remote control device number
d8b4b5822   David Härdeman   [media] ir-core: ...
79
80
   * @raw: additional data for raw pulse/space devices
   * @input_dev: the input child device used to communicate events to userspace
08aeb7c9a   Jarod Wilson   [media] rc: add l...
81
   * @driver_type: specifies if protocol decoding is done in hardware or software
d8b4b5822   David Härdeman   [media] ir-core: ...
82
   * @idle: used to keep track of RX state
c5540fbb9   David Härdeman   [media] rc-core: ...
83
84
85
86
87
88
   * @allowed_protocols: bitmask with the supported RC_BIT_* protocols
   * @enabled_protocols: bitmask with the enabled RC_BIT_* protocols
   * @allowed_wakeup_protocols: bitmask with the supported RC_BIT_* wakeup protocols
   * @enabled_wakeup_protocols: bitmask with the enabled RC_BIT_* wakeup protocols
   * @scancode_filter: scancode filter
   * @scancode_wakeup_filter: scancode wakeup filters
9d2f1d3cd   David Härdeman   [media] rc-core: ...
89
   * @scancode_mask: some hardware decoders are not capable of providing the full
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
90
91
92
93
   *	scancode to the application. As this is a hardware limit, we can't do
   *	anything with it. Yet, as the same keycode table can be used with other
   *	devices, a mask is provided to allow its usage. Drivers should generally
   *	leave this field in blank
9d2f1d3cd   David Härdeman   [media] rc-core: ...
94
   * @users: number of current users of the device
d8b4b5822   David Härdeman   [media] ir-core: ...
95
96
97
98
99
100
   * @priv: driver-specific data
   * @keylock: protects the remaining members of the struct
   * @keypressed: whether a key is currently pressed
   * @keyup_jiffies: time (in jiffies) when the current keypress should be released
   * @timer_keyup: timer for releasing a keypress
   * @last_keycode: keycode of last keypress
120703f9e   David Härdeman   [media] rc-core: ...
101
   * @last_protocol: protocol of last keypress
d8b4b5822   David Härdeman   [media] ir-core: ...
102
103
   * @last_scancode: scancode of last keypress
   * @last_toggle: toggle value of last command
4a702ebf6   Maxim Levitsky   V4L/DVB: IR: add ...
104
105
106
   * @timeout: optional time after which device stops sending data
   * @min_timeout: minimum timeout supported by device
   * @max_timeout: maximum timeout supported by device
e589333f3   Maxim Levitsky   V4L/DVB: IR: exte...
107
108
   * @rx_resolution : resolution (in ns) of input sampler
   * @tx_resolution: resolution (in ns) of output sampler
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
109
   * @change_protocol: allow changing the protocol used on hardware decoders
ab88c66de   James Hogan   [media] rc: add w...
110
111
   * @change_wakeup_protocol: allow changing the protocol used for wakeup
   *	filtering
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
112
113
114
115
   * @open: callback to allow drivers to enable polling/irq when IR input device
   *	is opened.
   * @close: callback to allow drivers to disable polling/irq when IR input device
   *	is opened.
9b7c54d92   Jarod Wilson   V4L/DVB: IR: add ...
116
117
   * @s_tx_mask: set transmitter mask (for devices with multiple tx outputs)
   * @s_tx_carrier: set transmit carrier frequency
e589333f3   Maxim Levitsky   V4L/DVB: IR: exte...
118
   * @s_tx_duty_cycle: set transmit duty cycle (0% - 100%)
fa810845e   Mauro Carvalho Chehab   [media] Docbook: ...
119
   * @s_rx_carrier_range: inform driver about carrier it is expected to handle
9b7c54d92   Jarod Wilson   V4L/DVB: IR: add ...
120
   * @tx_ir: transmit IR
d8b4b5822   David Härdeman   [media] ir-core: ...
121
122
   * @s_idle: enable/disable hardware idle mode, upon which,
   *	device doesn't interrupt host until it sees IR pulses
e589333f3   Maxim Levitsky   V4L/DVB: IR: exte...
123
   * @s_learning_mode: enable wide band receiver used for learning
4651918a4   Maxim Levitsky   [media] IR: exten...
124
   * @s_carrier_report: enable carrier reports
120703f9e   David Härdeman   [media] rc-core: ...
125
   * @s_filter: set the scancode filter
23c843b5e   David Härdeman   [media] rc-core: ...
126
   * @s_wakeup_filter: set the wakeup scancode filter
4f253cecf   Sean Young   [media] redrat3: ...
127
   * @s_timeout: set hardware timeout in ns
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
128
   */
d8b4b5822   David Härdeman   [media] ir-core: ...
129
130
  struct rc_dev {
  	struct device			dev;
078600f51   Mauro Carvalho Chehab   [media] rc-core: ...
131
  	atomic_t			initialized;
99b0f3c96   David Härdeman   [media] rc-core: ...
132
  	const struct attribute_group	*sysfs_groups[5];
d8b4b5822   David Härdeman   [media] ir-core: ...
133
134
135
136
137
  	const char			*input_name;
  	const char			*input_phys;
  	struct input_id			input_id;
  	char				*driver_name;
  	const char			*map_name;
08aeb7c9a   Jarod Wilson   [media] rc: add l...
138
139
  	struct rc_map			rc_map;
  	struct mutex			lock;
fcb130978   David Härdeman   [media] rc-core: ...
140
  	unsigned int			minor;
d8b4b5822   David Härdeman   [media] ir-core: ...
141
142
143
  	struct ir_raw_event_ctrl	*raw;
  	struct input_dev		*input_dev;
  	enum rc_driver_type		driver_type;
4a702ebf6   Maxim Levitsky   V4L/DVB: IR: add ...
144
  	bool				idle;
c5540fbb9   David Härdeman   [media] rc-core: ...
145
146
147
148
149
150
  	u64				allowed_protocols;
  	u64				enabled_protocols;
  	u64				allowed_wakeup_protocols;
  	u64				enabled_wakeup_protocols;
  	struct rc_scancode_filter	scancode_filter;
  	struct rc_scancode_filter	scancode_wakeup_filter;
9d2f1d3cd   David Härdeman   [media] rc-core: ...
151
  	u32				scancode_mask;
8b2ff3204   Srinivas Kandagatla   [media] media: rc...
152
  	u32				users;
d8b4b5822   David Härdeman   [media] ir-core: ...
153
154
155
156
157
158
  	void				*priv;
  	spinlock_t			keylock;
  	bool				keypressed;
  	unsigned long			keyup_jiffies;
  	struct timer_list		timer_keyup;
  	u32				last_keycode;
120703f9e   David Härdeman   [media] rc-core: ...
159
  	enum rc_type			last_protocol;
d8b4b5822   David Härdeman   [media] ir-core: ...
160
161
162
163
164
165
166
  	u32				last_scancode;
  	u8				last_toggle;
  	u32				timeout;
  	u32				min_timeout;
  	u32				max_timeout;
  	u32				rx_resolution;
  	u32				tx_resolution;
c003ab1be   David Härdeman   [media] rc-core: ...
167
  	int				(*change_protocol)(struct rc_dev *dev, u64 *rc_type);
ab88c66de   James Hogan   [media] rc: add w...
168
  	int				(*change_wakeup_protocol)(struct rc_dev *dev, u64 *rc_type);
d8b4b5822   David Härdeman   [media] ir-core: ...
169
170
171
172
173
174
  	int				(*open)(struct rc_dev *dev);
  	void				(*close)(struct rc_dev *dev);
  	int				(*s_tx_mask)(struct rc_dev *dev, u32 mask);
  	int				(*s_tx_carrier)(struct rc_dev *dev, u32 carrier);
  	int				(*s_tx_duty_cycle)(struct rc_dev *dev, u32 duty_cycle);
  	int				(*s_rx_carrier_range)(struct rc_dev *dev, u32 min, u32 max);
5588dc2b0   David Härdeman   [media] rc-core: ...
175
  	int				(*tx_ir)(struct rc_dev *dev, unsigned *txbuf, unsigned n);
d8b4b5822   David Härdeman   [media] ir-core: ...
176
177
178
  	void				(*s_idle)(struct rc_dev *dev, bool enable);
  	int				(*s_learning_mode)(struct rc_dev *dev, int enable);
  	int				(*s_carrier_report) (struct rc_dev *dev, int enable);
00942d1a1   James Hogan   [media] media: rc...
179
  	int				(*s_filter)(struct rc_dev *dev,
00942d1a1   James Hogan   [media] media: rc...
180
  						    struct rc_scancode_filter *filter);
23c843b5e   David Härdeman   [media] rc-core: ...
181
182
  	int				(*s_wakeup_filter)(struct rc_dev *dev,
  							   struct rc_scancode_filter *filter);
4f253cecf   Sean Young   [media] redrat3: ...
183
184
  	int				(*s_timeout)(struct rc_dev *dev,
  						     unsigned int timeout);
75543cce0   Mauro Carvalho Chehab   V4L/DVB (13615): ...
185
  };
a3572c34d   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
186

ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
187
188
189
190
191
192
193
194
  #define to_rc_dev(d) container_of(d, struct rc_dev, dev)
  
  /*
   * From rc-main.c
   * Those functions can be used on any type of Remote Controller. They
   * basically creates an input_dev and properly reports the device as a
   * Remote Controller, at sys/class/rc.
   */
5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
195
196
197
198
199
  /**
   * rc_allocate_device - Allocates a RC device
   *
   * returns a pointer to struct rc_dev.
   */
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
200
  struct rc_dev *rc_allocate_device(void);
5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
201
202
203
204
205
206
  
  /**
   * rc_free_device - Frees a RC device
   *
   * @dev: pointer to struct rc_dev.
   */
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
207
  void rc_free_device(struct rc_dev *dev);
5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
208
209
210
211
212
213
  
  /**
   * rc_register_device - Registers a RC device
   *
   * @dev: pointer to struct rc_dev.
   */
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
214
  int rc_register_device(struct rc_dev *dev);
5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
215
216
217
218
219
220
  
  /**
   * rc_unregister_device - Unregisters a RC device
   *
   * @dev: pointer to struct rc_dev.
   */
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
221
  void rc_unregister_device(struct rc_dev *dev);
5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
222
223
224
225
226
  /**
   * rc_open - Opens a RC device
   *
   * @rdev: pointer to struct rc_dev.
   */
8b2ff3204   Srinivas Kandagatla   [media] media: rc...
227
  int rc_open(struct rc_dev *rdev);
5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
228
229
  
  /**
e383ce073   Mauro Carvalho Chehab   [media] get rid o...
230
   * rc_close - Closes a RC device
5b6137dc8   Mauro Carvalho Chehab   [media] doc-rst: ...
231
232
233
   *
   * @rdev: pointer to struct rc_dev.
   */
8b2ff3204   Srinivas Kandagatla   [media] media: rc...
234
  void rc_close(struct rc_dev *rdev);
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
235
  void rc_repeat(struct rc_dev *dev);
120703f9e   David Härdeman   [media] rc-core: ...
236
237
  void rc_keydown(struct rc_dev *dev, enum rc_type protocol, u32 scancode, u8 toggle);
  void rc_keydown_notimeout(struct rc_dev *dev, enum rc_type protocol, u32 scancode, u8 toggle);
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
238
239
240
241
242
243
244
245
  void rc_keyup(struct rc_dev *dev);
  u32 rc_g_keycode_from_table(struct rc_dev *dev, u32 scancode);
  
  /*
   * From rc-raw.c
   * The Raw interface is specific to InfraRed. It may be a good idea to
   * split it later into a separate header.
   */
3f113e361   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
246
247
248
249
250
  enum raw_event_type {
  	IR_SPACE        = (1 << 0),
  	IR_PULSE        = (1 << 1),
  	IR_START_EVENT  = (1 << 2),
  	IR_STOP_EVENT   = (1 << 3),
995187bed   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
251
  };
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
252
  struct ir_raw_event {
4651918a4   Maxim Levitsky   [media] IR: exten...
253
254
  	union {
  		u32             duration;
5f61ff861   Heiner Kallweit   [media] media: rc...
255
  		u32             carrier;
4651918a4   Maxim Levitsky   [media] IR: exten...
256
  	};
5f61ff861   Heiner Kallweit   [media] media: rc...
257
  	u8                      duty_cycle;
4651918a4   Maxim Levitsky   [media] IR: exten...
258
259
260
261
262
  
  	unsigned                pulse:1;
  	unsigned                reset:1;
  	unsigned                timeout:1;
  	unsigned                carrier_report:1;
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
263
  };
5f61ff861   Heiner Kallweit   [media] media: rc...
264
  #define DEFINE_IR_RAW_EVENT(event) struct ir_raw_event event = {}
4651918a4   Maxim Levitsky   [media] IR: exten...
265
266
267
268
269
  
  static inline void init_ir_raw_event(struct ir_raw_event *ev)
  {
  	memset(ev, 0, sizeof(*ev));
  }
c8e1bbc52   Eric Nelson   [media] rc-core: ...
270
  #define IR_DEFAULT_TIMEOUT	MS_TO_NS(125)
6b20cf3c0   Mauro Carvalho Chehab   [media] rc: set I...
271
  #define IR_MAX_DURATION         500000000	/* 500 ms */
5aad72428   Jarod Wilson   [media] rc: fix u...
272
273
274
  #define US_TO_NS(usec)		((usec) * 1000)
  #define MS_TO_US(msec)		((msec) * 1000)
  #define MS_TO_NS(msec)		((msec) * 1000 * 1000)
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
275

d8b4b5822   David Härdeman   [media] ir-core: ...
276
277
278
279
  void ir_raw_event_handle(struct rc_dev *dev);
  int ir_raw_event_store(struct rc_dev *dev, struct ir_raw_event *ev);
  int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type);
  int ir_raw_event_store_with_filter(struct rc_dev *dev,
4a702ebf6   Maxim Levitsky   V4L/DVB: IR: add ...
280
  				struct ir_raw_event *ev);
d8b4b5822   David Härdeman   [media] ir-core: ...
281
  void ir_raw_event_set_idle(struct rc_dev *dev, bool idle);
4a702ebf6   Maxim Levitsky   V4L/DVB: IR: add ...
282

d8b4b5822   David Härdeman   [media] ir-core: ...
283
  static inline void ir_raw_event_reset(struct rc_dev *dev)
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
284
  {
5f61ff861   Heiner Kallweit   [media] media: rc...
285
  	struct ir_raw_event ev = { .reset = true };
4651918a4   Maxim Levitsky   [media] IR: exten...
286

d8b4b5822   David Härdeman   [media] ir-core: ...
287
288
  	ir_raw_event_store(dev, &ev);
  	ir_raw_event_handle(dev);
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
289
  }
724e24955   David Härdeman   V4L/DVB: Teach dr...
290

3ffea4988   David Härdeman   [media] ir-core: ...
291
292
293
294
295
296
  /* extract mask bits out of data and pack them into the result */
  static inline u32 ir_extract_bits(u32 data, u32 mask)
  {
  	u32 vbit = 1, value = 0;
  
  	do {
829ba9fe3   David Härdeman   [media] rc-core: ...
297
298
299
300
301
302
  		if (mask & 1) {
  			if (data & 1)
  				value |= vbit;
  			vbit <<= 1;
  		}
  		data >>= 1;
3ffea4988   David Härdeman   [media] ir-core: ...
303
304
305
306
  	} while (mask >>= 1);
  
  	return value;
  }
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
307
  #endif /* _RC_CORE */