MultiSound
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:36k
- #! /bin/sh
- #
- # Turtle Beach MultiSound Driver Notes
- # -- Andrew Veliath <andrewtv@usa.net>
- #
- # Last update: September 10, 1998
- # Corresponding msnd driver: 0.8.3
- #
- # ** This file is a README (top part) and shell archive (bottom part).
- # The corresponding archived utility sources can be unpacked by
- # running `sh MultiSound' (the utilities are only needed for the
- # Pinnacle and Fiji cards). **
- #
- #
- # -=-=- Getting Firmware -=-=-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- #
- # See the section `Obtaining and Creating Firmware Files' in this
- # document for instructions on obtaining the necessary firmware
- # files.
- #
- #
- # Supported Features
- # ~~~~~~~~~~~~~~~~~~
- #
- # Currently, full-duplex digital audio (/dev/dsp only, /dev/audio is
- # not currently available) and mixer functionality (/dev/mixer) are
- # supported (memory mapped digital audio is not yet supported).
- # Digital transfers and monitoring can be done as well if you have
- # the digital daughterboard (see the section on using the S/PDIF port
- # for more information).
- #
- # Support for the Turtle Beach MultiSound Hurricane architecture is
- # composed of the following modules (these can also operate compiled
- # into the kernel):
- #
- # 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. If
- # you are compiling in support for the MultiSound driver rather than
- # using it as a module, these firmware files must be accessible
- # during kernel compilation.
- #
- # Please note these files must be binary files, not assembler. See
- # the section later in this document for instructions to obtain these
- # files.
- #
- #
- # Configuring Card Resources
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~
- #
- # ** This section is very important, as your card may not work at all
- # or your machine may crash if you do not do this correctly. **
- #
- # * Classic/Monterey/Tahiti
- #
- # These cards are configured through the driver msnd_classic. You must
- # know the io port, then the driver will select the irq and memory resources
- # on the card. It is up to you to know if these are free locations or now,
- # a conflict can lock the machine up.
- #
- # * Pinnacle/Fiji
- #
- # The Pinnacle and Fiji cards have an extra config port, either
- # 0x250, 0x260 or 0x270. This port can be disabled to have the card
- # configured strictly through PnP, however you lose the ability to
- # access the IDE controller and joystick devices on this card when
- # using PnP. The included pinnaclecfg program in this shell archive
- # can be used to configure the card in non-PnP mode, and in PnP mode
- # you can use isapnptools. These are described briefly here.
- #
- # pinnaclecfg is not required; you can use the msnd_pinnacle module
- # to fully configure the card as well. However, pinnaclecfg can be
- # used to change the resource values of a particular device after the
- # msnd_pinnacle module has been loaded. If you are compiling the
- # driver into the kernel, you must set these values during compile
- # time, however other peripheral resource values can be changed with
- # the pinnaclecfg program after the kernel is loaded.
- #
- #
- # *** PnP mode
- #
- # Use pnpdump to obtain a sample configuration if you can; I was able
- # to obtain one with the command `pnpdump 1 0x203' -- this may vary
- # for you (running pnpdump by itself did not work for me). Then,
- # edit this file and use isapnp to uncomment and set the card values.
- # Use these values when inserting the msnd_pinnacle module. Using
- # this method, you can set the resources for the DSP and the Kurzweil
- # synth (Pinnacle). Since Linux does not directly support PnP
- # devices, you may have difficulty when using the card in PnP mode
- # when it the driver is compiled into the kernel. Using non-PnP mode
- # is preferable in this case.
- #
- # Here is an example mypinnacle.conf for isapnp that sets the card to
- # io base 0x210, irq 5 and mem 0xd8000, and also sets the Kurzweil
- # synth to 0x330 and irq 9 (may need editing for your system):
- #
- # (READPORT 0x0203)
- # (CSN 2)
- # (IDENTIFY *)
- #
- # # DSP
- # (CONFIGURE BVJ0440/-1 (LD 0
- # (INT 0 (IRQ 5 (MODE +E))) (IO 0 (BASE 0x0210)) (MEM 0 (BASE 0x0d8000))
- # (ACT Y)))
- #
- # # Kurzweil Synth (Pinnacle Only)
- # (CONFIGURE BVJ0440/-1 (LD 1
- # (IO 0 (BASE 0x0330)) (INT 0 (IRQ 9 (MODE +E)))
- # (ACT Y)))
- #
- # (WAITFORKEY)
- #
- #
- # *** Non-PnP mode
- #
- # The second way is by running the card in non-PnP mode. This
- # actually has some advantages in that you can access some other
- # devices on the card, such as the joystick and IDE controller. To
- # configure the card, unpack this shell archive and build the
- # pinnaclecfg program. Using this program, you can assign the
- # resource values to the card's devices, or disable the devices. As
- # an alternative to using pinnaclecfg, you can specify many of the
- # configuration values when loading the msnd_pinnacle module (or
- # during kernel configuration when compiling the driver into the
- # kernel).
- #
- # If you specify cfg=0x250 for the msnd_pinnacle module, it
- # automatically configure the card to the given io, irq and memory
- # values using that config port (the config port is jumper selectable
- # on the card to 0x250, 0x260 or 0x270).
- #
- # See the `msnd_pinnacle Additional Options' section below for more
- # information on these parameters (also, if you compile the driver
- # directly into the kernel, these extra parameters can be useful
- # here).
- #
- #
- # ** It is very easy to cause problems in your machine if you choose a
- # resource value which is incorrect. **
- #
- #
- # Examples
- # ~~~~~~~~
- #
- # * MultiSound Classic/Monterey/Tahiti:
- #
- # modprobe soundcore
- # insmod msnd
- # insmod msnd_classic io=0x290 irq=7 mem=0xd0000
- #
- # * MultiSound Pinnacle in PnP mode:
- #
- # modprobe soundcore
- # insmod msnd
- # isapnp mypinnacle.conf
- # insmod msnd_pinnacle io=0x210 irq=5 mem=0xd8000 <-- match mypinnacle.conf values
- #
- # * MultiSound Pinnacle in non-PnP mode (replace 0x250 with your configuration port,
- # one of 0x250, 0x260 or 0x270):
- #
- # insmod soundcore
- # insmod msnd
- # insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000
- #
- # * To use the MPU-compatible Kurzweil synth on the Pinnacle in PnP
- # mode, add the following (assumes you did `isapnp mypinnacle.conf'):
- #
- # insmod sound
- # insmod mpu401 io=0x330 irq=9 <-- match mypinnacle.conf values
- #
- # * To use the MPU-compatible Kurzweil synth on the Pinnacle in non-PnP
- # mode, add the following. Note how we first configure the peripheral's
- # resources, _then_ install a Linux driver for it:
- #
- # insmod sound
- # pinnaclecfg 0x250 mpu 0x330 9
- # insmod mpu401 io=0x330 irq=9
- #
- # -- OR you can use the following sequence without pinnaclecfg in non-PnP mode:
- #
- # insmod soundcore
- # insmod msnd
- # insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 mpu_io=0x330 mpu_irq=9
- # insmod sound
- # insmod mpu401 io=0x330 irq=9
- #
- # * To setup the joystick port on the Pinnacle in non-PnP mode (though
- # you have to find the actual Linux joystick driver elsewhere), you
- # can use pinnaclecfg:
- #
- # pinnaclecfg 0x250 joystick 0x200
- #
- # -- OR you can configure this using msnd_pinnacle with the following:
- #
- # insmod soundcore
- # insmod msnd
- # insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 joystick_io=0x200
- #
- #
- # 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. If not
- # specified, the default will be used. Increasing
- # this value will reduce the chance of a FIFO
- # underflow at the expense of increasing overall
- # latency. For example, fifosize=512 will
- # allocate 512kB read and write FIFOs (1MB total).
- # While this may reduce dropouts, a heavy machine
- # load will undoubtedly starve the FIFO of data
- # and you will eventually get dropouts. One
- # option is to alter the scheduling priority of
- # the playback process, using `nice' or some form
- # of POSIX soft real-time scheduling.
- #
- # 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.
- #
- # cfg Non-PnP configuration port for the Pinnacle
- # and Fiji (typically 0x250, 0x260 or 0x270,
- # depending on the jumper configuration). If
- # this option is omitted, then it is assumed
- # that the card is in PnP mode, and that the
- # specified DSP resource values are already
- # configured with PnP (i.e. it won't attempt to
- # do any sort of configuration).
- #
- # When the Pinnacle is in non-PnP mode, you can use the following
- # options to configure particular devices. If a full specification
- # for a device is not given, then the device is not configured. Note
- # that you still must use a Linux driver for any of these devices
- # once their resources are setup (such as the Linux joystick driver,
- # or the MPU401 driver from OSS for the Kurzweil synth).
- #
- # mpu_io I/O port of MPU (on-board Kurzweil synth)
- # mpu_irq IRQ of MPU (on-board Kurzweil synth)
- # ide_io0 First I/O port of IDE controller
- # ide_io1 Second I/O port of IDE controller
- # ide_irq IRQ IDE controller
- # joystick_io I/O port of joystick
- #
- #
- # Obtaining and Creating Firmware Files
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- #
- # For the Classic/Tahiti/Monterey
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- #
- # Download to /tmp and unzip the following file from Turtle Beach:
- #
- # ftp://ftp.voyetra.com/pub/tbs/msndcl/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).
- #
- # If you are compiling the driver into the kernel, these files must
- # be accessible during compilation, but will not be needed later.
- # The files must remain, however, if the driver is used as a module.
- #
- #
- # 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.voyetra.com/pub/tbs/pinn/pnddk100.zip
- #
- # Unpack this shell archive, and run make in the created directory
- # (you need a C compiler and flex to build the utilities). This
- # should give you the executables conv, pinnaclecfg and setdigital.
- # conv is only used temporarily here to create the firmware files,
- # while pinnaclecfg is used to configure the Pinnacle or Fiji card in
- # non-PnP mode, and setdigital can be used to set the S/PDIF input on
- # the mixer (pinnaclecfg and setdigital should be copied to a
- # convenient place, possibly run during system initialization).
- #
- # To generating the firmware files with the `conv' program, 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).
- #
- # If you are compiling the driver into the kernel, these files must
- # be accessible during compilation, but will not be needed later.
- # The files must remain, however, if the driver is used as a module.
- #
- #
- # Using Digital I/O with the S/PDIF Port
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- #
- # If you have a Pinnacle or Fiji with the digital daughterboard 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, or say Y to the option
- # during compiled-in kernel operation). Upon selection of the S/PDIF
- # port, you should be able monitor and record from it.
- #
- # There is something to note about using the S/PDIF port. Digital
- # timing is taken from the digital signal, so if a signal is not
- # connected to the port and it is selected as recording input, you
- # will find PCM playback to be distorted in playback rate. Also,
- # attempting to record at a sampling rate other than the DAT rate may
- # be problematic (i.e. trying to record at 8000Hz when the DAT signal
- # is 44100Hz). If you have a problem with this, set the recording
- # input to analog if you need to record at a rate other than that of
- # the DAT rate.
- #
- #
- # -- Shell archive attached below, just run `sh MultiSound' to extract.
- # Contains Pinnacle/Fiji utilities to convert firmware, configure
- # in non-PnP mode, and select the DIGITAL1 input for the mixer.
- #
- #
- #!/bin/sh
- # This is a shell archive (produced by GNU sharutils 4.2).
- # To extract the files from this archive, save it to some FILE, remove
- # everything before the `!/bin/sh' line above, then type `sh FILE'.
- #
- # Made on 1998-12-04 10:07 EST by <andrewtv@ztransform.velsoft.com>.
- # Source directory was `/home/andrewtv/programming/pinnacle/pinnacle'.
- #
- # Existing files will *not* be overwritten unless `-c' is specified.
- #
- # This shar contains:
- # length mode name
- # ------ ---------- ------------------------------------------
- # 2046 -rw-rw-r-- MultiSound.d/setdigital.c
- # 10235 -rw-rw-r-- MultiSound.d/pinnaclecfg.c
- # 106 -rw-rw-r-- MultiSound.d/Makefile
- # 141 -rw-rw-r-- MultiSound.d/conv.l
- # 1472 -rw-rw-r-- MultiSound.d/msndreset.c
- #
- save_IFS="${IFS}"
- IFS="${IFS}:"
- gettext_dir=FAILED
- locale_dir=FAILED
- first_param="$1"
- for dir in $PATH
- do
- if test "$gettext_dir" = FAILED && test -f $dir/gettext
- && ($dir/gettext --version >/dev/null 2>&1)
- then
- set `$dir/gettext --version 2>&1`
- if test "$3" = GNU
- then
- gettext_dir=$dir
- fi
- fi
- if test "$locale_dir" = FAILED && test -f $dir/shar
- && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
- then
- locale_dir=`$dir/shar --print-text-domain-dir`
- fi
- done
- IFS="$save_IFS"
- if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
- then
- echo=echo
- else
- TEXTDOMAINDIR=$locale_dir
- export TEXTDOMAINDIR
- TEXTDOMAIN=sharutils
- export TEXTDOMAIN
- echo="$gettext_dir/gettext -s"
- fi
- touch -am 1231235999 $$.touch >/dev/null 2>&1
- if test ! -f 1231235999 && test -f $$.touch; then
- shar_touch=touch
- else
- shar_touch=:
- echo
- $echo 'WARNING: not restoring timestamps. Consider getting and'
- $echo "installing GNU `touch', distributed in GNU File Utilities..."
- echo
- fi
- rm -f 1231235999 $$.touch
- #
- if mkdir _sh01426; then
- $echo 'x -' 'creating lock directory'
- else
- $echo 'failed to create lock directory'
- exit 1
- fi
- # ============= MultiSound.d/setdigital.c ==============
- if test ! -d 'MultiSound.d'; then
- $echo 'x -' 'creating directory' 'MultiSound.d'
- mkdir 'MultiSound.d'
- fi
- if test -f 'MultiSound.d/setdigital.c' && test "$first_param" != -c; then
- $echo 'x -' SKIPPING 'MultiSound.d/setdigital.c' '(file already exists)'
- else
- $echo 'x -' extracting 'MultiSound.d/setdigital.c' '(text)'
- sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/setdigital.c' &&
- /*********************************************************************
- X *
- X * setdigital.c - sets the DIGITAL1 input for a mixer
- X *
- X * Copyright (C) 1998 Andrew Veliath
- X *
- X * This program is free software; you can redistribute it and/or modify
- X * it under the terms of the GNU General Public License as published by
- X * the Free Software Foundation; either version 2 of the License, or
- X * (at your option) any later version.
- X *
- X * This program is distributed in the hope that it will be useful,
- X * but WITHOUT ANY WARRANTY; without even the implied warranty of
- X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- X * GNU General Public License for more details.
- X *
- X * You should have received a copy of the GNU General Public License
- X * along with this program; if not, write to the Free Software
- X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- X *
- X ********************************************************************/
- X
- #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>
- X
- int main(int argc, char *argv[])
- {
- X int fd;
- X unsigned long recmask, recsrc;
- X
- X if (argc != 2) {
- X fprintf(stderr, "usage: setdigital <mixer device>n");
- X exit(1);
- X }
- X
- X if ((fd = open(argv[1], O_RDWR)) < 0) {
- X perror(argv[1]);
- X exit(1);
- X }
- X
- X if (ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask) < 0) {
- X fprintf(stderr, "error: ioctl read recording mask failedn");
- X perror("ioctl");
- X close(fd);
- X exit(1);
- X }
- X
- X if (!(recmask & SOUND_MASK_DIGITAL1)) {
- X fprintf(stderr, "error: cannot find DIGITAL1 device in mixern");
- X close(fd);
- X exit(1);
- X }
- X
- X if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) < 0) {
- X fprintf(stderr, "error: ioctl read recording source failedn");
- X perror("ioctl");
- X close(fd);
- X exit(1);
- X }
- X
- X recsrc |= SOUND_MASK_DIGITAL1;
- X
- X if (ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &recsrc) < 0) {
- X fprintf(stderr, "error: ioctl write recording source failedn");
- X perror("ioctl");
- X close(fd);
- X exit(1);
- X }
- X
- X close(fd);
- X
- X return 0;
- }
- SHAR_EOF
- $shar_touch -am 1204092598 'MultiSound.d/setdigital.c' &&
- chmod 0664 'MultiSound.d/setdigital.c' ||
- $echo 'restore of' 'MultiSound.d/setdigital.c' 'failed'
- if ( md5sum --help 2>&1 | grep 'sage: md5sum [' ) >/dev/null 2>&1
- && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
- md5sum -c << SHAR_EOF >/dev/null 2>&1
- || $echo 'MultiSound.d/setdigital.c:' 'MD5 check failed'
- e87217fc3e71288102ba41fd81f71ec4 MultiSound.d/setdigital.c
- SHAR_EOF
- else
- shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/setdigital.c'`"
- test 2046 -eq "$shar_count" ||
- $echo 'MultiSound.d/setdigital.c:' 'original size' '2046,' 'current size' "$shar_count!"
- fi
- fi
- # ============= MultiSound.d/pinnaclecfg.c ==============
- if test -f 'MultiSound.d/pinnaclecfg.c' && test "$first_param" != -c; then
- $echo 'x -' SKIPPING 'MultiSound.d/pinnaclecfg.c' '(file already exists)'
- else
- $echo 'x -' extracting 'MultiSound.d/pinnaclecfg.c' '(text)'
- sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/pinnaclecfg.c' &&
- /*********************************************************************
- X *
- X * pinnaclecfg.c - Pinnacle/Fiji Device Configuration Program
- X *
- X * This is for NON-PnP mode only. For PnP mode, use isapnptools.
- X *
- X * This is Linux-specific, and must be run with root permissions.
- X *
- X * Part of the Turtle Beach MultiSound Sound Card Driver for Linux
- X *
- X * Copyright (C) 1998 Andrew Veliath
- X *
- X * This program is free software; you can redistribute it and/or modify
- X * it under the terms of the GNU General Public License as published by
- X * the Free Software Foundation; either version 2 of the License, or
- X * (at your option) any later version.
- X *
- X * This program is distributed in the hope that it will be useful,
- X * but WITHOUT ANY WARRANTY; without even the implied warranty of
- X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- X * GNU General Public License for more details.
- X *
- X * You should have received a copy of the GNU General Public License
- X * along with this program; if not, write to the Free Software
- X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- X *
- X ********************************************************************/
- X
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- #include <unistd.h>
- #include <asm/io.h>
- #include <asm/types.h>
- X
- #define IREG_LOGDEVICE 0x07
- #define IREG_ACTIVATE 0x30
- #define LD_ACTIVATE 0x01
- #define LD_DISACTIVATE 0x00
- #define IREG_EECONTROL 0x3F
- #define IREG_MEMBASEHI 0x40
- #define IREG_MEMBASELO 0x41
- #define IREG_MEMCONTROL 0x42
- #define IREG_MEMRANGEHI 0x43
- #define IREG_MEMRANGELO 0x44
- #define MEMTYPE_8BIT 0x00
- #define MEMTYPE_16BIT 0x02
- #define MEMTYPE_RANGE 0x00
- #define MEMTYPE_HIADDR 0x01
- #define IREG_IO0_BASEHI 0x60
- #define IREG_IO0_BASELO 0x61
- #define IREG_IO1_BASEHI 0x62
- #define IREG_IO1_BASELO 0x63
- #define IREG_IRQ_NUMBER 0x70
- #define IREG_IRQ_TYPE 0x71
- #define IRQTYPE_HIGH 0x02
- #define IRQTYPE_LOW 0x00
- #define IRQTYPE_LEVEL 0x01
- #define IRQTYPE_EDGE 0x00
- X
- #define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
- #define LOBYTE(w) ((BYTE)(w))
- #define MAKEWORD(low,hi) ((WORD)(((BYTE)(low))|(((WORD)((BYTE)(hi)))<<8)))
- X
- typedef __u8 BYTE;
- typedef __u16 USHORT;
- typedef __u16 WORD;
- X
- static int config_port = -1;
- X
- static int msnd_write_cfg(int cfg, int reg, int value)
- {
- X outb(reg, cfg);
- X outb(value, cfg + 1);
- X if (value != inb(cfg + 1)) {
- X fprintf(stderr, "error: msnd_write_cfg: I/O errorn");
- X return -EIO;
- X }
- X return 0;
- }
- X
- static int msnd_read_cfg(int cfg, int reg)
- {
- X outb(reg, cfg);
- X return inb(cfg + 1);
- }
- X
- static int msnd_write_cfg_io0(int cfg, int num, WORD io)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_IO0_BASEHI, HIBYTE(io)))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_IO0_BASELO, LOBYTE(io)))
- X return -EIO;
- X return 0;
- }
- X
- static int msnd_read_cfg_io0(int cfg, int num, WORD *io)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X
- X *io = MAKEWORD(msnd_read_cfg(cfg, IREG_IO0_BASELO),
- X msnd_read_cfg(cfg, IREG_IO0_BASEHI));
- X
- X return 0;
- }
- X
- static int msnd_write_cfg_io1(int cfg, int num, WORD io)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_IO1_BASEHI, HIBYTE(io)))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_IO1_BASELO, LOBYTE(io)))
- X return -EIO;
- X return 0;
- }
- X
- static int msnd_read_cfg_io1(int cfg, int num, WORD *io)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X
- X *io = MAKEWORD(msnd_read_cfg(cfg, IREG_IO1_BASELO),
- X msnd_read_cfg(cfg, IREG_IO1_BASEHI));
- X
- X return 0;
- }
- X
- static int msnd_write_cfg_irq(int cfg, int num, WORD irq)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_IRQ_NUMBER, LOBYTE(irq)))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_IRQ_TYPE, IRQTYPE_EDGE))
- X return -EIO;
- X return 0;
- }
- X
- static int msnd_read_cfg_irq(int cfg, int num, WORD *irq)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X
- X *irq = msnd_read_cfg(cfg, IREG_IRQ_NUMBER);
- X
- X return 0;
- }
- X
- static int msnd_write_cfg_mem(int cfg, int num, int mem)
- {
- X WORD wmem;
- X
- X mem >>= 8;
- X mem &= 0xfff;
- X wmem = (WORD)mem;
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_MEMBASEHI, HIBYTE(wmem)))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_MEMBASELO, LOBYTE(wmem)))
- X return -EIO;
- X if (wmem && msnd_write_cfg(cfg, IREG_MEMCONTROL, (MEMTYPE_HIADDR | MEMTYPE_16BIT)))
- X return -EIO;
- X return 0;
- }
- X
- static int msnd_read_cfg_mem(int cfg, int num, int *mem)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X
- X *mem = MAKEWORD(msnd_read_cfg(cfg, IREG_MEMBASELO),
- X msnd_read_cfg(cfg, IREG_MEMBASEHI));
- X *mem <<= 8;
- X
- X return 0;
- }
- X
- static int msnd_activate_logical(int cfg, int num)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X if (msnd_write_cfg(cfg, IREG_ACTIVATE, LD_ACTIVATE))
- X return -EIO;
- X return 0;
- }
- X
- static int msnd_write_cfg_logical(int cfg, int num, WORD io0, WORD io1, WORD irq, int mem)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X if (msnd_write_cfg_io0(cfg, num, io0))
- X return -EIO;
- X if (msnd_write_cfg_io1(cfg, num, io1))
- X return -EIO;
- X if (msnd_write_cfg_irq(cfg, num, irq))
- X return -EIO;
- X if (msnd_write_cfg_mem(cfg, num, mem))
- X return -EIO;
- X if (msnd_activate_logical(cfg, num))
- X return -EIO;
- X return 0;
- }
- X
- static int msnd_read_cfg_logical(int cfg, int num, WORD *io0, WORD *io1, WORD *irq, int *mem)
- {
- X if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
- X return -EIO;
- X if (msnd_read_cfg_io0(cfg, num, io0))
- X return -EIO;
- X if (msnd_read_cfg_io1(cfg, num, io1))
- X return -EIO;
- X if (msnd_read_cfg_irq(cfg, num, irq))
- X return -EIO;
- X if (msnd_read_cfg_mem(cfg, num, mem))
- X return -EIO;
- X return 0;
- }
- X
- static void usage(void)
- {
- X fprintf(stderr,
- X "n"
- X "pinnaclecfg 1.0n"
- X "n"
- X "usage: pinnaclecfg <config port> [device config]n"
- X "n"
- X "This is for use with the card in NON-PnP mode only.n"
- X "n"
- X "Available devices (not all available for Fiji):n"
- X "n"
- X " Device Descriptionn"
- X " -------------------------------------------------------------------n"
- X " reset Reset all devices (i.e. disable)n"
- X " show Display current device configurationsn"
- X "n"
- X " dsp <io> <irq> <mem> Audio devicen"
- X " mpu <io> <irq> Internal Kurzweil synthn"
- X " ide <io0> <io1> <irq> On-board IDE controllern"
- X " joystick <io> Joystick portn"
- X "n");
- X exit(1);
- }
- X
- static int cfg_reset(void)
- {
- X int i;
- X
- X for (i = 0; i < 4; ++i)
- X msnd_write_cfg_logical(config_port, i, 0, 0, 0, 0);
- X
- X return 0;
- }
- X
- static int cfg_show(void)
- {
- X int i;
- X int count = 0;
- X
- X for (i = 0; i < 4; ++i) {
- X WORD io0, io1, irq;
- X int mem;
- X msnd_read_cfg_logical(config_port, i, &io0, &io1, &irq, &mem);
- X switch (i) {
- X case 0:
- X if (io0 || irq || mem) {
- X printf("dsp 0x%x %d 0x%xn", io0, irq, mem);
- X ++count;
- X }
- X break;
- X case 1:
- X if (io0 || irq) {
- X printf("mpu 0x%x %dn", io0, irq);
- X ++count;
- X }
- X break;
- X case 2:
- X if (io0 || io1 || irq) {
- X printf("ide 0x%x 0x%x %dn", io0, io1, irq);
- X ++count;
- X }
- X break;
- X case 3:
- X if (io0) {
- X printf("joystick 0x%xn", io0);
- X ++count;
- X }
- X break;
- X }
- X }
- X
- X if (count == 0)
- X fprintf(stderr, "no devices configuredn");
- X
- X return 0;
- }
- X
- static int cfg_dsp(int argc, char *argv[])
- {
- X int io, irq, mem;
- X
- X if (argc < 3 ||
- X sscanf(argv[0], "0x%x", &io) != 1 ||
- X sscanf(argv[1], "%d", &irq) != 1 ||
- X sscanf(argv[2], "0x%x", &mem) != 1)
- X usage();
- X
- X if (!(io == 0x290 ||
- X io == 0x260 ||
- X io == 0x250 ||
- X io == 0x240 ||
- X io == 0x230 ||
- X io == 0x220 ||
- X io == 0x210 ||
- X io == 0x3e0)) {
- X fprintf(stderr, "error: io must be one of "
- X "210, 220, 230, 240, 250, 260, 290, or 3E0n");
- X usage();
- X }
- X
- X if (!(irq == 5 ||
- X irq == 7 ||
- X irq == 9 ||
- X irq == 10 ||
- X irq == 11 ||
- X irq == 12)) {
- X fprintf(stderr, "error: irq must be one of "
- X "5, 7, 9, 10, 11 or 12n");
- X usage();
- X }
- X
- X if (!(mem == 0xb0000 ||
- X mem == 0xc8000 ||
- X mem == 0xd0000 ||
- X mem == 0xd8000 ||
- X mem == 0xe0000 ||
- X mem == 0xe8000)) {
- X fprintf(stderr, "error: mem must be one of "
- X "0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or 0xe8000n");
- X usage();
- X }
- X
- X return msnd_write_cfg_logical(config_port, 0, io, 0, irq, mem);
- }
- X
- static int cfg_mpu(int argc, char *argv[])
- {
- X int io, irq;
- X
- X if (argc < 2 ||
- X sscanf(argv[0], "0x%x", &io) != 1 ||
- X sscanf(argv[1], "%d", &irq) != 1)
- X usage();
- X
- X return msnd_write_cfg_logical(config_port, 1, io, 0, irq, 0);
- }
- X
- static int cfg_ide(int argc, char *argv[])
- {
- X int io0, io1, irq;
- X
- X if (argc < 3 ||
- X sscanf(argv[0], "0x%x", &io0) != 1 ||
- X sscanf(argv[0], "0x%x", &io1) != 1 ||
- X sscanf(argv[1], "%d", &irq) != 1)
- X usage();
- X
- X return msnd_write_cfg_logical(config_port, 2, io0, io1, irq, 0);
- }
- X
- static int cfg_joystick(int argc, char *argv[])
- {
- X int io;
- X
- X if (argc < 1 ||
- X sscanf(argv[0], "0x%x", &io) != 1)
- X usage();
- X
- X return msnd_write_cfg_logical(config_port, 3, io, 0, 0, 0);
- }
- X
- int main(int argc, char *argv[])
- {
- X char *device;
- X int rv = 0;
- X
- X --argc; ++argv;
- X
- X if (argc < 2)
- X usage();
- X
- X sscanf(argv[0], "0x%x", &config_port);
- X if (config_port != 0x250 && config_port != 0x260 && config_port != 0x270) {
- X fprintf(stderr, "error: <config port> must be 0x250, 0x260 or 0x270n");
- X exit(1);
- X }
- X if (ioperm(config_port, 2, 1)) {
- X perror("ioperm");
- X fprintf(stderr, "note: pinnaclecfg must be run as rootn");
- X exit(1);
- X }
- X device = argv[1];
- X
- X argc -= 2; argv += 2;
- X
- X if (strcmp(device, "reset") == 0)
- X rv = cfg_reset();
- X else if (strcmp(device, "show") == 0)
- X rv = cfg_show();
- X else if (strcmp(device, "dsp") == 0)
- X rv = cfg_dsp(argc, argv);
- X else if (strcmp(device, "mpu") == 0)
- X rv = cfg_mpu(argc, argv);
- X else if (strcmp(device, "ide") == 0)
- X rv = cfg_ide(argc, argv);
- X else if (strcmp(device, "joystick") == 0)
- X rv = cfg_joystick(argc, argv);
- X else {
- X fprintf(stderr, "error: unknown device %sn", device);
- X usage();
- X }
- X
- X if (rv)
- X fprintf(stderr, "error: device configuration failedn");
- X
- X return 0;
- }
- SHAR_EOF
- $shar_touch -am 1204092598 'MultiSound.d/pinnaclecfg.c' &&
- chmod 0664 'MultiSound.d/pinnaclecfg.c' ||
- $echo 'restore of' 'MultiSound.d/pinnaclecfg.c' 'failed'
- if ( md5sum --help 2>&1 | grep 'sage: md5sum [' ) >/dev/null 2>&1
- && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
- md5sum -c << SHAR_EOF >/dev/null 2>&1
- || $echo 'MultiSound.d/pinnaclecfg.c:' 'MD5 check failed'
- 366bdf27f0db767a3c7921d0a6db20fe MultiSound.d/pinnaclecfg.c
- SHAR_EOF
- else
- shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/pinnaclecfg.c'`"
- test 10235 -eq "$shar_count" ||
- $echo 'MultiSound.d/pinnaclecfg.c:' 'original size' '10235,' 'current size' "$shar_count!"
- fi
- fi
- # ============= MultiSound.d/Makefile ==============
- if test -f 'MultiSound.d/Makefile' && test "$first_param" != -c; then
- $echo 'x -' SKIPPING 'MultiSound.d/Makefile' '(file already exists)'
- else
- $echo 'x -' extracting 'MultiSound.d/Makefile' '(text)'
- sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/Makefile' &&
- CC = gcc
- CFLAGS = -O
- PROGS = setdigital msndreset pinnaclecfg conv
- X
- all: $(PROGS)
- X
- clean:
- X rm -f $(PROGS)
- SHAR_EOF
- $shar_touch -am 1204092398 'MultiSound.d/Makefile' &&
- chmod 0664 'MultiSound.d/Makefile' ||
- $echo 'restore of' 'MultiSound.d/Makefile' 'failed'
- if ( md5sum --help 2>&1 | grep 'sage: md5sum [' ) >/dev/null 2>&1
- && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
- md5sum -c << SHAR_EOF >/dev/null 2>&1
- || $echo 'MultiSound.d/Makefile:' 'MD5 check failed'
- 76ca8bb44e3882edcf79c97df6c81845 MultiSound.d/Makefile
- SHAR_EOF
- else
- shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/Makefile'`"
- test 106 -eq "$shar_count" ||
- $echo 'MultiSound.d/Makefile:' 'original size' '106,' 'current size' "$shar_count!"
- fi
- fi
- # ============= MultiSound.d/conv.l ==============
- if test -f 'MultiSound.d/conv.l' && test "$first_param" != -c; then
- $echo 'x -' SKIPPING 'MultiSound.d/conv.l' '(file already exists)'
- else
- $echo 'x -' extracting 'MultiSound.d/conv.l' '(text)'
- sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/conv.l' &&
- %%
- [ nt,r]
- ;.*
- DB
- [0-9A-Fa-f]+H { int n; sscanf(yytext, "%xH", &n); printf("%c", n); }
- %%
- int yywrap() { return 1; }
- main() { yylex(); }
- SHAR_EOF
- $shar_touch -am 0828231798 'MultiSound.d/conv.l' &&
- chmod 0664 'MultiSound.d/conv.l' ||
- $echo 'restore of' 'MultiSound.d/conv.l' 'failed'
- if ( md5sum --help 2>&1 | grep 'sage: md5sum [' ) >/dev/null 2>&1
- && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
- md5sum -c << SHAR_EOF >/dev/null 2>&1
- || $echo 'MultiSound.d/conv.l:' 'MD5 check failed'
- d2411fc32cd71a00dcdc1f009e858dd2 MultiSound.d/conv.l
- SHAR_EOF
- else
- shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/conv.l'`"
- test 141 -eq "$shar_count" ||
- $echo 'MultiSound.d/conv.l:' 'original size' '141,' 'current size' "$shar_count!"
- fi
- fi
- # ============= MultiSound.d/msndreset.c ==============
- if test -f 'MultiSound.d/msndreset.c' && test "$first_param" != -c; then
- $echo 'x -' SKIPPING 'MultiSound.d/msndreset.c' '(file already exists)'
- else
- $echo 'x -' extracting 'MultiSound.d/msndreset.c' '(text)'
- sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/msndreset.c' &&
- /*********************************************************************
- X *
- X * msndreset.c - resets the MultiSound card
- X *
- X * Copyright (C) 1998 Andrew Veliath
- X *
- X * This program is free software; you can redistribute it and/or modify
- X * it under the terms of the GNU General Public License as published by
- X * the Free Software Foundation; either version 2 of the License, or
- X * (at your option) any later version.
- X *
- X * This program is distributed in the hope that it will be useful,
- X * but WITHOUT ANY WARRANTY; without even the implied warranty of
- X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- X * GNU General Public License for more details.
- X *
- X * You should have received a copy of the GNU General Public License
- X * along with this program; if not, write to the Free Software
- X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- X *
- X ********************************************************************/
- X
- #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>
- X
- int main(int argc, char *argv[])
- {
- X int fd;
- X
- X if (argc != 2) {
- X fprintf(stderr, "usage: msndreset <mixer device>n");
- X exit(1);
- X }
- X
- X if ((fd = open(argv[1], O_RDWR)) < 0) {
- X perror(argv[1]);
- X exit(1);
- X }
- X
- X if (ioctl(fd, SOUND_MIXER_PRIVATE1, 0) < 0) {
- X fprintf(stderr, "error: msnd ioctl reset failedn");
- X perror("ioctl");
- X close(fd);
- X exit(1);
- X }
- X
- X close(fd);
- X
- X return 0;
- }
- SHAR_EOF
- $shar_touch -am 1204100698 'MultiSound.d/msndreset.c' &&
- chmod 0664 'MultiSound.d/msndreset.c' ||
- $echo 'restore of' 'MultiSound.d/msndreset.c' 'failed'
- if ( md5sum --help 2>&1 | grep 'sage: md5sum [' ) >/dev/null 2>&1
- && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
- md5sum -c << SHAR_EOF >/dev/null 2>&1
- || $echo 'MultiSound.d/msndreset.c:' 'MD5 check failed'
- c52f876521084e8eb25e12e01dcccb8a MultiSound.d/msndreset.c
- SHAR_EOF
- else
- shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/msndreset.c'`"
- test 1472 -eq "$shar_count" ||
- $echo 'MultiSound.d/msndreset.c:' 'original size' '1472,' 'current size' "$shar_count!"
- fi
- fi
- rm -fr _sh01426
- exit 0