2 tm6000-input.c - driver for TM5600/TM6000/TM6010 USB video capture devices
4 Copyright (C) 2010 Stefan Ringel <stefan.ringel@arcor.de>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation version 2
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <linux/module.h>
21 #include <linux/init.h>
22 #include <linux/delay.h>
24 #include <linux/input.h>
25 #include <linux/usb.h>
27 #include <media/ir-core.h>
28 #include <media/ir-common.h>
31 #include "tm6000-regs.h"
33 static unsigned int ir_debug
;
34 module_param(ir_debug
, int, 0644);
35 MODULE_PARM_DESC(ir_debug
, "enable debug message [IR]");
37 static unsigned int enable_ir
= 1;
38 module_param(enable_ir
, int, 0644);
39 MODULE_PARM_DESC(enable_ir
, "enable ir (default is enable");
43 #define dprintk(fmt, arg...) \
45 printk(KERN_DEBUG "%s/ir: " fmt, ir->name , ## arg); \
48 struct tm6000_ir_poll_result
{
53 struct tm6000_core
*dev
;
54 struct ir_input_dev
*input
;
55 struct ir_input_state ir
;
59 /* poll expernal decoder */
61 struct delayed_work work
;
67 int (*get_key
) (struct tm6000_IR
*, struct tm6000_ir_poll_result
*);
69 /* IR device properties */
70 struct ir_dev_props props
;
74 void tm6000_ir_wait(struct tm6000_core
*dev
, u8 state
)
76 struct tm6000_IR
*ir
= dev
->ir
;
88 static int tm6000_ir_config(struct tm6000_IR
*ir
)
90 struct tm6000_core
*dev
= ir
->dev
;
106 rc
= tm6000_read_write_usb(dev
, USB_DIR_OUT
| USB_TYPE_VENDOR
|
107 USB_RECIP_DEVICE
, REQ_00_SET_IR_VALUE
, 0, 0, buf
, 0x0a);
111 printk(KERN_INFO
"IR configuration failed");
117 static void tm6000_ir_urb_received(struct urb
*urb
)
119 struct tm6000_core
*dev
= urb
->context
;
120 struct tm6000_IR
*ir
= dev
->ir
;
123 if (urb
->status
!= 0)
124 printk(KERN_INFO
"not ready\n");
125 else if (urb
->actual_length
> 0) {
126 memcpy(ir
->urb_data
, urb
->transfer_buffer
, urb
->actual_length
);
128 dprintk("data %02x %02x %02x %02x\n", ir
->urb_data
[0],
129 ir
->urb_data
[1], ir
->urb_data
[2], ir
->urb_data
[3]);
134 rc
= usb_submit_urb(urb
, GFP_ATOMIC
);
137 static int default_polling_getkey(struct tm6000_IR
*ir
,
138 struct tm6000_ir_poll_result
*poll_result
)
140 struct tm6000_core
*dev
= ir
->dev
;
144 if (ir
->wait
&& !&dev
->int_in
)
148 if (ir
->ir
.ir_type
== IR_TYPE_RC5
)
149 poll_result
->rc_data
= ir
->urb_data
[0];
151 poll_result
->rc_data
= ir
->urb_data
[0] | ir
->urb_data
[1] << 8;
153 tm6000_set_reg(dev
, REQ_04_EN_DISABLE_MCU_INT
, 2, 0);
155 tm6000_set_reg(dev
, REQ_04_EN_DISABLE_MCU_INT
, 2, 1);
158 if (ir
->ir
.ir_type
== IR_TYPE_RC5
) {
159 rc
= tm6000_read_write_usb(dev
, USB_DIR_IN
|
160 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
161 REQ_02_GET_IR_CODE
, 0, 0, buf
, 1);
165 dprintk("read data=%02x\n", buf
[0]);
169 poll_result
->rc_data
= buf
[0];
171 rc
= tm6000_read_write_usb(dev
, USB_DIR_IN
|
172 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
173 REQ_02_GET_IR_CODE
, 0, 0, buf
, 2);
177 dprintk("read data=%04x\n", buf
[0] | buf
[1] << 8);
181 poll_result
->rc_data
= buf
[0] | buf
[1] << 8;
183 if ((poll_result
->rc_data
& 0x00ff) != 0xff)
189 static void tm6000_ir_handle_key(struct tm6000_IR
*ir
)
192 struct tm6000_ir_poll_result poll_result
;
194 /* read the registers containing the IR status */
195 result
= ir
->get_key(ir
, &poll_result
);
197 printk(KERN_INFO
"ir->get_key() failed %d\n", result
);
201 dprintk("ir->get_key result data=%04x\n", poll_result
.rc_data
);
204 ir_input_keydown(ir
->input
->input_dev
, &ir
->ir
,
205 (u32
)poll_result
.rc_data
);
207 ir_input_nokey(ir
->input
->input_dev
, &ir
->ir
);
213 static void tm6000_ir_work(struct work_struct
*work
)
215 struct tm6000_IR
*ir
= container_of(work
, struct tm6000_IR
, work
.work
);
217 tm6000_ir_handle_key(ir
);
218 schedule_delayed_work(&ir
->work
, msecs_to_jiffies(ir
->polling
));
221 static int tm6000_ir_start(void *priv
)
223 struct tm6000_IR
*ir
= priv
;
225 INIT_DELAYED_WORK(&ir
->work
, tm6000_ir_work
);
226 schedule_delayed_work(&ir
->work
, 0);
231 static void tm6000_ir_stop(void *priv
)
233 struct tm6000_IR
*ir
= priv
;
235 cancel_delayed_work_sync(&ir
->work
);
238 int tm6000_ir_change_protocol(void *priv
, u64 ir_type
)
240 struct tm6000_IR
*ir
= priv
;
242 ir
->get_key
= default_polling_getkey
;
244 tm6000_ir_config(ir
);
249 int tm6000_ir_init(struct tm6000_core
*dev
)
251 struct tm6000_IR
*ir
;
252 struct ir_input_dev
*ir_input_dev
;
259 if (!dev
->caps
.has_remote
)
265 ir
= kzalloc(sizeof(*ir
), GFP_KERNEL
);
266 ir_input_dev
= kzalloc(sizeof(*ir_input_dev
), GFP_KERNEL
);
267 ir_input_dev
->input_dev
= input_allocate_device();
268 if (!ir
|| !ir_input_dev
|| !ir_input_dev
->input_dev
)
271 /* record handles to ourself */
275 ir
->input
= ir_input_dev
;
277 /* input einrichten */
278 ir
->props
.allowed_protos
= IR_TYPE_RC5
| IR_TYPE_NEC
;
280 ir
->props
.change_protocol
= tm6000_ir_change_protocol
;
281 ir
->props
.open
= tm6000_ir_start
;
282 ir
->props
.close
= tm6000_ir_stop
;
283 ir
->props
.driver_type
= RC_DRIVER_SCANCODE
;
287 snprintf(ir
->name
, sizeof(ir
->name
), "tm5600/60x0 IR (%s)",
290 usb_make_path(dev
->udev
, ir
->phys
, sizeof(ir
->phys
));
291 strlcat(ir
->phys
, "/input0", sizeof(ir
->phys
));
293 tm6000_ir_change_protocol(ir
, IR_TYPE_UNKNOWN
);
294 err
= ir_input_init(ir_input_dev
->input_dev
, &ir
->ir
, IR_TYPE_OTHER
);
298 ir_input_dev
->input_dev
->name
= ir
->name
;
299 ir_input_dev
->input_dev
->phys
= ir
->phys
;
300 ir_input_dev
->input_dev
->id
.bustype
= BUS_USB
;
301 ir_input_dev
->input_dev
->id
.version
= 1;
302 ir_input_dev
->input_dev
->id
.vendor
= le16_to_cpu(dev
->udev
->descriptor
.idVendor
);
303 ir_input_dev
->input_dev
->id
.product
= le16_to_cpu(dev
->udev
->descriptor
.idProduct
);
305 ir_input_dev
->input_dev
->dev
.parent
= &dev
->udev
->dev
;
308 dprintk("IR over int\n");
310 ir
->int_urb
= usb_alloc_urb(0, GFP_KERNEL
);
312 pipe
= usb_rcvintpipe(dev
->udev
,
313 dev
->int_in
.endp
->desc
.bEndpointAddress
314 & USB_ENDPOINT_NUMBER_MASK
);
316 size
= usb_maxpacket(dev
->udev
, pipe
, usb_pipeout(pipe
));
317 dprintk("IR max size: %d\n", size
);
319 ir
->int_urb
->transfer_buffer
= kzalloc(size
, GFP_KERNEL
);
320 if (ir
->int_urb
->transfer_buffer
== NULL
) {
321 usb_free_urb(ir
->int_urb
);
324 dprintk("int interval: %d\n", dev
->int_in
.endp
->desc
.bInterval
);
325 usb_fill_int_urb(ir
->int_urb
, dev
->udev
, pipe
,
326 ir
->int_urb
->transfer_buffer
, size
,
327 tm6000_ir_urb_received
, dev
,
328 dev
->int_in
.endp
->desc
.bInterval
);
329 rc
= usb_submit_urb(ir
->int_urb
, GFP_KERNEL
);
331 kfree(ir
->int_urb
->transfer_buffer
);
332 usb_free_urb(ir
->int_urb
);
336 ir
->urb_data
= kzalloc(size
, GFP_KERNEL
);
340 err
= ir_input_register(ir
->input
->input_dev
, dev
->ir_codes
,
341 &ir
->props
, "tm6000");
355 int tm6000_ir_fini(struct tm6000_core
*dev
)
357 struct tm6000_IR
*ir
= dev
->ir
;
359 /* skip detach on non attached board */
364 ir_input_unregister(ir
->input
->input_dev
);
367 usb_kill_urb(ir
->int_urb
);
368 kfree(ir
->int_urb
->transfer_buffer
);
369 usb_free_urb(ir
->int_urb
);