2 * Linux driver for TerraTec DMX 6Fire USB
4 * Device communications
6 * Author: Torsten Schenk <torsten.schenk@zoho.com>
7 * Created: Jan 01, 2011
9 * Copyright: (C) Torsten Schenk
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
26 static void usb6fire_comm_init_urb(struct comm_runtime
*rt
, struct urb
*urb
,
27 u8
*buffer
, void *context
, void(*handler
)(struct urb
*urb
))
30 urb
->transfer_buffer
= buffer
;
31 urb
->pipe
= usb_sndintpipe(rt
->chip
->dev
, COMM_EP
);
32 urb
->complete
= handler
;
33 urb
->context
= context
;
35 urb
->dev
= rt
->chip
->dev
;
38 static void usb6fire_comm_receiver_handler(struct urb
*urb
)
40 struct comm_runtime
*rt
= urb
->context
;
41 struct midi_runtime
*midi_rt
= rt
->chip
->midi
;
44 if (rt
->receiver_buffer
[0] == 0x10) /* midi in event */
46 midi_rt
->in_received(midi_rt
,
47 rt
->receiver_buffer
+ 2,
48 rt
->receiver_buffer
[1]);
51 if (!rt
->chip
->shutdown
) {
53 urb
->actual_length
= 0;
54 if (usb_submit_urb(urb
, GFP_ATOMIC
) < 0)
55 snd_printk(KERN_WARNING PREFIX
56 "comm data receiver aborted.\n");
60 static void usb6fire_comm_init_buffer(u8
*buffer
, u8 id
, u8 request
,
68 buffer
[1] = 0x05; /* length (starting at buffer[2]) */
75 buffer
[1] = 0x0b; /* length (starting at buffer[2]) */
97 static int usb6fire_comm_send_buffer(u8
*buffer
, struct usb_device
*dev
)
102 ret
= usb_interrupt_msg(dev
, usb_sndintpipe(dev
, COMM_EP
),
103 buffer
, buffer
[1] + 2, &actual_len
, HZ
);
106 else if (actual_len
!= buffer
[1] + 2)
111 static int usb6fire_comm_write8(struct comm_runtime
*rt
, u8 request
,
114 u8 buffer
[13]; /* 13: maximum length of message */
116 usb6fire_comm_init_buffer(buffer
, 0x00, request
, reg
, value
, 0x00);
117 return usb6fire_comm_send_buffer(buffer
, rt
->chip
->dev
);
120 static int usb6fire_comm_write16(struct comm_runtime
*rt
, u8 request
,
121 u8 reg
, u8 vl
, u8 vh
)
123 u8 buffer
[13]; /* 13: maximum length of message */
125 usb6fire_comm_init_buffer(buffer
, 0x00, request
, reg
, vl
, vh
);
126 return usb6fire_comm_send_buffer(buffer
, rt
->chip
->dev
);
129 int __devinit
usb6fire_comm_init(struct sfire_chip
*chip
)
131 struct comm_runtime
*rt
= kzalloc(sizeof(struct comm_runtime
),
133 struct urb
*urb
= &rt
->receiver
;
142 rt
->init_urb
= usb6fire_comm_init_urb
;
143 rt
->write8
= usb6fire_comm_write8
;
144 rt
->write16
= usb6fire_comm_write16
;
146 /* submit an urb that receives communication data from device */
147 urb
->transfer_buffer
= rt
->receiver_buffer
;
148 urb
->transfer_buffer_length
= COMM_RECEIVER_BUFSIZE
;
149 urb
->pipe
= usb_rcvintpipe(chip
->dev
, COMM_EP
);
150 urb
->dev
= chip
->dev
;
151 urb
->complete
= usb6fire_comm_receiver_handler
;
154 ret
= usb_submit_urb(urb
, GFP_KERNEL
);
157 snd_printk(KERN_ERR PREFIX
"cannot create comm data receiver.");
164 void usb6fire_comm_abort(struct sfire_chip
*chip
)
166 struct comm_runtime
*rt
= chip
->comm
;
169 usb_poison_urb(&rt
->receiver
);
172 void usb6fire_comm_destroy(struct sfire_chip
*chip
)