Root/drivers/staging/line6/driver.h

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, u8 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                    u8 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

Archive Download this file



interactive