3 # Turtle Beach MultiSound Driver Notes
4 # -- Andrew Veliath <andrewtv@usa.net>
6 # Last update: September 10, 1998
7 # Corresponding msnd driver: 0.8.3
9 # ** This file is a README (top part) and shell archive (bottom part).
10 # The corresponding archived utility sources can be unpacked by
11 # running `sh MultiSound' (the utilities are only needed for the
12 # Pinnacle and Fiji cards). **
15 # -=-=- Getting Firmware -=-=-
16 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18 # See the section `Obtaining and Creating Firmware Files' in this
19 # document for instructions on obtaining the necessary firmware
26 # Currently, full-duplex digital audio (/dev/dsp only, /dev/audio is
27 # not currently available) and mixer functionality (/dev/mixer) are
28 # supported (memory mapped digital audio is not yet supported).
29 # Digital transfers and monitoring can be done as well if you have
30 # the digital daughterboard (see the section on using the S/PDIF port
31 # for more information).
33 # Support for the Turtle Beach MultiSound Hurricane architecture is
34 # composed of the following modules (these can also operate compiled
37 # snd-msnd-lib - MultiSound base (requires snd)
39 # snd-msnd-classic - Base audio/mixer support for Classic, Monetery and
42 # snd-msnd-pinnacle - Base audio/mixer support for Pinnacle and Fiji cards
45 # Important Notes - Read Before Using
46 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48 # The firmware files are not included (may change in future). You
49 # must obtain these images from Turtle Beach (they are included in
50 # the MultiSound Development Kits), and place them in /etc/sound for
51 # example, and give the full paths in the Linux configuration. If
52 # you are compiling in support for the MultiSound driver rather than
53 # using it as a module, these firmware files must be accessible
54 # during kernel compilation.
56 # Please note these files must be binary files, not assembler. See
57 # the section later in this document for instructions to obtain these
61 # Configuring Card Resources
62 # ~~~~~~~~~~~~~~~~~~~~~~~~~~
64 # ** This section is very important, as your card may not work at all
65 # or your machine may crash if you do not do this correctly. **
67 # * Classic/Monterey/Tahiti
69 # These cards are configured through the driver snd-msnd-classic. You must
70 # know the io port, then the driver will select the irq and memory resources
71 # on the card. It is up to you to know if these are free locations or now,
72 # a conflict can lock the machine up.
76 # The Pinnacle and Fiji cards have an extra config port, either
77 # 0x250, 0x260 or 0x270. This port can be disabled to have the card
78 # configured strictly through PnP, however you lose the ability to
79 # access the IDE controller and joystick devices on this card when
80 # using PnP. The included pinnaclecfg program in this shell archive
81 # can be used to configure the card in non-PnP mode, and in PnP mode
82 # you can use isapnptools. These are described briefly here.
84 # pinnaclecfg is not required; you can use the snd-msnd-pinnacle module
85 # to fully configure the card as well. However, pinnaclecfg can be
86 # used to change the resource values of a particular device after the
87 # snd-msnd-pinnacle module has been loaded. If you are compiling the
88 # driver into the kernel, you must set these values during compile
89 # time, however other peripheral resource values can be changed with
90 # the pinnaclecfg program after the kernel is loaded.
95 # Use pnpdump to obtain a sample configuration if you can; I was able
96 # to obtain one with the command `pnpdump 1 0x203' -- this may vary
97 # for you (running pnpdump by itself did not work for me). Then,
98 # edit this file and use isapnp to uncomment and set the card values.
99 # Use these values when inserting the snd-msnd-pinnacle module. Using
100 # this method, you can set the resources for the DSP and the Kurzweil
101 # synth (Pinnacle). Since Linux does not directly support PnP
102 # devices, you may have difficulty when using the card in PnP mode
103 # when it the driver is compiled into the kernel. Using non-PnP mode
104 # is preferable in this case.
106 # Here is an example mypinnacle.conf for isapnp that sets the card to
107 # io base 0x210, irq 5 and mem 0xd8000, and also sets the Kurzweil
108 # synth to 0x330 and irq 9 (may need editing for your system):
115 # (CONFIGURE BVJ0440/-1 (LD 0
116 # (INT 0 (IRQ 5 (MODE +E))) (IO 0 (BASE 0x0210)) (MEM 0 (BASE 0x0d8000))
119 # # Kurzweil Synth (Pinnacle Only)
120 # (CONFIGURE BVJ0440/-1 (LD 1
121 # (IO 0 (BASE 0x0330)) (INT 0 (IRQ 9 (MODE +E)))
129 # The second way is by running the card in non-PnP mode. This
130 # actually has some advantages in that you can access some other
131 # devices on the card, such as the joystick and IDE controller. To
132 # configure the card, unpack this shell archive and build the
133 # pinnaclecfg program. Using this program, you can assign the
134 # resource values to the card's devices, or disable the devices. As
135 # an alternative to using pinnaclecfg, you can specify many of the
136 # configuration values when loading the snd-msnd-pinnacle module (or
137 # during kernel configuration when compiling the driver into the
140 # If you specify cfg=0x250 for the snd-msnd-pinnacle module, it
141 # automatically configure the card to the given io, irq and memory
142 # values using that config port (the config port is jumper selectable
143 # on the card to 0x250, 0x260 or 0x270).
145 # See the `snd-msnd-pinnacle Additional Options' section below for more
146 # information on these parameters (also, if you compile the driver
147 # directly into the kernel, these extra parameters can be useful
151 # ** It is very easy to cause problems in your machine if you choose a
152 # resource value which is incorrect. **
158 # * MultiSound Classic/Monterey/Tahiti:
161 # insmod snd-msnd-lib
162 # insmod snd-msnd-classic io=0x290 irq=7 mem=0xd0000
164 # * MultiSound Pinnacle in PnP mode:
167 # insmod snd-msnd-lib
168 # isapnp mypinnacle.conf
169 # insmod snd-msnd-pinnacle io=0x210 irq=5 mem=0xd8000 <-- match mypinnacle.conf values
171 # * MultiSound Pinnacle in non-PnP mode (replace 0x250 with your configuration port,
172 # one of 0x250, 0x260 or 0x270):
175 # insmod snd-msnd-lib
176 # insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000
178 # * To use the MPU-compatible Kurzweil synth on the Pinnacle in PnP
179 # mode, add the following (assumes you did `isapnp mypinnacle.conf'):
182 # insmod mpu401 io=0x330 irq=9 <-- match mypinnacle.conf values
184 # * To use the MPU-compatible Kurzweil synth on the Pinnacle in non-PnP
185 # mode, add the following. Note how we first configure the peripheral's
186 # resources, _then_ install a Linux driver for it:
189 # pinnaclecfg 0x250 mpu 0x330 9
190 # insmod mpu401 io=0x330 irq=9
192 # -- OR you can use the following sequence without pinnaclecfg in non-PnP mode:
195 # insmod snd-msnd-lib
196 # insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 mpu_io=0x330 mpu_irq=9
198 # insmod mpu401 io=0x330 irq=9
200 # * To setup the joystick port on the Pinnacle in non-PnP mode (though
201 # you have to find the actual Linux joystick driver elsewhere), you
202 # can use pinnaclecfg:
204 # pinnaclecfg 0x250 joystick 0x200
206 # -- OR you can configure this using snd-msnd-pinnacle with the following:
209 # insmod snd-msnd-lib
210 # insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 joystick_io=0x200
213 # snd-msnd-classic, snd-msnd-pinnacle Required Options
214 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
216 # If the following options are not given, the module will not load.
217 # Examine the kernel message log for informative error messages.
218 # WARNING--probing isn't supported so try to make sure you have the
219 # correct shared memory area, otherwise you may experience problems.
221 # io I/O base of DSP, e.g. io=0x210
222 # irq IRQ number, e.g. irq=5
223 # mem Shared memory area, e.g. mem=0xd8000
226 # snd-msnd-classic, snd-msnd-pinnacle Additional Options
227 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
229 # fifosize The digital audio FIFOs, in kilobytes. If not
230 # specified, the default will be used. Increasing
231 # this value will reduce the chance of a FIFO
232 # underflow at the expense of increasing overall
233 # latency. For example, fifosize=512 will
234 # allocate 512kB read and write FIFOs (1MB total).
235 # While this may reduce dropouts, a heavy machine
236 # load will undoubtedly starve the FIFO of data
237 # and you will eventually get dropouts. One
238 # option is to alter the scheduling priority of
239 # the playback process, using `nice' or some form
240 # of POSIX soft real-time scheduling.
242 # calibrate_signal Setting this to one calibrates the ADCs to the
243 # signal, zero calibrates to the card (defaults
247 # snd-msnd-pinnacle Additional Options
248 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
250 # digital Specify digital=1 to enable the S/PDIF input
251 # if you have the digital daughterboard
252 # adapter. This will enable access to the
253 # DIGITAL1 input for the soundcard in the mixer.
254 # Some mixer programs might have trouble setting
255 # the DIGITAL1 source as an input. If you have
256 # trouble, you can try the setdigital.c program
257 # at the bottom of this document.
259 # cfg Non-PnP configuration port for the Pinnacle
260 # and Fiji (typically 0x250, 0x260 or 0x270,
261 # depending on the jumper configuration). If
262 # this option is omitted, then it is assumed
263 # that the card is in PnP mode, and that the
264 # specified DSP resource values are already
265 # configured with PnP (i.e. it won't attempt to
266 # do any sort of configuration).
268 # When the Pinnacle is in non-PnP mode, you can use the following
269 # options to configure particular devices. If a full specification
270 # for a device is not given, then the device is not configured. Note
271 # that you still must use a Linux driver for any of these devices
272 # once their resources are setup (such as the Linux joystick driver,
273 # or the MPU401 driver from OSS for the Kurzweil synth).
275 # mpu_io I/O port of MPU (on-board Kurzweil synth)
276 # mpu_irq IRQ of MPU (on-board Kurzweil synth)
277 # ide_io0 First I/O port of IDE controller
278 # ide_io1 Second I/O port of IDE controller
279 # ide_irq IRQ IDE controller
280 # joystick_io I/O port of joystick
283 # Obtaining and Creating Firmware Files
284 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
286 # For the Classic/Tahiti/Monterey
287 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
289 # Download to /tmp and unzip the following file from Turtle Beach:
291 # ftp://ftp.voyetra.com/pub/tbs/msndcl/msndvkit.zip
293 # When unzipped, unzip the file named MsndFiles.zip. Then copy the
294 # following firmware files to /etc/sound (note the file renaming):
296 # cp DSPCODE/MSNDINIT.BIN /etc/sound/msndinit.bin
297 # cp DSPCODE/MSNDPERM.REB /etc/sound/msndperm.bin
299 # When configuring the Linux kernel, specify /etc/sound/msndinit.bin and
300 # /etc/sound/msndperm.bin for the two firmware files (Linux kernel
301 # versions older than 2.2 do not ask for firmware paths, and are
302 # hardcoded to /etc/sound).
304 # If you are compiling the driver into the kernel, these files must
305 # be accessible during compilation, but will not be needed later.
306 # The files must remain, however, if the driver is used as a module.
309 # For the Pinnacle/Fiji
310 # ~~~~~~~~~~~~~~~~~~~~~
312 # Download to /tmp and unzip the following file from Turtle Beach (be
313 # sure to use the entire URL; some have had trouble navigating to the
316 # ftp://ftp.voyetra.com/pub/tbs/pinn/pnddk100.zip
318 # Unpack this shell archive, and run make in the created directory
319 # (you need a C compiler and flex to build the utilities). This
320 # should give you the executables conv, pinnaclecfg and setdigital.
321 # conv is only used temporarily here to create the firmware files,
322 # while pinnaclecfg is used to configure the Pinnacle or Fiji card in
323 # non-PnP mode, and setdigital can be used to set the S/PDIF input on
324 # the mixer (pinnaclecfg and setdigital should be copied to a
325 # convenient place, possibly run during system initialization).
327 # To generating the firmware files with the `conv' program, we create
328 # the binary firmware files by doing the following conversion
329 # (assuming the archive unpacked into a directory named PINNDDK):
331 # ./conv < PINNDDK/dspcode/pndspini.asm > /etc/sound/pndspini.bin
332 # ./conv < PINNDDK/dspcode/pndsperm.asm > /etc/sound/pndsperm.bin
334 # The conv (and conv.l) program is not needed after conversion and can
335 # be safely deleted. Then, when configuring the Linux kernel, specify
336 # /etc/sound/pndspini.bin and /etc/sound/pndsperm.bin for the two
337 # firmware files (Linux kernel versions older than 2.2 do not ask for
338 # firmware paths, and are hardcoded to /etc/sound).
340 # If you are compiling the driver into the kernel, these files must
341 # be accessible during compilation, but will not be needed later.
342 # The files must remain, however, if the driver is used as a module.
345 # Using Digital I/O with the S/PDIF Port
346 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
348 # If you have a Pinnacle or Fiji with the digital daughterboard and
349 # want to set it as the input source, you can use this program if you
350 # have trouble trying to do it with a mixer program (be sure to
351 # insert the module with the digital=1 option, or say Y to the option
352 # during compiled-in kernel operation). Upon selection of the S/PDIF
353 # port, you should be able monitor and record from it.
355 # There is something to note about using the S/PDIF port. Digital
356 # timing is taken from the digital signal, so if a signal is not
357 # connected to the port and it is selected as recording input, you
358 # will find PCM playback to be distorted in playback rate. Also,
359 # attempting to record at a sampling rate other than the DAT rate may
360 # be problematic (i.e. trying to record at 8000Hz when the DAT signal
361 # is 44100Hz). If you have a problem with this, set the recording
362 # input to analog if you need to record at a rate other than that of
366 # -- Shell archive attached below, just run `sh MultiSound' to extract.
367 # Contains Pinnacle/Fiji utilities to convert firmware, configure
368 # in non-PnP mode, and select the DIGITAL1 input for the mixer.
372 # This is a shell archive (produced by GNU sharutils 4.2).
373 # To extract the files from this archive, save it to some FILE, remove
374 # everything before the `!/bin/sh' line above, then type `sh FILE'.
376 # Made on 1998-12-04 10:07 EST by <andrewtv@ztransform.velsoft.com>.
377 # Source directory was `/home/andrewtv/programming/pinnacle/pinnacle'.
379 # Existing files will *not* be overwritten unless `-c' is specified.
381 # This shar contains:
383 # ------ ---------- ------------------------------------------
384 # 2064 -rw-rw-r-- MultiSound.d/setdigital.c
385 # 10224 -rw-rw-r-- MultiSound.d/pinnaclecfg.c
386 # 106 -rw-rw-r-- MultiSound.d/Makefile
387 # 146 -rw-rw-r-- MultiSound.d/conv.l
388 # 1491 -rw-rw-r-- MultiSound.d/msndreset.c
397 if test "$gettext_dir" = FAILED
&& test -f $dir/gettext \
398 && ($dir/gettext --version >/dev
/null
2>&1)
400 set `$dir/gettext --version 2>&1`
406 if test "$locale_dir" = FAILED
&& test -f $dir/shar \
407 && ($dir/shar --print-text-domain-dir >/dev
/null
2>&1)
409 locale_dir
=`$dir/shar --print-text-domain-dir`
413 if test "$locale_dir" = FAILED ||
test "$gettext_dir" = FAILED
417 TEXTDOMAINDIR
=$locale_dir
421 echo="$gettext_dir/gettext -s"
423 touch -am 1231235999 $$.
touch >/dev
/null
2>&1
424 if test ! -f 1231235999 && test -f $$.
touch; then
429 $echo 'WARNING: not restoring timestamps. Consider getting and'
430 $echo "installing GNU \`touch', distributed in GNU File Utilities..."
433 rm -f 1231235999 $$.
touch
435 if mkdir _sh01426
; then
436 $echo 'x -' 'creating lock directory'
438 $echo 'failed to create lock directory'
441 # ============= MultiSound.d/setdigital.c ==============
442 if test ! -d 'MultiSound.d'; then
443 $echo 'x -' 'creating directory' 'MultiSound.d'
446 if test -f 'MultiSound.d/setdigital.c' && test "$first_param" != -c; then
447 $echo 'x -' SKIPPING
'MultiSound.d/setdigital.c' '(file already exists)'
449 $echo 'x -' extracting
'MultiSound.d/setdigital.c' '(text)'
450 sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/setdigital.c' &&
451 /*********************************************************************
453 X
* setdigital.c
- sets the DIGITAL1 input
for a mixer
455 X
* Copyright
(C
) 1998 Andrew Veliath
457 X
* This program is free software
; you can redistribute it and
/or modify
458 X
* it under the terms of the GNU General Public License as published by
459 X
* the Free Software Foundation
; either version
2 of the License
, or
460 X
* (at your option
) any later version.
462 X
* This program is distributed
in the hope that it will be useful
,
463 X
* but WITHOUT ANY WARRANTY
; without even the implied warranty of
464 X
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
465 X
* GNU General Public License
for more details.
467 X
* You should have received a copy of the GNU General Public License
468 X
* along with this program
; if not
, write to the Free Software
469 X
* Foundation
, Inc.
, 675 Mass Ave
, Cambridge
, MA
02139, USA.
471 X
********************************************************************/
477 #include <sys/types.h>
478 #include <sys/stat.h>
479 #include <sys/ioctl.h>
480 #include <sys/soundcard.h>
482 int main
(int argc
, char
*argv
[])
485 X unsigned long recmask
, recsrc
;
488 X fprintf
(stderr
, "usage: setdigital <mixer device>\n");
492 X
if ((fd
= open
(argv
[1], O_RDWR
)) < 0) {
497 X
if (ioctl
(fd
, SOUND_MIXER_READ_RECMASK
, &recmask
) < 0) {
498 X fprintf
(stderr
, "error: ioctl read recording mask failed\n");
504 X
if (!(recmask
& SOUND_MASK_DIGITAL1
)) {
505 X fprintf
(stderr
, "error: cannot find DIGITAL1 device in mixer\n");
510 X
if (ioctl
(fd
, SOUND_MIXER_READ_RECSRC
, &recsrc
) < 0) {
511 X fprintf
(stderr
, "error: ioctl read recording source failed\n");
517 X recsrc |
= SOUND_MASK_DIGITAL1
;
519 X
if (ioctl
(fd
, SOUND_MIXER_WRITE_RECSRC
, &recsrc
) < 0) {
520 X fprintf
(stderr
, "error: ioctl write recording source failed\n");
531 $shar_touch -am 1204092598 'MultiSound.d/setdigital.c' &&
532 chmod 0664 'MultiSound.d/setdigital.c' ||
533 $echo 'restore of' 'MultiSound.d/setdigital.c' 'failed'
534 if ( md5sum --help 2>&1 |
grep 'sage: md5sum \[' ) >/dev
/null
2>&1 \
535 && ( md5sum --version 2>&1 |
grep -v 'textutils 1.12' ) >/dev
/null
; then
536 md5sum -c << SHAR_EOF >/dev/null 2>&1 \
537 || $echo 'MultiSound.d/setdigital.c:' 'MD5 check failed'
538 e87217fc3e71288102ba41fd81f71ec4 MultiSound.d/setdigital.c
541 shar_count
="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/setdigital.c'`"
542 test 2064 -eq "$shar_count" ||
543 $echo 'MultiSound.d/setdigital.c:' 'original size' '2064,' 'current size' "$shar_count!"
546 # ============= MultiSound.d/pinnaclecfg.c ==============
547 if test -f 'MultiSound.d/pinnaclecfg.c' && test "$first_param" != -c; then
548 $echo 'x -' SKIPPING
'MultiSound.d/pinnaclecfg.c' '(file already exists)'
550 $echo 'x -' extracting
'MultiSound.d/pinnaclecfg.c' '(text)'
551 sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/pinnaclecfg.c' &&
552 /*********************************************************************
554 X
* pinnaclecfg.c
- Pinnacle
/Fiji Device Configuration Program
556 X
* This is
for NON-PnP mode only. For PnP mode
, use isapnptools.
558 X
* This is Linux-specific
, and must be run with root permissions.
560 X
* Part of the Turtle Beach MultiSound Sound Card Driver
for Linux
562 X
* Copyright
(C
) 1998 Andrew Veliath
564 X
* This program is free software
; you can redistribute it and
/or modify
565 X
* it under the terms of the GNU General Public License as published by
566 X
* the Free Software Foundation
; either version
2 of the License
, or
567 X
* (at your option
) any later version.
569 X
* This program is distributed
in the hope that it will be useful
,
570 X
* but WITHOUT ANY WARRANTY
; without even the implied warranty of
571 X
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
572 X
* GNU General Public License
for more details.
574 X
* You should have received a copy of the GNU General Public License
575 X
* along with this program
; if not
, write to the Free Software
576 X
* Foundation
, Inc.
, 675 Mass Ave
, Cambridge
, MA
02139, USA.
578 X
********************************************************************/
585 #include <asm/types.h>
588 #define IREG_LOGDEVICE 0x07
589 #define IREG_ACTIVATE 0x30
590 #define LD_ACTIVATE 0x01
591 #define LD_DISACTIVATE 0x00
592 #define IREG_EECONTROL 0x3F
593 #define IREG_MEMBASEHI 0x40
594 #define IREG_MEMBASELO 0x41
595 #define IREG_MEMCONTROL 0x42
596 #define IREG_MEMRANGEHI 0x43
597 #define IREG_MEMRANGELO 0x44
598 #define MEMTYPE_8BIT 0x00
599 #define MEMTYPE_16BIT 0x02
600 #define MEMTYPE_RANGE 0x00
601 #define MEMTYPE_HIADDR 0x01
602 #define IREG_IO0_BASEHI 0x60
603 #define IREG_IO0_BASELO 0x61
604 #define IREG_IO1_BASEHI 0x62
605 #define IREG_IO1_BASELO 0x63
606 #define IREG_IRQ_NUMBER 0x70
607 #define IREG_IRQ_TYPE 0x71
608 #define IRQTYPE_HIGH 0x02
609 #define IRQTYPE_LOW 0x00
610 #define IRQTYPE_LEVEL 0x01
611 #define IRQTYPE_EDGE 0x00
613 #define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
614 #define LOBYTE(w) ((BYTE)(w))
615 #define MAKEWORD(low,hi) ((WORD)(((BYTE)(low))|(((WORD)((BYTE)(hi)))<<8)))
618 typedef __u16 USHORT
;
621 static int config_port
= -1;
623 static int msnd_write_cfg
(int cfg
, int reg
, int value
)
626 X outb
(value
, cfg
+ 1);
627 X
if (value
!= inb
(cfg
+ 1)) {
628 X fprintf
(stderr
, "error: msnd_write_cfg: I/O error\n");
634 static int msnd_read_cfg
(int cfg
, int reg
)
637 X
return inb
(cfg
+ 1);
640 static int msnd_write_cfg_io0
(int cfg
, int num
, WORD io
)
642 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
644 X
if (msnd_write_cfg
(cfg
, IREG_IO0_BASEHI
, HIBYTE
(io
)))
646 X
if (msnd_write_cfg
(cfg
, IREG_IO0_BASELO
, LOBYTE
(io
)))
651 static int msnd_read_cfg_io0
(int cfg
, int num
, WORD
*io
)
653 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
656 X
*io
= MAKEWORD
(msnd_read_cfg
(cfg
, IREG_IO0_BASELO
),
657 X msnd_read_cfg
(cfg
, IREG_IO0_BASEHI
));
662 static int msnd_write_cfg_io1
(int cfg
, int num
, WORD io
)
664 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
666 X
if (msnd_write_cfg
(cfg
, IREG_IO1_BASEHI
, HIBYTE
(io
)))
668 X
if (msnd_write_cfg
(cfg
, IREG_IO1_BASELO
, LOBYTE
(io
)))
673 static int msnd_read_cfg_io1
(int cfg
, int num
, WORD
*io
)
675 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
678 X
*io
= MAKEWORD
(msnd_read_cfg
(cfg
, IREG_IO1_BASELO
),
679 X msnd_read_cfg
(cfg
, IREG_IO1_BASEHI
));
684 static int msnd_write_cfg_irq
(int cfg
, int num
, WORD irq
)
686 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
688 X
if (msnd_write_cfg
(cfg
, IREG_IRQ_NUMBER
, LOBYTE
(irq
)))
690 X
if (msnd_write_cfg
(cfg
, IREG_IRQ_TYPE
, IRQTYPE_EDGE
))
695 static int msnd_read_cfg_irq
(int cfg
, int num
, WORD
*irq
)
697 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
700 X
*irq
= msnd_read_cfg
(cfg
, IREG_IRQ_NUMBER
);
705 static int msnd_write_cfg_mem
(int cfg
, int num
, int mem
)
712 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
714 X
if (msnd_write_cfg
(cfg
, IREG_MEMBASEHI
, HIBYTE
(wmem
)))
716 X
if (msnd_write_cfg
(cfg
, IREG_MEMBASELO
, LOBYTE
(wmem
)))
718 X
if (wmem
&& msnd_write_cfg
(cfg
, IREG_MEMCONTROL
, (MEMTYPE_HIADDR | MEMTYPE_16BIT
)))
723 static int msnd_read_cfg_mem
(int cfg
, int num
, int
*mem
)
725 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
728 X
*mem
= MAKEWORD
(msnd_read_cfg
(cfg
, IREG_MEMBASELO
),
729 X msnd_read_cfg
(cfg
, IREG_MEMBASEHI
));
735 static int msnd_activate_logical
(int cfg
, int num
)
737 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
739 X
if (msnd_write_cfg
(cfg
, IREG_ACTIVATE
, LD_ACTIVATE
))
744 static int msnd_write_cfg_logical
(int cfg
, int num
, WORD io0
, WORD io1
, WORD irq
, int mem
)
746 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
748 X
if (msnd_write_cfg_io0
(cfg
, num
, io0
))
750 X
if (msnd_write_cfg_io1
(cfg
, num
, io1
))
752 X
if (msnd_write_cfg_irq
(cfg
, num
, irq
))
754 X
if (msnd_write_cfg_mem
(cfg
, num
, mem
))
756 X
if (msnd_activate_logical
(cfg
, num
))
761 static int msnd_read_cfg_logical
(int cfg
, int num
, WORD
*io0
, WORD
*io1
, WORD
*irq
, int
*mem
)
763 X
if (msnd_write_cfg
(cfg
, IREG_LOGDEVICE
, num
))
765 X
if (msnd_read_cfg_io0
(cfg
, num
, io0
))
767 X
if (msnd_read_cfg_io1
(cfg
, num
, io1
))
769 X
if (msnd_read_cfg_irq
(cfg
, num
, irq
))
771 X
if (msnd_read_cfg_mem
(cfg
, num
, mem
))
776 static void usage
(void
)
780 X
"pinnaclecfg 1.0\n"
782 X
"usage: pinnaclecfg <config port> [device config]\n"
784 X
"This is for use with the card in NON-PnP mode only.\n"
786 X
"Available devices (not all available for Fiji):\n"
788 X
" Device Description\n"
789 X
" -------------------------------------------------------------------\n"
790 X
" reset Reset all devices (i.e. disable)\n"
791 X
" show Display current device configurations\n"
793 X
" dsp <io> <irq> <mem> Audio device\n"
794 X
" mpu <io> <irq> Internal Kurzweil synth\n"
795 X
" ide <io0> <io1> <irq> On-board IDE controller\n"
796 X
" joystick <io> Joystick port\n"
801 static int cfg_reset
(void
)
805 X
for (i
= 0; i
< 4; ++i
)
806 X msnd_write_cfg_logical
(config_port
, i
, 0, 0, 0, 0);
811 static int cfg_show
(void
)
816 X
for (i
= 0; i
< 4; ++i
) {
817 X WORD io0
, io1
, irq
;
819 X msnd_read_cfg_logical
(config_port
, i
, &io0
, &io1
, &irq
, &mem
);
822 X
if (io0 || irq || mem
) {
823 X
printf("dsp 0x%x %d 0x%x\n", io0
, irq
, mem
);
829 X
printf("mpu 0x%x %d\n", io0
, irq
);
834 X
if (io0 || io1 || irq
) {
835 X
printf("ide 0x%x 0x%x %d\n", io0
, io1
, irq
);
841 X
printf("joystick 0x%x\n", io0
);
849 X fprintf
(stderr
, "no devices configured\n");
854 static int cfg_dsp
(int argc
, char
*argv
[])
859 X sscanf
(argv
[0], "0x%x", &io
) != 1 ||
860 X sscanf
(argv
[1], "%d", &irq
) != 1 ||
861 X sscanf
(argv
[2], "0x%x", &mem
) != 1)
864 X
if (!(io
== 0x290 ||
872 X fprintf
(stderr
, "error: io must be one of "
873 X
"210, 220, 230, 240, 250, 260, 290, or 3E0\n");
883 X fprintf
(stderr
, "error: irq must be one of "
884 X
"5, 7, 9, 10, 11 or 12\n");
888 X
if (!(mem
== 0xb0000 ||
894 X fprintf
(stderr
, "error: mem must be one of "
895 X
"0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or 0xe8000\n");
899 X
return msnd_write_cfg_logical
(config_port
, 0, io
, 0, irq
, mem
);
902 static int cfg_mpu
(int argc
, char
*argv
[])
907 X sscanf
(argv
[0], "0x%x", &io
) != 1 ||
908 X sscanf
(argv
[1], "%d", &irq
) != 1)
911 X
return msnd_write_cfg_logical
(config_port
, 1, io
, 0, irq
, 0);
914 static int cfg_ide
(int argc
, char
*argv
[])
919 X sscanf
(argv
[0], "0x%x", &io0
) != 1 ||
920 X sscanf
(argv
[0], "0x%x", &io1
) != 1 ||
921 X sscanf
(argv
[1], "%d", &irq
) != 1)
924 X
return msnd_write_cfg_logical
(config_port
, 2, io0
, io1
, irq
, 0);
927 static int cfg_joystick
(int argc
, char
*argv
[])
932 X sscanf
(argv
[0], "0x%x", &io
) != 1)
935 X
return msnd_write_cfg_logical
(config_port
, 3, io
, 0, 0, 0);
938 int main
(int argc
, char
*argv
[])
948 X sscanf
(argv
[0], "0x%x", &config_port
);
949 X
if (config_port
!= 0x250 && config_port
!= 0x260 && config_port
!= 0x270) {
950 X fprintf
(stderr
, "error: <config port> must be 0x250, 0x260 or 0x270\n");
953 X
if (ioperm
(config_port
, 2, 1)) {
955 X fprintf
(stderr
, "note: pinnaclecfg must be run as root\n");
960 X argc
-= 2; argv
+= 2;
962 X
if (strcmp
(device
, "reset") == 0)
964 X
else if (strcmp
(device
, "show") == 0)
966 X
else if (strcmp
(device
, "dsp") == 0)
967 X rv
= cfg_dsp
(argc
, argv
);
968 X
else if (strcmp
(device
, "mpu") == 0)
969 X rv
= cfg_mpu
(argc
, argv
);
970 X
else if (strcmp
(device
, "ide") == 0)
971 X rv
= cfg_ide
(argc
, argv
);
972 X
else if (strcmp
(device
, "joystick") == 0)
973 X rv
= cfg_joystick
(argc
, argv
);
975 X fprintf
(stderr
, "error: unknown device %s\n", device
);
980 X fprintf
(stderr
, "error: device configuration failed\n");
985 $shar_touch -am 1204092598 'MultiSound.d/pinnaclecfg.c' &&
986 chmod 0664 'MultiSound.d/pinnaclecfg.c' ||
987 $echo 'restore of' 'MultiSound.d/pinnaclecfg.c' 'failed'
988 if ( md5sum --help 2>&1 |
grep 'sage: md5sum \[' ) >/dev
/null
2>&1 \
989 && ( md5sum --version 2>&1 |
grep -v 'textutils 1.12' ) >/dev
/null
; then
990 md5sum -c << SHAR_EOF >/dev/null 2>&1 \
991 || $echo 'MultiSound.d/pinnaclecfg.c:' 'MD5 check failed'
992 366bdf27f0db767a3c7921d0a6db20fe MultiSound.d/pinnaclecfg.c
995 shar_count
="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/pinnaclecfg.c'`"
996 test 10224 -eq "$shar_count" ||
997 $echo 'MultiSound.d/pinnaclecfg.c:' 'original size' '10224,' 'current size' "$shar_count!"
1000 # ============= MultiSound.d/Makefile ==============
1001 if test -f 'MultiSound.d/Makefile' && test "$first_param" != -c; then
1002 $echo 'x -' SKIPPING
'MultiSound.d/Makefile' '(file already exists)'
1004 $echo 'x -' extracting
'MultiSound.d/Makefile' '(text)'
1005 sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/Makefile' &&
1008 PROGS
= setdigital msndreset pinnaclecfg conv
1015 $shar_touch -am 1204092398 'MultiSound.d/Makefile' &&
1016 chmod 0664 'MultiSound.d/Makefile' ||
1017 $echo 'restore of' 'MultiSound.d/Makefile' 'failed'
1018 if ( md5sum --help 2>&1 |
grep 'sage: md5sum \[' ) >/dev
/null
2>&1 \
1019 && ( md5sum --version 2>&1 |
grep -v 'textutils 1.12' ) >/dev
/null
; then
1020 md5sum -c << SHAR_EOF >/dev/null 2>&1 \
1021 || $echo 'MultiSound.d/Makefile:' 'MD5 check failed'
1022 76ca8bb44e3882edcf79c97df6c81845 MultiSound.d/Makefile
1025 shar_count
="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/Makefile'`"
1026 test 106 -eq "$shar_count" ||
1027 $echo 'MultiSound.d/Makefile:' 'original size' '106,' 'current size' "$shar_count!"
1030 # ============= MultiSound.d/conv.l ==============
1031 if test -f 'MultiSound.d/conv.l' && test "$first_param" != -c; then
1032 $echo 'x -' SKIPPING
'MultiSound.d/conv.l' '(file already exists)'
1034 $echo 'x -' extracting
'MultiSound.d/conv.l' '(text)'
1035 sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/conv.l' &&
1040 [0-9A-Fa-f]+H
{ int n
; sscanf
(yytext
, "%xH", &n
); printf("%c", n
); }
1042 int yywrap
() { return 1; }
1043 void main
() { yylex
(); }
1045 $shar_touch -am 0828231798 'MultiSound.d/conv.l' &&
1046 chmod 0664 'MultiSound.d/conv.l' ||
1047 $echo 'restore of' 'MultiSound.d/conv.l' 'failed'
1048 if ( md5sum --help 2>&1 |
grep 'sage: md5sum \[' ) >/dev
/null
2>&1 \
1049 && ( md5sum --version 2>&1 |
grep -v 'textutils 1.12' ) >/dev
/null
; then
1050 md5sum -c << SHAR_EOF >/dev/null 2>&1 \
1051 || $echo 'MultiSound.d/conv.l:' 'MD5 check failed'
1052 d2411fc32cd71a00dcdc1f009e858dd2 MultiSound.d/conv.l
1055 shar_count
="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/conv.l'`"
1056 test 146 -eq "$shar_count" ||
1057 $echo 'MultiSound.d/conv.l:' 'original size' '146,' 'current size' "$shar_count!"
1060 # ============= MultiSound.d/msndreset.c ==============
1061 if test -f 'MultiSound.d/msndreset.c' && test "$first_param" != -c; then
1062 $echo 'x -' SKIPPING
'MultiSound.d/msndreset.c' '(file already exists)'
1064 $echo 'x -' extracting
'MultiSound.d/msndreset.c' '(text)'
1065 sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/msndreset.c' &&
1066 /*********************************************************************
1068 X
* msndreset.c
- resets the MultiSound card
1070 X
* Copyright
(C
) 1998 Andrew Veliath
1072 X
* This program is free software
; you can redistribute it and
/or modify
1073 X
* it under the terms of the GNU General Public License as published by
1074 X
* the Free Software Foundation
; either version
2 of the License
, or
1075 X
* (at your option
) any later version.
1077 X
* This program is distributed
in the hope that it will be useful
,
1078 X
* but WITHOUT ANY WARRANTY
; without even the implied warranty of
1079 X
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1080 X
* GNU General Public License
for more details.
1082 X
* You should have received a copy of the GNU General Public License
1083 X
* along with this program
; if not
, write to the Free Software
1084 X
* Foundation
, Inc.
, 675 Mass Ave
, Cambridge
, MA
02139, USA.
1086 X
********************************************************************/
1092 #include <sys/types.h>
1093 #include <sys/stat.h>
1094 #include <sys/ioctl.h>
1095 #include <sys/soundcard.h>
1097 int main
(int argc
, char
*argv
[])
1102 X fprintf
(stderr
, "usage: msndreset <mixer device>\n");
1106 X
if ((fd
= open
(argv
[1], O_RDWR
)) < 0) {
1111 X
if (ioctl
(fd
, SOUND_MIXER_PRIVATE1
, 0) < 0) {
1112 X fprintf
(stderr
, "error: msnd ioctl reset failed\n");
1123 $shar_touch -am 1204100698 'MultiSound.d/msndreset.c' &&
1124 chmod 0664 'MultiSound.d/msndreset.c' ||
1125 $echo 'restore of' 'MultiSound.d/msndreset.c' 'failed'
1126 if ( md5sum --help 2>&1 |
grep 'sage: md5sum \[' ) >/dev
/null
2>&1 \
1127 && ( md5sum --version 2>&1 |
grep -v 'textutils 1.12' ) >/dev
/null
; then
1128 md5sum -c << SHAR_EOF >/dev/null 2>&1 \
1129 || $echo 'MultiSound.d/msndreset.c:' 'MD5 check failed'
1130 c52f876521084e8eb25e12e01dcccb8a MultiSound.d/msndreset.c
1133 shar_count
="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/msndreset.c'`"
1134 test 1491 -eq "$shar_count" ||
1135 $echo 'MultiSound.d/msndreset.c:' 'original size' '1491,' 'current size' "$shar_count!"