Blame view

include/media/rc-core.h 7.45 KB
446e4a64d   Mauro Carvalho Chehab   V4L/DVB (13613): ...
1
2
3
  /*
   * Remote Controller core header
   *
995187bed   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
4
5
   * Copyright (C) 2009-2010 by Mauro Carvalho Chehab <mchehab@redhat.com>
   *
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
28
29
  #define IR_dprintk(level, fmt, ...)				\
  do {								\
  	if (rc_core_debug >= level)				\
  		pr_debug("%s: " fmt, __func__, ##__VA_ARGS__);	\
  } while (0)
446e4a64d   Mauro Carvalho Chehab   V4L/DVB (13613): ...
30

626cf6979   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
31
32
33
34
  enum rc_driver_type {
  	RC_DRIVER_SCANCODE = 0,	/* Driver or hardware generates a scancode */
  	RC_DRIVER_IR_RAW,	/* Needs a Infra-Red pulse/space decoder */
  };
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
35
  /**
d8b4b5822   David Härdeman   [media] ir-core: ...
36
37
38
39
40
41
42
   * struct rc_dev - represents a remote control device
   * @dev: driver model's view of this device
   * @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...
43
   * @rc_map: current scan/key table
08aeb7c9a   Jarod Wilson   [media] rc: add l...
44
45
   * @lock: used to ensure we've filled in all protocol details before
   *	anyone can call show_protocols or store_protocols
d8b4b5822   David Härdeman   [media] ir-core: ...
46
47
48
   * @devno: unique remote control device number
   * @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...
49
   * @driver_type: specifies if protocol decoding is done in hardware or software
d8b4b5822   David Härdeman   [media] ir-core: ...
50
   * @idle: used to keep track of RX state
52b661449   Mauro Carvalho Chehab   [media] rc: Renam...
51
   * @allowed_protos: bitmask with the supported RC_TYPE_* protocols
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
52
53
54
55
56
   * @scanmask: some hardware decoders are not capable of providing the full
   *	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
d8b4b5822   David Härdeman   [media] ir-core: ...
57
58
59
60
61
62
63
64
   * @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
   * @last_scancode: scancode of last keypress
   * @last_toggle: toggle value of last command
4a702ebf6   Maxim Levitsky   V4L/DVB: IR: add ...
65
66
67
   * @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...
68
69
   * @rx_resolution : resolution (in ns) of input sampler
   * @tx_resolution: resolution (in ns) of output sampler
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
70
71
72
73
74
   * @change_protocol: allow changing the protocol used on hardware decoders
   * @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 ...
75
76
   * @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...
77
78
   * @s_tx_duty_cycle: set transmit duty cycle (0% - 100%)
   * @s_rx_carrier: inform driver about carrier it is expected to handle
9b7c54d92   Jarod Wilson   V4L/DVB: IR: add ...
79
   * @tx_ir: transmit IR
d8b4b5822   David Härdeman   [media] ir-core: ...
80
81
   * @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...
82
   * @s_learning_mode: enable wide band receiver used for learning
4651918a4   Maxim Levitsky   [media] IR: exten...
83
   * @s_carrier_report: enable carrier reports
9dfe4e833   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
84
   */
d8b4b5822   David Härdeman   [media] ir-core: ...
85
86
87
88
89
90
91
  struct rc_dev {
  	struct device			dev;
  	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...
92
93
  	struct rc_map			rc_map;
  	struct mutex			lock;
d8b4b5822   David Härdeman   [media] ir-core: ...
94
95
96
97
  	unsigned long			devno;
  	struct ir_raw_event_ctrl	*raw;
  	struct input_dev		*input_dev;
  	enum rc_driver_type		driver_type;
4a702ebf6   Maxim Levitsky   V4L/DVB: IR: add ...
98
  	bool				idle;
d8b4b5822   David Härdeman   [media] ir-core: ...
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  	u64				allowed_protos;
  	u32				scanmask;
  	void				*priv;
  	spinlock_t			keylock;
  	bool				keypressed;
  	unsigned long			keyup_jiffies;
  	struct timer_list		timer_keyup;
  	u32				last_keycode;
  	u32				last_scancode;
  	u8				last_toggle;
  	u32				timeout;
  	u32				min_timeout;
  	u32				max_timeout;
  	u32				rx_resolution;
  	u32				tx_resolution;
52b661449   Mauro Carvalho Chehab   [media] rc: Renam...
114
  	int				(*change_protocol)(struct rc_dev *dev, u64 rc_type);
d8b4b5822   David Härdeman   [media] ir-core: ...
115
116
117
118
119
120
  	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: ...
121
  	int				(*tx_ir)(struct rc_dev *dev, unsigned *txbuf, unsigned n);
d8b4b5822   David Härdeman   [media] ir-core: ...
122
123
124
  	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);
75543cce0   Mauro Carvalho Chehab   V4L/DVB (13615): ...
125
  };
a3572c34d   Mauro Carvalho Chehab   V4L/DVB: ir-core:...
126

ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  #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.
   */
  
  struct rc_dev *rc_allocate_device(void);
  void rc_free_device(struct rc_dev *dev);
  int rc_register_device(struct rc_dev *dev);
  void rc_unregister_device(struct rc_dev *dev);
  
  void rc_repeat(struct rc_dev *dev);
  void rc_keydown(struct rc_dev *dev, int scancode, u8 toggle);
  void rc_keydown_notimeout(struct rc_dev *dev, int scancode, u8 toggle);
  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:...
152
153
154
155
156
  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:...
157
  };
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
158
  struct ir_raw_event {
4651918a4   Maxim Levitsky   [media] IR: exten...
159
160
161
162
163
164
165
166
167
168
169
170
171
  	union {
  		u32             duration;
  
  		struct {
  			u32     carrier;
  			u8      duty_cycle;
  		};
  	};
  
  	unsigned                pulse:1;
  	unsigned                reset:1;
  	unsigned                timeout:1;
  	unsigned                carrier_report:1;
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
172
  };
4651918a4   Maxim Levitsky   [media] IR: exten...
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  #define DEFINE_IR_RAW_EVENT(event) \
  	struct ir_raw_event event = { \
  		{ .duration = 0 } , \
  		.pulse = 0, \
  		.reset = 0, \
  		.timeout = 0, \
  		.carrier_report = 0 }
  
  static inline void init_ir_raw_event(struct ir_raw_event *ev)
  {
  	memset(ev, 0, sizeof(*ev));
  }
  
  #define IR_MAX_DURATION         0xFFFFFFFF      /* a bit more than 4 seconds */
5aad72428   Jarod Wilson   [media] rc: fix u...
187
188
189
  #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:...
190

d8b4b5822   David Härdeman   [media] ir-core: ...
191
192
193
194
  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 ...
195
  				struct ir_raw_event *ev);
d8b4b5822   David Härdeman   [media] ir-core: ...
196
  void ir_raw_event_set_idle(struct rc_dev *dev, bool idle);
4a702ebf6   Maxim Levitsky   V4L/DVB: IR: add ...
197

d8b4b5822   David Härdeman   [media] ir-core: ...
198
  static inline void ir_raw_event_reset(struct rc_dev *dev)
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
199
  {
4651918a4   Maxim Levitsky   [media] IR: exten...
200
201
  	DEFINE_IR_RAW_EVENT(ev);
  	ev.reset = true;
d8b4b5822   David Härdeman   [media] ir-core: ...
202
203
  	ir_raw_event_store(dev, &ev);
  	ir_raw_event_handle(dev);
e40b1127f   David Härdeman   V4L/DVB: ir-core:...
204
  }
724e24955   David Härdeman   V4L/DVB: Teach dr...
205

3ffea4988   David Härdeman   [media] ir-core: ...
206
207
208
209
210
211
  /* 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: ...
212
213
214
215
216
217
  		if (mask & 1) {
  			if (data & 1)
  				value |= vbit;
  			vbit <<= 1;
  		}
  		data >>= 1;
3ffea4988   David Härdeman   [media] ir-core: ...
218
219
220
221
  	} while (mask >>= 1);
  
  	return value;
  }
ca86674b8   Mauro Carvalho Chehab   [media] Rename al...
222
  #endif /* _RC_CORE */