File: HalLStream.h

package info (click to toggle)
oss4 4.2-build2020-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,332 kB
  • sloc: ansic: 239,151; cpp: 18,981; sh: 4,590; pascal: 3,863; asm: 1,189; makefile: 553; php: 53; xml: 46
file content (367 lines) | stat: -rw-r--r-- 14,055 bytes parent folder | download
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
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
/****************************************************************************
 HalLStream.h

 Description:	Interface for the HalLStream class.

 Created: David A. Hoatson, September 2002
	
 Copyright  2000 Lynx Studio Technology, Inc.

 This software contains the valuable TRADE SECRETS and CONFIDENTIAL INFORMATION 
 of Lynx Studio Technology, Inc. The software is protected under copyright 
 laws as an unpublished work of Lynx Studio Technology, Inc.  Notice is 
 for informational purposes only and does not imply publication.  The user 
 of this software may make copies of the software for use with products 
 manufactured by Lynx Studio Technology, Inc. or under license from 
 Lynx Studio Technology, Inc. and for no other use.

 THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
 KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
 PURPOSE.

 Environment: 

 4 spaces per tab

 Revision History
 
 When      Who  Description
 --------- ---  ------------------------------------------------------------
****************************************************************************/

#ifndef _HALLSTREAM_H
#define _HALLSTREAM_H

#include "Hal.h"
#include "HalEnv.h"		// Added by ClassView

enum
{
  LSTREAM_BRACKET = 0,
  LSTREAM_HEADER,
  LSTREAM_NUM_PORTS
};

enum
{
  ADAT_OPTICAL_IN_1 = 0,
  ADAT_OPTICAL_IN_2
};

/////////////////////////////////////////////////////////////////////////////
// Control Registers (Write Only)
/////////////////////////////////////////////////////////////////////////////
enum
{
  kControlLSCTL0 = 0,		// 00 LStream control, generic
  kControlLSREQ,		// 01 LStream status request, generic

  // LS-ADAT Specific
  kControlADATCTL = 2,		// 02 LS-ADAT control
  kControlTCRATE0,		// 03 Sync In time code transmission rate, byte 0
  kControlTCRATE1,		// 04 Sync In time code transmission rate, byte 1
  kControlTCCUE0,		// 05 Sync In time code cue frame count, byte 0
  kControlTCCUE1,		// 06 Sync In time code cue frame count, byte 1
  kControlTCCUE2,		// 07 Sync In time code cue frame count, byte 2
  kControlTCCUE3,		// 08 Sync In time code cue frame count, byte 3
  kControlSYNCOUT,		// 09 Sync Out MIDI data on SYNC IN port.
  kControlUSR1TC0,		// 0A ADAT optical out 1 user bit time code, byte 0
  kControlUSR1TC1,		// 0B ADAT optical out 1 user bit time code, byte 1 
  kControlUSR1TC2,		// 0C ADAT optical out 1 user bit time code, byte 2 
  kControlUSR1TC3,		// 0D ADAT optical out 1 user bit time code, byte 3 (MSB)
  kControlUSR1MIDI,		// 0E ADAT optical out 1 user bit MIDI
  kControlUSR2TC0,		// 0F ADAT optical out 2 user bit time code, byte 0 (LSB)
  kControlUSR2TC1,		// 10 ADAT optical out 2 user bit time code, byte 1 
  kControlUSR2TC2,		// 11 ADAT optical out 2 user bit time code, byte 2 
  kControlUSR2TC3,		// 12 ADAT optical out 2 user bit time code, byte 3 (MSB)
  kControlUSR2MIDI,		// 13 ADAT optical out 2 user bit MIDI

  // LS-AES Specific
  kControlDEVCTL = 0x02,	// 02 Device Specific Control
  kControlAK4117_PDC = 0x08,	// 08 AK4117 Control Register Block (8 Bytes)
  kControlAK4117_CLC,		// 09 AK4117 Register 
  kControlAK4117_IOC,		// 0A AK4117 Register 
  kControlCBLK8420A = 0x10,	// 10 CS8420 Control Register Block (16 Bytes)
  kControlCBLK8420B = 0x20,	// 20 CS8420 Control Register Block (16 Bytes)
  kControlCBLK8420C = 0x30,	// 30 CS8420 Control Register Block (16 Bytes)
  kControlCBLK8420D = 0x40,	// 40 CS8420 Control Register Block (16 Bytes)

  kControlNumRegs
};

enum
{
  kAES8420MiscControl1 = 0,
  kAES8420MiscControl2,
  kAES8420DataFlowControl,
  kAES8420ClockSourceControl,
  kAES8420RxErrorMask,
  kAES8420CSDataBufferControl,
  kAES8420CSBuffer
};

#define REG_LSCTL0_MRST				kBit0	// Master reset for LStream device logic and state machines, active high (NEVER ASSERT THIS!)
#define REG_LSCTL0_MMUTEn			kBit1	// Master mute.  Must all inputs and outputs, active low
#define REG_LSCTL0_LED				kBit2	// Illuminates LED
#define REG_LSCTL0_PING				kBit3	// Enables periodic transmission of basic status
#define REG_LSCTL0_CKSRC_MASK		(kBit4 | kBit5)
#define REG_LSCTL0_CKSRC_FCK		(0)	// LStream frame clock (FCK)
// LS-ADAT Specific
#define REG_LSCTL0_CKSRC_OP0		kBit4	// ADAT Optical In 0
#define REG_LSCTL0_CKSRC_OP1		kBit5	// ADAT Optical In 1
#define REG_LSCTL0_CKSRC_SYNCIN		(kBit4 | kBit5)	// ADAT Sync In port
// LS-AES Specific
#define REG_LSCTL0_CLKSRC_DIGIN1	0
#define REG_LSCTL0_CLKSRC_DIGIN2	kBit4
#define REG_LSCTL0_CLKSRC_DIGIN3	kBit5
#define REG_LSCTL0_CLKSRC_DIGIN4	(kBit4 | kBit5)
#define REG_LSCTL0_FCKOE			kBit6	// Output frame clock enable, 0=disabled, 1=enabled.

#define REG_LSREQ_ADDR_MASK			0x3F	// Address of requested status register
#define REG_LSREQ_REQSINGLE			kBit6	// Request transmission of single status register at ADDR
#define REG_LSREQ_REQALL			kBit7	// Request transmission of all status registers

#define REG_ADATCTL_RCVRSTn			kBit0	// ADAT receiver reset, resets both receivers, active low.
#define REG_ADATCTL_RCVMUTEn		kBit1	// ADAT receiver reset, mutes both receivers, active low.
#define REG_ADATCTL_XMTMUTEn		kBit2	// ADAT transmitter mute, mutes both transmitters, active low.
#define REG_ADATCTL_TCEN			kBit3	// Enables transmission of SYNC IN timecode to hoast at the rate specified by TCRATE3-0.
#define REG_ADATCTL_TCXMITSYNC		kBit4	// Initalizes the counter used to count cycles between time code transmissions.
#define REG_ADATCTL_TCCUEEN			kBit5	// Enabled time code cuit hit signal transmission to host for starting devices in SYNCREADY mode.
#define REG_ADATCTL_SYNCINEN		kBit6	// Enables transmission of SYNC IN data on arrival

enum
{
  MIXVAL_ADATCLKSRC_SLAVE = 0,
  MIXVAL_ADATCLKSRC_IN1,
  MIXVAL_ADATCLKSRC_IN2,
  MIXVAL_ADATCLKSRC_SYNCIN
};

#define REG_DEVCTL_DEVRSTn			kBit0
#define REG_DEVCTL_CSINIT			kBit1
#define REG_DEVCTL_RXNOTIFY			kBit2
#define REG_DEVCTL_WIDEWIRE			kBit3
#define REG_DEVCTL_DIOFMT1			kBit4
#define REG_DEVCTL_DIOFMT2			kBit5
#define REG_DEVCTL_DIOFMT3			kBit6
#define REG_DEVCTL_DIOFMT4			kBit7

enum
{
  MIXVAL_AESCLKSRC_SLAVE = 0,
  MIXVAL_AESCLKSRC_IN1,
  MIXVAL_AESCLKSRC_IN2,
  MIXVAL_AESCLKSRC_IN3,
  MIXVAL_AESCLKSRC_IN4
};

/////////////////////////////////////////////////////////////////////////////
// Status Registers (Read Only)
/////////////////////////////////////////////////////////////////////////////
enum
{
  kStatusLSDEVID = 0,		// 00 LStream device ID LS-ADAT 1, LS-AES 2, LS-TDIF 3
  kStatusPCBRREV,		// 01 LStream device PCB revision, 0=NC, 1=A, 2=B, etc.
  kStatusFWREV,			// 02 LStream device firmware build number
  kStatusLSSTAT,		// 03 LStream device status/errors, generic (locked, power, parity)

  // LS-ADAT Specific
  kStatusADATSTAT = 4,		// 04 LS-ADAT status (receiver errors)
  kStatusSYNCTC0,		// 05 ADAT SYNC IN port time code, byte 0 (LSB)
  kStatusSYNCTC1,		// 06 ADAT SYNC IN port time code, byte 1 
  kStatusSYNCTC2,		// 07 ADAT SYNC IN port time code, byte 2 
  kStatusSYNCTC3,		// 08 ADAT SYNC IN port time code, byte 3 (MSB)
  kStatusSYNCIN,		// 09 ADAT SYNC IN port MIDI data
  kStatusUSR1TC0,		// 0A ADAT optical in 1 user bit time code, byte 0 (LSB)
  kStatusUSR1TC1,		// 0B ADAT optical in 1 user bit time code, byte 1 
  kStatusUSR1TC2,		// 0C ADAT optical in 1 user bit time code, byte 2 
  kStatusUSR1TC3,		// 0D ADAT optical in 1 user bit time code, byte 3 (MSB)
  kStatusUSR1MIDI,		// 0E ADAT optical in 1 user bit MIDI
  kStatusUSR2TC0,		// 0F ADAT optical in 2 user bit time code, byte 0 (LSB)
  kStatusUSR2TC1,		// 10 ADAT optical in 2 user bit time code, byte 1 
  kStatusUSR2TC2,		// 11 ADAT optical in 2 user bit time code, byte 2 
  kStatusUSR2TC3,		// 12 ADAT optical in 2 user bit time code, byte 3 (MSB)
  kStatusUSR2MIDI,		// 13 ADAT optical in 2 user bit MIDI

  // LS-AES Specific
  kStatusFREQCNTA0 = 3,		// 03 AES Frequency Counter A LSB
  kStatusFREQCNTA1,		// 04 AES Frequency Counter A MSB
  kStatusFREQSCALEA,		// 05 AES Frequency Scale A
  kStatusFREQCNTB0,		// 06 AES Frequency Counter B LSB
  kStatusFREQCNTB1,		// 07 AES Frequency Counter B MSB
  kStatusFREQSCALEB,		// 08 AES Frequency Scale B
  kStatusFREQCNTC0,		// 09 AES Frequency Counter C LSB
  kStatusFREQCNTC1,		// 0A AES Frequency Counter C MSB
  kStatusFREQSCALEC,		// 0B AES Frequency Scale C
  kStatusFREQCNTD0,		// 0C AES Frequency Counter D LSB
  kStatusFREQCNTD1,		// 0D AES Frequency Counter D MSB
  kStatusFREQSCALED,		// 0E AES Frequency Scale D

  kStatusAKSTAT0 = 0x10,	// 10 AK4117 Receiver Status 0
  kStatusAKSTAT1,		// 11 AK4117 Receiver Status 1
  kStatusAKSTAT2,		// 12 AK4117 Receiver Status 2
  kStatusRXCSA,			// 13 CS8420 Receiver Channel Status, Digital In 1
  kStatusRXERRA,		// 14 CS8420 Receiver Error Status, Digital In 1
  kStatusSRRA,			// 15 CS8420 Sample Rate Ratio, Digital In 1
  kStatusRXCSB,			// 16 CS8420 Receiver Channel Status, Digital In 2
  kStatusRXERRB,		// 17 CS8420 Receiver Error Status, Digital In 2
  kStatusSRRB,			// 18 CS8420 Sample Rate Ratio, Digital In 2
  kStatusRXCSC,			// 19 CS8420 Receiver Channel Status, Digital In 3
  kStatusRXERRC,		// 1A CS8420 Receiver Error Status, Digital In 3
  kStatusSRRC,			// 1B CS8420 Sample Rate Ratio, Digital In 3
  kStatusRXCSD,			// 1C CS8420 Receiver Channel Status, Digital In 4
  kStatusRXERRD,		// 1D CS8420 Receiver Error Status, Digital In 4
  kStatusSRRD,			// 1E CS8420 Sample Rate Ratio, Digital In 4

  kStatusNumRegs
};

enum
{
  k8420_A = 0,
  k8420_B,
  k8420_C,
  k8420_D,
  LSTREAM_NUM_8420
};

enum
{
  MIXVAL_AESSRCMODE_SRC_ON = 0,	// AES In, SRC
  MIXVAL_AESSRCMODE_SRC_OFF,	// Slave to AES In, No SRC
  MIXVAL_AESSRCMODE_SRC_ON_DIGOUT,	// AES out SRC to AES in
  MIXVAL_AESSRCMODE_TXONLY	// AES out only
};


#define REG_LSDEVID_LSADAT			1
#define REG_LSDEVID_LSAES			2
#define REG_LSDEVID_AURORA16		0x26
#define REG_LSDEVID_AURORA8			0x27

#define REG_ADATSTAT_RCVERR0		kBit0
#define REG_ADATSTAT_RCVERR1		kBit1

// This is the abstract class CHalLStream 
class CHalLStream
{
public:
  CHalLStream ()
  {
  }
   ~CHalLStream ()
  {
  }

  USHORT Open (PHALADAPTER pHalAdapter);
  USHORT Close ();
  void EnableInterrupts ();
  void DisableInterrupts ();
  void ResetFIFOs ();

  USHORT SampleClockChanged (LONG lRate, LONG lSource);

  ULONG GetDeviceID (ULONG ulPort);
  ULONG GetPCBRev (ULONG ulPort);
  ULONG GetFirmwareRev (ULONG ulPort);

  USHORT ReadStatus (ULONG ulPort, ULONG ulReg, PBYTE pucValue);

  BOOLEAN IsLocked (ULONG ulPort);
  USHORT WaitForLock (ULONG ulPort);

  USHORT SetOutputSelection (ULONG ulPort, ULONG ulOutputSelection);
  ULONG GetOutputSelection (ULONG ulPort);

  USHORT SetLStreamDualInternal (ULONG ulLStreamDualInternal);
  ULONG GetLStreamDualInternal ()
  {
    return (m_bLStreamDualInternal);
  }

  USHORT SetGPOut (ULONG ulGPOut);
  ULONG GetGPOut ()
  {
    return (m_bGPOut);
  }

  // LS-ADAT Specific
  USHORT ADATSetClockSource (ULONG ulPort, ULONG ulClockSource);
  BYTE ADATGetClockSource (ULONG ulPort);
  BOOLEAN ADATIsLocked (ULONG ulPort, ULONG ulInput);
  USHORT ADATEnableTimeCodeToMTC (ULONG ulPort, BOOLEAN bEnable);
  USHORT ADATSetTimeCodeTxRate (ULONG ulPort, ULONG ulTCTxRateSamples);
  USHORT ADATSetCuePoint (ULONG ulPort, ULONG ulCuePoint);
  ULONG ADATGetCuePoint (ULONG ulPort);
  USHORT ADATCuePointEnable ();
  USHORT ADATGetSyncInTimeCode (ULONG ulPort, PULONG pulTimecode);
  USHORT ADATGetPosition (ULONG ulPort, PULONG pulPosition);

  // LS-AES Specific
  USHORT AESSetClockSource (ULONG ulPort, ULONG ulClockSource,
			    BOOLEAN bInISR = FALSE);
  ULONG AESGetClockSource (ULONG ulPort);
  USHORT AESSetSRCMode (ULONG ulPort, ULONG ulTheChip, ULONG ulMode);
  ULONG AESGetSRCMode (ULONG ulPort, ULONG ulTheChip);
  USHORT AESSetFormat (ULONG ulPort, ULONG ulTheChip, ULONG ulFormat);
  ULONG AESGetFormat (ULONG ulPort, ULONG ulTheChip);
  USHORT AESSetInputMuteOnError (ULONG ulPort, BOOLEAN bMuteOnError);
  USHORT AESSetOutputStatus (ULONG ulPort, ULONG ulTheChip, ULONG ulStatus);
  ULONG AESGetOutputStatus (ULONG ulPort, ULONG ulTheChip);
  ULONG AESGetInputSampleRate (ULONG ulPort, ULONG ulTheChip);
  ULONG AESGetSRCRatio (ULONG ulPort, ULONG ulTheChip);
  ULONG AESGetInputStatus (ULONG ulPort, ULONG ulTheChip);
  USHORT AESSetWideWire (ULONG ulPort, ULONG ulWideWire);
  ULONG AESGetWideWire (ULONG ulPort);

  // Mixer
  USHORT SetDefaults (void);
  USHORT SetMixerControl (USHORT usControl, ULONG ulValue);
  USHORT GetMixerControl (USHORT usControl, PULONG pulValue);

  USHORT Service (BOOLEAN bPolled = FALSE);

private:
  USHORT InitializeDevice (ULONG ulPort);
  USHORT WriteControl (ULONG ulPort, ULONG ulReg, BYTE ucValue, BYTE ucMask =
		       0xFF);
  // LS-AES Specific
  ULONG AESGetBaseControl (ULONG ulTheChip);
  ULONG AESGetBaseStatus (ULONG ulTheChip);
  USHORT AESInitialize8420 (ULONG ulPort, ULONG ulTheChip);
  USHORT AESWriteCSBuffer (ULONG ulPort, ULONG ulTheChip, PBYTE pBuffer);

  PHALADAPTER m_pHalAdapter;
  CHalRegister m_RegOPIOCTL;
  CHalRegister m_RegOPDEVCTL;
  CHalRegister m_RegOPDEVSTAT;
  CHalRegister m_RegOPBUFSTAT;
  CHalMIDIDevice *m_pMIDIRecord;

  LONG m_lSampleRate;
  ULONG m_ulSpeed;
  BYTE m_aControlRegisters[LSTREAM_NUM_PORTS][127];	// 2 ports, 0x7F registers each
  BYTE m_aStatusRegisters[LSTREAM_NUM_PORTS][127];	// 2 ports, 0x7F registers each
  ULONG m_ulOutputSelection[LSTREAM_NUM_PORTS];
  BOOLEAN m_bInitialized[LSTREAM_NUM_PORTS];

  BOOLEAN m_bLStreamDualInternal;
  BOOLEAN m_bGPOut;

  // LS-ADAT Specific
  ULONG m_ulADATClockSource[LSTREAM_NUM_PORTS];
  ULONG m_ulLastTimecode[LSTREAM_NUM_PORTS];
  ULONG m_ulADATTimeCodeTxRate[LSTREAM_NUM_PORTS];
  ULONG m_ulADATCuePoint[LSTREAM_NUM_PORTS];
  BOOLEAN m_bEnableMTC[LSTREAM_NUM_PORTS];

  // LS-AES Specific
  ULONG m_ulAESClockSource[LSTREAM_NUM_PORTS];
  ULONG m_ulWideWire[LSTREAM_NUM_PORTS];
  ULONG m_ulFormat[LSTREAM_NUM_PORTS][LSTREAM_NUM_8420];
  ULONG m_ulSRCMode[LSTREAM_NUM_PORTS][LSTREAM_NUM_8420];
  ULONG m_ulOutputStatus[LSTREAM_NUM_PORTS][LSTREAM_NUM_8420];
};

#endif // _HALLSTREAM_H