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/spinlock.h>
# include <linux/usb.h>
# include <sound/core.h>
# include "midi.h"
# define DRIVER_NAME "line6usb"
2015-01-28 14:50:08 +01:00
# define USB_INTERVALS_PER_SECOND 1000
/* 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
# define LINE6_BUFSIZE_LISTEN 32
# define LINE6_MESSAGE_MAXLEN 256
/*
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
unsigned ep_ctrl_r ;
unsigned ep_ctrl_w ;
2015-01-12 12:42:55 -08:00
unsigned ep_audio_r ;
unsigned 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 ,
/* device support hardware monitoring */
LINE6_CAP_HWMON = 1 < < 2 ,
} ;
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 ;
2015-01-28 14:43:11 +01:00
/* Interval (ms) */
2009-02-27 19:43:04 -08:00
int interval ;
2015-01-28 14:43:11 +01:00
/* Maximum size of 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 ;
2015-01-28 14:43:11 +01:00
/* URB for listening to PODxt Pro control endpoint */
2009-02-27 19:43:04 -08:00
struct urb * urb_listen ;
2015-01-28 14:43:11 +01:00
/* Buffer for listening to PODxt Pro control endpoint */
2009-02-27 19:43:04 -08:00
unsigned char * buffer_listen ;
2015-01-28 14:43:11 +01:00
/* Buffer for message to be processed */
2009-02-27 19:43:04 -08:00
unsigned char * buffer_message ;
2015-01-28 14:43:11 +01:00
/* Length of message to be processed */
2009-02-27 19:43:04 -08:00
int message_length ;
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 ) ;
extern int line6_read_data ( struct usb_line6 * line6 , int address , void * data ,
size_t datalen ) ;
extern int line6_read_serial_number ( struct usb_line6 * line6 ,
int * serial_number ) ;
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 ) ;
2009-02-27 21:09:55 -08:00
extern int line6_write_data ( struct usb_line6 * line6 , int address , void * data ,
size_t 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-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