1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
/*
* Line6 Linux USB driver - 0.7.3
*
* Copyright (C) 2004-2008 Markus Grabner (grabner@icg.tugraz.at)
*
* 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 <linux/wait.h>
#include <sound/driver.h>
#include <sound/core.h>
#include "config.h"
#include "midi.h"
#define DRIVER_NAME "line6usb"
#define LINE6_TIMEOUT 1
#define LINE6_MAX_DEVICES 8
#define LINE6_BUFSIZE_LISTEN 32
#define LINE6_MESSAGE_MAXLEN 256
/*
Line6 MIDI control commands
*/
#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
#define LINE6_CHANNEL_UNKNOWN 5 /* don't know yet what this is good for */
#define LINE6_CHANNEL_MASK 0x0f
#define CHECK_RETURN(x) if((err = x) < 0) return err
extern const unsigned char line6_midi_id[3];
extern struct usb_line6 *line6_devices[LINE6_MAX_DEVICES];
extern struct workqueue_struct *line6_workqueue;
static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3;
static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4;
/**
Common data shared by all Line6 devices.
Corresponds to a pair of USB endpoints.
*/
struct usb_line6 {
/**
USB device.
*/
struct usb_device *usbdev;
/**
Name of this device.
*/
const char *devname;
/**
Interface number.
*/
int interface_number;
/**
Interval (ms).
*/
int interval;
/**
Maximum size of USB packet.
*/
int max_packet_size;
/**
Bit code of this device.
*/
int devbit;
/**
Device representing the USB interface.
*/
struct device *ifcdev;
/**
Line6 sound card data structure.
Each device has at least a MIDI connection.
*/
struct snd_card *card;
/**
Line6 MIDI device data structure.
*/
struct snd_line6_midi *midi;
/**
USB endpoint for listening to control commands.
*/
int ep_control_read;
/**
USB endpoint for writing control commands.
*/
int ep_control_write;
/**
URB for listening to PODxt Pro control endpoint.
*/
struct urb *urb_listen;
/**
Buffer for listening to PODxt Pro control endpoint.
*/
unsigned char *buffer_listen;
/**
Buffer for message to be processed.
*/
unsigned char *buffer_message;
/**
Length of message to be processed.
*/
int message_length;
};
extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, int code2, int size);
extern ssize_t line6_nop_read(struct device *dev, DEVICE_ATTRIBUTE char *buf);
extern ssize_t line6_nop_write(struct device *dev, DEVICE_ATTRIBUTE const char *buf, size_t count);
extern int line6_send_program(struct usb_line6 *line6, int value);
extern int line6_send_raw_message(struct usb_line6 *line6, const char *buffer, int size);
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, DEVICE_ATTRIBUTE const char *buf, size_t count);
extern int line6_transmit_parameter(struct usb_line6 *line6, int param, int value);
extern void line6_write_hexdump(struct usb_line6 *line6, char dir, const unsigned char *buffer, int size);
#endif
|