2009-02-27 19:43:04 -08:00
/*
2015-01-20 02:20:50 -06:00
* Line 6 Linux USB driver
2009-02-27 19:43:04 -08:00
*
2010-08-12 01:35:30 +02:00
* Copyright ( C ) 2004 - 2010 Markus Grabner ( grabner @ icg . tugraz . at )
2009-02-27 19:43:04 -08:00
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation , version 2.
*
*/
# ifndef DRIVER_H
# define DRIVER_H
# include <linux/usb.h>
2016-09-18 20:59:32 +02:00
# include <linux/mutex.h>
# include <linux/kfifo.h>
2009-02-27 19:43:04 -08:00
# include <sound/core.h>
# include "midi.h"
2016-09-18 20:59:22 +02:00
/* USB 1.1 speed configuration */
# define USB_LOW_INTERVALS_PER_SECOND 1000
# define USB_LOW_ISO_BUFFERS 2
/* USB 2.0+ speed configuration */
# define USB_HIGH_INTERVALS_PER_SECOND 8000
# define USB_HIGH_ISO_BUFFERS 16
2015-01-28 14:50:08 +01:00
/* Fallback USB interval and max packet size values */
# define LINE6_FALLBACK_INTERVAL 10
# define LINE6_FALLBACK_MAXPACKETSIZE 16
2009-02-27 19:43:04 -08:00
# define LINE6_TIMEOUT 1
2016-09-18 20:59:24 +02:00
# define LINE6_BUFSIZE_LISTEN 64
2016-09-18 20:59:32 +02:00
# define LINE6_MIDI_MESSAGE_MAXLEN 256
# define LINE6_RAW_MESSAGES_MAXCOUNT_ORDER 7
/* 4k packets are common, BUFSIZE * MAXCOUNT should be bigger... */
# define LINE6_RAW_MESSAGES_MAXCOUNT (1 << LINE6_RAW_MESSAGES_MAXCOUNT_ORDER)
# if LINE6_BUFSIZE_LISTEN > 65535
# error "Use dynamic fifo instead"
# endif
2009-02-27 19:43:04 -08:00
/*
2015-01-20 02:20:49 -06:00
Line 6 MIDI control commands
2009-02-27 19:43:04 -08:00
*/
# define LINE6_PARAM_CHANGE 0xb0
# define LINE6_PROGRAM_CHANGE 0xc0
# define LINE6_SYSEX_BEGIN 0xf0
# define LINE6_SYSEX_END 0xf7
# define LINE6_RESET 0xff
/*
MIDI channel for messages initiated by the host
( and eventually echoed back by the device )
*/
# define LINE6_CHANNEL_HOST 0x00
/*
MIDI channel for messages initiated by the device
*/
# define LINE6_CHANNEL_DEVICE 0x02
2010-08-23 01:08:25 +02:00
# define LINE6_CHANNEL_UNKNOWN 5 /* don't know yet what this is good for */
2009-02-27 19:43:04 -08:00
# define LINE6_CHANNEL_MASK 0x0f
2010-09-21 16:58:00 -07:00
# define CHECK_STARTUP_PROGRESS(x, n) \
do { \
if ( ( x ) > = ( n ) ) \
return ; \
x = ( n ) ; \
} while ( 0 )
2010-08-12 01:35:30 +02:00
2009-02-27 19:43:04 -08:00
extern const unsigned char line6_midi_id [ 3 ] ;
static const int SYSEX_DATA_OFS = sizeof ( line6_midi_id ) + 3 ;
static const int SYSEX_EXTRA_SIZE = sizeof ( line6_midi_id ) + 4 ;
2015-01-28 14:43:11 +01:00
/*
2015-01-20 02:20:49 -06:00
Common properties of Line 6 devices .
2009-02-27 19:43:04 -08:00
*/
struct line6_properties {
2015-01-28 14:43:11 +01:00
/* Card id string (maximum 16 characters).
* This can be used to address the device in ALSA programs as
* " default:CARD=<id> "
*/
2010-08-12 01:35:30 +02:00
const char * id ;
2015-01-28 14:43:11 +01:00
/* Card short name (maximum 32 characters) */
2009-02-27 19:43:04 -08:00
const char * name ;
2010-08-12 01:35:30 +02:00
2015-01-28 14:43:11 +01:00
/* Bit vector defining this device's capabilities in line6usb driver */
2009-02-27 19:43:04 -08:00
int capabilities ;
2015-01-12 12:42:52 -08:00
int altsetting ;
2015-01-12 12:42:53 -08:00
2016-11-29 22:12:51 +01:00
unsigned int ctrl_if ;
unsigned int ep_ctrl_r ;
unsigned int ep_ctrl_w ;
unsigned int ep_audio_r ;
unsigned int ep_audio_w ;
2009-02-27 19:43:04 -08:00
} ;
2015-01-28 14:50:08 +01:00
/* Capability bits */
enum {
/* device supports settings parameter via USB */
LINE6_CAP_CONTROL = 1 < < 0 ,
/* device supports PCM input/output via USB */
LINE6_CAP_PCM = 1 < < 1 ,
2016-09-18 20:59:25 +02:00
/* device supports hardware monitoring */
2015-01-28 14:50:08 +01:00
LINE6_CAP_HWMON = 1 < < 2 ,
2016-09-18 20:59:25 +02:00
/* device requires output data when input is read */
LINE6_CAP_IN_NEEDS_OUT = 1 < < 3 ,
2016-09-18 20:59:26 +02:00
/* device uses raw MIDI via USB (data endpoints) */
LINE6_CAP_CONTROL_MIDI = 1 < < 4 ,
2015-01-28 14:50:08 +01:00
} ;
2015-01-28 14:43:11 +01:00
/*
2015-01-20 02:20:49 -06:00
Common data shared by all Line 6 devices .
2009-02-27 19:43:04 -08:00
Corresponds to a pair of USB endpoints .
*/
struct usb_line6 {
2015-01-28 14:43:11 +01:00
/* USB device */
2009-02-27 19:43:04 -08:00
struct usb_device * usbdev ;
2015-01-28 14:43:11 +01:00
/* Properties */
2009-02-27 19:43:04 -08:00
const struct line6_properties * properties ;
2016-09-18 20:59:22 +02:00
/* Interval for data USB packets */
2009-02-27 19:43:04 -08:00
int interval ;
2016-09-18 20:59:22 +02:00
/* ...for isochronous transfers framing */
int intervals_per_second ;
2016-09-18 20:59:21 +02:00
/* Number of isochronous URBs used for frame transfers */
int iso_buffers ;
2009-02-27 19:43:04 -08:00
2016-09-18 20:59:22 +02:00
/* Maximum size of data USB packet */
2009-02-27 19:43:04 -08:00
int max_packet_size ;
2015-01-28 14:43:11 +01:00
/* Device representing the USB interface */
2009-02-27 19:43:04 -08:00
struct device * ifcdev ;
2015-01-28 14:43:11 +01:00
/* Line 6 sound card data structure.
* Each device has at least MIDI or PCM .
*/
2009-02-27 19:43:04 -08:00
struct snd_card * card ;
2015-01-28 14:43:11 +01:00
/* Line 6 PCM device data structure */
2009-02-27 19:43:04 -08:00
struct snd_line6_pcm * line6pcm ;
2015-01-28 14:43:11 +01:00
/* Line 6 MIDI device data structure */
2009-02-27 19:43:04 -08:00
struct snd_line6_midi * line6midi ;
2016-09-18 20:59:26 +02:00
/* URB for listening to POD data endpoint */
2009-02-27 19:43:04 -08:00
struct urb * urb_listen ;
2016-09-18 20:59:27 +02:00
/* Buffer for incoming data from POD data endpoint */
2009-02-27 19:43:04 -08:00
unsigned char * buffer_listen ;
2016-09-18 20:59:27 +02:00
/* Buffer for message to be processed, generated from MIDI layer */
2009-02-27 19:43:04 -08:00
unsigned char * buffer_message ;
2016-09-18 20:59:27 +02:00
/* Length of message to be processed, generated from MIDI layer */
2009-02-27 19:43:04 -08:00
int message_length ;
2015-01-12 12:42:58 -08:00
2016-09-18 20:59:32 +02:00
/* Circular buffer for non-MIDI control messages */
struct {
struct mutex read_lock ;
wait_queue_head_t wait_queue ;
unsigned int active : 1 ;
STRUCT_KFIFO_REC_2 ( LINE6_BUFSIZE_LISTEN * LINE6_RAW_MESSAGES_MAXCOUNT )
fifo ;
} messages ;
2016-09-18 20:59:27 +02:00
/* If MIDI is supported, buffer_message contains the pre-processed data;
* otherwise the data is only in urb_listen ( buffer_incoming ) .
*/
2015-01-12 12:42:58 -08:00
void ( * process_message ) ( struct usb_line6 * ) ;
2015-01-25 18:22:58 +01:00
void ( * disconnect ) ( struct usb_line6 * line6 ) ;
2009-02-27 19:43:04 -08:00
} ;
2009-02-27 21:09:55 -08:00
extern char * line6_alloc_sysex_buffer ( struct usb_line6 * line6 , int code1 ,
int code2 , int size ) ;
2015-02-11 06:03:31 -06:00
extern int line6_read_data ( struct usb_line6 * line6 , unsigned address ,
void * data , unsigned datalen ) ;
2009-02-27 21:09:55 -08:00
extern int line6_read_serial_number ( struct usb_line6 * line6 ,
2015-02-10 23:03:16 -06:00
u32 * serial_number ) ;
2009-02-27 21:09:55 -08:00
extern int line6_send_raw_message_async ( struct usb_line6 * line6 ,
const char * buffer , int size ) ;
extern int line6_send_sysex_message ( struct usb_line6 * line6 ,
const char * buffer , int size ) ;
extern ssize_t line6_set_raw ( struct device * dev , struct device_attribute * attr ,
const char * buf , size_t count ) ;
2015-02-03 02:38:56 -05:00
extern void line6_start_timer ( struct timer_list * timer , unsigned long msecs ,
2014-02-27 21:06:58 +05:30
void ( * function ) ( unsigned long ) ,
2010-08-23 01:08:25 +02:00
unsigned long data ) ;
2010-08-12 01:35:30 +02:00
extern int line6_version_request_async ( struct usb_line6 * line6 ) ;
2015-02-11 06:03:31 -06:00
extern int line6_write_data ( struct usb_line6 * line6 , unsigned address ,
void * data , unsigned datalen ) ;
2010-08-12 01:35:30 +02:00
2015-01-15 08:22:31 +01:00
int line6_probe ( struct usb_interface * interface ,
2015-01-25 18:22:58 +01:00
const struct usb_device_id * id ,
2015-02-07 10:43:19 -06:00
const char * driver_name ,
2015-01-15 08:22:31 +01:00
const struct line6_properties * properties ,
2015-01-25 18:36:29 +01:00
int ( * private_init ) ( struct usb_line6 * , const struct usb_device_id * id ) ,
size_t data_size ) ;
2015-01-25 18:22:58 +01:00
2015-01-15 08:22:31 +01:00
void line6_disconnect ( struct usb_interface * interface ) ;
# ifdef CONFIG_PM
int line6_suspend ( struct usb_interface * interface , pm_message_t message ) ;
int line6_resume ( struct usb_interface * interface ) ;
# endif
2009-02-27 19:43:04 -08:00
# endif