1*4882a593Smuzhiyun /**************************************************************************** 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun Copyright Echo Digital Audio Corporation (c) 1998 - 2004 4*4882a593Smuzhiyun All rights reserved 5*4882a593Smuzhiyun www.echoaudio.com 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun This file is part of Echo Digital Audio's generic driver library. 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun Echo Digital Audio's generic driver library is free software; 10*4882a593Smuzhiyun you can redistribute it and/or modify it under the terms of 11*4882a593Smuzhiyun the GNU General Public License as published by the Free Software 12*4882a593Smuzhiyun Foundation. 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun This program is distributed in the hope that it will be useful, 15*4882a593Smuzhiyun but WITHOUT ANY WARRANTY; without even the implied warranty of 16*4882a593Smuzhiyun MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*4882a593Smuzhiyun GNU General Public License for more details. 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun You should have received a copy of the GNU General Public License 20*4882a593Smuzhiyun along with this program; if not, write to the Free Software 21*4882a593Smuzhiyun Foundation, Inc., 59 Temple Place - Suite 330, Boston, 22*4882a593Smuzhiyun MA 02111-1307, USA. 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun ************************************************************************* 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun Translation from C++ and adaptation for use in ALSA-Driver 27*4882a593Smuzhiyun were made by Giuliano Pochini <pochini@shiny.it> 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun ****************************************************************************/ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #ifndef _ECHO_DSP_ 32*4882a593Smuzhiyun #define _ECHO_DSP_ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /**** Echogals: Darla20, Gina20, Layla20, and Darla24 ****/ 36*4882a593Smuzhiyun #if defined(ECHOGALS_FAMILY) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define NUM_ASIC_TESTS 5 39*4882a593Smuzhiyun #define READ_DSP_TIMEOUT 1000000L /* one second */ 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /**** Echo24: Gina24, Layla24, Mona, Mia, Mia-midi ****/ 42*4882a593Smuzhiyun #elif defined(ECHO24_FAMILY) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define DSP_56361 /* Some Echo24 cards use the 56361 DSP */ 45*4882a593Smuzhiyun #define READ_DSP_TIMEOUT 100000L /* .1 second */ 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /**** 3G: Gina3G, Layla3G ****/ 48*4882a593Smuzhiyun #elif defined(ECHO3G_FAMILY) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define DSP_56361 51*4882a593Smuzhiyun #define READ_DSP_TIMEOUT 100000L /* .1 second */ 52*4882a593Smuzhiyun #define MIN_MTC_1X_RATE 32000 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /**** Indigo: Indigo, Indigo IO, Indigo DJ ****/ 55*4882a593Smuzhiyun #elif defined(INDIGO_FAMILY) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #define DSP_56361 58*4882a593Smuzhiyun #define READ_DSP_TIMEOUT 100000L /* .1 second */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #else 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #error No family is defined 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #endif 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* 69*4882a593Smuzhiyun * 70*4882a593Smuzhiyun * Max inputs and outputs 71*4882a593Smuzhiyun * 72*4882a593Smuzhiyun */ 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define DSP_MAXAUDIOINPUTS 16 /* Max audio input channels */ 75*4882a593Smuzhiyun #define DSP_MAXAUDIOOUTPUTS 16 /* Max audio output channels */ 76*4882a593Smuzhiyun #define DSP_MAXPIPES 32 /* Max total pipes (input + output) */ 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* 80*4882a593Smuzhiyun * 81*4882a593Smuzhiyun * These are the offsets for the memory-mapped DSP registers; the DSP base 82*4882a593Smuzhiyun * address is treated as the start of a u32 array. 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define CHI32_CONTROL_REG 4 86*4882a593Smuzhiyun #define CHI32_STATUS_REG 5 87*4882a593Smuzhiyun #define CHI32_VECTOR_REG 6 88*4882a593Smuzhiyun #define CHI32_DATA_REG 7 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* 92*4882a593Smuzhiyun * 93*4882a593Smuzhiyun * Interesting bits within the DSP registers 94*4882a593Smuzhiyun * 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define CHI32_VECTOR_BUSY 0x00000001 98*4882a593Smuzhiyun #define CHI32_STATUS_REG_HF3 0x00000008 99*4882a593Smuzhiyun #define CHI32_STATUS_REG_HF4 0x00000010 100*4882a593Smuzhiyun #define CHI32_STATUS_REG_HF5 0x00000020 101*4882a593Smuzhiyun #define CHI32_STATUS_HOST_READ_FULL 0x00000004 102*4882a593Smuzhiyun #define CHI32_STATUS_HOST_WRITE_EMPTY 0x00000002 103*4882a593Smuzhiyun #define CHI32_STATUS_IRQ 0x00000040 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* 107*4882a593Smuzhiyun * 108*4882a593Smuzhiyun * DSP commands sent via slave mode; these are sent to the DSP by write_dsp() 109*4882a593Smuzhiyun * 110*4882a593Smuzhiyun */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define DSP_FNC_SET_COMMPAGE_ADDR 0x02 113*4882a593Smuzhiyun #define DSP_FNC_LOAD_LAYLA_ASIC 0xa0 114*4882a593Smuzhiyun #define DSP_FNC_LOAD_GINA24_ASIC 0xa0 115*4882a593Smuzhiyun #define DSP_FNC_LOAD_MONA_PCI_CARD_ASIC 0xa0 116*4882a593Smuzhiyun #define DSP_FNC_LOAD_LAYLA24_PCI_CARD_ASIC 0xa0 117*4882a593Smuzhiyun #define DSP_FNC_LOAD_MONA_EXTERNAL_ASIC 0xa1 118*4882a593Smuzhiyun #define DSP_FNC_LOAD_LAYLA24_EXTERNAL_ASIC 0xa1 119*4882a593Smuzhiyun #define DSP_FNC_LOAD_3G_ASIC 0xa0 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* 123*4882a593Smuzhiyun * 124*4882a593Smuzhiyun * Defines to handle the MIDI input state engine; these are used to properly 125*4882a593Smuzhiyun * extract MIDI time code bytes and their timestamps from the MIDI input stream. 126*4882a593Smuzhiyun * 127*4882a593Smuzhiyun */ 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #define MIDI_IN_STATE_NORMAL 0 130*4882a593Smuzhiyun #define MIDI_IN_STATE_TS_HIGH 1 131*4882a593Smuzhiyun #define MIDI_IN_STATE_TS_LOW 2 132*4882a593Smuzhiyun #define MIDI_IN_STATE_F1_DATA 3 133*4882a593Smuzhiyun #define MIDI_IN_SKIP_DATA (-1) 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /*---------------------------------------------------------------------------- 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun Setting the sample rates on Layla24 is somewhat schizophrenic. 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun For standard rates, it works exactly like Mona and Gina24. That is, for 141*4882a593Smuzhiyun 8, 11.025, 16, 22.05, 32, 44.1, 48, 88.2, and 96 kHz, you just set the 142*4882a593Smuzhiyun appropriate bits in the control register and write the control register. 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun In order to support MIDI time code sync (and possibly SMPTE LTC sync in 145*4882a593Smuzhiyun the future), Layla24 also has "continuous sample rate mode". In this mode, 146*4882a593Smuzhiyun Layla24 can generate any sample rate between 25 and 50 kHz inclusive, or 147*4882a593Smuzhiyun 50 to 100 kHz inclusive for double speed mode. 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun To use continuous mode: 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun -Set the clock select bits in the control register to 0xe (see the #define 152*4882a593Smuzhiyun below) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun -Set double-speed mode if you want to use sample rates above 50 kHz 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun -Write the control register as you would normally 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun -Now, you need to set the frequency register. First, you need to determine the 159*4882a593Smuzhiyun value for the frequency register. This is given by the following formula: 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun frequency_reg = (LAYLA24_MAGIC_NUMBER / sample_rate) - 2 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun Note the #define below for the magic number 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun -Wait for the DSP handshake 166*4882a593Smuzhiyun -Write the frequency_reg value to the .SampleRate field of the comm page 167*4882a593Smuzhiyun -Send the vector command SET_LAYLA24_FREQUENCY_REG (see vmonkey.h) 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun Once you have set the control register up for continuous mode, you can just 170*4882a593Smuzhiyun write the frequency register to change the sample rate. This could be 171*4882a593Smuzhiyun used for MIDI time code sync. For MTC sync, the control register is set for 172*4882a593Smuzhiyun continuous mode. The driver then just keeps writing the 173*4882a593Smuzhiyun SET_LAYLA24_FREQUENCY_REG command. 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun -----------------------------------------------------------------------------*/ 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #define LAYLA24_MAGIC_NUMBER 677376000 178*4882a593Smuzhiyun #define LAYLA24_CONTINUOUS_CLOCK 0x000e 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* 182*4882a593Smuzhiyun * 183*4882a593Smuzhiyun * DSP vector commands 184*4882a593Smuzhiyun * 185*4882a593Smuzhiyun */ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define DSP_VC_RESET 0x80ff 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun #ifndef DSP_56361 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #define DSP_VC_ACK_INT 0x8073 192*4882a593Smuzhiyun #define DSP_VC_SET_VMIXER_GAIN 0x0000 /* Not used, only for compile */ 193*4882a593Smuzhiyun #define DSP_VC_START_TRANSFER 0x0075 /* Handshke rqd. */ 194*4882a593Smuzhiyun #define DSP_VC_METERS_ON 0x0079 195*4882a593Smuzhiyun #define DSP_VC_METERS_OFF 0x007b 196*4882a593Smuzhiyun #define DSP_VC_UPDATE_OUTVOL 0x007d /* Handshke rqd. */ 197*4882a593Smuzhiyun #define DSP_VC_UPDATE_INGAIN 0x007f /* Handshke rqd. */ 198*4882a593Smuzhiyun #define DSP_VC_ADD_AUDIO_BUFFER 0x0081 /* Handshke rqd. */ 199*4882a593Smuzhiyun #define DSP_VC_TEST_ASIC 0x00eb 200*4882a593Smuzhiyun #define DSP_VC_UPDATE_CLOCKS 0x00ef /* Handshke rqd. */ 201*4882a593Smuzhiyun #define DSP_VC_SET_LAYLA_SAMPLE_RATE 0x00f1 /* Handshke rqd. */ 202*4882a593Smuzhiyun #define DSP_VC_SET_GD_AUDIO_STATE 0x00f1 /* Handshke rqd. */ 203*4882a593Smuzhiyun #define DSP_VC_WRITE_CONTROL_REG 0x00f1 /* Handshke rqd. */ 204*4882a593Smuzhiyun #define DSP_VC_MIDI_WRITE 0x00f5 /* Handshke rqd. */ 205*4882a593Smuzhiyun #define DSP_VC_STOP_TRANSFER 0x00f7 /* Handshke rqd. */ 206*4882a593Smuzhiyun #define DSP_VC_UPDATE_FLAGS 0x00fd /* Handshke rqd. */ 207*4882a593Smuzhiyun #define DSP_VC_GO_COMATOSE 0x00f9 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #else /* !DSP_56361 */ 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* Vector commands for families that use either the 56301 or 56361 */ 212*4882a593Smuzhiyun #define DSP_VC_ACK_INT 0x80F5 213*4882a593Smuzhiyun #define DSP_VC_SET_VMIXER_GAIN 0x00DB /* Handshke rqd. */ 214*4882a593Smuzhiyun #define DSP_VC_START_TRANSFER 0x00DD /* Handshke rqd. */ 215*4882a593Smuzhiyun #define DSP_VC_METERS_ON 0x00EF 216*4882a593Smuzhiyun #define DSP_VC_METERS_OFF 0x00F1 217*4882a593Smuzhiyun #define DSP_VC_UPDATE_OUTVOL 0x00E3 /* Handshke rqd. */ 218*4882a593Smuzhiyun #define DSP_VC_UPDATE_INGAIN 0x00E5 /* Handshke rqd. */ 219*4882a593Smuzhiyun #define DSP_VC_ADD_AUDIO_BUFFER 0x00E1 /* Handshke rqd. */ 220*4882a593Smuzhiyun #define DSP_VC_TEST_ASIC 0x00ED 221*4882a593Smuzhiyun #define DSP_VC_UPDATE_CLOCKS 0x00E9 /* Handshke rqd. */ 222*4882a593Smuzhiyun #define DSP_VC_SET_LAYLA24_FREQUENCY_REG 0x00E9 /* Handshke rqd. */ 223*4882a593Smuzhiyun #define DSP_VC_SET_LAYLA_SAMPLE_RATE 0x00EB /* Handshke rqd. */ 224*4882a593Smuzhiyun #define DSP_VC_SET_GD_AUDIO_STATE 0x00EB /* Handshke rqd. */ 225*4882a593Smuzhiyun #define DSP_VC_WRITE_CONTROL_REG 0x00EB /* Handshke rqd. */ 226*4882a593Smuzhiyun #define DSP_VC_MIDI_WRITE 0x00E7 /* Handshke rqd. */ 227*4882a593Smuzhiyun #define DSP_VC_STOP_TRANSFER 0x00DF /* Handshke rqd. */ 228*4882a593Smuzhiyun #define DSP_VC_UPDATE_FLAGS 0x00FB /* Handshke rqd. */ 229*4882a593Smuzhiyun #define DSP_VC_GO_COMATOSE 0x00d9 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun #endif /* !DSP_56361 */ 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* 235*4882a593Smuzhiyun * 236*4882a593Smuzhiyun * Timeouts 237*4882a593Smuzhiyun * 238*4882a593Smuzhiyun */ 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun #define HANDSHAKE_TIMEOUT 20000 /* send_vector command timeout (20ms) */ 241*4882a593Smuzhiyun #define VECTOR_BUSY_TIMEOUT 100000 /* 100ms */ 242*4882a593Smuzhiyun #define MIDI_OUT_DELAY_USEC 2000 /* How long to wait after MIDI fills up */ 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* 246*4882a593Smuzhiyun * 247*4882a593Smuzhiyun * Flags for .Flags field in the comm page 248*4882a593Smuzhiyun * 249*4882a593Smuzhiyun */ 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun #define DSP_FLAG_MIDI_INPUT 0x0001 /* Enable MIDI input */ 252*4882a593Smuzhiyun #define DSP_FLAG_SPDIF_NONAUDIO 0x0002 /* Sets the "non-audio" bit 253*4882a593Smuzhiyun * in the S/PDIF out status 254*4882a593Smuzhiyun * bits. Clear this flag for 255*4882a593Smuzhiyun * audio data; 256*4882a593Smuzhiyun * set it for AC3 or WMA or 257*4882a593Smuzhiyun * some such */ 258*4882a593Smuzhiyun #define DSP_FLAG_PROFESSIONAL_SPDIF 0x0008 /* 1 Professional, 0 Consumer */ 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun /* 262*4882a593Smuzhiyun * 263*4882a593Smuzhiyun * Clock detect bits reported by the DSP for Gina20, Layla20, Darla24, and Mia 264*4882a593Smuzhiyun * 265*4882a593Smuzhiyun */ 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #define GLDM_CLOCK_DETECT_BIT_WORD 0x0002 268*4882a593Smuzhiyun #define GLDM_CLOCK_DETECT_BIT_SUPER 0x0004 269*4882a593Smuzhiyun #define GLDM_CLOCK_DETECT_BIT_SPDIF 0x0008 270*4882a593Smuzhiyun #define GLDM_CLOCK_DETECT_BIT_ESYNC 0x0010 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun /* 274*4882a593Smuzhiyun * 275*4882a593Smuzhiyun * Clock detect bits reported by the DSP for Gina24, Mona, and Layla24 276*4882a593Smuzhiyun * 277*4882a593Smuzhiyun */ 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun #define GML_CLOCK_DETECT_BIT_WORD96 0x0002 280*4882a593Smuzhiyun #define GML_CLOCK_DETECT_BIT_WORD48 0x0004 281*4882a593Smuzhiyun #define GML_CLOCK_DETECT_BIT_SPDIF48 0x0008 282*4882a593Smuzhiyun #define GML_CLOCK_DETECT_BIT_SPDIF96 0x0010 283*4882a593Smuzhiyun #define GML_CLOCK_DETECT_BIT_WORD (GML_CLOCK_DETECT_BIT_WORD96 | GML_CLOCK_DETECT_BIT_WORD48) 284*4882a593Smuzhiyun #define GML_CLOCK_DETECT_BIT_SPDIF (GML_CLOCK_DETECT_BIT_SPDIF48 | GML_CLOCK_DETECT_BIT_SPDIF96) 285*4882a593Smuzhiyun #define GML_CLOCK_DETECT_BIT_ESYNC 0x0020 286*4882a593Smuzhiyun #define GML_CLOCK_DETECT_BIT_ADAT 0x0040 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /* 290*4882a593Smuzhiyun * 291*4882a593Smuzhiyun * Layla clock numbers to send to DSP 292*4882a593Smuzhiyun * 293*4882a593Smuzhiyun */ 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define LAYLA20_CLOCK_INTERNAL 0 296*4882a593Smuzhiyun #define LAYLA20_CLOCK_SPDIF 1 297*4882a593Smuzhiyun #define LAYLA20_CLOCK_WORD 2 298*4882a593Smuzhiyun #define LAYLA20_CLOCK_SUPER 3 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun /* 302*4882a593Smuzhiyun * 303*4882a593Smuzhiyun * Gina/Darla clock states 304*4882a593Smuzhiyun * 305*4882a593Smuzhiyun */ 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun #define GD_CLOCK_NOCHANGE 0 308*4882a593Smuzhiyun #define GD_CLOCK_44 1 309*4882a593Smuzhiyun #define GD_CLOCK_48 2 310*4882a593Smuzhiyun #define GD_CLOCK_SPDIFIN 3 311*4882a593Smuzhiyun #define GD_CLOCK_UNDEF 0xff 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun /* 315*4882a593Smuzhiyun * 316*4882a593Smuzhiyun * Gina/Darla S/PDIF status bits 317*4882a593Smuzhiyun * 318*4882a593Smuzhiyun */ 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun #define GD_SPDIF_STATUS_NOCHANGE 0 321*4882a593Smuzhiyun #define GD_SPDIF_STATUS_44 1 322*4882a593Smuzhiyun #define GD_SPDIF_STATUS_48 2 323*4882a593Smuzhiyun #define GD_SPDIF_STATUS_UNDEF 0xff 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun /* 327*4882a593Smuzhiyun * 328*4882a593Smuzhiyun * Layla20 output clocks 329*4882a593Smuzhiyun * 330*4882a593Smuzhiyun */ 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun #define LAYLA20_OUTPUT_CLOCK_SUPER 0 333*4882a593Smuzhiyun #define LAYLA20_OUTPUT_CLOCK_WORD 1 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun /**************************************************************************** 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun Magic constants for the Darla24 hardware 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun ****************************************************************************/ 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun #define GD24_96000 0x0 343*4882a593Smuzhiyun #define GD24_48000 0x1 344*4882a593Smuzhiyun #define GD24_44100 0x2 345*4882a593Smuzhiyun #define GD24_32000 0x3 346*4882a593Smuzhiyun #define GD24_22050 0x4 347*4882a593Smuzhiyun #define GD24_16000 0x5 348*4882a593Smuzhiyun #define GD24_11025 0x6 349*4882a593Smuzhiyun #define GD24_8000 0x7 350*4882a593Smuzhiyun #define GD24_88200 0x8 351*4882a593Smuzhiyun #define GD24_EXT_SYNC 0x9 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun /* 355*4882a593Smuzhiyun * 356*4882a593Smuzhiyun * Return values from the DSP when ASIC is loaded 357*4882a593Smuzhiyun * 358*4882a593Smuzhiyun */ 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun #define ASIC_ALREADY_LOADED 0x1 361*4882a593Smuzhiyun #define ASIC_NOT_LOADED 0x0 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun /* 365*4882a593Smuzhiyun * 366*4882a593Smuzhiyun * DSP Audio formats 367*4882a593Smuzhiyun * 368*4882a593Smuzhiyun * These are the audio formats that the DSP can transfer 369*4882a593Smuzhiyun * via input and output pipes. LE means little-endian, 370*4882a593Smuzhiyun * BE means big-endian. 371*4882a593Smuzhiyun * 372*4882a593Smuzhiyun * DSP_AUDIOFORM_MS_8 373*4882a593Smuzhiyun * 374*4882a593Smuzhiyun * 8-bit mono unsigned samples. For playback, 375*4882a593Smuzhiyun * mono data is duplicated out the left and right channels 376*4882a593Smuzhiyun * of the output bus. The "MS" part of the name 377*4882a593Smuzhiyun * means mono->stereo. 378*4882a593Smuzhiyun * 379*4882a593Smuzhiyun * DSP_AUDIOFORM_MS_16LE 380*4882a593Smuzhiyun * 381*4882a593Smuzhiyun * 16-bit signed little-endian mono samples. Playback works 382*4882a593Smuzhiyun * like the previous code. 383*4882a593Smuzhiyun * 384*4882a593Smuzhiyun * DSP_AUDIOFORM_MS_24LE 385*4882a593Smuzhiyun * 386*4882a593Smuzhiyun * 24-bit signed little-endian mono samples. Data is packed 387*4882a593Smuzhiyun * three bytes per sample; if you had two samples 0x112233 and 0x445566 388*4882a593Smuzhiyun * they would be stored in memory like this: 33 22 11 66 55 44. 389*4882a593Smuzhiyun * 390*4882a593Smuzhiyun * DSP_AUDIOFORM_MS_32LE 391*4882a593Smuzhiyun * 392*4882a593Smuzhiyun * 24-bit signed little-endian mono samples in a 32-bit 393*4882a593Smuzhiyun * container. In other words, each sample is a 32-bit signed 394*4882a593Smuzhiyun * integer, where the actual audio data is left-justified 395*4882a593Smuzhiyun * in the 32 bits and only the 24 most significant bits are valid. 396*4882a593Smuzhiyun * 397*4882a593Smuzhiyun * DSP_AUDIOFORM_SS_8 398*4882a593Smuzhiyun * DSP_AUDIOFORM_SS_16LE 399*4882a593Smuzhiyun * DSP_AUDIOFORM_SS_24LE 400*4882a593Smuzhiyun * DSP_AUDIOFORM_SS_32LE 401*4882a593Smuzhiyun * 402*4882a593Smuzhiyun * Like the previous ones, except now with stereo interleaved 403*4882a593Smuzhiyun * data. "SS" means stereo->stereo. 404*4882a593Smuzhiyun * 405*4882a593Smuzhiyun * DSP_AUDIOFORM_MM_32LE 406*4882a593Smuzhiyun * 407*4882a593Smuzhiyun * Similar to DSP_AUDIOFORM_MS_32LE, except that the mono 408*4882a593Smuzhiyun * data is not duplicated out both the left and right outputs. 409*4882a593Smuzhiyun * This mode is used by the ASIO driver. Here, "MM" means 410*4882a593Smuzhiyun * mono->mono. 411*4882a593Smuzhiyun * 412*4882a593Smuzhiyun * DSP_AUDIOFORM_MM_32BE 413*4882a593Smuzhiyun * 414*4882a593Smuzhiyun * Just like DSP_AUDIOFORM_MM_32LE, but now the data is 415*4882a593Smuzhiyun * in big-endian format. 416*4882a593Smuzhiyun * 417*4882a593Smuzhiyun */ 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun #define DSP_AUDIOFORM_MS_8 0 /* 8 bit mono */ 420*4882a593Smuzhiyun #define DSP_AUDIOFORM_MS_16LE 1 /* 16 bit mono */ 421*4882a593Smuzhiyun #define DSP_AUDIOFORM_MS_24LE 2 /* 24 bit mono */ 422*4882a593Smuzhiyun #define DSP_AUDIOFORM_MS_32LE 3 /* 32 bit mono */ 423*4882a593Smuzhiyun #define DSP_AUDIOFORM_SS_8 4 /* 8 bit stereo */ 424*4882a593Smuzhiyun #define DSP_AUDIOFORM_SS_16LE 5 /* 16 bit stereo */ 425*4882a593Smuzhiyun #define DSP_AUDIOFORM_SS_24LE 6 /* 24 bit stereo */ 426*4882a593Smuzhiyun #define DSP_AUDIOFORM_SS_32LE 7 /* 32 bit stereo */ 427*4882a593Smuzhiyun #define DSP_AUDIOFORM_MM_32LE 8 /* 32 bit mono->mono little-endian */ 428*4882a593Smuzhiyun #define DSP_AUDIOFORM_MM_32BE 9 /* 32 bit mono->mono big-endian */ 429*4882a593Smuzhiyun #define DSP_AUDIOFORM_SS_32BE 10 /* 32 bit stereo big endian */ 430*4882a593Smuzhiyun #define DSP_AUDIOFORM_INVALID 0xFF /* Invalid audio format */ 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun /* 434*4882a593Smuzhiyun * 435*4882a593Smuzhiyun * Super-interleave is defined as interleaving by 4 or more. Darla20 and Gina20 436*4882a593Smuzhiyun * do not support super interleave. 437*4882a593Smuzhiyun * 438*4882a593Smuzhiyun * 16 bit, 24 bit, and 32 bit little endian samples are supported for super 439*4882a593Smuzhiyun * interleave. The interleave factor must be even. 16 - way interleave is the 440*4882a593Smuzhiyun * current maximum, so you can interleave by 4, 6, 8, 10, 12, 14, and 16. 441*4882a593Smuzhiyun * 442*4882a593Smuzhiyun * The actual format code is derived by taking the define below and or-ing with 443*4882a593Smuzhiyun * the interleave factor. So, 32 bit interleave by 6 is 0x86 and 444*4882a593Smuzhiyun * 16 bit interleave by 16 is (0x40 | 0x10) = 0x50. 445*4882a593Smuzhiyun * 446*4882a593Smuzhiyun */ 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun #define DSP_AUDIOFORM_SUPER_INTERLEAVE_16LE 0x40 449*4882a593Smuzhiyun #define DSP_AUDIOFORM_SUPER_INTERLEAVE_24LE 0xc0 450*4882a593Smuzhiyun #define DSP_AUDIOFORM_SUPER_INTERLEAVE_32LE 0x80 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun /* 454*4882a593Smuzhiyun * 455*4882a593Smuzhiyun * Gina24, Mona, and Layla24 control register defines 456*4882a593Smuzhiyun * 457*4882a593Smuzhiyun */ 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun #define GML_CONVERTER_ENABLE 0x0010 460*4882a593Smuzhiyun #define GML_SPDIF_PRO_MODE 0x0020 /* Professional S/PDIF == 1, 461*4882a593Smuzhiyun consumer == 0 */ 462*4882a593Smuzhiyun #define GML_SPDIF_SAMPLE_RATE0 0x0040 463*4882a593Smuzhiyun #define GML_SPDIF_SAMPLE_RATE1 0x0080 464*4882a593Smuzhiyun #define GML_SPDIF_TWO_CHANNEL 0x0100 /* 1 == two channels, 465*4882a593Smuzhiyun 0 == one channel */ 466*4882a593Smuzhiyun #define GML_SPDIF_NOT_AUDIO 0x0200 467*4882a593Smuzhiyun #define GML_SPDIF_COPY_PERMIT 0x0400 468*4882a593Smuzhiyun #define GML_SPDIF_24_BIT 0x0800 /* 1 == 24 bit, 0 == 20 bit */ 469*4882a593Smuzhiyun #define GML_ADAT_MODE 0x1000 /* 1 == ADAT mode, 0 == S/PDIF mode */ 470*4882a593Smuzhiyun #define GML_SPDIF_OPTICAL_MODE 0x2000 /* 1 == optical mode, 0 == RCA mode */ 471*4882a593Smuzhiyun #define GML_SPDIF_CDROM_MODE 0x3000 /* 1 == CDROM mode, 472*4882a593Smuzhiyun * 0 == RCA or optical mode */ 473*4882a593Smuzhiyun #define GML_DOUBLE_SPEED_MODE 0x4000 /* 1 == double speed, 474*4882a593Smuzhiyun 0 == single speed */ 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun #define GML_DIGITAL_IN_AUTO_MUTE 0x800000 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun #define GML_96KHZ (0x0 | GML_DOUBLE_SPEED_MODE) 479*4882a593Smuzhiyun #define GML_88KHZ (0x1 | GML_DOUBLE_SPEED_MODE) 480*4882a593Smuzhiyun #define GML_48KHZ 0x2 481*4882a593Smuzhiyun #define GML_44KHZ 0x3 482*4882a593Smuzhiyun #define GML_32KHZ 0x4 483*4882a593Smuzhiyun #define GML_22KHZ 0x5 484*4882a593Smuzhiyun #define GML_16KHZ 0x6 485*4882a593Smuzhiyun #define GML_11KHZ 0x7 486*4882a593Smuzhiyun #define GML_8KHZ 0x8 487*4882a593Smuzhiyun #define GML_SPDIF_CLOCK 0x9 488*4882a593Smuzhiyun #define GML_ADAT_CLOCK 0xA 489*4882a593Smuzhiyun #define GML_WORD_CLOCK 0xB 490*4882a593Smuzhiyun #define GML_ESYNC_CLOCK 0xC 491*4882a593Smuzhiyun #define GML_ESYNCx2_CLOCK 0xD 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun #define GML_CLOCK_CLEAR_MASK 0xffffbff0 494*4882a593Smuzhiyun #define GML_SPDIF_RATE_CLEAR_MASK (~(GML_SPDIF_SAMPLE_RATE0|GML_SPDIF_SAMPLE_RATE1)) 495*4882a593Smuzhiyun #define GML_DIGITAL_MODE_CLEAR_MASK 0xffffcfff 496*4882a593Smuzhiyun #define GML_SPDIF_FORMAT_CLEAR_MASK 0xfffff01f 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun /* 500*4882a593Smuzhiyun * 501*4882a593Smuzhiyun * Mia sample rate and clock setting constants 502*4882a593Smuzhiyun * 503*4882a593Smuzhiyun */ 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun #define MIA_32000 0x0040 506*4882a593Smuzhiyun #define MIA_44100 0x0042 507*4882a593Smuzhiyun #define MIA_48000 0x0041 508*4882a593Smuzhiyun #define MIA_88200 0x0142 509*4882a593Smuzhiyun #define MIA_96000 0x0141 510*4882a593Smuzhiyun 511*4882a593Smuzhiyun #define MIA_SPDIF 0x00000044 512*4882a593Smuzhiyun #define MIA_SPDIF96 0x00000144 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun #define MIA_MIDI_REV 1 /* Must be Mia rev 1 for MIDI support */ 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun /* 518*4882a593Smuzhiyun * 519*4882a593Smuzhiyun * 3G register bits 520*4882a593Smuzhiyun * 521*4882a593Smuzhiyun */ 522*4882a593Smuzhiyun 523*4882a593Smuzhiyun #define E3G_CONVERTER_ENABLE 0x0010 524*4882a593Smuzhiyun #define E3G_SPDIF_PRO_MODE 0x0020 /* Professional S/PDIF == 1, 525*4882a593Smuzhiyun consumer == 0 */ 526*4882a593Smuzhiyun #define E3G_SPDIF_SAMPLE_RATE0 0x0040 527*4882a593Smuzhiyun #define E3G_SPDIF_SAMPLE_RATE1 0x0080 528*4882a593Smuzhiyun #define E3G_SPDIF_TWO_CHANNEL 0x0100 /* 1 == two channels, 529*4882a593Smuzhiyun 0 == one channel */ 530*4882a593Smuzhiyun #define E3G_SPDIF_NOT_AUDIO 0x0200 531*4882a593Smuzhiyun #define E3G_SPDIF_COPY_PERMIT 0x0400 532*4882a593Smuzhiyun #define E3G_SPDIF_24_BIT 0x0800 /* 1 == 24 bit, 0 == 20 bit */ 533*4882a593Smuzhiyun #define E3G_DOUBLE_SPEED_MODE 0x4000 /* 1 == double speed, 534*4882a593Smuzhiyun 0 == single speed */ 535*4882a593Smuzhiyun #define E3G_PHANTOM_POWER 0x8000 /* 1 == phantom power on, 536*4882a593Smuzhiyun 0 == phantom power off */ 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun #define E3G_96KHZ (0x0 | E3G_DOUBLE_SPEED_MODE) 539*4882a593Smuzhiyun #define E3G_88KHZ (0x1 | E3G_DOUBLE_SPEED_MODE) 540*4882a593Smuzhiyun #define E3G_48KHZ 0x2 541*4882a593Smuzhiyun #define E3G_44KHZ 0x3 542*4882a593Smuzhiyun #define E3G_32KHZ 0x4 543*4882a593Smuzhiyun #define E3G_22KHZ 0x5 544*4882a593Smuzhiyun #define E3G_16KHZ 0x6 545*4882a593Smuzhiyun #define E3G_11KHZ 0x7 546*4882a593Smuzhiyun #define E3G_8KHZ 0x8 547*4882a593Smuzhiyun #define E3G_SPDIF_CLOCK 0x9 548*4882a593Smuzhiyun #define E3G_ADAT_CLOCK 0xA 549*4882a593Smuzhiyun #define E3G_WORD_CLOCK 0xB 550*4882a593Smuzhiyun #define E3G_CONTINUOUS_CLOCK 0xE 551*4882a593Smuzhiyun 552*4882a593Smuzhiyun #define E3G_ADAT_MODE 0x1000 553*4882a593Smuzhiyun #define E3G_SPDIF_OPTICAL_MODE 0x2000 554*4882a593Smuzhiyun 555*4882a593Smuzhiyun #define E3G_CLOCK_CLEAR_MASK 0xbfffbff0 556*4882a593Smuzhiyun #define E3G_DIGITAL_MODE_CLEAR_MASK 0xffffcfff 557*4882a593Smuzhiyun #define E3G_SPDIF_FORMAT_CLEAR_MASK 0xfffff01f 558*4882a593Smuzhiyun 559*4882a593Smuzhiyun /* Clock detect bits reported by the DSP */ 560*4882a593Smuzhiyun #define E3G_CLOCK_DETECT_BIT_WORD96 0x0001 561*4882a593Smuzhiyun #define E3G_CLOCK_DETECT_BIT_WORD48 0x0002 562*4882a593Smuzhiyun #define E3G_CLOCK_DETECT_BIT_SPDIF48 0x0004 563*4882a593Smuzhiyun #define E3G_CLOCK_DETECT_BIT_ADAT 0x0004 564*4882a593Smuzhiyun #define E3G_CLOCK_DETECT_BIT_SPDIF96 0x0008 565*4882a593Smuzhiyun #define E3G_CLOCK_DETECT_BIT_WORD (E3G_CLOCK_DETECT_BIT_WORD96|E3G_CLOCK_DETECT_BIT_WORD48) 566*4882a593Smuzhiyun #define E3G_CLOCK_DETECT_BIT_SPDIF (E3G_CLOCK_DETECT_BIT_SPDIF48|E3G_CLOCK_DETECT_BIT_SPDIF96) 567*4882a593Smuzhiyun 568*4882a593Smuzhiyun /* Frequency control register */ 569*4882a593Smuzhiyun #define E3G_MAGIC_NUMBER 677376000 570*4882a593Smuzhiyun #define E3G_FREQ_REG_DEFAULT (E3G_MAGIC_NUMBER / 48000 - 2) 571*4882a593Smuzhiyun #define E3G_FREQ_REG_MAX 0xffff 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun /* 3G external box types */ 574*4882a593Smuzhiyun #define E3G_GINA3G_BOX_TYPE 0x00 575*4882a593Smuzhiyun #define E3G_LAYLA3G_BOX_TYPE 0x10 576*4882a593Smuzhiyun #define E3G_ASIC_NOT_LOADED 0xffff 577*4882a593Smuzhiyun #define E3G_BOX_TYPE_MASK 0xf0 578*4882a593Smuzhiyun 579*4882a593Smuzhiyun /* Indigo express control register values */ 580*4882a593Smuzhiyun #define INDIGO_EXPRESS_32000 0x02 581*4882a593Smuzhiyun #define INDIGO_EXPRESS_44100 0x01 582*4882a593Smuzhiyun #define INDIGO_EXPRESS_48000 0x00 583*4882a593Smuzhiyun #define INDIGO_EXPRESS_DOUBLE_SPEED 0x10 584*4882a593Smuzhiyun #define INDIGO_EXPRESS_QUAD_SPEED 0x04 585*4882a593Smuzhiyun #define INDIGO_EXPRESS_CLOCK_MASK 0x17 586*4882a593Smuzhiyun 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun /* 589*4882a593Smuzhiyun * 590*4882a593Smuzhiyun * Gina20 & Layla20 have input gain controls for the analog inputs; 591*4882a593Smuzhiyun * this is the magic number for the hardware that gives you 0 dB at -10. 592*4882a593Smuzhiyun * 593*4882a593Smuzhiyun */ 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun #define GL20_INPUT_GAIN_MAGIC_NUMBER 0xC8 596*4882a593Smuzhiyun 597*4882a593Smuzhiyun 598*4882a593Smuzhiyun /* 599*4882a593Smuzhiyun * 600*4882a593Smuzhiyun * Defines how much time must pass between DSP load attempts 601*4882a593Smuzhiyun * 602*4882a593Smuzhiyun */ 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun #define DSP_LOAD_ATTEMPT_PERIOD 1000000L /* One second */ 605*4882a593Smuzhiyun 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun /* 608*4882a593Smuzhiyun * 609*4882a593Smuzhiyun * Size of arrays for the comm page. MAX_PLAY_TAPS and MAX_REC_TAPS are 610*4882a593Smuzhiyun * no longer used, but the sizes must still be right for the DSP to see 611*4882a593Smuzhiyun * the comm page correctly. 612*4882a593Smuzhiyun * 613*4882a593Smuzhiyun */ 614*4882a593Smuzhiyun 615*4882a593Smuzhiyun #define MONITOR_ARRAY_SIZE 0x180 616*4882a593Smuzhiyun #define VMIXER_ARRAY_SIZE 0x40 617*4882a593Smuzhiyun #define MIDI_OUT_BUFFER_SIZE 32 618*4882a593Smuzhiyun #define MIDI_IN_BUFFER_SIZE 256 619*4882a593Smuzhiyun #define MAX_PLAY_TAPS 168 620*4882a593Smuzhiyun #define MAX_REC_TAPS 192 621*4882a593Smuzhiyun #define DSP_MIDI_OUT_FIFO_SIZE 64 622*4882a593Smuzhiyun 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun /* sg_entry is a single entry for the scatter-gather list. The array of struct 625*4882a593Smuzhiyun sg_entry struct is read by the DSP, so all values must be little-endian. */ 626*4882a593Smuzhiyun 627*4882a593Smuzhiyun #define MAX_SGLIST_ENTRIES 512 628*4882a593Smuzhiyun 629*4882a593Smuzhiyun struct sg_entry { 630*4882a593Smuzhiyun __le32 addr; 631*4882a593Smuzhiyun __le32 size; 632*4882a593Smuzhiyun }; 633*4882a593Smuzhiyun 634*4882a593Smuzhiyun 635*4882a593Smuzhiyun /**************************************************************************** 636*4882a593Smuzhiyun 637*4882a593Smuzhiyun The comm page. This structure is read and written by the DSP; the 638*4882a593Smuzhiyun DSP code is a firm believer in the byte offsets written in the comments 639*4882a593Smuzhiyun at the end of each line. This structure should not be changed. 640*4882a593Smuzhiyun 641*4882a593Smuzhiyun Any reads from or writes to this structure should be in little-endian format. 642*4882a593Smuzhiyun 643*4882a593Smuzhiyun ****************************************************************************/ 644*4882a593Smuzhiyun 645*4882a593Smuzhiyun struct comm_page { /* Base Length*/ 646*4882a593Smuzhiyun __le32 comm_size; /* size of this object 0x000 4 */ 647*4882a593Smuzhiyun __le32 flags; /* See Appendix A below 0x004 4 */ 648*4882a593Smuzhiyun __le32 unused; /* Unused entry 0x008 4 */ 649*4882a593Smuzhiyun __le32 sample_rate; /* Card sample rate in Hz 0x00c 4 */ 650*4882a593Smuzhiyun __le32 handshake; /* DSP command handshake 0x010 4 */ 651*4882a593Smuzhiyun __le32 cmd_start; /* Chs. to start mask 0x014 4 */ 652*4882a593Smuzhiyun __le32 cmd_stop; /* Chs. to stop mask 0x018 4 */ 653*4882a593Smuzhiyun __le32 cmd_reset; /* Chs. to reset mask 0x01c 4 */ 654*4882a593Smuzhiyun __le16 audio_format[DSP_MAXPIPES]; /* Chs. audio format 0x020 32*2 */ 655*4882a593Smuzhiyun struct sg_entry sglist_addr[DSP_MAXPIPES]; 656*4882a593Smuzhiyun /* Chs. Physical sglist addrs 0x060 32*8 */ 657*4882a593Smuzhiyun __le32 position[DSP_MAXPIPES]; 658*4882a593Smuzhiyun /* Positions for ea. ch. 0x160 32*4 */ 659*4882a593Smuzhiyun s8 vu_meter[DSP_MAXPIPES]; 660*4882a593Smuzhiyun /* VU meters 0x1e0 32*1 */ 661*4882a593Smuzhiyun s8 peak_meter[DSP_MAXPIPES]; 662*4882a593Smuzhiyun /* Peak meters 0x200 32*1 */ 663*4882a593Smuzhiyun s8 line_out_level[DSP_MAXAUDIOOUTPUTS]; 664*4882a593Smuzhiyun /* Output gain 0x220 16*1 */ 665*4882a593Smuzhiyun s8 line_in_level[DSP_MAXAUDIOINPUTS]; 666*4882a593Smuzhiyun /* Input gain 0x230 16*1 */ 667*4882a593Smuzhiyun s8 monitors[MONITOR_ARRAY_SIZE]; 668*4882a593Smuzhiyun /* Monitor map 0x240 0x180 */ 669*4882a593Smuzhiyun __le32 play_coeff[MAX_PLAY_TAPS]; 670*4882a593Smuzhiyun /* Gina/Darla play filters - obsolete 0x3c0 168*4 */ 671*4882a593Smuzhiyun __le32 rec_coeff[MAX_REC_TAPS]; 672*4882a593Smuzhiyun /* Gina/Darla record filters - obsolete 0x660 192*4 */ 673*4882a593Smuzhiyun __le16 midi_input[MIDI_IN_BUFFER_SIZE]; 674*4882a593Smuzhiyun /* MIDI input data transfer buffer 0x960 256*2 */ 675*4882a593Smuzhiyun u8 gd_clock_state; /* Chg Gina/Darla clock state 0xb60 1 */ 676*4882a593Smuzhiyun u8 gd_spdif_status; /* Chg. Gina/Darla S/PDIF state 0xb61 1 */ 677*4882a593Smuzhiyun u8 gd_resampler_state; /* Should always be 3 0xb62 1 */ 678*4882a593Smuzhiyun u8 filler2; /* 0xb63 1 */ 679*4882a593Smuzhiyun __le32 nominal_level_mask; /* -10 level enable mask 0xb64 4 */ 680*4882a593Smuzhiyun __le16 input_clock; /* Chg. Input clock state 0xb68 2 */ 681*4882a593Smuzhiyun __le16 output_clock; /* Chg. Output clock state 0xb6a 2 */ 682*4882a593Smuzhiyun __le32 status_clocks; /* Current Input clock state 0xb6c 4 */ 683*4882a593Smuzhiyun __le32 ext_box_status; /* External box status 0xb70 4 */ 684*4882a593Smuzhiyun __le32 cmd_add_buffer; /* Pipes to add (obsolete) 0xb74 4 */ 685*4882a593Smuzhiyun __le32 midi_out_free_count; 686*4882a593Smuzhiyun /* # of bytes free in MIDI output FIFO 0xb78 4 */ 687*4882a593Smuzhiyun __le32 unused2; /* Cyclic pipes 0xb7c 4 */ 688*4882a593Smuzhiyun __le32 control_register; 689*4882a593Smuzhiyun /* Mona, Gina24, Layla24, 3G ctrl reg 0xb80 4 */ 690*4882a593Smuzhiyun __le32 e3g_frq_register; /* 3G frequency register 0xb84 4 */ 691*4882a593Smuzhiyun u8 filler[24]; /* filler 0xb88 24*1 */ 692*4882a593Smuzhiyun s8 vmixer[VMIXER_ARRAY_SIZE]; 693*4882a593Smuzhiyun /* Vmixer levels 0xba0 64*1 */ 694*4882a593Smuzhiyun u8 midi_output[MIDI_OUT_BUFFER_SIZE]; 695*4882a593Smuzhiyun /* MIDI output data 0xbe0 32*1 */ 696*4882a593Smuzhiyun }; 697*4882a593Smuzhiyun 698*4882a593Smuzhiyun #endif /* _ECHO_DSP_ */ 699