| rjw | 1f88458 | 2022-01-06 17:20:42 +0800 | [diff] [blame] | 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/usb.h> | 
 | 16 | #include <linux/mutex.h> | 
 | 17 | #include <linux/kfifo.h> | 
 | 18 | #include <sound/core.h> | 
 | 19 |  | 
 | 20 | #include "midi.h" | 
 | 21 |  | 
 | 22 | /* USB 1.1 speed configuration */ | 
 | 23 | #define USB_LOW_INTERVALS_PER_SECOND 1000 | 
 | 24 | #define USB_LOW_ISO_BUFFERS 2 | 
 | 25 |  | 
 | 26 | /* USB 2.0+ speed configuration */ | 
 | 27 | #define USB_HIGH_INTERVALS_PER_SECOND 8000 | 
 | 28 | #define USB_HIGH_ISO_BUFFERS 16 | 
 | 29 |  | 
 | 30 | /* Fallback USB interval and max packet size values */ | 
 | 31 | #define LINE6_FALLBACK_INTERVAL 10 | 
 | 32 | #define LINE6_FALLBACK_MAXPACKETSIZE 16 | 
 | 33 |  | 
 | 34 | #define LINE6_TIMEOUT 1 | 
 | 35 | #define LINE6_BUFSIZE_LISTEN 64 | 
 | 36 | #define LINE6_MIDI_MESSAGE_MAXLEN 256 | 
 | 37 |  | 
 | 38 | #define LINE6_RAW_MESSAGES_MAXCOUNT_ORDER 7 | 
 | 39 | /* 4k packets are common, BUFSIZE * MAXCOUNT should be bigger... */ | 
 | 40 | #define LINE6_RAW_MESSAGES_MAXCOUNT (1 << LINE6_RAW_MESSAGES_MAXCOUNT_ORDER) | 
 | 41 |  | 
 | 42 |  | 
 | 43 | #if LINE6_BUFSIZE_LISTEN > 65535 | 
 | 44 | #error "Use dynamic fifo instead" | 
 | 45 | #endif | 
 | 46 |  | 
 | 47 | /* | 
 | 48 | 	Line 6 MIDI control commands | 
 | 49 | */ | 
 | 50 | #define LINE6_PARAM_CHANGE   0xb0 | 
 | 51 | #define LINE6_PROGRAM_CHANGE 0xc0 | 
 | 52 | #define LINE6_SYSEX_BEGIN    0xf0 | 
 | 53 | #define LINE6_SYSEX_END      0xf7 | 
 | 54 | #define LINE6_RESET          0xff | 
 | 55 |  | 
 | 56 | /* | 
 | 57 | 	MIDI channel for messages initiated by the host | 
 | 58 | 	(and eventually echoed back by the device) | 
 | 59 | */ | 
 | 60 | #define LINE6_CHANNEL_HOST   0x00 | 
 | 61 |  | 
 | 62 | /* | 
 | 63 | 	MIDI channel for messages initiated by the device | 
 | 64 | */ | 
 | 65 | #define LINE6_CHANNEL_DEVICE 0x02 | 
 | 66 |  | 
 | 67 | #define LINE6_CHANNEL_UNKNOWN 5	/* don't know yet what this is good for */ | 
 | 68 |  | 
 | 69 | #define LINE6_CHANNEL_MASK 0x0f | 
 | 70 |  | 
 | 71 | #define CHECK_STARTUP_PROGRESS(x, n)	\ | 
 | 72 | do {					\ | 
 | 73 | 	if ((x) >= (n))			\ | 
 | 74 | 		return;			\ | 
 | 75 | 	x = (n);			\ | 
 | 76 | } while (0) | 
 | 77 |  | 
 | 78 | extern const unsigned char line6_midi_id[3]; | 
 | 79 |  | 
 | 80 | static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3; | 
 | 81 | static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4; | 
 | 82 |  | 
 | 83 | /* | 
 | 84 | 	 Common properties of Line 6 devices. | 
 | 85 | */ | 
 | 86 | struct line6_properties { | 
 | 87 | 	/* Card id string (maximum 16 characters). | 
 | 88 | 	 * This can be used to address the device in ALSA programs as | 
 | 89 | 	 * "default:CARD=<id>" | 
 | 90 | 	 */ | 
 | 91 | 	const char *id; | 
 | 92 |  | 
 | 93 | 	/* Card short name (maximum 32 characters) */ | 
 | 94 | 	const char *name; | 
 | 95 |  | 
 | 96 | 	/* Bit vector defining this device's capabilities in line6usb driver */ | 
 | 97 | 	int capabilities; | 
 | 98 |  | 
 | 99 | 	int altsetting; | 
 | 100 |  | 
 | 101 | 	unsigned int ctrl_if; | 
 | 102 | 	unsigned int ep_ctrl_r; | 
 | 103 | 	unsigned int ep_ctrl_w; | 
 | 104 | 	unsigned int ep_audio_r; | 
 | 105 | 	unsigned int ep_audio_w; | 
 | 106 | }; | 
 | 107 |  | 
 | 108 | /* Capability bits */ | 
 | 109 | enum { | 
 | 110 | 	/* device supports settings parameter via USB */ | 
 | 111 | 	LINE6_CAP_CONTROL =	1 << 0, | 
 | 112 | 	/* device supports PCM input/output via USB */ | 
 | 113 | 	LINE6_CAP_PCM =		1 << 1, | 
 | 114 | 	/* device supports hardware monitoring */ | 
 | 115 | 	LINE6_CAP_HWMON =	1 << 2, | 
 | 116 | 	/* device requires output data when input is read */ | 
 | 117 | 	LINE6_CAP_IN_NEEDS_OUT = 1 << 3, | 
 | 118 | 	/* device uses raw MIDI via USB (data endpoints) */ | 
 | 119 | 	LINE6_CAP_CONTROL_MIDI = 1 << 4, | 
 | 120 | 	/* device provides low-level information */ | 
 | 121 | 	LINE6_CAP_CONTROL_INFO = 1 << 5, | 
 | 122 | }; | 
 | 123 |  | 
 | 124 | /* | 
 | 125 | 	 Common data shared by all Line 6 devices. | 
 | 126 | 	 Corresponds to a pair of USB endpoints. | 
 | 127 | */ | 
 | 128 | struct usb_line6 { | 
 | 129 | 	/* USB device */ | 
 | 130 | 	struct usb_device *usbdev; | 
 | 131 |  | 
 | 132 | 	/* Properties */ | 
 | 133 | 	const struct line6_properties *properties; | 
 | 134 |  | 
 | 135 | 	/* Interval for data USB packets */ | 
 | 136 | 	int interval; | 
 | 137 | 	/* ...for isochronous transfers framing */ | 
 | 138 | 	int intervals_per_second; | 
 | 139 |  | 
 | 140 | 	/* Number of isochronous URBs used for frame transfers */ | 
 | 141 | 	int iso_buffers; | 
 | 142 |  | 
 | 143 | 	/* Maximum size of data USB packet */ | 
 | 144 | 	int max_packet_size; | 
 | 145 |  | 
 | 146 | 	/* Device representing the USB interface */ | 
 | 147 | 	struct device *ifcdev; | 
 | 148 |  | 
 | 149 | 	/* Line 6 sound card data structure. | 
 | 150 | 	 * Each device has at least MIDI or PCM. | 
 | 151 | 	 */ | 
 | 152 | 	struct snd_card *card; | 
 | 153 |  | 
 | 154 | 	/* Line 6 PCM device data structure */ | 
 | 155 | 	struct snd_line6_pcm *line6pcm; | 
 | 156 |  | 
 | 157 | 	/* Line 6 MIDI device data structure */ | 
 | 158 | 	struct snd_line6_midi *line6midi; | 
 | 159 |  | 
 | 160 | 	/* URB for listening to POD data endpoint */ | 
 | 161 | 	struct urb *urb_listen; | 
 | 162 |  | 
 | 163 | 	/* Buffer for incoming data from POD data endpoint */ | 
 | 164 | 	unsigned char *buffer_listen; | 
 | 165 |  | 
 | 166 | 	/* Buffer for message to be processed, generated from MIDI layer */ | 
 | 167 | 	unsigned char *buffer_message; | 
 | 168 |  | 
 | 169 | 	/* Length of message to be processed, generated from MIDI layer  */ | 
 | 170 | 	int message_length; | 
 | 171 |  | 
 | 172 | 	/* Circular buffer for non-MIDI control messages */ | 
 | 173 | 	struct { | 
 | 174 | 		struct mutex read_lock; | 
 | 175 | 		wait_queue_head_t wait_queue; | 
 | 176 | 		unsigned int active:1; | 
 | 177 | 		STRUCT_KFIFO_REC_2(LINE6_BUFSIZE_LISTEN * LINE6_RAW_MESSAGES_MAXCOUNT) | 
 | 178 | 			fifo; | 
 | 179 | 	} messages; | 
 | 180 |  | 
 | 181 | 	/* If MIDI is supported, buffer_message contains the pre-processed data; | 
 | 182 | 	 * otherwise the data is only in urb_listen (buffer_incoming). | 
 | 183 | 	 */ | 
 | 184 | 	void (*process_message)(struct usb_line6 *); | 
 | 185 | 	void (*disconnect)(struct usb_line6 *line6); | 
 | 186 | }; | 
 | 187 |  | 
 | 188 | extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, | 
 | 189 | 				      int code2, int size); | 
 | 190 | extern int line6_read_data(struct usb_line6 *line6, unsigned address, | 
 | 191 | 			   void *data, unsigned datalen); | 
 | 192 | extern int line6_read_serial_number(struct usb_line6 *line6, | 
 | 193 | 				    u32 *serial_number); | 
 | 194 | extern int line6_send_raw_message_async(struct usb_line6 *line6, | 
 | 195 | 					const char *buffer, int size); | 
 | 196 | extern int line6_send_sysex_message(struct usb_line6 *line6, | 
 | 197 | 				    const char *buffer, int size); | 
 | 198 | extern ssize_t line6_set_raw(struct device *dev, struct device_attribute *attr, | 
 | 199 | 			     const char *buf, size_t count); | 
 | 200 | extern void line6_start_timer(struct timer_list *timer, unsigned long msecs, | 
 | 201 | 			      void (*function)(unsigned long), | 
 | 202 | 			      unsigned long data); | 
 | 203 | extern int line6_version_request_async(struct usb_line6 *line6); | 
 | 204 | extern int line6_write_data(struct usb_line6 *line6, unsigned address, | 
 | 205 | 			    void *data, unsigned datalen); | 
 | 206 |  | 
 | 207 | int line6_probe(struct usb_interface *interface, | 
 | 208 | 		const struct usb_device_id *id, | 
 | 209 | 		const char *driver_name, | 
 | 210 | 		const struct line6_properties *properties, | 
 | 211 | 		int (*private_init)(struct usb_line6 *, const struct usb_device_id *id), | 
 | 212 | 		size_t data_size); | 
 | 213 |  | 
 | 214 | void line6_disconnect(struct usb_interface *interface); | 
 | 215 |  | 
 | 216 | #ifdef CONFIG_PM | 
 | 217 | int line6_suspend(struct usb_interface *interface, pm_message_t message); | 
 | 218 | int line6_resume(struct usb_interface *interface); | 
 | 219 | #endif | 
 | 220 |  | 
 | 221 | #endif |