1 /* 2 * Line 6 Linux USB driver 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 USB_INTERVALS_PER_SECOND 1000 22 23 /* Fallback USB interval and max packet size values */ 24 #define LINE6_FALLBACK_INTERVAL 10 25 #define LINE6_FALLBACK_MAXPACKETSIZE 16 26 27 #define LINE6_TIMEOUT 1 28 #define LINE6_BUFSIZE_LISTEN 32 29 #define LINE6_MESSAGE_MAXLEN 256 30 31 /* 32 Line 6 MIDI control commands 33 */ 34 #define LINE6_PARAM_CHANGE 0xb0 35 #define LINE6_PROGRAM_CHANGE 0xc0 36 #define LINE6_SYSEX_BEGIN 0xf0 37 #define LINE6_SYSEX_END 0xf7 38 #define LINE6_RESET 0xff 39 40 /* 41 MIDI channel for messages initiated by the host 42 (and eventually echoed back by the device) 43 */ 44 #define LINE6_CHANNEL_HOST 0x00 45 46 /* 47 MIDI channel for messages initiated by the device 48 */ 49 #define LINE6_CHANNEL_DEVICE 0x02 50 51 #define LINE6_CHANNEL_UNKNOWN 5 /* don't know yet what this is good for */ 52 53 #define LINE6_CHANNEL_MASK 0x0f 54 55 #define CHECK_STARTUP_PROGRESS(x, n) \ 56 do { \ 57 if ((x) >= (n)) \ 58 return; \ 59 x = (n); \ 60 } while (0) 61 62 extern const unsigned char line6_midi_id[3]; 63 64 static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3; 65 static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4; 66 67 /* 68 Common properties of Line 6 devices. 69 */ 70 struct line6_properties { 71 /* Card id string (maximum 16 characters). 72 * This can be used to address the device in ALSA programs as 73 * "default:CARD=<id>" 74 */ 75 const char *id; 76 77 /* Card short name (maximum 32 characters) */ 78 const char *name; 79 80 /* Bit vector defining this device's capabilities in line6usb driver */ 81 int capabilities; 82 83 int altsetting; 84 85 unsigned ep_ctrl_r; 86 unsigned ep_ctrl_w; 87 unsigned ep_audio_r; 88 unsigned ep_audio_w; 89 }; 90 91 /* Capability bits */ 92 enum { 93 /* device supports settings parameter via USB */ 94 LINE6_CAP_CONTROL = 1 << 0, 95 /* device supports PCM input/output via USB */ 96 LINE6_CAP_PCM = 1 << 1, 97 /* device support hardware monitoring */ 98 LINE6_CAP_HWMON = 1 << 2, 99 }; 100 101 /* 102 Common data shared by all Line 6 devices. 103 Corresponds to a pair of USB endpoints. 104 */ 105 struct usb_line6 { 106 /* USB device */ 107 struct usb_device *usbdev; 108 109 /* Properties */ 110 const struct line6_properties *properties; 111 112 /* Interval (ms) */ 113 int interval; 114 115 /* Maximum size of USB packet */ 116 int max_packet_size; 117 118 /* Device representing the USB interface */ 119 struct device *ifcdev; 120 121 /* Line 6 sound card data structure. 122 * Each device has at least MIDI or PCM. 123 */ 124 struct snd_card *card; 125 126 /* Line 6 PCM device data structure */ 127 struct snd_line6_pcm *line6pcm; 128 129 /* Line 6 MIDI device data structure */ 130 struct snd_line6_midi *line6midi; 131 132 /* URB for listening to PODxt Pro control endpoint */ 133 struct urb *urb_listen; 134 135 /* Buffer for listening to PODxt Pro control endpoint */ 136 unsigned char *buffer_listen; 137 138 /* Buffer for message to be processed */ 139 unsigned char *buffer_message; 140 141 /* Length of message to be processed */ 142 int message_length; 143 144 void (*process_message)(struct usb_line6 *); 145 void (*disconnect)(struct usb_line6 *line6); 146 }; 147 148 extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, 149 int code2, int size); 150 extern int line6_read_data(struct usb_line6 *line6, unsigned address, 151 void *data, unsigned datalen); 152 extern int line6_read_serial_number(struct usb_line6 *line6, 153 u32 *serial_number); 154 extern int line6_send_raw_message_async(struct usb_line6 *line6, 155 const char *buffer, int size); 156 extern int line6_send_sysex_message(struct usb_line6 *line6, 157 const char *buffer, int size); 158 extern ssize_t line6_set_raw(struct device *dev, struct device_attribute *attr, 159 const char *buf, size_t count); 160 extern void line6_start_timer(struct timer_list *timer, unsigned long msecs, 161 void (*function)(unsigned long), 162 unsigned long data); 163 extern int line6_version_request_async(struct usb_line6 *line6); 164 extern int line6_write_data(struct usb_line6 *line6, unsigned address, 165 void *data, unsigned datalen); 166 167 int line6_probe(struct usb_interface *interface, 168 const struct usb_device_id *id, 169 const char *driver_name, 170 const struct line6_properties *properties, 171 int (*private_init)(struct usb_line6 *, const struct usb_device_id *id), 172 size_t data_size); 173 174 void line6_disconnect(struct usb_interface *interface); 175 176 #ifdef CONFIG_PM 177 int line6_suspend(struct usb_interface *interface, pm_message_t message); 178 int line6_resume(struct usb_interface *interface); 179 #endif 180 181 #endif 182