#! /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 failed\n");
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 mixer\n");
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 failed\n");
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 failed\n");
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 error\n");
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.0\n"
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                       Description\n"
X		"        -------------------------------------------------------------------\n"
X		"        reset                        Reset all devices (i.e. disable)\n"
X		"        show                         Display current device configurations\n"
X		"\n"
X		"        dsp <io> <irq> <mem>         Audio device\n"
X		"        mpu <io> <irq>               Internal Kurzweil synth\n"
X		"        ide <io0> <io1> <irq>        On-board IDE controller\n"
X		"        joystick <io>                Joystick port\n"
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%x\n", io0, irq, mem);
X				++count;
X			}
X			break;
X		case 1:
X			if (io0 || irq) {
X				printf("mpu 0x%x %d\n", io0, irq);
X				++count;
X			}
X			break;
X		case 2:
X			if (io0 || io1 || irq) {
X				printf("ide 0x%x 0x%x %d\n", io0, io1, irq);
X				++count;
X			}
X			break;
X		case 3:
X			if (io0) {
X				printf("joystick 0x%x\n", io0);
X				++count;
X			}
X			break;
X		}
X	}
X
X	if (count == 0)
X		fprintf(stderr, "no devices configured\n");
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 3E0\n");
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 12\n");
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 0xe8000\n");
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 0x270\n");
X		exit(1);
X	}
X	if (ioperm(config_port, 2, 1)) {
X		perror("ioperm");
X		fprintf(stderr, "note: pinnaclecfg must be run as root\n");
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 %s\n", device);
X		usage();
X	}
X
X	if (rv)
X		fprintf(stderr, "error: device configuration failed\n");
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' &&
%%
[ \n\t,\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 failed\n");
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
