1 /* 2 * Line6 Linux USB driver - 0.9.1beta 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 POD_H 13 #define POD_H 14 15 #include <linux/interrupt.h> 16 #include <linux/spinlock.h> 17 #include <linux/usb.h> 18 #include <linux/wait.h> 19 20 #include <sound/core.h> 21 22 #include "driver.h" 23 #include "dumprequest.h" 24 25 /* 26 PODxt Live interfaces 27 */ 28 #define PODXTLIVE_INTERFACE_POD 0 29 #define PODXTLIVE_INTERFACE_VARIAX 1 30 31 /* 32 Locate name in binary program dump 33 */ 34 #define POD_NAME_OFFSET 0 35 #define POD_NAME_LENGTH 16 36 37 /* 38 Other constants 39 */ 40 #define POD_CONTROL_SIZE 0x80 41 #define POD_BUFSIZE_DUMPREQ 7 42 #define POD_STARTUP_DELAY 1000 43 44 /* 45 Stages of POD startup procedure 46 */ 47 enum { 48 POD_STARTUP_INIT = 1, 49 POD_STARTUP_DUMPREQ, 50 POD_STARTUP_VERSIONREQ, 51 POD_STARTUP_WORKQUEUE, 52 POD_STARTUP_SETUP, 53 POD_STARTUP_LAST = POD_STARTUP_SETUP - 1 54 }; 55 56 /** 57 Data structure for values that need to be requested explicitly. 58 This is the case for system and tuner settings. 59 */ 60 struct ValueWait { 61 int value; 62 wait_queue_head_t wait; 63 }; 64 65 /** 66 Binary PODxt Pro program dump 67 */ 68 struct pod_program { 69 /** 70 Header information (including program name). 71 */ 72 unsigned char header[0x20]; 73 74 /** 75 Program parameters. 76 */ 77 unsigned char control[POD_CONTROL_SIZE]; 78 }; 79 80 struct usb_line6_pod { 81 /** 82 Generic Line6 USB data. 83 */ 84 struct usb_line6 line6; 85 86 /** 87 Dump request structure. 88 */ 89 struct line6_dump_request dumpreq; 90 91 /** 92 Current program number. 93 */ 94 unsigned char channel_num; 95 96 /** 97 Current program settings. 98 */ 99 struct pod_program prog_data; 100 101 /** 102 Buffer for data retrieved from or to be stored on PODxt Pro. 103 */ 104 struct pod_program prog_data_buf; 105 106 /** 107 Tuner mute mode. 108 */ 109 struct ValueWait tuner_mute; 110 111 /** 112 Tuner base frequency (typically 440Hz). 113 */ 114 struct ValueWait tuner_freq; 115 116 /** 117 Note received from tuner. 118 */ 119 struct ValueWait tuner_note; 120 121 /** 122 Pitch value received from tuner. 123 */ 124 struct ValueWait tuner_pitch; 125 126 /** 127 Instrument monitor level. 128 */ 129 struct ValueWait monitor_level; 130 131 /** 132 Audio routing mode. 133 0: send processed guitar 134 1: send clean guitar 135 2: send clean guitar re-amp playback 136 3: send re-amp playback 137 */ 138 struct ValueWait routing; 139 140 /** 141 Wait for audio clipping event. 142 */ 143 struct ValueWait clipping; 144 145 /** 146 Timer for device initializaton. 147 */ 148 struct timer_list startup_timer; 149 150 /** 151 Work handler for device initializaton. 152 */ 153 struct work_struct startup_work; 154 155 /** 156 Current progress in startup procedure. 157 */ 158 int startup_progress; 159 160 /** 161 Dirty flags for access to parameter data. 162 */ 163 unsigned long param_dirty[POD_CONTROL_SIZE / sizeof(unsigned long)]; 164 165 /** 166 Some atomic flags. 167 */ 168 unsigned long atomic_flags; 169 170 /** 171 Serial number of device. 172 */ 173 int serial_number; 174 175 /** 176 Firmware version (x 100). 177 */ 178 int firmware_version; 179 180 /** 181 Device ID. 182 */ 183 int device_id; 184 185 /** 186 Flag to indicate modification of current program settings. 187 */ 188 char dirty; 189 190 /** 191 Flag to enable MIDI postprocessing. 192 */ 193 char midi_postprocess; 194 }; 195 196 extern void line6_pod_disconnect(struct usb_interface *interface); 197 extern int line6_pod_init(struct usb_interface *interface, 198 struct usb_line6_pod *pod); 199 extern void line6_pod_midi_postprocess(struct usb_line6_pod *pod, 200 unsigned char *data, int length); 201 extern void line6_pod_process_message(struct usb_line6_pod *pod); 202 extern void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param, 203 int value); 204 205 #endif 206