root/trunk/libffado/src/rme/fireface_def.h

Revision 1596, 29.0 kB (checked in by jwoithe, 14 years ago)

RME:

  • implement lowlevel streaming control/setup/status functions
  • fill in further status register details
  • update documentation
Line 
1 /*
2  * Copyright (C) 2009 by Jonathan Woithe
3  *
4  * This file is part of FFADO
5  * FFADO = Free Firewire (pro-)audio drivers for linux
6  *
7  * FFADO is based upon FreeBoB.
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 2 of the License, or
12  * (at your option) version 3 of the License.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  */
23
24 /* This file contains definitions relating to the RME Fireface interfaces
25  * (Fireface 400 and Fireface 800).  Naming convention:
26  *   RME_FF_     identifier applies to both FF400 and FF800
27  *   RME_FF400_  identifier specific to the FF400
28  *   RME_FF800_  identifier specific to the FF800
29  */
30
31 #ifndef _FIREFACE_DEF
32 #define _FIREFACE_DEF
33
34 /* Identifiers for the Fireface models */
35 #define RME_FF400               0
36 #define RME_FF800               1
37
38 #define MIN_SPEED               30000
39 #define MIN_DOUBLE_SPEED        56000
40 #define MIN_QUAD_SPEED          112000
41 #define MAX_SPEED               210000
42
43 // A flag used to indicate the use of a 800 Mbps bus speed to various
44 // streaming registers of the FF800.
45 #define RME_FF800_STREAMING_SPEED_800 0x800
46
47 /* The Command Buffer Address (CBA) is different for the two interfaces */
48 #define RME_FF400_CMD_BUFFER    0x80100500
49 #define RME_FF800_CMD_BUFFER    0xfc88f000
50
51 /* Offsets for registers at fixed offsets from the device's command buffer address */
52 #define RME_FF_DDS_SRATE_OFS      (0*4)
53 #define RME_FF_CONF1_OFS          (5*4)
54 #define RME_FF_CONF2_OFS          (6*4)
55 #define RME_FF_CONF3_OFS          (7*4)
56 #define RME_FF400_FLASH_CMD_OFS   (8*4)       // Write only
57 #define RME_FF400_FLASH_STAT_OFS  (8*4)       // Read only
58
59 /* General register definitions */
60 #define RME_FF400_CONF_REG          (RME_FF400_CMD_BUFFER + RME_FF_CONF1_OFS)
61 #define RME_FF800_CONF_REG          (RME_FF800_CMD_BUFFER + RME_FF_CONF1_OFS)
62
63 #define RME_FF400_STREAM_INIT_REG   (RME_FF400_CMD_BUFFER)           // 3 quadlets wide
64 #define RME_FF400_STREAM_INIT_SIZE  3              // Size in quadlets
65 #define RME_FF400_STREAM_SRATE      (RME_FF400_CMD_BUFFER)
66 #define RME_FF400_STREAM_CONF0      (RME_FF400_CMD_BUFFER+4)
67 #define RME_FF400_STREAM_CONF1      (RME_FF400_CMD_BUFFER+8)
68 #define RME_FF800_STREAM_INIT_REG   0x20000001cLL                    // 3 quadlets wide
69 #define RME_FF800_STREAM_INIT_SIZE  3              // Size in quadlets
70 #define RME_FF800_STREAM_SRATE      0x20000001cLL
71 #define RME_FF800_STREAM_CONF0      (0x20000001cLL+4)
72 #define RME_FF800_STREAM_CONF1      (0x20000001cLL+8)
73 #define RME_FF400_STREAM_START_REG  (RME_FF400_CMD_BUFFER + 0x001c)  // 1 quadlet
74 #define RME_FF800_STREAM_START_REG  0x200000028LL                    // 1 quadlet
75 #define RME_FF400_STREAM_END_REG    (RME_FF400_CMD_BUFFER + 0x0004)  // 4 quadlets wide
76 #define RME_FF400_STREAM_END_SIZE   4              // Size in quadlets
77 #define RME_FF800_STREAM_END_REG    0x200000034LL                    // 3 quadlets wide
78 #define RME_FF800_STREAM_END_SIZE   3              // Size in quadlets
79
80 #define RME_FF800_HOST_LED_REG      0x200000324LL
81
82 #define RME_FF800_REVISION_REG      0x200000100LL
83
84 #define RME_FF_CHANNEL_MUTE_MASK     0x801c0000    // Write only
85 #define RME_FF_STATUS_REG0           0x801c0000    // Read only
86 #define RME_FF_STATUS_REG1           0x801c0004    // Read only
87
88 #define RME_FF_TCO_READ_REG          0x801f0000
89 #define RME_FF_TCO_WRITE_REG         0x810f0020
90
91 /* Addresses of various blocks in memory-mapped flash */
92 #define RME_FF400_FLASH_SETTINGS_ADDR       0x00060000
93 #define RME_FF400_FLASH_MIXER_VOLUME_ADDR   0x00070000
94 #define RME_FF400_FLASH_MIXER_PAN_ADDR      0x00070800
95 #define RME_FF400_FLASH_MIXER_HW_ADDR       0x00071000  /* Hardware volume settings, MIDI enable, submix */
96 #define RME_FF800_FLASH_MIXER_SHADOW_ADDR  0x3000e0000LL
97 #define RME_FF800_FLASH_MIXER_VOLUME_ADDR  0x3000e2000LL
98 #define RME_FF800_FLASH_MIXER_PAN_ADDR     0x3000e2800LL
99 #define RME_FF800_FLASH_MIXER_HW_ADDR      0x3000e3000LL  /* H/w volume settings, MIDI enable, submix */
100 #define RME_FF800_FLASH_SETTINGS_ADDR      0x3000f0000LL
101
102 /* Flash control registers */
103 #define RME_FF400_FLASH_BLOCK_ADDR_REG      0x80100288
104 #define RME_FF400_FLASH_BLOCK_SIZE_REG      0x8010028c
105 #define RME_FF400_FLASH_CMD_REG             (RME_FF400_CMD_BUFFER + RME_FF400_FLASH_CMD_OFS)
106 #define RME_FF400_FLASH_STAT_REG            (RME_FF400_CMD_BUFFER + RME_FF400_FLASH_STAT_OFS)
107 #define RME_FF400_FLASH_WRITE_BUFFER        0x80100290
108 #define RME_FF400_FLASH_READ_BUFFER         0x80100290
109
110 /* Flash erase control registers on the FF800 */
111 #define RME_FF800_FLASH_ERASE_VOLUME_REG    0x3fffffff4LL
112 #define RME_FF800_FLASH_ERASE_SETTINGS_REG  0x3fffffff0LL
113 #define RME_FF800_FLASH_ERASE_FIRMWARE_REG  0x3fffffff8LL
114 #define RME_FF800_FLASH_ERASE_CONFIG_REG    0x3fffffffcLL
115
116 /* Flash erase command values for the FF400 */
117 #define RME_FF400_FLASH_CMD_WRITE           0x00000001
118 #define RME_FF400_FLASH_CMD_READ            0x00000002
119 #define RME_FF400_FLASH_CMD_ERASE_VOLUME    0x0000000e
120 #define RME_FF400_FLASH_CMD_ERASE_SETTINGS  0x0000000d
121 #define RME_FF400_FLASH_CMD_ERASE_CONFIG    0x0000000c
122 #define RME_FF400_FLASH_CMD_GET_REVISION    0x0000000f
123
124 /* Flags for use with erase_flash() */
125 #define RME_FF_FLASH_ERASE_VOLUME           1
126 #define RME_FF_FLASH_ERASE_SETTINGS         2
127 #define RME_FF_FLASH_ERASE_CONFIG           3
128
129 /* Defines for components of the control registers */
130 // Configuration register 0
131 #define CR0_PHANTOM_MIC0        0x00000001
132 #define CR0_PHANTOM_MIC2        0x00000002
133 #define CR0_FILTER_FPGA         0x00000004
134 #define CR0_ILEVEL_FPGA_CTRL0   0x00000008
135 #define CR0_ILEVEL_FPGA_CTRL1   0x00000010
136 #define CR0_ILEVEL_FPGA_CTRL2   0x00000020
137 #define CR0_ZEROBIT06           0x00000040
138 #define CR0_PHANTOM_MIC1        0x00000080
139 #define CR0_PHANTOM_MIC3        0x00000100
140 #define CR0_ZEROBIT09           0x00000200
141 #define CR0_INSTR_DRIVE_FPGA    0x00000200
142 #define CRO_OLEVEL_FPGA_CTRL_0  0x00000400
143 #define CRO_OLEVEL_FPGA_CTRL_1  0x00000800
144 #define CRO_OLEVEL_FPGA_CTRL_2  0x00001000
145 #define CR0_ZEROBIT13           0x00002000
146 #define CRO_ZEROBIT14           0x00004000
147 #define CRO_ZEROBIT15           0x00008000
148 #define CRO_PHLEVEL_CTRL0       0x00010000
149 #define CRO_PHLEVEL_CTRL1       0x00020000
150
151 #define CR0_PHANTOM_FF400_MIC0  CR0_PHANTOM_MIC0
152 #define CR0_PHANTOM_FF400_MIC1  CR0_PHANTOM_MIC1
153 #define CR0_PHANTOM_FF800_MIC7  CR0_PHANTOM_MIC0
154 #define CR0_PHANTOM_FF800_MIC8  CR0_PHANTOM_MIC1
155 #define CR0_PHANTOM_FF800_MIC9  CR0_PHANTOM_MIC2
156 #define CR0_PHANTOM_FF800_MIC10 CR0_PHANTOM_MIC3
157 #define CR0_ILEVEL_FPGA_LOGAIN  CR0_ILEVEL_FPGA_CTRL0
158 #define CR0_ILEVEL_FPGA_4dBU    CR0_ILEVEL_FPGA_CTRL1
159 #define CR0_ILEVEL_FPGA_m10dBV  CR0_ILEVEL_FPGA_CTRL2
160 #define CR0_OLEVEL_FPGA_HIGAIN  CRO_OLEVEL_FPGA_CTRL_0
161 #define CR0_OLEVEL_FPGA_4dBU    CRO_OLEVEL_FPGA_CTRL_1
162 #define CR0_OLEVEL_FPGA_m10dBV  CRO_OLEVEL_FPGA_CTRL_2
163 #define CR0_PHLEVEL_4dBU        0
164 #define CRO_PHLEVEL_m10dBV      CRO_PHLEVEL_CTRL0
165 #define CRO_PHLEVEL_HIGAIN      CRO_PHLEVEL_CTRL1
166
167 // Configuration register 1
168 #define CR1_ILEVEL_CPLD_CTRL0   0x00000001
169 #define CR1_ILEVEL_CPLD_CTRL1   0x00000002
170 #define CR1_INPUT_OPT0_B        0x00000004    // Input optionset 0, option B
171 #define CR1_OLEVEL_CPLD_CTRL0   0x00000008
172 #define CR1_OLEVEL_CPLD_CTRL1   0x00000010
173 #define CR1_INPUT_OPT1_A        0x00000020    // Input optionset 1, option A
174 #define CR1_INPUT_OPT1_B        0x00000040    // Input optionset 1, option B
175 #define CR1_INPUT_OPT2_A        0x00000080    // Input optionset 2, option A
176 #define CR1_INPUT_OPT2_B        0x00000100    // Input optionset 2, option B
177 #define CR1_INSTR_DRIVE         0x00000200
178 #define CR1_INPUT_OPT0_A1       0x00000400    // Input optionset 0, option A bit 1
179 #define CR1_INPUT_OPT0_A0       0x00000800    // Input optionset 0, option A bit 0
180
181 #define CR1_ILEVEL_CPLD_LOGAIN  0
182 #define CR1_ILEVEL_CPLD_4dBU    CR1_ILEVEL_CPLD_CTRL1
183 #define CR1_ILEVEL_CPLD_m10dBV  (CR1_ILEVEL_CPLD_CTRL0 | CR1_ILEVEL_CPLD_CTRL1)
184 #define CR1_OLEVEL_CPLD_m10dBV  CR1_OLEVEL_CPLD_CTRL0
185 #define CR1_OLEVEL_CPLD_HIGAIN  CR1_OLEVEL_CPLD_CTRL1
186 #define CR1_OLEVEL_CPLD_4dBU    (CR1_OLEVEL_CPLD_CTRL0 | CR1_OLEVEL_CPLD_CTRL1)
187 #define CR1_FF800_INPUT7_FRONT  CR1_INPUT_OPT1_A
188 #define CR1_FF800_INPUT7_REAR   CR1_INPUT_OPT1_B
189 #define CR1_FF800_INPUT8_FRONT  CR1_INPUT_OPT2_A
190 #define CR1_FF800_INPUT8_REAR   CR1_INPUT_OPT2_B
191 #define CR1_FF400_INPUT3_INSTR  CR1_INPUT_OPT1_B   // To be confirmed
192 #define CR1_FF400_INPUT3_PAD    CR1_INPUT_OPT1_A   // To be confirmed
193 #define CR1_FF400_INPUT4_INSTR  CR1_INPUT_OPT2_B   // To be confirmed
194 #define CR1_FF400_INPUT4_PAD    CR1_INPUT_OPT2_A   // To be confirmed
195
196 // The input 1 "front" option is strange on the FF800 in that it is
197 // indicated using two bits.  The actual bit set depends, curiously enough,
198 // on the "speaker emulation" (aka "filter") setting.  How odd.
199 #define CR1_FF800_INPUT1_FRONT              CR1_INPUT_OPT0_A0
200 #define CR1_FF800_INPUT1_FRONT_WITH_FILTER  CR1_INPUT_OPT0_A1
201 #define CR1_FF800_INPUT1_REAR               CR1_INPUT_OPT0_B
202
203 // Configuration register 2
204 #define CR2_CLOCKMODE_AUTOSYNC  0x00000000
205 #define CR2_CLOCKMODE_MASTER    0x00000001
206 #define CR2_FREQ0               0x00000002
207 #define CR2_FREQ1               0x00000004
208 #define CR2_DSPEED              0x00000008
209 #define CR2_QSSPEED             0x00000010
210 #define CR2_SPDIF_OUT_PRO       0x00000020
211 #define CR2_SPDIF_OUT_EMP       0x00000040
212 #define CR2_SPDIF_OUT_NONAUDIO  0x00000080
213 #define CR2_SPDIF_OUT_ADAT2     0x00000100  // Optical SPDIF on ADAT2 port
214 #define CR2_SPDIF_IN_COAX       0x00000000
215 #define CR2_SPDIF_IN_ADAT2      0x00000200  // Optical SPDIF on ADAT2 port
216 #define CR2_SYNC_REF0           0x00000400
217 #define CR2_SYNC_REF1           0x00000800
218 #define CR2_SYNC_REF2           0x00001000
219 #define CR2_WORD_CLOCK_1x       0x00002000
220 #define CR2_TOGGLE_TCO          0x00004000  // Normally set to 0
221 #define CR2_P12DB_AN0           0x00010000  // Disable soft-limiter.  Normally set to 0
222 #define CR2_FF400_BIT           0x04000000  // Set on FF400, clear on FF800
223 #define CR2_TMS                 0x40000000  // Unit option, normally 0
224 #define CR2_DROP_AND_STOP       0x80000000  // Normally set to 1
225
226 #define CR2_SYNC_ADAT1          0x0
227 #define CR2_SYNC_ADAT2          (CR2_SYNC_REF0)
228 #define CR2_SYNC_SPDIF          (CR2_SYNC_REF0 | CR2_SYNC_REF1)
229 #define CR2_SYNC_WORDCLOCK      (CR2_SYNC_REF2)
230 #define CR2_SYNC_TCO            (CR2_SYNC_REF0 | CR2_SYNC_REF2)
231 #define CR2_DISABLE_LIMITER     CR2_P12DB_AN0
232
233 /* Defines for the status registers */
234 // Status register 0
235 #define SR0_ADAT1_LOCK          0x00000400
236 #define SR0_ADAT2_LOCK          0x00000800
237 #define SR0_ADAT1_SYNC          0x00001000
238 #define SR0_ADAT2_SYNC          0x00002000
239 #define SR0_SPDIF_F0            0x00004000
240 #define SR0_SPDIF_F1            0x00008000
241 #define SR0_SPDIF_F2            0x00010000
242 #define SR0_SPDIF_F3            0x00020000
243 #define SR0_SPDIF_SYNC          0x00040000
244 #define SR0_OVER                0x00080000
245 #define SR0_SPDIF_LOCK          0x00100000
246 #define SR0_SEL_SYNC_REF0       0x00400000
247 #define SR0_SEL_SYNC_REF1       0x00800000
248 #define SR0_SEL_SYNC_REF2       0x01000000
249 #define SR0_INP_FREQ0           0x02000000
250 #define SR0_INP_FREQ1           0x04000000
251 #define SR0_INP_FREQ2           0x08000000
252 #define SR0_INP_FREQ3           0x10000000
253 #define SR0_WCLK_SYNC           0x20000000
254 #define SR0_WCLK_LOCK           0x40000000
255
256 // It seems the definition of SR0 is a little different depending on whether
257 // 2 or 4 status registers are read.  In the case of a request for 2, the
258 // following additional bits are defined.
259 #define SR0_IS_STREAMING        0x00000001
260 // If 4 quadlets are requested (as is done when checking the streaming
261 // system status), the lowest 10 bits instead represent sample_rate/250 if
262 // locked to an external clock source.
263 #define SR0_STREAMING_FREQ_MASK 0x000003ff
264
265 #define SR0_ADAT1_STATUS_MASK   (SR0_ADAT1_LOCK|SR0_ADAT1_SYNC)
266 #define SR0_ADAT1_STATUS_NOLOCK 0
267 #define SR0_ADAT1_STATUS_LOCK   SR0_ADAT1_LOCK
268 #define SR0_ADAT1_STATUS_SYNC   (SR0_ADAT1_LOCK|SR0_ADAT1_SYNC)
269 #define SR0_ADAT2_STATUS_MASK   (SR0_ADAT2_LOCK|SR0_ADAT2_SYNC)
270 #define SR0_ADAT2_STATUS_NOLOCK 0
271 #define SR0_ADAT2_STATUS_LOCK   SR0_ADAT2_LOCK
272 #define SR0_ADAT2_STATUS_SYNC   (SR0_ADAT2_LOCK|SR0_ADAT2_SYNC)
273 #define SR0_SPDIF_STATUS_MASK   (SR0_SPDIF_LOCK|SR0_SPDIF_SYNC)
274 #define SR0_SPDIF_STATUS_NOLOCK 0
275 #define SR0_SPDIF_STATUS_LOCK   SR0_SPDIF_LOCK
276 #define SR0_SPDIF_STATUS_SYNC   (SR0_SPDIF_LOCK|SR0_SPDIF_SYNC)
277 #define SR0_WCLK_STATUS_MASK    (SR0_WCLK_LOCK|SR0_WCLK_SYNC)
278 #define SR0_WCLK_STATUS_NOLOCK  0
279 #define SR0_WCLK_STATUS_LOCK    SR0_WCLK_LOCK
280 #define SR0_WCLK_STATUS_SYNC    (SR0_WCLK_LOCK|SR0_WCLK_SYNC)
281
282 #define SR0_SPDIF_FREQ_MASK     (SR0_SPDIF_F0|SR0_SPDIF_F1|SR0_SPDIF_F2|SR0_SPDIF_F3)
283 #define SR0_SPDIF_FREQ_32k      SR0_SPDIF_F0
284 #define SR0_SPDIF_FREQ_44k1     SR0_SPDIF_F1
285 #define SR0_SPDIF_FREQ_48k      (SR0_SPDIF_F0|SR0_SPDIF_F1)
286 #define SR0_SPDIF_FREQ_64k      SR0_SPDIF_F2
287 #define SR0_SPDIF_FREQ_88k2     (SR0_SPDIF_F0|SR0_SPDIF_F2)
288 #define SR0_SPDIF_FREQ_96k      (SR0_SPDIF_F1|SR0_SPDIF_F2)
289 #define SR0_SPDIF_FREQ_128k     (SR0_SPDIF_F0|SR0_SPDIF_F1|SR0_SPDIF_F2)
290 #define SR0_SPDIF_FREQ_176k4    SR0_SPDIF_F3
291 #define SR0_SPDIF_FREQ_192k     (SR0_SPDIF_F0|SR0_SPDIF_F3)
292
293 #define SR0_AUTOSYNC_SRC_MASK   (SR0_SEL_SYNC_REF0|SR0_SEL_SYNC_REF1|SR0_SEL_SYNC_REF2)
294 #define SR0_AUTOSYNC_SRC_ADAT1  0
295 #define SR0_AUTOSYNC_SRC_ADAT2  SR0_SEL_SYNC_REF0
296 #define SR0_AUTOSYNC_SRC_SPDIF  (SR0_SEL_SYNC_REF0|SR0_SEL_SYNC_REF1)
297 #define SR0_AUTOSYNC_SRC_WCLK   SR0_SEL_SYNC_REF2
298 #define SR0_AUTOSYNC_SRC_TCO    (SR0_SEL_SYNC_REF0|SR0_SEL_SYNC_REF2)
299
300 #define SR0_AUTOSYNC_FREQ_MASK  (SR0_INP_FREQ0|SR0_INP_FREQ1|SR0_INP_FREQ2|SR0_INP_FREQ3)
301 #define SR0_AUTOSYNC_FREQ_32k   SR0_INP_FREQ0
302 #define SR0_AUTOSYNC_FREQ_44k1  SR0_INP_FREQ1
303 #define SR0_AUTOSYNC_FREQ_48k   (SR0_INP_FREQ0|SR0_INP_FREQ1)
304 #define SR0_AUTOSYNC_FREQ_64k   SR0_INP_FREQ2
305 #define SR0_AUTOSYNC_FREQ_88k2  (SR0_INP_FREQ0|SR0_INP_FREQ2)
306 #define SR0_AUTOSYNC_FREQ_96k   (SR0_INP_FREQ1|SR0_INP_FREQ2)
307 #define SR0_AUTOSYNC_FREQ_128k  (SR0_INP_FREQ0|SR0_INP_FREQ1|SR0_INP_FREQ2)
308 #define SR0_AUTOSYNC_FREQ_176k4 SR0_INP_FREQ3
309 #define SR0_AUTOSYNC_FREQ_192k  (SR0_INP_FREQ0|SR0_INP_FREQ3)
310 #define SR0_AUTOSYNC_FREQ_NONE  0
311
312 // Status register 1
313 #define SR1_CLOCK_MODE_MASTER   0x00000001
314 #define SR1_TCO_SYNC            0x00400000
315 #define SR1_TCO_LOCK            0x00800000
316
317 #define SR1_TCO_STATUS_MASK    (SR1_TCO_LOCK|SR1_TCO_SYNC)
318 #define SR1_TCO_STATUS_NOLOCK  0
319 #define SR1_TCO_STATUS_LOCK    SR1_TCO_LOCK
320 #define SR1_TCO_STATUS_SYNC    (SR1_TCO_LOCK|SR1_TCO_SYNC)
321
322 /* Structure used to store device settings in the device flash RAM.  This
323  * structure mirrors the layout in the Fireface's flash, so it cannot be
324  * altered.  Fields named as unused_* are not utilised at present.
325  */
326 typedef struct {
327     uint32_t unused_device_id;
328     uint32_t unused_device_rev;
329     uint32_t unused_asio_latency;
330     uint32_t unused_samples_per_frame;
331     uint32_t spdif_input_mode;
332     uint32_t spdif_output_emphasis;
333     uint32_t spdif_output_pro;
334     uint32_t clock_mode;
335     uint32_t spdif_output_nonaudio;
336     uint32_t sync_ref;
337     uint32_t spdif_output_mode;
338     uint32_t unused_check_input;
339     uint32_t unused_status;
340     uint32_t unused_register[4];
341     uint32_t unused_iso_rx_channel;
342     uint32_t unused_iso_tx_channel;
343     uint32_t unused_timecode;
344     uint32_t unused_device_type;
345     uint32_t unused_number_of_devices;
346     uint32_t tms;
347     uint32_t unused_speed;
348     uint32_t unused_channels_avail_hi;
349     uint32_t unused_channels_avail_lo;
350     uint32_t limit_bandwidth;
351     uint32_t unused_bandwidth_allocated;
352     uint32_t stop_on_dropout;
353     uint32_t input_level;
354     uint32_t output_level;
355     uint32_t mic_plug_select[2];     // Front/rear select for FF800 ch 7/8
356                                      // [0] = phones level on FF400
357     uint32_t mic_phantom[4];
358     uint32_t instrument_plug_select; // Front/rear select for FF800 ch 1
359     uint32_t filter;
360     uint32_t fuzz;
361     uint32_t unused_sync_align;
362     uint32_t unused_device_index;
363     uint32_t unused_advanced_dialog;
364     uint32_t sample_rate;
365     uint32_t unused_interleaved;
366     uint32_t unused_sn;
367     uint32_t word_clock_single_speed;
368     uint32_t unused_num_channels;
369     uint32_t unused_dropped_samples;
370     uint32_t p12db_an[10];
371 } FF_device_flash_settings_t;
372
373 // Defines used to interpret device flash settings.  These appear to be
374 // arbitary from the device's perspective since the device doesn't appear to
375 // directly use these stored settings.  The driver loads the flash settings
376 // and then uses them to infer the appropriate values for the configuration
377 // registers.  The actual values used here appear to correspond more or less
378 // to the "value" returns from the GUI elements used to represent the
379 // controls under other systems.
380 #define FF_DEV_FLASH_INVALID                   0xffffffff
381 #define FF_DEV_FLASH_SPDIF_INPUT_COAX          0x00000002   // To be confirmed
382 #define FF_DEV_FLASH_SPDIF_INPUT_OPTICAL       0x00000001   // To be confirmed
383 #define FF_DEV_FLASH_SPDIF_OUTPUT_COAX         0x00000000   // To be confirmed
384 #define FF_DEV_FLASH_SPDIF_OUTPUT_OPTICAL      0x00000001   // To be confirmed
385 #define FF_DEV_FLASH_SPDIF_OUTPUT_EMPHASIS_ON  0x00000001
386 #define FF_DEV_FLASH_SPDIF_OUTPUT_PRO_ON       0x00000001
387 #define FF_DEV_FLASH_SPDIF_OUTPUT_NONAUDIO_ON  0x00000001
388 #define FF_DEV_FLASH_CLOCK_MODE_MASTER         0x00000002
389 #define FF_DEV_FLASH_CLOCK_MODE_AUTOSYNC       0x00000001
390 #define FF_DEV_FLASH_CLOCK_MODE_SLAVE          0x00000001
391 #define FF_DEV_FLASH_SYNCREF_WORDCLOCK         0x00000001
392 #define FF_DEV_FLASH_SYNCREF_ADAT1             0x00000002
393 #define FF_DEV_FLASH_SYNCREF_ADAT2             0x00000003
394 #define FF_DEV_FLASH_SYNCREF_SPDIF             0x00000004
395 #define FF_DEV_FLASH_SYNCREC_TCO               0x00000005
396 #define FF_DEV_FLASH_ILEVEL_LOGAIN             0x00000001
397 #define FF_DEV_FLASH_ILEVEL_4dBU               0x00000002
398 #define FF_DEV_FLASH_ILEVEL_m10dBV             0x00000003
399 #define FF_DEV_FLASH_OLEVEL_HIGAIN             0x00000001
400 #define FF_DEV_FLASH_OLEVEL_4dBU               0x00000002
401 #define FF_DEV_FLASH_OLEVEL_m10dBV             0x00000003
402 #define FF_DEV_FLASH_MIC_PHANTOM_ON            0x00000001
403 #define FF_DEV_FLASH_SRATE_DDS_INACTIVE        0x00000000
404 #define FF_DEV_FLASH_WORD_CLOCK_1x             0x00000001
405 #define FF_DEV_FLASH_PLUG_SELECT_FRONT         0x00000001  // To be confirmed
406 #define FF_DEV_FLASH_PLUG_SELECT_REAR          0x00000000  // To be confirmed
407
408 // Structure used by FFADO to keep track of the device status.  This is
409 // decoupled from any structures used directly by the device, so it can be
410 // added to and ordered freely.  When making changes to the device the
411 // configuration registers must be all written to, so any function changing
412 // a parameter must have access to the complete device status.
413 typedef struct {
414     uint32_t mic_phantom[4];
415     uint32_t spdif_input_mode;
416     uint32_t spdif_output_emphasis;
417     uint32_t spdif_output_pro;
418     uint32_t spdif_output_nonaudio;
419     uint32_t spdif_output_mode;
420     uint32_t clock_mode;
421     uint32_t sync_ref;
422     uint32_t tms;
423     uint32_t limit_bandwidth;
424     uint32_t stop_on_dropout;
425     uint32_t input_level;
426     uint32_t output_level;
427     uint32_t filter;
428     uint32_t fuzz;
429     uint32_t limiter_disable;
430     uint32_t sample_rate;
431     uint32_t word_clock_single_speed;
432     uint32_t phones_level;             // Derived from fields in device flash
433     uint32_t input_opt[3];             // Derived from fields in device flash
434 } FF_software_settings_t;
435
436 // Defines used to interpret the software settings structure.  For now we
437 // use the same values as used by the device flash settings to remove the
438 // need for translation between reading the flash and copying it to the
439 // software settings structure, but in principle different values could be
440 // used given translation code.
441 #define FF_SWPARAM_INVALID                     FF_DEV_FLASH_INVALID
442 #define FF_SWPARAM_SPDIF_INPUT_COAX            FF_DEV_FLASH_SPDIF_INPUT_COAX
443 #define FF_SWPARAM_SPDIF_INPUT_OPTICAL         FF_DEV_FLASH_SPDIF_INPUT_OPTICAL
444 #define FF_SWPARAM_SPDIF_OUTPUT_COAX           FF_DEV_FLASH_SPDIF_OUTPUT_COAX
445 #define FF_SWPARAM_SPDIF_OUTPUT_OPTICAL        FF_DEV_FLASH_SPDIF_OUTPUT_OPTICAL
446 #define FF_SWPARAM_SPDIF_OUTPUT_EMPHASIS_ON    FF_DEV_FLASH_SPDIF_OUTPUT_EMPHASIS_ON
447 #define FF_SWPARAM_SPDIF_OUTPUT_PRO_ON         FF_DEV_FLASH_SPDIF_OUTPUT_PRO_ON
448 #define FF_SWPARAM_SPDIF_OUTPUT_NONAUDIO_ON    FF_DEV_FLASH_SPDIF_OUTPUT_NONAUDIO_ON
449 #define FF_SWPARAM_CLOCK_MODE_MASTER           FF_DEV_FLASH_CLOCK_MODE_MASTER
450 #define FF_SWPARAM_CLOCK_MODE_AUTOSYNC         FF_DEV_FLASH_CLOCK_MODE_AUTOSYNC
451 #define FF_SWPARAM_CLOCK_MODE_SLAVE            FF_DEV_FLASH_CLOCK_MODE_SLAVE
452 #define FF_SWPARAM_SYNCREF_WORDCLOCK           FF_DEV_FLASH_SYNCREF_WORDCLOCK
453 #define FF_SWPARAM_SYNCREF_ADAT1               FF_DEV_FLASH_SYNCREF_ADAT1
454 #define FF_SWPARAM_SYNCREF_ADAT2               FF_DEV_FLASH_SYNCREF_ADAT2
455 #define FF_SWPARAM_SYNCREF_SPDIF               FF_DEV_FLASH_SYNCREF_SPDIF
456 #define FF_SWPARAM_SYNCREC_TCO                 FF_DEV_FLASH_SYNCREC_TCO
457 #define FF_SWPARAM_ILEVEL_LOGAIN               FF_DEV_FLASH_ILEVEL_LOGAIN
458 #define FF_SWPARAM_ILEVEL_4dBU                 FF_DEV_FLASH_ILEVEL_4dBU
459 #define FF_SWPARAM_ILEVEL_m10dBV               FF_DEV_FLASH_ILEVEL_m10dBV
460 #define FF_SWPARAM_OLEVEL_HIGAIN               FF_DEV_FLASH_OLEVEL_HIGAIN
461 #define FF_SWPARAM_OLEVEL_4dBU                 FF_DEV_FLASH_OLEVEL_4dBU
462 #define FF_SWPARAM_OLEVEL_m10dBV               FF_DEV_FLASH_OLEVEL_m10dBV
463 #define FF_SWPARAM_MIC_PHANTOM_ON              FF_DEV_FLASH_MIC_PHANTOM_ON
464 #define FF_SWPARAM_WORD_CLOCK_1x               FF_DEV_FLASH_WORD_CLOCK_1x
465 #define FF_SWPARAM_SRATE_DDS_INACTIVE          FF_DEV_FLASH_SRATE_DDS_INACTIVE
466 //
467 // The following defines refer to fields in the software parameter record
468 // which are derived from one or more fields in device flash.
469 #define FF_SWPARAM_PHONESLEVEL_HIGAIN          0x00000001
470 #define FF_SWPARAM_PHONESLEVEL_4dBU            0x00000002
471 #define FF_SWPARAM_PHONESLEVEL_m10dBV          0x00000003
472 #define FF_SWPARAM_INPUT_OPT_B                 0x00000001
473 #define FF_SWPARAM_INPUT_OPT_A                 0x00000002
474
475 #define FF_SWPARAM_FF800_INPUT_OPT_FRONT       FF_SWPARAM_INPUT_OPT_A
476 #define FF_SWPARAM_FF800_INPUT_OPT_REAR        FF_SWPARAM_INPUT_OPT_B
477
478 // The general Fireface state
479 typedef struct {
480     uint32_t is_streaming;
481     uint32_t clock_mode;
482     uint32_t autosync_source;
483     uint32_t autosync_freq;
484     uint32_t spdif_freq;
485     uint32_t adat1_sync_status, adat2_sync_status;
486     uint32_t spdif_sync_status;
487     uint32_t wclk_sync_status, tco_sync_status;
488 } FF_state_t;
489
490 #define FF_STATE_CLOCKMODE_MASTER              0
491 #define FF_STATE_CLOCKMODE_AUTOSYNC            1
492 #define FF_STATE_AUTOSYNC_SRC_NOLOCK           0
493 #define FF_STATE_AUTOSYNC_SRC_ADAT1            1
494 #define FF_STATE_AUTOSYNC_SRC_ADAT2            2
495 #define FF_STATE_AUTOSYNC_SRC_SPDIF            3
496 #define FF_STATE_AUTOSYNC_SRC_WCLK             4
497 #define FF_STATE_AUTOSYNC_SRC_TCO              5
498 #define FF_STATE_SYNC_NOLOCK                   0
499 #define FF_STATE_SYNC_LOCKED                   1
500 #define FF_STATE_SYNC_SYNCED                   2
501
502 // Data structure for the TCO (Time Code Option) state
503 typedef struct {
504     uint32_t input;
505     uint32_t frame_rate;
506     uint32_t word_clock;
507     uint32_t sample_rate;
508     uint32_t pull;
509     uint32_t termination;
510     uint32_t MTC;
511 } FF_TCO_settings_t;
512
513 // Defines used to configure selected quadlets of the TCO write space.  Some
514 // of these are also used when configuring the TCO.  The byte indices
515 // referenced in the define names are 0-based.
516
517 // TCO quadlet 0
518 #define FF_TCO0_MTC                           0x80000000
519
520 // TCO quadlet 1
521 #define FF_TCO1_TCO_lock                      0x00000001
522 #define FF_TCO1_WORD_CLOCK_INPUT_RATE0        0x00000002
523 #define FF_TCO1_WORD_CLOCK_INPUT_RATE1        0x00000004
524 #define FF_TCO1_LTC_INPUT_VALID               0x00000008
525 #define FF_TCO1_WORD_CLOCK_INPUT_VALID        0x00000010
526 #define FF_TCO1_VIDEO_INPUT_NTSC              0x00000020
527 #define FF_TCO1_VIDEO_INPUT_PAL               0x00000040
528 #define FF_TCO1_SET_TC                        0x00000100
529 #define FF_TCO1_SET_DROPFRAME                 0x00000200
530 #define FF_TCO1_LTC_FORMAT0                   0x00000400
531 #define FF_TCO1_LTC_FORMAT1                   0x00000800
532
533 #define FF_TCO1_WORD_CLOCK_INPUT_1x           0
534 #define FF_TCO1_WORD_CLOCK_INPUT_2x           FF_TCO1_WORD_CLOCK_INPUT_RATE0
535 #define FF_TCO1_WORD_CLOCK_INPUT_4x           FF_TCO1_WORD_CLOCK_INPUT_RATE1
536 #define FF_TCO1_WORD_CLOCK_INPUT_MASK         (FF_TCO1_WORD_CLOCK_INPUT_RATE0|FF_TCO1_WORD_CLOCK_INPUT_RATE1)
537 #define FF_TCO1_VIDEO_INPUT_MASK              (FF_TCO1_VIDEO_INPUT_NTSC|FF_TCO1_VIDEO_INPUT_PAL)
538 #define FF_TC01_LTC_FORMAT_24fps              0
539 #define FF_TCO1_LTC_FORMAT_25fps              FF_TCO1_LTC_FORMAT0
540 #define FF_TC01_LTC_FORMAT_29_97fps           FF_TCO1_LTC_FORMAT1
541 #define FF_TCO1_LTC_FORMAT_29_97dpfs          (FF_TCO1_LTC_FORMAT1|FF_TCO1_SET_DROPFRAME)
542 #define FF_TCO1_LTC_FORMAT_30fps              (FF_TCO1_LTC_FORMAT0|FF_TCO1_LTC_FORMAT1)
543 #define FF_TCO1_LTC_FORMAT_30dfps             (FF_TCO1_LTC_FORMAT0|FF_TCO1_LTC_FORMAT1|FF_TCO1_SET_DROPFRAME)
544 #define FF_TCO1_LTC_FORMAT_MASK               (FF_TCO1_LTC_FORMAT0|FF_TCO1_LTC_FORMAT1)
545
546 // TCO quadlet 2
547 #define FF_TCO2_TC_RUN                        0x00010000
548 #define FF_TCO2_WORD_CLOCK_CONV0              0x00020000
549 #define FF_TCO2_WORD_CLOCK_CONV1              0x00040000
550 #define FF_TCO2_NUM_DROPFRAMES0               0x00080000 // Unused
551 #define FF_TCO2_NUM_DROPFRAMES1               0x00100000 // Unused
552 #define FF_TCO2_SET_JAM_SYNC                  0x00200000
553 #define FF_TCO2_SET_FLYWHEEL                  0x00400000
554 #define FF_TCO2_SET_01_4                      0x01000000
555 #define FF_TCO2_SET_PULLDOWN                  0x02000000
556 #define FF_TCO2_SET_PULLUP                    0x04000000
557 #define FF_TCO2_SET_FREQ                      0x08000000
558 #define FF_TCO2_SET_TERMINATION               0x10000000
559 #define FF_TCO2_SET_INPUT0                    0x20000000
560 #define FF_TCO2_SET_INPUT1                    0x40000000
561 #define FF_TCO2_SET_FREQ_FROM_APP             0x80000000
562
563 #define FF_TCO2_WORD_CLOCK_CONV_1_1           0
564 #define FF_TCO2_WORD_CLOCK_CONV_44_48         FF_TCO2_WORD_CLOCK_CONV0
565 #define FF_TCO2_WORD_CLOCK_CONV_48_44         FF_TCO2_WORD_CLOCK_CONV1
566 #define FF_TCO2_PULL_0                        0
567 #define FF_TCO2_PULL_UP_01                    FF_TCO2_SET_PULLUP
568 #define FF_TCO2_PULL_DOWN_01                  FF_TCO2_SET_PULLDOWN
569 #define FF_TCO2_PULL_UP_40                    (FF_TCO2_SET_PULLUP|FF_TCO2_SET_01_4)
570 #define FF_TCO2_PULL_DOWN_40                  (FF_TCO2_SET_PULLDOWN|FF_TCO2_SET_01_4)
571 #define FF_TCO2_INPUT_LTC                     FF_TCO2_SET_INPUT1
572 #define FF_TCO2_INPUT_VIDEO                   FF_TCO2_SET_INPUT0
573 #define FF_TCO2_INPUT_WORD_CLOCK              0
574 #define FF_TCO2_SRATE_44_1                    0
575 #define FF_TCO2_SRATE_48                      FF_TCO2_SET_FREQ
576 #define FF_TCO2_SRATE_FROM_APP                FF_TCO2_SET_FREQ_FROM_APP
577
578 // Interpretation of the TCO software settings fields
579 #define FF_TCOPARAM_INPUT_LTC                 1
580 #define FF_TCOPARAM_INPUT_VIDEO               2
581 #define FF_TCOPARAM_INPUT_WCK                 3
582 #define FF_TCOPARAM_FRAMERATE_24fps           1
583 #define FF_TCOPARAM_FRAMERATE_25fps           2
584 #define FF_TCOPARAM_FRAMERATE_29_97fps        3
585 #define FF_TCOPARAM_FRAMERATE_29_97dfps       4
586 #define FF_TCOPARAM_FRAMERATE_30fps           5
587 #define FF_TCOPARAM_FRAMERATE_30dfps          6
588 #define FF_TCOPARAM_WORD_CLOCK_CONV_1_1       1     // 1:1
589 #define FF_TCOPARAM_WORD_CLOCK_CONV_44_48     2     // 44.1 kHz-> 48 kHz
590 #define FF_TCOPARAM_WORD_CLOCK_CONV_48_44     3     // 48 kHz -> 44.1 kHz
591 #define FF_TCOPARAM_SRATE_44_1                1     // Rate is 44.1 kHz
592 #define FF_TCOPARAM_SRATE_48                  2     // Rate is 48 kHz
593 #define FF_TCOPARAM_SRATE_FROM_APP            3
594 #define FF_TCPPARAM_PULL_NONE                 1
595 #define FF_TCOPARAM_PULL_UP_01                2     // +0.1%
596 #define FF_TCOPARAM_PULL_DOWN_01              3     // -0.1%
597 #define FF_TCOPARAM_PULL_UP_40                4     // +4.0%
598 #define FF_TCOPARAM_PULL_DOWN_40              5     // -4.0%
599 #define FF_TCOPARAM_TERMINATION_ON            1
600
601 // The state of the TCO
602 typedef struct {
603   unsigned int locked, ltc_valid;
604   unsigned int hours, minutes, seconds, frames;
605   unsigned int frame_rate;
606   unsigned int drop_frame;
607   unsigned int video_input;
608   unsigned int word_clock_state;
609   float sample_rate;
610 } FF_TCO_state_t;
611
612 // TCO state field defines
613 #define FF_TCOSTATE_FRAMERATE_24fps           1
614 #define FF_TCOSTATE_FRAMERATE_25fps           2
615 #define FF_TCOSTATE_FRAMERATE_29_97fps        3
616 #define FF_TCOSTATE_FRAMERATE_30fps           4
617 #define FF_TCOSTATE_VIDEO_NONE                0
618 #define FF_TCOSTATE_VIDEO_PAL                 1
619 #define FF_TCOSTATE_VIDEO_NTSC                2
620 #define FF_TCOSTATE_WORDCLOCK_NONE            0
621 #define FF_TCOSTATE_WORDCLOCK_1x              1
622 #define FF_TCOSTATE_WORDCLOCK_2x              2
623 #define FF_TCOSTATE_WORDCLOCK_4x              3
624
625 #endif
Note: See TracBrowser for help on using the browser.