/* * Line6 Linux USB driver - 0.9.1beta * * Copyright (C) 2004-2010 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 POD_H #define POD_H #include <linux/interrupt.h> #include <linux/spinlock.h> #include <linux/usb.h> #include <linux/wait.h> #include <sound/core.h> #include "driver.h" #include "dumprequest.h" /* PODxt Live interfaces */ #define PODXTLIVE_INTERFACE_POD 0 #define PODXTLIVE_INTERFACE_VARIAX 1 /* Locate name in binary program dump */ #define POD_NAME_OFFSET 0 #define POD_NAME_LENGTH 16 /* Other constants */ #define POD_CONTROL_SIZE 0x80 #define POD_BUFSIZE_DUMPREQ 7 #define POD_STARTUP_DELAY 1000 /* Stages of POD startup procedure */ enum { POD_STARTUP_INIT = 1, POD_STARTUP_DUMPREQ, POD_STARTUP_VERSIONREQ, POD_STARTUP_WORKQUEUE, POD_STARTUP_SETUP, POD_STARTUP_LAST = POD_STARTUP_SETUP - 1 }; /** Data structure for values that need to be requested explicitly. This is the case for system and tuner settings. */ struct ValueWait { int value; wait_queue_head_t wait; }; /** Binary PODxt Pro program dump */ struct pod_program { /** Header information (including program name). */ unsigned char header[0x20]; /** Program parameters. */ unsigned char control[POD_CONTROL_SIZE]; }; struct usb_line6_pod { /** Generic Line6 USB data. */ struct usb_line6 line6; /** Dump request structure. */ struct line6_dump_request dumpreq; /** Current program number. */ unsigned char channel_num; /** Current program settings. */ struct pod_program prog_data; /** Buffer for data retrieved from or to be stored on PODxt Pro. */ struct pod_program prog_data_buf; /** Tuner mute mode. */ struct ValueWait tuner_mute; /** Tuner base frequency (typically 440Hz). */ struct ValueWait tuner_freq; /** Note received from tuner. */ struct ValueWait tuner_note; /** Pitch value received from tuner. */ struct ValueWait tuner_pitch; /** Instrument monitor level. */ struct ValueWait monitor_level; /** Audio routing mode. 0: send processed guitar 1: send clean guitar 2: send clean guitar re-amp playback 3: send re-amp playback */ struct ValueWait routing; /** Wait for audio clipping event. */ struct ValueWait clipping; /** Timer for device initializaton. */ struct timer_list startup_timer; /** Work handler for device initializaton. */ struct work_struct startup_work; /** Current progress in startup procedure. */ int startup_progress; /** Dirty flags for access to parameter data. */ unsigned long param_dirty[POD_CONTROL_SIZE / sizeof(unsigned long)]; /** Some atomic flags. */ unsigned long atomic_flags; /** Serial number of device. */ int serial_number; /** Firmware version (x 100). */ int firmware_version; /** Device ID. */ int device_id; /** Flag to indicate modification of current program settings. */ char dirty; /** Flag to enable MIDI postprocessing. */ char midi_postprocess; }; extern void line6_pod_disconnect(struct usb_interface *interface); extern int line6_pod_init(struct usb_interface *interface, struct usb_line6_pod *pod); extern void line6_pod_midi_postprocess(struct usb_line6_pod *pod, unsigned char *data, int length); extern void line6_pod_process_message(struct usb_line6_pod *pod); extern void line6_pod_transmit_parameter(struct usb_line6_pod *pod, int param, int value); #endif