1/*
2 * @(#)hardware.h  1.0 1998/12/22 Carlos Hasan (chasan@dcc.uchile.cl)
3 *
4 * Hardware definitions for the Sound Blaster 16 device driver.
5 *
6 * Copyright (C) 1998 Carlos Hasan. All Rights Reserved.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 */
13
14#ifndef __HARDWARE_H
15#define __HARDWARE_H
16
17/*****************************************************************************
18 * SOUND BLASTER 16 PLUG-AND-PLAY DEVICE IDENTIFIERS
19 *****************************************************************************/
20
21/*****************************************************************************
22 * ==========================================================================
23 * Product ID	Description
24 * ==========================================================================
25 * CTL0001	Creative Sound Blaster 16 Plug and Play
26 *
27 * CTL0021	Creative AWE32 Wavetable MIDI
28 * CTL0022	Creative AWE64 Wavetable MIDI
29 * CTL0023	Creative AWE64 Gold Wavetable MIDI
30 * CTL0024	Creative AWE64 Compatible Wavetable MIDI
31 *
32 * CTL0031	Creative AWE32 16-bit Audio (SB16 compatible)
33 *
34 * CTL0041	Creative SB16 Value Plug and Play (V16CL/V32D/V32G)
35 * CTL0042	Creative SB AWE32 Plug and Play
36 * CTL0043	Creative ViBRA 16X Plug and Play
37 * CTL0044	Creative SB AWE64 Gold Plug and Play
38 * CTL0045	Creative SB AWE64
39 * CTL0046	Creative SB AWE64 Compatible Plug and Play
40 * CTL0047	Creative SB16 Plug and Play
41 * CTL0048	Creative SB AWE64 Gold Plug and Play
42 *
43 * CTL0051	Creative 3D Stereo Enhancement
44 *
45 * CTL00F0	Creative ViBRA 16X Plug and Play
46 *
47 * CTL7001	Creative Programmable Game Port
48 * CTL7002	Creative Programmable Game Port
49 * CTL7005	Creative Programmable Game Port (1 I/O)
50 *
51 * CTL8001	SB Legacy Device
52 * PNPB003	SB16 Legacy Device
53 *
54 * ==========================================================================
55 * Serial  Card Name                       Device Name    Vendor ID Device ID
56 * ==========================================================================
57 * CT3980  Creative SB AWE32 PnP           Audio          CTL0042   CTL0031
58 *                                         WaveTable      CTL0042   CTL0021
59 *                                         Game           CTL0042   CTL7001
60 *                                         IDE            CTL0042   CTL2011
61 *
62 * CT2230  Creative ViBRA 16X PnP          Audio          CTL00f0   CTL0043
63 *                                         Game           CTL00f0   CTL7005
64 */
65
66#define PNP_ISA_PRODUCT_ID(ch0, ch1, ch2, prod, rev) \
67(((ch0 & 0x1f) <<  2) | ((ch1 & 0x18) >> 3) | \
68 ((ch1 & 0x07) << 13) | ((ch2 & 0x1f) << 8) | \
69 ((prod & 0xff0) << 12) | ((prod & 0x00f) << 28) | ((rev & 0xf) << 24))
70
71#define PNP_IS_SB16_DEVICE(id) \
72    (((id & 0xf0ffffff) == PNP_ISA_PRODUCT_ID('C', 'T', 'L', 0x000, 0x0)) || \
73     ((id & 0xf0ffffff) == PNP_ISA_PRODUCT_ID('C', 'T', 'L', 0x003, 0x0)) || \
74     ((id & 0xf0ffffff) == PNP_ISA_PRODUCT_ID('C', 'T', 'L', 0x004, 0x0)))
75
76/*****************************************************************************
77 * SOUND BLASTER 16 HARDWARE SPECIFICATIONS
78 *****************************************************************************/
79
80/*****************************************************************************
81 * Sound Blaster 16 DSP I/O port register offsets
82 */
83    enum {
84	SB16_MIXER_ADDRESS      = 0x004,
85	SB16_MIXER_DATA         = 0x005,
86	SB16_CODEC_RESET        = 0x006,
87	SB16_CODEC_READ_DATA    = 0x00a,
88	SB16_CODEC_WRITE_DATA   = 0x00c,
89	SB16_CODEC_WRITE_STATUS = 0x00c,
90	SB16_CODEC_READ_STATUS  = 0x00e,
91	SB16_CODEC_ACK_8_BIT    = 0x00e,
92	SB16_CODEC_ACK_16_BIT   = 0x00f
93    };
94
95/*****************************************************************************
96 * Sound Blaster 16 DSP programming commands
97 */
98enum {
99    SB16_SPEAKER_ENABLE     = 0xd1,
100    SB16_SPEAKER_DISABLE    = 0xd3,
101    SB16_SPEAKER_STATUS     = 0xd8,
102
103    SB16_PLAYBACK_RATE      = 0x41,
104    SB16_CAPTURE_RATE       = 0x42,
105
106    SB16_PLAYBACK_8_BIT     = 0xc6,
107    SB16_CAPTURE_8_BIT      = 0xce,
108    SB16_DMA_DISABLE_8_BIT  = 0xd0,
109    SB16_DMA_ENABLE_8_BIT   = 0xd4,
110    SB16_DMA_EXIT_8_BIT     = 0xda,
111
112    SB16_PLAYBACK_16_BIT    = 0xb6,
113    SB16_CAPTURE_16_BIT     = 0xbe,
114    SB16_DMA_DISABLE_16_BIT = 0xd5,
115    SB16_DMA_ENABLE_16_BIT  = 0xd6,
116    SB16_DMA_EXIT_16_BIT    = 0xd9,
117
118    SB16_CODEC_VERSION      = 0xe1
119};
120
121/*****************************************************************************
122 * Sound Blaster 16 mixer indirect registers
123 */
124enum {
125    SB16_MIXER_RESET        = 0x00,
126
127    SB16_LINE_OUT_LEFT      = 0x30,
128    SB16_LINE_OUT_RIGHT     = 0x31,
129
130    SB16_DAC_LEFT           = 0x32,
131    SB16_DAC_RIGHT          = 0x33,
132
133    SB16_SYNTH_LEFT         = 0x34,
134    SB16_SYNTH_RIGHT        = 0x35,
135
136    SB16_CD_LEFT            = 0x36,
137    SB16_CD_RIGHT           = 0x37,
138
139    SB16_LINE_IN_LEFT       = 0x38,
140    SB16_LINE_IN_RIGHT      = 0x39,
141
142    SB16_MIC                = 0x3a,
143    SB16_PC_BEEP            = 0x3b,
144
145    SB16_OUTPUT_MUX         = 0x3c,
146
147    SB16_INPUT_MUX_LEFT     = 0x3d,
148    SB16_INPUT_MUX_RIGHT    = 0x3e,
149
150    SB16_ADC_GAIN_LEFT      = 0x3f,
151    SB16_ADC_GAIN_RIGHT     = 0x40,
152
153    SB16_DAC_GAIN_LEFT      = 0x41,
154    SB16_DAC_GAIN_RIGHT     = 0x42,
155
156    SB16_MIC_BOOST          = 0x43,
157
158    SB16_TREBLE_LEFT        = 0x44,
159    SB16_TREBLE_RIGHT       = 0x45,
160
161    SB16_BASS_LEFT          = 0x46,
162    SB16_BASS_RIGHT         = 0x47,
163
164    SB16_IRQ_SETUP          = 0x80,
165    SB16_DMA_SETUP          = 0x81,
166    SB16_IRQ_STATUS         = 0x82,
167
168    SB16_STEREO_ENHANCEMENT = 0x90
169};
170
171/*****************************************************************************
172 * Sound Blaster 16 playback and capture sample formats
173 */
174enum {
175    B_SB16_FORMAT_UNSIGNED  = 0x00,
176    B_SB16_FORMAT_SIGNED    = 0x10,
177    B_SB16_FORMAT_MONO      = 0x00,
178    B_SB16_FORMAT_STEREO    = 0x20
179};
180
181/*****************************************************************************
182 * Sound Blaster 16 playback and capture control bits
183 */
184enum {
185    B_SB16_MUX_SYNTH_LEFT   = 0x20,
186    B_SB16_MUX_SYNTH_RIGHT  = 0x40,
187    B_SB16_MUX_LINE_LEFT    = 0x10,
188    B_SB16_MUX_LINE_RIGHT   = 0x08,
189    B_SB16_MUX_CD_LEFT      = 0x04,
190    B_SB16_MUX_CD_RIGHT     = 0x02,
191    B_SB16_MUX_MIC          = 0x01,
192    B_SB16_MUX_ALL_LEFT     = 0x35,
193    B_SB16_MUX_ALL_RIGHT    = 0x4b
194};
195
196/*****************************************************************************
197 * Sound Blaster 16 Stereo Enhancenment
198 */
199enum {
200    B_SB16_SE_ENABLE        = 0x01,
201    B_SB16_SE_DETECT_ENABLE = 0x40,
202    B_SB16_SE_DETECT_STATUS = 0x80
203};
204
205/*****************************************************************************
206 * Sound Blaster 16 DSP I/O port delays
207 */
208enum {
209    SB16_CODEC_IO_DELAY     = 200000,
210    SB16_CODEC_RESET_DELAY  = 200
211};
212
213/*****************************************************************************
214 * Sound Blaster 16 DMA low memory buffer
215 */
216typedef struct {
217    area_id area;
218    char *address;
219    int size;
220} hw_dma_buffer;
221
222/*****************************************************************************
223 * SOUND BLASTER 16 MPU-401 MIDI PORT HARDWARE SPECIFICATIONS
224 *****************************************************************************/
225
226/*****************************************************************************
227 * Sound Blaster 16 MPU-401 I/O port register offsets
228 */
229enum {
230    MPU401_DATA           = 0x000,
231    MPU401_STATUS         = 0x001,
232    MPU401_COMMAND        = 0x001
233};
234
235/*****************************************************************************
236 * Sound Blaster 16 MPU-401 status register bit fields
237 */
238enum {
239    B_MPU401_WRITE_BUSY   = 0x40,
240    B_MPU401_READ_BUSY    = 0x80
241};
242
243/*****************************************************************************
244 * Sound Blaster 16 MPU-401 MIDI port commands
245 */
246enum {
247    MPU401_CMD_RESET      = 0xff,
248    MPU401_CMD_UART_MODE  = 0x3f
249};
250
251/*****************************************************************************
252 * Sound Blaster 16 MPU-401 port timeout and latency
253 */
254enum {
255    MPU401_IO_LATENCY     = 1000,
256    MPU401_IO_TIMEOUT     = 10000
257};
258
259#endif
260