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 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 */ 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