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
|
Getting Firmware
~~~~~~~~~~~~~~~~
See the end of this document on how to obtain and create the necessary
firmware files.
Supported Features
~~~~~~~~~~~~~~~~~~
Currently digital audio and mixer functionality is supported. (memory
mapped digital audio is not yet supported). Modular MultiSound
support is composed of the following modules:
msnd - MultiSound base (requires soundcore)
msnd_classic - Base audio/mixer support for Classic, Monetery and
Tahiti cards
msnd_pinnacle - Base audio/mixer support for Pinnacle and Fiji cards
Important Notes - Read Before Using
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* The firmware files are not included (may change in future). You
must obtain these images from Turtle Beach (they are included in the
MultiSound Development Kits), and place them in /etc/sound for
example, and give the full paths in the Linux configuration. Please
note these files must be binary files, not assembler.
* You need the following information to use this driver: the card's
I/O base (i.e. 0x250), the IRQ (i.e. 5), and the shared memory area
(i.e. 0xd8000).
* Probing is not currently implemented, and only the msnd_classic
driver will actually program the card's IRQ and SMA locations; the
msnd_pinnacle is primarily for use with the card in PnP mode, however
it should work if you know what the card's resource values are (this
will change in the future).
* Note the Turtle Beach Pinnacle card contains a Kurzweil MA-1
synthesizer with an MPU compatible interface, which should work with
the mpu401 module. You must know the resource values of the MA-1.
Examples
~~~~~~~~
* If you have a MultiSound Classic/Monterey/Tahiti:
insmod soundcore
insmod msnd
insmod msnd_classic io=0x290 irq=7 mem=0xd0000
* If you have a MultiSound Pinnacle:
insmod soundcore
insmod msnd
insmod msnd_pinnacle io=0x210 irq=5 mem=0xd8000
* To use the MPU-compatible Kurzweil synth on the Pinnacle, add the
following:
insmod sound
insmod mpu401 io=0x330 irq=9
msnd_classic, msnd_pinnacle Required Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If the following options are not given, the module will not load.
Examine the kernel message log for informative error messages.
WARNING--probing isn't supported so try to make sure you have the
correct shared memory area, otherwise you may experience problems.
io I/O base of DSP, e.g. io=0x210
irq IRQ number, e.g. irq=5
mem Shared memory area, e.g. mem=0xd8000
msnd_classic, msnd_pinnacle Additional Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fifosize The digital audio FIFOs, in kilobytes. The
default is 64kB (two FIFOs are allocated, so
this uses up 128kB).
calibrate_signal Setting this to one calibrates the ADCs to the
signal, zero calibrates to the card (defaults
to zero).
msnd_pinnacle Additional Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
digital Specify digital=1 to enable the S/PDIF input
if you have the digital daughterboard
adapter. This will enable access to the
DIGITAL1 input for the soundcard in the mixer.
Some mixer programs might have trouble setting
the DIGITAL1 source as an input. If you have
trouble, you can try the setdigital.c program
at the bottom of this document.
Obtaining and Creating Firmware Files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For the Classic/Tahiti/Monterey
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Download to /tmp and unzip the following file from Turtle Beach:
ftp://ftp.tbeach.com/pub/tbs/pinn/msndvkit.zip
When unzipped, unzip the file named MsndFiles.zip. Then copy the
following firmware files to /etc/sound (note the file renaming):
cp DSPCODE/MSNDINIT.BIN /etc/sound/msndinit.bin
cp DSPCODE/MSNDPERM.REB /etc/sound/msndperm.bin
When configuring the Linux kernel, specify /etc/sound/msndinit.bin and
/etc/sound/msndperm.bin for the two firmware files (Linux kernel
versions older than 2.2 do not ask for firmware paths, and are
hardcoded to /etc/sound).
For the Pinnacle/Fiji
~~~~~~~~~~~~~~~~~~~~~
Download to /tmp and unzip the following file from Turtle Beach (be
sure to use the entire URL; some have had trouble navigating to the
URL):
ftp://ftp.tbeach.com/oldpub/tbs/pinn/pnddk100.zip
Put the following lines into a file named conv.l (between the start
and end lines):
-- conv.l start --
%%
[ \n\t,\r]
\;.*
DB
[0-9A-Fa-f]+H { int n; sscanf(yytext, "%xH", &n); printf("%c", n); }
-- conv.l end --
Then, compile the conv program with GNU make with the following
command:
make LEX=flex LOADLIBES=-lfl conv
This should give you an executable named conv. Now, we create the
binary firmware files by doing the following conversion (assuming the
archive unpacked into a directory named PINNDDK):
./conv < PINNDDK/dspcode/pndspini.asm > /etc/sound/pndspini.bin
./conv < PINNDDK/dspcode/pndsperm.asm > /etc/sound/pndsperm.bin
The conv (and conv.l) program is not needed after conversion and can
be safely deleted. Then, when configuring the Linux kernel, specify
/etc/sound/pndspini.bin and /etc/sound/pndsperm.bin for the two
firmware files (Linux kernel versions older than 2.2 do not ask for
firmware paths, and are hardcoded to /etc/sound).
Recording from the S/PDIF Input
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you have a Pinnacle or Fiji with S/PDIF input and want to set it as
the input source, you can use this program if you have trouble trying
to do it with a mixer program (be sure to insert the module with the
digital=1 option).
Compile with:
cc -O setdigital.c -o setdigital
-- start setdigital.c --
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
int main(int argc, char *argv[])
{
int fd;
unsigned long recmask, recsrc;
if (argc != 2) {
fprintf(stderr, "usage: setdigital <mixer device>\n");
exit(1);
} else
if ((fd = open(argv[1], O_RDWR)) < 0) {
perror(argv[1]);
exit(1);
}
if (ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask) < 0) {
fprintf(stderr, "error: ioctl read recmask failed\n");
perror("ioctl");
close(fd);
exit(1);
}
if (!(recmask & SOUND_MASK_DIGITAL1)) {
fprintf(stderr, "error: cannot find DIGITAL1 device in mixer\n");
close(fd);
exit(1);
}
if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) < 0) {
fprintf(stderr, "error: ioctl read recsrc failed\n");
perror("ioctl");
close(fd);
exit(1);
}
recsrc |= SOUND_MASK_DIGITAL1;
if (ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &recsrc) < 0) {
fprintf(stderr, "error: ioctl write recsrc failed\n");
perror("ioctl");
close(fd);
exit(1);
}
close(fd);
return 0;
}
-- end setdigital.c --
|