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
|
/* $OpenBSD: esoreg.h,v 1.2 2007/11/11 01:32:52 jakemsr Exp $ */
/* $NetBSD: esoreg.h,v 1.6 2004/05/25 20:59:37 kleink Exp $ */
/*
* Copyright (c) 1999 Klaus J. Klein
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef _DEV_PCI_ESOREG_H_
#define _DEV_PCI_ESOREG_H_
/*
* PCI Configuration Registers
*/
#define ESO_PCI_BAR_IO 0x10 /* I/O space base address */
#define ESO_PCI_BAR_SB 0x14 /* SB I/O space base address */
#define ESO_PCI_BAR_VC 0x18 /* VC I/O space base address */
#define ESO_PCI_BAR_MPU 0x1c /* MPU-401 I/O space base address */
#define ESO_PCI_BAR_GAME 0x20 /* Game port I/O space base address */
#define ESO_PCI_S1C 0x50 /* Solo-1 Configuration */
#define ESO_PCI_S1C_IRQP_MASK 0x0006000 /* ISA IRQ emulation policy */
#define ESO_PCI_S1C_DMAP_MASK 0x0000700 /* DMA policy */
#define ESO_PCI_DDMAC 0x60 /* DDMA Control base address */
#define ESO_PCI_DDMAC_DE 0x01 /* Distributed DMA enable */
/* PCI Revision IDs of the Solo-1 PCI AudioDrive family */
#define ESO_PCI_REVISION_ES1938 0x00 /* ES1938 */
#define ESO_PCI_REVISION_ES1946 0x01 /* ES1946 */
/*
* Check the validity of a PCI I/O space base address for use in
* ESO_PCI_DDMAC; see the relevant comment in the attach function.
*/
#define ESO_VALID_DDMAC_BASE(addr) \
(((addr) & 0x03ff) != 0)
/*
* I/O Port offsets
*/
/* I/O Device ports */
#define ESO_IO_A2DMAA 0x00 /* [RW] Audio 2 b/c DMA address */
#define ESO_IO_A2DMAC 0x04 /* [RW] Audio 2 b/c DMA count */
#define ESO_IO_A2DMAM 0x06 /* [RW] Solo-1 mode register */
#define ESO_IO_A2DMAM_DMAENB 0x02 /* DMA enable */
#define ESO_IO_A2DMAM_AUTO 0x08 /* Auto-Initialize DMA enable */
#define ESO_IO_IRQCTL 0x07 /* [RW] IRQ control register */
#define ESO_IO_IRQCTL_A1IRQ 0x10 /* Audio 1 IRQ */
#define ESO_IO_IRQCTL_A2IRQ 0x20 /* Audio 2 IRQ */
#define ESO_IO_IRQCTL_HVIRQ 0x40 /* Hardware volume IRQ */
#define ESO_IO_IRQCTL_MPUIRQ 0x80 /* MPU-401 IRQ */
#define ESO_IO_IRQCTL_MASK 0xf0 /* all of the above */
/* Audio/FM Device ports */
#define ESO_SB_STATUS 0x00 /* [R] FM Status */
#define ESO_SB_LBA 0x00 /* [W] FM Low Bank Address */
#define ESO_SB_LBDW 0x01 /* [W] FM Low Bank Data Write */
#define ESO_SB_HBA 0x02 /* [W] FM High Bank Address */
#define ESO_SB_HBDW 0x03 /* [W] FM High Bank Data Write */
#define ESO_SB_MIXERADDR 0x04 /* [RW] Mixer Address Register */
#define ESO_SB_MIXERDATA 0x05 /* [RW] Mixer Data Register */
#define ESO_SB_RESET 0x06 /* [W] Reset */
#define ESO_SB_RESET_SW 0x01 /* SW Reset */
#define ESO_SB_RESET_FIFO 0x02 /* FIFO Reset */
#define ESO_SB_STATUSFLAGS 0x06 /* [R] Status Flags */
#define ESO_SB_PMR 0x07 /* [RW] Power Management Register */
#define ESO_SB_RDR 0x0a /* [R] Read Data Register */
#define ESO_SB_RDR_RESETMAGIC 0xaa /* Indicates SW reset completion */
#define ESO_SB_WDR 0x0c /* [W] Write Data Register */
#define ESO_SB_RSR 0x0c /* [R] Read Status Register */
#define ESO_SB_RSR_BUSY 0x80 /* WDR not available or Solo-1 busy */
#define ESO_SB_RBSR 0x0e /* [R] Read Buffer Status Register */
#define ESO_SB_RBSR_RDAV 0x80 /* Data available in RDR */
#define ESO_SB_PIOAFR 0x0f /* [RW] PIO Access to FIFO Register */
/* (Audio 1) DMAC Device ports */
#define ESO_DMAC_DMAA 0x00 /* [RW] DMA Current/Base Address */
#define ESO_DMAC_DMAC 0x04 /* [RW] DMA Current/Base Count */
#define ESO_DMAC_COMMAND 0x08 /* [W] DMA Command */
#define ESO_DMAC_COMMAND_ENB 0x04 /* Controller enable */
#define ESO_DMAC_COMMAND_DREQPOL 0x40 /* DREQ signal polarity */
#define ESO_DMAC_COMMAND_DACKPOL 0x80 /* DACK signal polarity */
#define ESO_DMAC_STATUS 0x08 /* [R] DMA Status */
#define ESO_DMAC_MODE 0x0b /* [W] DMA Mode */
#define ESO_DMAC_CLEAR 0x0d /* [W] DMA Master Clear */
#define ESO_DMAC_MASK 0x0f /* [RW] DMA Mask */
#define ESO_DMAC_MASK_MASK 0x01 /* Mask DREQ */
/* Controller commands */
#define ESO_CMD_RCR 0xc0 /* Read ext. controller registers */
#define ESO_CMD_EXTENB 0xc6 /* Enable Solo-1 Extension commands */
#define ESO_CMD_EXTDIS 0xc7 /* Disable Solo-1 Extension commands */
/* Mixer registers */
#define ESO_MIXREG_RESET 0x00 /* Reset mixer registers */
#define ESO_MIXREG_RESET_RESET 0x00 /* Any value will do */
#define ESO_MIXREG_PVR_MIC 0x1a /* Playback mixer: Microphone */
#define ESO_MIXREG_ERS 0x1c /* Extended record source */
#define ESO_MIXREG_ERS_MIC 0x00 /* Microphone */
#define ESO_MIXREG_ERS_CD 0x02 /* CD */
#define ESO_MIXREG_ERS_MIC2 0x04 /* Microphone (again?) */
#define ESO_MIXREG_ERS_MIXER 0x05 /* Record mixer */
#define ESO_MIXREG_ERS_LINE 0x06 /* Line */
#define ESO_MIXREG_ERS_MUTE 0x10 /* Mutes input to filters for rec */
#define ESO_MIXREG_PCSVR 0x3c /* PC Speaker Volume Register */
#define ESO_MIXREG_PCSVR_RESV 0xf8 /* Reserved */
#define ESO_MIXREG_PVR_SYNTH 0x36 /* Playback mixer: FM/Synth */
#define ESO_MIXREG_PVR_CD 0x38 /* Playback mixer: AuxA/CD */
#define ESO_MIXREG_PVR_AUXB 0x3a /* Playback mixer: AuxB */
#define ESO_MIXREG_PCSPKR_VOL 0x3c /* PC speaker volume */
#define ESO_MIXREG_PVR_LINE 0x3e /* Playback mixer: Line */
#define ESO_MIXREG_SPAT 0x50 /* Spatializer Enable and Mode */
#define ESO_MIXREG_SPAT_MONO 0x02 /* 0 = Stereo in, 1 = Mono in */
#define ESO_MIXREG_SPAT_RSTREL 0x04 /* 0 = reset, 1 = release from reset */
#define ESO_MIXREG_SPAT_ENB 0x08 /* Spatializer Enable */
#define ESO_MIXREG_SPATLVL 0x52 /* Spatializer Level */
#define ESO_MIXREG_LMVM 0x60 /* Left Master Volume and Mute */
#define ESO_MIXREG_LMVM_MUTE 0x40 /* Mute enable */
#define ESO_MIXREG_LHVCC 0x61 /* Left Hardware Volume Control Ctr */
#define ESO_MIXREG_RMVM 0x62 /* Right Master Volume and Mute */
#define ESO_MIXREG_RMVM_MUTE 0x40 /* Mute enable */
#define ESO_MIXREG_RHVCC 0x63 /* Left Hardware Volume Control Ctr */
#define ESO_MIXREG_MVCTL 0x64 /* Master Volume Control */
#define ESO_MIXREG_MVCTL_HVIRQM 0x02 /* Hardware Volume Control intr mask */
#define ESO_MIXREG_MVCTL_MPUIRQM 0x40 /* MPU-401 interrupt unmask */
#define ESO_MIXREG_MVCTL_SPLIT 0x80 /* Split xHVCC/xMVM registers */
#define ESO_MIXREG_CHVIR 0x66 /* Clear Hardware Volume IRQ */
#define ESO_MIXREG_CHVIR_CHVIR 0x00 /* Any value will do */
#define ESO_MIXREG_RVR_MIC 0x68 /* Record mixer: Microphone */
#define ESO_MIXREG_RVR_A2 0x69 /* Record mixer: Audio 2 */
#define ESO_MIXREG_RVR_CD 0x6a /* Record mixer: AuxA/CD */
#define ESO_MIXREG_RVR_SYNTH 0x6b /* Record mixer: FM/Synth */
#define ESO_MIXREG_RVR_AUXB 0x6c /* Record mixer: AuxB */
#define ESO_MIXREG_PVR_MONO 0x6d /* Playback mixer: Mono In */
#define ESO_MIXREG_RVR_LINE 0x6e /* Record mixer: Line */
#define ESO_MIXREG_RVR_MONO 0x6f /* Record mixer: Mono In */
#define ESO_MIXREG_A2SRG 0x70 /* Audio 2 Sample Rate Generator */
#define ESO_MIXREG_A2MODE 0x71 /* Audio 2 Mode */
#define ESO_MIXREG_A2MODE_ASYNC 0x02 /* A2 SRG and FLTDIV async wrt A1 */
#define ESO_MIXREG_A2MODE_NEWA1 0x20 /* New-style SRG for Audio 1 */
#define ESO_MIXREG_A2FLTDIV 0x72 /* Audio 2 Filter Rate Divider */
#define ESO_MIXREG_A2TCRLO 0x74 /* Audio 2 Transfer Count Reload LO */
#define ESO_MIXREG_A2TCRHI 0x76 /* Audio 2 Transfer Count Reload HI */
#define ESO_MIXREG_A2C1 0x78 /* Audio 2 Control 1 */
#define ESO_MIXREG_A2C1_FIFOENB 0x01 /* FIFO enable */
#define ESO_MIXREG_A2C1_DMAENB 0x02 /* DMA enable */
#define ESO_MIXREG_A2C1_RESV0 0xcc /* Reserved, always write 0 XXXb5? */
#define ESO_MIXREG_A2C1_AUTO 0x10 /* Auto-initialize mode */
#define ESO_MIXREG_A2C2 0x7a /* Audio 2 Control 2 */
#define ESO_MIXREG_A2C2_16BIT 0x01 /* 1 = 16-bit, 0 = 8-bit */
#define ESO_MIXREG_A2C2_STEREO 0x02 /* 1 = Stereo, 0 = Mono */
#define ESO_MIXREG_A2C2_SIGNED 0x04 /* 1 = Signed data, 0 = unsigned */
#define ESO_MIXREG_A2C2_RESV0 0x38 /* Reserved, always write 0 */
#define ESO_MIXREG_A2C2_IRQM 0x40 /* IRQ mask */
#define ESO_MIXREG_A2C2_IRQ 0x80 /* IRQ latch */
#define ESO_MIXREG_PVR_A2 0x7c /* Playback mixer: Audio 2 */
#define ESO_MIXREG_MPM 0x7d /* Microphone Preamp, Mono In/Out */
#define ESO_MIXREG_MPM_MIBYPASS 0x01 /* MONO_IN mixer bypass */
#define ESO_MIXREG_MPM_MOMASK 0x06 /* MONO_OUT value mask */
#define ESO_MIXREG_MPM_MOMUTE 0x00 /* MONO_OUT mute */
#define ESO_MIXREG_MPM_MOCINR 0x02 /* MONO_OUT source CIN_R */
#define ESO_MIXREG_MPM_MOA2R 0x04 /* MONO_OUT source Audio 2 Right */
#define ESO_MIXREG_MPM_MOREC 0x06 /* MONO_OUT source record stage */
#define ESO_MIXREG_MPM_PREAMP 0x08 /* Preamp enable */
#define ESO_MIXREG_MPM_RESV0 0xf0 /* Reserved, always write 0 */
/* Controller registers */
#define ESO_CTLREG_SRG 0xa1 /* Sample Rate Generator */
#define ESO_CTLREG_FLTDIV 0xa2 /* Filter Rate Divider */
#define ESO_CTLREG_A1TCRLO 0xa4 /* Audio 1 Transfer Count Reload LO */
#define ESO_CTLREG_A1TCRHI 0xa5 /* Audio 1 Transfer Count Reload HI */
#define ESO_CTLREG_ACTL 0xa8 /* Analog Control */
#define ESO_CTLREG_ACTL_STEREO 0x01 /* DMA converters stereo */
#define ESO_CTLREG_ACTL_MONO 0x02 /* DMA converters mono */
#define ESO_CTLREG_ACTL_RESV1 0x10 /* Reserved, always write 1 */
#define ESO_CTLREG_ACTL_RESV0 0xe4 /* Reserved, always write 0 */
#define ESO_CTLREG_ACTL_RECMON 0x08 /* Record Monitor enable */
#define ESO_CTLREG_LAIC 0xb1 /* Legacy Audio Interrupt Control */
#define ESO_CTLREG_LAIC_PINENB 0x10 /* Interrupt pin enable */
#define ESO_CTLREG_LAIC_EXTENB 0x40 /* Extended mode IRQ enable */
#define ESO_CTLREG_DRQCTL 0xb2 /* DRQ Control */
#define ESO_CTLREG_DRQCTL_ENB1 0x10 /* Supposedly no function, but ... */
#define ESO_CTLREG_DRQCTL_EXTENB 0x40 /* Extended mode DRQ enable */
#define ESO_CTLREG_RECLVL 0xb4 /* Record Level */
#define ESO_CTLREG_A1C1 0xb7 /* Audio 1 Control 1 */
#define ESO_CTLREG_A1C1_LOAD 0x01 /* Generate load signal */
#define ESO_CTLREG_A1C1_RESV0 0x02 /* Reserved, always write 0 */
#define ESO_CTLREG_A1C1_16BIT 0x04 /* 1 = 16-bit, 0 = 8-bit */
#define ESO_CTLREG_A1C1_STEREO 0x08 /* DMA FIFO Stereo */
#define ESO_CTLREG_A1C1_RESV1 0x10 /* Reserved, always write 1 */
#define ESO_CTLREG_A1C1_SIGNED 0x20 /* 1 = Signed data, 0 = unsigned */
#define ESO_CTLREG_A1C1_MONO 0x40 /* DMA FIFO Mono */
#define ESO_CTLREG_A1C1_FIFOENB 0x80 /* DMA FIFO enable */
#define ESO_CTLREG_A1C2 0xb8 /* Audio 1 Control 2 */
#define ESO_CTLREG_A1C2_DMAENB 0x01 /* DMA enable */
#define ESO_CTLREG_A1C2_READ 0x02 /* 1 = DMA read/ADC, 0 = write/DAC */
#define ESO_CTLREG_A1C2_AUTO 0x04 /* Auto-initialize DMA enable */
#define ESO_CTLREG_A1C2_ADC 0x08 /* 1 = ADC mode, 0 = DAC mode */
#define ESO_CTLREG_A1TT 0xb9 /* Audio 1 Transfer Type */
#define ESO_CTLREG_A1TT_SINGLE 0x00 /* Single-Transfer */
#define ESO_CTLREG_A1TT_DEMAND2 0x01 /* Demand-Transfer, 2 bytes/DREQ */
#define ESO_CTLREG_A1TT_DEMAND4 0x02 /* Demand-Transfer, 4 bytes/DREQ */
/*
* Sample rate related constants.
* Note: the use of these clock sources must be explicitly enabled for Audio 1.
*/
#define ESO_MINRATE 6000
#define ESO_MAXRATE 48000
#define ESO_CLK0 793800L /* Clock source 0 frequency */
#define ESO_CLK1 768000L /* Clock source 1 frequency */
#define ESO_CLK1_SELECT 0x80 /* MSb of divider selects clock src */
/*
* Upper bounds on several polling loop iterations.
*/
#define ESO_RESET_TIMEOUT 5000
#define ESO_RDR_TIMEOUT 5000
#define ESO_WDR_TIMEOUT 5000
/*
* Mixer state data conversions.
*/
/* Truncate MI 8-bit precision gain values to the width of chip registers. */
#define ESO_GAIN_TO_3BIT(x) ((x) & 0xe0)
#define ESO_GAIN_TO_4BIT(x) ((x) & 0xf0)
#define ESO_GAIN_TO_6BIT(x) ((x) & 0xfc)
/* Convert two 4-bit gain values to standard mixer stereo register layout. */
#define ESO_4BIT_GAIN_TO_STEREO(l,r) ((l) | ((r) >> 4))
#endif /* !_DEV_PCI_ESOREG_H_ */
|