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 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
|
/*
* Purpose: Internal definitions for RME MADI and AES32 audio interfaces
*/
/*
*
* This file is part of Open Sound System.
*
* Copyright (C) 4Front Technologies 1996-2008.
*
* This this source file is released under GPL v2 license (no other versions).
* See the COPYING file included in the main directory of this source
* distribution for the license terms and conditions.
*
*/
/*
* DMA buffer size (for one direction)
*/
#define MAX_CHANNELS 64
#define CHBUF_SIZE (64*1024) // 64k / channel
#define CHBUF_PAGES (CHBUF_SIZE/4096)
#define DMABUF_SIZE (MAX_CHANNELS*CHBUF_SIZE) // 4 Mbytes (total)
/*
* Monitor mixer channel
*/
#define MONITOR_CH 64 // ???
/*
* Registers
*/
#define MADI_control 64
#define MADI_interruptAck 96
#define MADI_control2 256
#define MADI_freq 256 /* AES32 only */
#define MADI_midiOut0 352
#define MADI_midiOut1 356
#define MADI_eeprom 384 /* AES32 only */
#define MADI_outputEnableStart 512
#define MADI_inputEnableStart 768
#define MADI_PlayPageTable 8192
#define MADI_RecPageTable 12288 /* 12k */
#define MADI_MATRIX_MIXER_SIZE 8192
#define MADI_mixerStart 32768
#define MADI_status 0
#define MADI_status2 192
#define MADI_timecode 128
#define MADI_midiIn0 360
#define MADI_midiIn1 364
#define MADI_midiStatusOut0 384
#define MADI_midiStatusOut1 388
#define MADI_midiStatusIn0 392
#define MADI_midiStatusIn1 396
#define MADI_peakrmsStart 4096
#define MADI_inpeaks (1024*4)
#define MADI_playpeaks (MADI_inpeaks+64*4)
#define MADI_outpeaks (MADI_playpeaks+64*4)
/*
* Control register bits
*/
#define MADI_Start (1<<0)
#define MADI_Latency0 (1<<1)
#define MADI_Latency1 (1<<2)
#define MADI_Latency2 (1<<3)
#define MADI_ClockModeMaster (1<<4)
#define MADI_AudioInterruptEnable (1<<5)
#define MADI_Freq0 (1<<6)
#define MADI_Freq1 (1<<7)
#define MADI_DblSpeed (1<<8)
#define MADI_QuadSpeed (1U<<31)
#define MADI_ProBit (1<<9) // AES32
#define MADI_TX_64ch_mode (1<<10) // MADI
#define MADI_Emphasis (1<<10) // AES32
#define MADI_AutoInput (1<<11) // MADI
#define MADI_DataBit (1<<11) // AES32
#define MADI_InputSrc0 (1<<14) // MADI
#define MADI_InputSrc1 (1<<15)
#define MADI_SyncSrc0 (1<<16)
#define MADI_SyncSrc1 (1<<17) // AES32
#define MADI_SyncSrc2 (1<<13) // AES32
#define MADI_SyncSrc3 (1<<25) // AES32
#define MADI_SMUX (1<<18) // MADI
#define MADI_clr_tms (1<<19)
#define MADI_taxi_reset (1<<20) // MADI
#define MADI_WCK48 (1<<20) // AES32
#define MADI_Midi0IntrEna (1<<22)
#define MADI_Midi1IntrEna (1<<23)
#define MADI_LineOut (1<<24)
#define MADI_DS_2Wire (1<<26) // AES32
#define MADI_QS_2Wire (1<<27) // AES32
#define MADI_QS_4Wire (1<<28) // AES32
#define MADI_wclk_sel (1<<30)
/*
* Control2 register bits
*/
#define MADI_BIGENDIAN_MODE (1<<9)
/*
* Helper macros for the command register
*/
#define MADI_FreqMask (MADI_Freq0|MADI_Freq1|\
MADI_DblSpeed|MADI_QuadSpeed)
#define MADI_LatencyMask (MADI_Latency0|MADI_Latency1|MADI_Latency2)
#define MADI_InputMask (MADI_InputSrc0|MADI_InputSrc1)
#define MADI_InputOptical 0
#define MADI_InputCoax (MADI_InputSrc0)
#define MADI_SyncRefMask (MADI_SyncSrc0|MADI_SyncSrc1|\
MADI_SyncSrc2|MADI_SyncSrc3)
#define MADI_SyncRef_Word 0
#define MADI_SyncRef_MADI (MADI_SyncSrc0)
/*
* Status register bits
*/
#define MADI_audioIntPending (1<<0)
#define MADI_RX_64ch_mode (1<<1)
#define MADI_AB_int (1<<2)
#define MADI_LockStatus (1<<3)
#define MADI_BufferPosMask 0x000FFC0
#define MADI_madiSync (1<<18)
#define MADI_DblSpeedStatus (1<<19)
#define MADI_Freq0_status (1<<22)
#define MADI_Freq1_status (1<<23)
#define MADI_Freq2_status (1<<24)
#define MADI_Freq3_status (1<<25)
#define MADI_BufferHalf (1<<26)
#define MADI_midi0IRQStatus (1<<30)
#define MADI_midi1IRQStatus (1U<<31)
#define UNITY_GAIN 32768
#define MUTE_GAIN 0
typedef struct
{
int open_mode;
unsigned int trigger_bits;
int direction;
#define DIR_IN PCM_ENABLE_INPUT
#define DIR_OUT PCM_ENABLE_OUTPUT
int channel; /* Index to the first channel */
int audio_dev;
int max_channels;
int channels; /* Number of channels */
} madi_portc_t;
typedef struct
{
oss_device_t *osdev;
oss_mutex_t mutex;
char *name;
int model;
#define MDL_MADI 0
#define MDL_AES32 1
char *registers;
oss_native_word physaddr;
unsigned int cmd, cmd2; // Cached control/control2 register values
/* Sample rate, etc. */
unsigned int rate, next_rate;
unsigned long long active_inputs, active_outputs; /* Bitmasks indexed by ch# */
/* Mixer */
int mixer_dev;
/* Shadow of the hw mixer gain registers */
unsigned short mixer_values[MAX_CHANNELS][2 * MAX_CHANNELS];
/* Playback */
unsigned char *playbuf;
oss_native_word playbuf_phys;
oss_dma_handle_t play_dma_handle;
int num_outputs;
madi_portc_t *out_portc[MAX_CHANNELS];
unsigned long long busy_play_channels;
/* Recording */
unsigned char *recbuf;
oss_native_word recbuf_phys;
oss_dma_handle_t rec_dma_handle;
int num_inputs;
madi_portc_t *in_portc[MAX_CHANNELS];
unsigned long long busy_rec_channels;
volatile int open_audiodevs; /* Number of audio input/output devices currently open */
int first_audiodev;
} madi_devc_t;
static __inline__ void
madi_write (madi_devc_t * devc, int reg, unsigned int value)
{
PCI_WRITEL (devc->osdev, devc->registers + reg, value);
}
static __inline__ unsigned int
madi_read (madi_devc_t * devc, int reg)
{
return PCI_READL (devc->osdev, devc->registers + reg);
}
static __inline__ void
madi_control (madi_devc_t * devc, unsigned int value)
{
madi_write (devc, MADI_control, value);
devc->cmd = value;
}
static __inline__ void
madi_control2 (madi_devc_t * devc, unsigned int value)
{
madi_write (devc, MADI_control2, value);
devc->cmd2 = value;
}
#define SRC_IN 0
#define SRC_PLAY 64
extern void madi_write_gain (madi_devc_t * devc, unsigned int chn,
unsigned int src, unsigned short value);
extern int madi_read_gain (madi_devc_t * devc, unsigned int chn,
unsigned int src);
extern int madi_install_mixer (madi_devc_t * devc);
extern void madi_activate_mixer (madi_devc_t * devc);
|