1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Infrared Toy and IR Droid RC core driver
6 * Copyright (C) 2020 Sean Young <sean@mess.org>
8 * http://dangerousprototypes.com/docs/USB_IR_Toy:_Sampling_mode
10 * This driver is based on the lirc driver which can be found here:
11 * https://sourceforge.net/p/lirc/git/ci/master/tree/plugins/irtoy.c
12 * Copyright (C) 2011 Peter Kooiman <pkooiman@gmail.com>
15 #include <linux/unaligned.h>
16 #include <linux/completion.h>
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/usb.h>
20 #include <linux/slab.h>
21 #include <linux/usb/input.h>
23 #include <media/rc-core.h>
25 static const u8 COMMAND_VERSION
[] = { 'v' };
26 // End transmit and repeat reset command so we exit sump mode
27 static const u8 COMMAND_RESET
[] = { 0xff, 0xff, 0, 0, 0, 0, 0 };
28 static const u8 COMMAND_SMODE_ENTER
[] = { 's' };
29 static const u8 COMMAND_SMODE_EXIT
[] = { 0 };
30 static const u8 COMMAND_TXSTART
[] = { 0x26, 0x24, 0x25, 0x03 };
32 #define REPLY_XMITCOUNT 't'
33 #define REPLY_XMITSUCCESS 'C'
34 #define REPLY_VERSION 'V'
35 #define REPLY_SAMPLEMODEPROTO 'S'
41 #define LEN_SAMPLEMODEPROTO 3
43 #define MIN_FW_VERSION 20
45 #define MAX_TIMEOUT_US (UNIT_US * U16_MAX)
51 STATE_COMMAND_NO_RESP
,
58 struct usb_device
*usbdev
;
61 struct urb
*urb_in
, *urb_out
;
65 struct completion command_done
;
81 static void irtoy_response(struct irtoy
*irtoy
, u32 len
)
83 switch (irtoy
->state
) {
85 if (len
== LEN_VERSION
&& irtoy
->in
[0] == REPLY_VERSION
) {
88 irtoy
->in
[LEN_VERSION
] = 0;
90 if (kstrtouint(irtoy
->in
+ 1, 10, &version
)) {
91 dev_err(irtoy
->dev
, "invalid version %*phN. Please make sure you are using firmware v20 or higher",
92 LEN_VERSION
, irtoy
->in
);
96 dev_dbg(irtoy
->dev
, "version %s\n", irtoy
->in
);
98 irtoy
->hw_version
= version
/ 100;
99 irtoy
->sw_version
= version
% 100;
101 irtoy
->state
= STATE_IRDATA
;
102 complete(&irtoy
->command_done
);
103 } else if (len
== LEN_SAMPLEMODEPROTO
&&
104 irtoy
->in
[0] == REPLY_SAMPLEMODEPROTO
) {
107 irtoy
->in
[LEN_SAMPLEMODEPROTO
] = 0;
109 if (kstrtouint(irtoy
->in
+ 1, 10, &version
)) {
110 dev_err(irtoy
->dev
, "invalid sample mode response %*phN",
111 LEN_SAMPLEMODEPROTO
, irtoy
->in
);
115 dev_dbg(irtoy
->dev
, "protocol %s\n", irtoy
->in
);
117 irtoy
->proto_version
= version
;
119 irtoy
->state
= STATE_IRDATA
;
120 complete(&irtoy
->command_done
);
122 dev_err(irtoy
->dev
, "unexpected response to command: %*phN\n",
126 case STATE_COMMAND_NO_RESP
:
128 struct ir_raw_event rawir
= { .pulse
= irtoy
->pulse
};
129 __be16
*in
= (__be16
*)irtoy
->in
;
132 for (i
= 0; i
< len
/ sizeof(__be16
); i
++) {
133 u16 v
= be16_to_cpu(in
[i
]);
138 rawir
.duration
= v
* UNIT_US
;
139 ir_raw_event_store_with_timeout(irtoy
->rc
,
143 rawir
.pulse
= !rawir
.pulse
;
146 irtoy
->pulse
= rawir
.pulse
;
148 ir_raw_event_handle(irtoy
->rc
);
152 if (irtoy
->tx_len
== 0) {
153 if (len
== LEN_XMITRES
&&
154 irtoy
->in
[0] == REPLY_XMITCOUNT
) {
155 u16 emitted
= get_unaligned_be16(irtoy
->in
+ 1);
157 dev_dbg(irtoy
->dev
, "emitted:%u\n", emitted
);
159 irtoy
->emitted
= emitted
;
160 } else if (len
== 1 &&
161 irtoy
->in
[0] == REPLY_XMITSUCCESS
) {
162 irtoy
->state
= STATE_IRDATA
;
163 complete(&irtoy
->command_done
);
166 // send next part of tx buffer
167 uint space
= irtoy
->in
[0];
171 if (len
!= 1 || space
> MAX_PACKET
|| space
== 0) {
172 dev_dbg(irtoy
->dev
, "packet length expected: %*phN\n",
177 buf_len
= min(space
, irtoy
->tx_len
);
179 dev_dbg(irtoy
->dev
, "remaining:%u sending:%u\n",
180 irtoy
->tx_len
, buf_len
);
182 memcpy(irtoy
->out
, irtoy
->tx_buf
, buf_len
);
183 irtoy
->urb_out
->transfer_buffer_length
= buf_len
;
184 err
= usb_submit_urb(irtoy
->urb_out
, GFP_ATOMIC
);
186 dev_err(irtoy
->dev
, "fail to submit tx buf urb: %d\n",
188 irtoy
->state
= STATE_IRDATA
;
189 complete(&irtoy
->command_done
);
193 irtoy
->tx_buf
+= buf_len
;
194 irtoy
->tx_len
-= buf_len
;
200 static void irtoy_out_callback(struct urb
*urb
)
202 struct irtoy
*irtoy
= urb
->context
;
204 if (urb
->status
== 0) {
205 if (irtoy
->state
== STATE_COMMAND_NO_RESP
)
206 complete(&irtoy
->command_done
);
208 dev_warn(irtoy
->dev
, "out urb status: %d\n", urb
->status
);
212 static void irtoy_in_callback(struct urb
*urb
)
214 struct irtoy
*irtoy
= urb
->context
;
217 switch (urb
->status
) {
219 irtoy_response(irtoy
, urb
->actual_length
);
229 dev_dbg(irtoy
->dev
, "in urb status: %d\n", urb
->status
);
232 ret
= usb_submit_urb(urb
, GFP_ATOMIC
);
233 if (ret
&& ret
!= -ENODEV
)
234 dev_warn(irtoy
->dev
, "failed to resubmit urb: %d\n", ret
);
237 static int irtoy_command(struct irtoy
*irtoy
, const u8
*cmd
, int cmd_len
,
242 init_completion(&irtoy
->command_done
);
244 irtoy
->state
= state
;
246 memcpy(irtoy
->out
, cmd
, cmd_len
);
247 irtoy
->urb_out
->transfer_buffer_length
= cmd_len
;
249 err
= usb_submit_urb(irtoy
->urb_out
, GFP_KERNEL
);
253 if (!wait_for_completion_timeout(&irtoy
->command_done
,
254 msecs_to_jiffies(TIMEOUT
))) {
255 usb_kill_urb(irtoy
->urb_out
);
262 static int irtoy_setup(struct irtoy
*irtoy
)
266 err
= irtoy_command(irtoy
, COMMAND_RESET
, sizeof(COMMAND_RESET
),
267 STATE_COMMAND_NO_RESP
);
269 dev_err(irtoy
->dev
, "could not write reset command: %d\n",
274 usleep_range(50, 50);
277 err
= irtoy_command(irtoy
, COMMAND_VERSION
, sizeof(COMMAND_VERSION
),
280 dev_err(irtoy
->dev
, "could not write version command: %d\n",
286 err
= irtoy_command(irtoy
, COMMAND_SMODE_ENTER
,
287 sizeof(COMMAND_SMODE_ENTER
), STATE_COMMAND
);
289 dev_err(irtoy
->dev
, "could not write sample command: %d\n",
296 * When sending IR, it is imperative that we send the IR data as quickly
297 * as possible to the device, so it does not run out of IR data and
298 * introduce gaps. Allocate the buffer here, and then feed the data from
299 * the urb callback handler.
301 static int irtoy_tx(struct rc_dev
*rc
, uint
*txbuf
, uint count
)
303 struct irtoy
*irtoy
= rc
->priv
;
304 unsigned int i
, size
;
308 size
= sizeof(u16
) * (count
+ 1);
309 buf
= kmalloc(size
, GFP_KERNEL
);
313 for (i
= 0; i
< count
; i
++) {
314 u16 v
= DIV_ROUND_CLOSEST(txbuf
[i
], UNIT_US
);
318 buf
[i
] = cpu_to_be16(v
);
321 buf
[count
] = cpu_to_be16(0xffff);
324 irtoy
->tx_len
= size
;
327 // There is an issue where if the unit is receiving IR while the
328 // first TXSTART command is sent, the device might end up hanging
329 // with its led on. It does not respond to any command when this
330 // happens. To work around this, re-enter sample mode.
331 err
= irtoy_command(irtoy
, COMMAND_SMODE_EXIT
,
332 sizeof(COMMAND_SMODE_EXIT
), STATE_COMMAND_NO_RESP
);
334 dev_err(irtoy
->dev
, "exit sample mode: %d\n", err
);
339 err
= irtoy_command(irtoy
, COMMAND_SMODE_ENTER
,
340 sizeof(COMMAND_SMODE_ENTER
), STATE_COMMAND
);
342 dev_err(irtoy
->dev
, "enter sample mode: %d\n", err
);
347 err
= irtoy_command(irtoy
, COMMAND_TXSTART
, sizeof(COMMAND_TXSTART
),
352 dev_err(irtoy
->dev
, "failed to send tx start command: %d\n",
354 // not sure what state the device is in, reset it
359 if (size
!= irtoy
->emitted
) {
360 dev_err(irtoy
->dev
, "expected %u emitted, got %u\n", size
,
362 // not sure what state the device is in, reset it
370 static int irtoy_tx_carrier(struct rc_dev
*rc
, uint32_t carrier
)
372 struct irtoy
*irtoy
= rc
->priv
;
380 buf
[1] = DIV_ROUND_CLOSEST(48000000, 16 * carrier
) - 1;
383 err
= irtoy_command(irtoy
, buf
, sizeof(buf
), STATE_COMMAND_NO_RESP
);
385 dev_err(irtoy
->dev
, "could not write carrier command: %d\n",
391 static int irtoy_probe(struct usb_interface
*intf
,
392 const struct usb_device_id
*id
)
394 struct usb_host_interface
*idesc
= intf
->cur_altsetting
;
395 struct usb_device
*usbdev
= interface_to_usbdev(intf
);
396 struct usb_endpoint_descriptor
*ep_in
= NULL
;
397 struct usb_endpoint_descriptor
*ep_out
= NULL
;
398 struct usb_endpoint_descriptor
*ep
= NULL
;
402 int i
, pipe
, err
= -ENOMEM
;
404 for (i
= 0; i
< idesc
->desc
.bNumEndpoints
; i
++) {
405 ep
= &idesc
->endpoint
[i
].desc
;
407 if (!ep_in
&& usb_endpoint_is_bulk_in(ep
) &&
408 usb_endpoint_maxp(ep
) == MAX_PACKET
)
411 if (!ep_out
&& usb_endpoint_is_bulk_out(ep
) &&
412 usb_endpoint_maxp(ep
) == MAX_PACKET
)
416 if (!ep_in
|| !ep_out
) {
417 dev_err(&intf
->dev
, "required endpoints not found\n");
421 irtoy
= kzalloc(sizeof(*irtoy
), GFP_KERNEL
);
425 irtoy
->in
= kmalloc(MAX_PACKET
, GFP_KERNEL
);
429 irtoy
->out
= kmalloc(MAX_PACKET
, GFP_KERNEL
);
433 rc
= rc_allocate_device(RC_DRIVER_IR_RAW
);
437 urb
= usb_alloc_urb(0, GFP_KERNEL
);
441 pipe
= usb_rcvbulkpipe(usbdev
, ep_in
->bEndpointAddress
);
442 usb_fill_bulk_urb(urb
, usbdev
, pipe
, irtoy
->in
, MAX_PACKET
,
443 irtoy_in_callback
, irtoy
);
446 urb
= usb_alloc_urb(0, GFP_KERNEL
);
450 pipe
= usb_sndbulkpipe(usbdev
, ep_out
->bEndpointAddress
);
451 usb_fill_bulk_urb(urb
, usbdev
, pipe
, irtoy
->out
, MAX_PACKET
,
452 irtoy_out_callback
, irtoy
);
454 irtoy
->dev
= &intf
->dev
;
455 irtoy
->usbdev
= usbdev
;
457 irtoy
->urb_out
= urb
;
460 err
= usb_submit_urb(irtoy
->urb_in
, GFP_KERNEL
);
462 dev_err(irtoy
->dev
, "fail to submit in urb: %d\n", err
);
466 err
= irtoy_setup(irtoy
);
470 dev_info(irtoy
->dev
, "version: hardware %u, firmware %u.%u, protocol %u",
471 irtoy
->hw_version
, irtoy
->sw_version
/ 10,
472 irtoy
->sw_version
% 10, irtoy
->proto_version
);
474 if (irtoy
->sw_version
< MIN_FW_VERSION
) {
475 dev_err(irtoy
->dev
, "need firmware V%02u or higher",
481 usb_make_path(usbdev
, irtoy
->phys
, sizeof(irtoy
->phys
));
483 rc
->device_name
= "Infrared Toy";
484 rc
->driver_name
= KBUILD_MODNAME
;
485 rc
->input_phys
= irtoy
->phys
;
486 usb_to_input_id(usbdev
, &rc
->input_id
);
487 rc
->dev
.parent
= &intf
->dev
;
489 rc
->tx_ir
= irtoy_tx
;
490 rc
->s_tx_carrier
= irtoy_tx_carrier
;
491 rc
->allowed_protocols
= RC_PROTO_BIT_ALL_IR_DECODER
;
492 rc
->map_name
= RC_MAP_RC6_MCE
;
493 rc
->rx_resolution
= UNIT_US
;
494 rc
->timeout
= IR_DEFAULT_TIMEOUT
;
497 * end of transmission is detected by absence of a usb packet
498 * with more pulse/spaces. However, each usb packet sent can
499 * contain 32 pulse/spaces, which can be quite lengthy, so there
500 * can be a delay between usb packets. For example with nec there is a
501 * 17ms gap between packets.
503 * So, make timeout a largish minimum which works with most protocols.
505 rc
->min_timeout
= MS_TO_US(40);
506 rc
->max_timeout
= MAX_TIMEOUT_US
;
508 err
= rc_register_device(rc
);
512 usb_set_intfdata(intf
, irtoy
);
517 usb_kill_urb(irtoy
->urb_out
);
518 usb_free_urb(irtoy
->urb_out
);
519 usb_kill_urb(irtoy
->urb_in
);
520 usb_free_urb(irtoy
->urb_in
);
529 static void irtoy_disconnect(struct usb_interface
*intf
)
531 struct irtoy
*ir
= usb_get_intfdata(intf
);
533 rc_unregister_device(ir
->rc
);
534 usb_set_intfdata(intf
, NULL
);
535 usb_kill_urb(ir
->urb_out
);
536 usb_free_urb(ir
->urb_out
);
537 usb_kill_urb(ir
->urb_in
);
538 usb_free_urb(ir
->urb_in
);
544 static const struct usb_device_id irtoy_table
[] = {
545 { USB_DEVICE_INTERFACE_CLASS(0x04d8, 0xfd08, USB_CLASS_CDC_DATA
) },
546 { USB_DEVICE_INTERFACE_CLASS(0x04d8, 0xf58b, USB_CLASS_CDC_DATA
) },
550 static struct usb_driver irtoy_driver
= {
551 .name
= KBUILD_MODNAME
,
552 .probe
= irtoy_probe
,
553 .disconnect
= irtoy_disconnect
,
554 .id_table
= irtoy_table
,
557 module_usb_driver(irtoy_driver
);
559 MODULE_AUTHOR("Sean Young <sean@mess.org>");
560 MODULE_DESCRIPTION("Infrared Toy and IR Droid driver");
561 MODULE_LICENSE("GPL");
562 MODULE_DEVICE_TABLE(usb
, irtoy_table
);