1 /*
2  * Line6 Linux USB driver - 0.9.1beta
3  *
4  * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
5  *
6  *	This program is free software; you can redistribute it and/or
7  *	modify it under the terms of the GNU General Public License as
8  *	published by the Free Software Foundation, version 2.
9  *
10  */
11 
12 #ifndef DRIVER_H
13 #define DRIVER_H
14 
15 #include <linux/spinlock.h>
16 #include <linux/usb.h>
17 #include <sound/core.h>
18 
19 #include "midi.h"
20 
21 #define DRIVER_NAME "line6usb"
22 
23 #if defined(CONFIG_LINE6_USB_DUMP_CTRL) || defined(CONFIG_LINE6_USB_DUMP_MIDI) || defined(CONFIG_LINE6_USB_DUMP_PCM)
24 #define CONFIG_LINE6_USB_DUMP_ANY
25 #endif
26 
27 #define LINE6_TIMEOUT 1
28 #define LINE6_MAX_DEVICES 8
29 #define LINE6_BUFSIZE_LISTEN 32
30 #define LINE6_MESSAGE_MAXLEN 256
31 
32 /*
33 	Line6 MIDI control commands
34 */
35 #define LINE6_PARAM_CHANGE   0xb0
36 #define LINE6_PROGRAM_CHANGE 0xc0
37 #define LINE6_SYSEX_BEGIN    0xf0
38 #define LINE6_SYSEX_END      0xf7
39 #define LINE6_RESET          0xff
40 
41 /*
42 	MIDI channel for messages initiated by the host
43 	(and eventually echoed back by the device)
44 */
45 #define LINE6_CHANNEL_HOST   0x00
46 
47 /*
48 	MIDI channel for messages initiated by the device
49 */
50 #define LINE6_CHANNEL_DEVICE 0x02
51 
52 #define LINE6_CHANNEL_UNKNOWN 5	/* don't know yet what this is good for */
53 
54 #define LINE6_CHANNEL_MASK 0x0f
55 
56 #ifdef CONFIG_LINE6_USB_DEBUG
57 #define DEBUG_MESSAGES(x) (x)
58 #else
59 #define DEBUG_MESSAGES(x)
60 #endif
61 
62 #define MISSING_CASE	\
63 	printk(KERN_ERR "line6usb driver bug: missing case in %s:%d\n", \
64 		__FILE__, __LINE__)
65 
66 #define CHECK_RETURN(x)		\
67 do {				\
68 	err = x;		\
69 	if (err < 0)		\
70 		return err;	\
71 } while (0)
72 
73 #define CHECK_STARTUP_PROGRESS(x, n)	\
74 do {					\
75 	if ((x) >= (n))			\
76 		return;			\
77 	x = (n);			\
78 } while (0)
79 
80 extern const unsigned char line6_midi_id[3];
81 extern struct usb_line6 *line6_devices[LINE6_MAX_DEVICES];
82 
83 static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3;
84 static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4;
85 
86 /**
87 	 Common properties of Line6 devices.
88 */
89 struct line6_properties {
90 	/**
91 		 Card id string (maximum 16 characters).
92 		 This can be used to address the device in ALSA programs as
93 		 "default:CARD=<id>"
94 	*/
95 	const char *id;
96 
97 	/**
98 		 Card short name (maximum 32 characters).
99 	*/
100 	const char *name;
101 
102 	/**
103 		 Bit identifying this device in the line6usb driver.
104 	*/
105 	int device_bit;
106 
107 	/**
108 		 Bit vector defining this device's capabilities in the
109 		 line6usb driver.
110 	*/
111 	int capabilities;
112 };
113 
114 /**
115 	 Common data shared by all Line6 devices.
116 	 Corresponds to a pair of USB endpoints.
117 */
118 struct usb_line6 {
119 	/**
120 		 USB device.
121 	*/
122 	struct usb_device *usbdev;
123 
124 	/**
125 		 Product id.
126 	*/
127 	int product;
128 
129 	/**
130 		 Properties.
131 	*/
132 	const struct line6_properties *properties;
133 
134 	/**
135 		 Interface number.
136 	*/
137 	int interface_number;
138 
139 	/**
140 		 Interval (ms).
141 	*/
142 	int interval;
143 
144 	/**
145 		 Maximum size of USB packet.
146 	*/
147 	int max_packet_size;
148 
149 	/**
150 		 Device representing the USB interface.
151 	*/
152 	struct device *ifcdev;
153 
154 	/**
155 		 Line6 sound card data structure.
156 		 Each device has at least MIDI or PCM.
157 	*/
158 	struct snd_card *card;
159 
160 	/**
161 		 Line6 PCM device data structure.
162 	*/
163 	struct snd_line6_pcm *line6pcm;
164 
165 	/**
166 		 Line6 MIDI device data structure.
167 	*/
168 	struct snd_line6_midi *line6midi;
169 
170 	/**
171 		 USB endpoint for listening to control commands.
172 	*/
173 	int ep_control_read;
174 
175 	/**
176 		 USB endpoint for writing control commands.
177 	*/
178 	int ep_control_write;
179 
180 	/**
181 		 URB for listening to PODxt Pro control endpoint.
182 	*/
183 	struct urb *urb_listen;
184 
185 	/**
186 		 Buffer for listening to PODxt Pro control endpoint.
187 	*/
188 	unsigned char *buffer_listen;
189 
190 	/**
191 		 Buffer for message to be processed.
192 	*/
193 	unsigned char *buffer_message;
194 
195 	/**
196 		 Length of message to be processed.
197 	*/
198 	int message_length;
199 };
200 
201 extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
202 				      int code2, int size);
203 extern ssize_t line6_nop_read(struct device *dev,
204 			      struct device_attribute *attr, char *buf);
205 extern ssize_t line6_nop_write(struct device *dev,
206 			       struct device_attribute *attr,
207 			       const char *buf, size_t count);
208 extern int line6_read_data(struct usb_line6 *line6, int address, void *data,
209 			   size_t datalen);
210 extern int line6_read_serial_number(struct usb_line6 *line6,
211 				    int *serial_number);
212 extern int line6_send_program(struct usb_line6 *line6, int value);
213 extern int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
214 				  int size);
215 extern int line6_send_raw_message_async(struct usb_line6 *line6,
216 					const char *buffer, int size);
217 extern int line6_send_sysex_message(struct usb_line6 *line6,
218 				    const char *buffer, int size);
219 extern int line6_send_sysex_message_async(struct usb_line6 *line6,
220 					  const char *buffer, int size);
221 extern ssize_t line6_set_raw(struct device *dev, struct device_attribute *attr,
222 			     const char *buf, size_t count);
223 extern void line6_start_timer(struct timer_list *timer, unsigned int msecs,
224 			      void (*function) (unsigned long),
225 			      unsigned long data);
226 extern int line6_transmit_parameter(struct usb_line6 *line6, int param,
227 				    int value);
228 extern int line6_version_request_async(struct usb_line6 *line6);
229 extern int line6_write_data(struct usb_line6 *line6, int address, void *data,
230 			    size_t datalen);
231 
232 #ifdef CONFIG_LINE6_USB_DUMP_ANY
233 extern void line6_write_hexdump(struct usb_line6 *line6, char dir,
234 				const unsigned char *buffer, int size);
235 #endif
236 
237 #endif
238