1 |
1275 |
phoenix |
#define DSP_RESET (devc->base + 0x6)
|
2 |
|
|
#define DSP_READ (devc->base + 0xA)
|
3 |
|
|
#define DSP_WRITE (devc->base + 0xC)
|
4 |
|
|
#define DSP_COMMAND (devc->base + 0xC)
|
5 |
|
|
#define DSP_STATUS (devc->base + 0xC)
|
6 |
|
|
#define DSP_DATA_AVAIL (devc->base + 0xE)
|
7 |
|
|
#define DSP_DATA_AVL16 (devc->base + 0xF)
|
8 |
|
|
#define MIXER_ADDR (devc->base + 0x4)
|
9 |
|
|
#define MIXER_DATA (devc->base + 0x5)
|
10 |
|
|
#define OPL3_LEFT (devc->base + 0x0)
|
11 |
|
|
#define OPL3_RIGHT (devc->base + 0x2)
|
12 |
|
|
#define OPL3_BOTH (devc->base + 0x8)
|
13 |
|
|
/* DSP Commands */
|
14 |
|
|
|
15 |
|
|
#define DSP_CMD_SPKON 0xD1
|
16 |
|
|
#define DSP_CMD_SPKOFF 0xD3
|
17 |
|
|
#define DSP_CMD_DMAON 0xD0
|
18 |
|
|
#define DSP_CMD_DMAOFF 0xD4
|
19 |
|
|
|
20 |
|
|
#define IMODE_NONE 0
|
21 |
|
|
#define IMODE_OUTPUT PCM_ENABLE_OUTPUT
|
22 |
|
|
#define IMODE_INPUT PCM_ENABLE_INPUT
|
23 |
|
|
#define IMODE_INIT 3
|
24 |
|
|
#define IMODE_MIDI 4
|
25 |
|
|
|
26 |
|
|
#define NORMAL_MIDI 0
|
27 |
|
|
#define UART_MIDI 1
|
28 |
|
|
|
29 |
|
|
|
30 |
|
|
/*
|
31 |
|
|
* Device models
|
32 |
|
|
*/
|
33 |
|
|
#define MDL_NONE 0
|
34 |
|
|
#define MDL_SB1 1 /* SB1.0 or 1.5 */
|
35 |
|
|
#define MDL_SB2 2 /* SB2.0 */
|
36 |
|
|
#define MDL_SB201 3 /* SB2.01 */
|
37 |
|
|
#define MDL_SBPRO 4 /* SB Pro */
|
38 |
|
|
#define MDL_SB16 5 /* SB16/32/AWE */
|
39 |
|
|
#define MDL_SBPNP 6 /* SB16/32/AWE PnP */
|
40 |
|
|
#define MDL_JAZZ 10 /* Media Vision Jazz16 */
|
41 |
|
|
#define MDL_SMW 11 /* Logitech SoundMan Wave (Jazz16) */
|
42 |
|
|
#define MDL_ESS 12 /* ESS ES688 and ES1688 */
|
43 |
|
|
#define MDL_AZTECH 13 /* Aztech Sound Galaxy family */
|
44 |
|
|
#define MDL_ES1868MIDI 14 /* MIDI port of ESS1868 */
|
45 |
|
|
#define MDL_AEDSP 15 /* Audio Excel DSP 16 */
|
46 |
|
|
#define MDL_ESSPCI 16 /* ESS PCI card */
|
47 |
|
|
#define MDL_YMPCI 17 /* Yamaha PCI sb in emulation */
|
48 |
|
|
|
49 |
|
|
#define SUBMDL_ALS007 42 /* ALS-007 differs from SB16 only in mixer */
|
50 |
|
|
/* register assignment */
|
51 |
|
|
#define SUBMDL_ALS100 43 /* ALS-100 allows sampling rates of up */
|
52 |
|
|
/* to 48kHz */
|
53 |
|
|
|
54 |
|
|
/*
|
55 |
|
|
* Config flags
|
56 |
|
|
*/
|
57 |
|
|
#define SB_NO_MIDI 0x00000001
|
58 |
|
|
#define SB_NO_MIXER 0x00000002
|
59 |
|
|
#define SB_NO_AUDIO 0x00000004
|
60 |
|
|
#define SB_NO_RECORDING 0x00000008 /* No audio recording */
|
61 |
|
|
#define SB_MIDI_ONLY (SB_NO_AUDIO|SB_NO_MIXER)
|
62 |
|
|
#define SB_PCI_IRQ 0x00000010 /* PCI shared IRQ */
|
63 |
|
|
|
64 |
|
|
struct mixer_def {
|
65 |
|
|
unsigned int regno: 8;
|
66 |
|
|
unsigned int bitoffs:4;
|
67 |
|
|
unsigned int nbits:4;
|
68 |
|
|
};
|
69 |
|
|
|
70 |
|
|
typedef struct mixer_def mixer_tab[32][2];
|
71 |
|
|
typedef struct mixer_def mixer_ent;
|
72 |
|
|
|
73 |
|
|
struct sb_module_options
|
74 |
|
|
{
|
75 |
|
|
int esstype; /* ESS chip type */
|
76 |
|
|
int acer; /* Do acer notebook init? */
|
77 |
|
|
int sm_games; /* Logitech soundman games? */
|
78 |
|
|
};
|
79 |
|
|
|
80 |
|
|
typedef struct sb_devc {
|
81 |
|
|
int dev;
|
82 |
|
|
|
83 |
|
|
/* Hardware parameters */
|
84 |
|
|
int *osp;
|
85 |
|
|
int minor, major;
|
86 |
|
|
int type;
|
87 |
|
|
int model, submodel;
|
88 |
|
|
int caps;
|
89 |
|
|
# define SBCAP_STEREO 0x00000001
|
90 |
|
|
# define SBCAP_16BITS 0x00000002
|
91 |
|
|
|
92 |
|
|
/* Hardware resources */
|
93 |
|
|
int base;
|
94 |
|
|
int irq;
|
95 |
|
|
int dma8, dma16;
|
96 |
|
|
|
97 |
|
|
int pcibase; /* For ESS Maestro etc */
|
98 |
|
|
|
99 |
|
|
/* State variables */
|
100 |
|
|
int opened;
|
101 |
|
|
/* new audio fields for full duplex support */
|
102 |
|
|
int fullduplex;
|
103 |
|
|
int duplex;
|
104 |
|
|
int speed, bits, channels;
|
105 |
|
|
volatile int irq_ok;
|
106 |
|
|
volatile int intr_active, irq_mode;
|
107 |
|
|
/* duplicate audio fields for full duplex support */
|
108 |
|
|
volatile int intr_active_16, irq_mode_16;
|
109 |
|
|
|
110 |
|
|
/* Mixer fields */
|
111 |
|
|
int *levels;
|
112 |
|
|
mixer_tab *iomap;
|
113 |
|
|
int mixer_caps, recmask, outmask, supported_devices;
|
114 |
|
|
int supported_rec_devices, supported_out_devices;
|
115 |
|
|
int my_mixerdev;
|
116 |
|
|
int sbmixnum;
|
117 |
|
|
|
118 |
|
|
/* Audio fields */
|
119 |
|
|
unsigned long trg_buf;
|
120 |
|
|
int trigger_bits;
|
121 |
|
|
int trg_bytes;
|
122 |
|
|
int trg_intrflag;
|
123 |
|
|
int trg_restart;
|
124 |
|
|
/* duplicate audio fields for full duplex support */
|
125 |
|
|
unsigned long trg_buf_16;
|
126 |
|
|
int trigger_bits_16;
|
127 |
|
|
int trg_bytes_16;
|
128 |
|
|
int trg_intrflag_16;
|
129 |
|
|
int trg_restart_16;
|
130 |
|
|
|
131 |
|
|
unsigned char tconst;
|
132 |
|
|
|
133 |
|
|
/* MIDI fields */
|
134 |
|
|
int my_mididev;
|
135 |
|
|
int input_opened;
|
136 |
|
|
int midi_broken;
|
137 |
|
|
void (*midi_input_intr) (int dev, unsigned char data);
|
138 |
|
|
void *midi_irq_cookie; /* IRQ cookie for the midi */
|
139 |
|
|
|
140 |
|
|
spinlock_t lock;
|
141 |
|
|
|
142 |
|
|
struct sb_module_options sbmo; /* Module options */
|
143 |
|
|
|
144 |
|
|
} sb_devc;
|
145 |
|
|
|
146 |
|
|
/*
|
147 |
|
|
* PCI card types
|
148 |
|
|
*/
|
149 |
|
|
|
150 |
|
|
#define SB_PCI_ESSMAESTRO 1 /* ESS Maestro Legacy */
|
151 |
|
|
#define SB_PCI_YAMAHA 2 /* Yamaha Legacy */
|
152 |
|
|
|
153 |
|
|
/*
|
154 |
|
|
* Functions
|
155 |
|
|
*/
|
156 |
|
|
|
157 |
|
|
int sb_dsp_command (sb_devc *devc, unsigned char val);
|
158 |
|
|
int sb_dsp_get_byte(sb_devc * devc);
|
159 |
|
|
int sb_dsp_reset (sb_devc *devc);
|
160 |
|
|
void sb_setmixer (sb_devc *devc, unsigned int port, unsigned int value);
|
161 |
|
|
unsigned int sb_getmixer (sb_devc *devc, unsigned int port);
|
162 |
|
|
int sb_dsp_detect (struct address_info *hw_config, int pci, int pciio, struct sb_module_options *sbmo);
|
163 |
|
|
int sb_dsp_init (struct address_info *hw_config, struct module *owner);
|
164 |
|
|
void sb_dsp_unload(struct address_info *hw_config, int sbmpu);
|
165 |
|
|
int sb_mixer_init(sb_devc *devc, struct module *owner);
|
166 |
|
|
void sb_mixer_unload(sb_devc *devc);
|
167 |
|
|
void sb_mixer_set_stereo (sb_devc *devc, int mode);
|
168 |
|
|
void smw_mixer_init(sb_devc *devc);
|
169 |
|
|
void sb_dsp_midi_init (sb_devc *devc, struct module *owner);
|
170 |
|
|
void sb_audio_init (sb_devc *devc, char *name, struct module *owner);
|
171 |
|
|
void sb_midi_interrupt (sb_devc *devc);
|
172 |
|
|
void sb_chgmixer (sb_devc * devc, unsigned int reg, unsigned int mask, unsigned int val);
|
173 |
|
|
int sb_common_mixer_set(sb_devc * devc, int dev, int left, int right);
|
174 |
|
|
|
175 |
|
|
int sb_audio_open(int dev, int mode);
|
176 |
|
|
void sb_audio_close(int dev);
|
177 |
|
|
|
178 |
|
|
extern sb_devc *last_sb;
|
179 |
|
|
|
180 |
|
|
/* From sb_common.c */
|
181 |
|
|
void sb_dsp_disable_midi(int port);
|
182 |
|
|
void sb_dsp_disable_recording(int port);
|
183 |
|
|
int probe_sbmpu (struct address_info *hw_config, struct module *owner);
|
184 |
|
|
void unload_sbmpu (struct address_info *hw_config);
|
185 |
|
|
|
186 |
|
|
void unload_sb16(struct address_info *hw_info);
|
187 |
|
|
void unload_sb16midi(struct address_info *hw_info);
|