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)		\
67do {				\
68	err = x;		\
69	if (err < 0)		\
70		return err;	\
71} while (0)
72
73#define CHECK_STARTUP_PROGRESS(x, n)	\
74do {					\
75	if ((x) >= (n))			\
76		return;			\
77	x = (n);			\
78} while (0)
79
80extern const unsigned char line6_midi_id[3];
81extern struct usb_line6 *line6_devices[LINE6_MAX_DEVICES];
82
83static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3;
84static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4;
85
86/**
87	 Common properties of Line6 devices.
88*/
89struct line6_properties {
90	/**
91		 Bit identifying this device in the line6usb driver.
92	*/
93	int device_bit;
94
95	/**
96		 Card id string (maximum 16 characters).
97		 This can be used to address the device in ALSA programs as
98		 "default:CARD=<id>"
99	*/
100	const char *id;
101
102	/**
103		 Card short name (maximum 32 characters).
104	*/
105	const char *name;
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*/
118struct 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
201extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
202				      int code2, int size);
203extern ssize_t line6_nop_read(struct device *dev,
204			      struct device_attribute *attr, char *buf);
205extern ssize_t line6_nop_write(struct device *dev,
206			       struct device_attribute *attr,
207			       const char *buf, size_t count);
208extern int line6_read_data(struct usb_line6 *line6, int address, void *data,
209			   size_t datalen);
210extern int line6_read_serial_number(struct usb_line6 *line6,
211				    int *serial_number);
212extern int line6_send_program(struct usb_line6 *line6, int value);
213extern int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
214				  int size);
215extern int line6_send_raw_message_async(struct usb_line6 *line6,
216					const char *buffer, int size);
217extern int line6_send_sysex_message(struct usb_line6 *line6,
218				    const char *buffer, int size);
219extern int line6_send_sysex_message_async(struct usb_line6 *line6,
220					  const char *buffer, int size);
221extern ssize_t line6_set_raw(struct device *dev, struct device_attribute *attr,
222			     const char *buf, size_t count);
223extern void line6_start_timer(struct timer_list *timer, unsigned int msecs,
224			      void (*function) (unsigned long),
225			      unsigned long data);
226extern int line6_transmit_parameter(struct usb_line6 *line6, int param,
227				    int value);
228extern int line6_version_request_async(struct usb_line6 *line6);
229extern int line6_write_data(struct usb_line6 *line6, int address, void *data,
230			    size_t datalen);
231
232#ifdef CONFIG_LINE6_USB_DUMP_ANY
233extern void line6_write_hexdump(struct usb_line6 *line6, char dir,
234				const unsigned char *buffer, int size);
235#endif
236
237#endif
238