|
@@ -0,0 +1,1139 @@
|
|
|
+#! /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):
|
|
|
+#
|
|
|
+# snd-msnd-lib - MultiSound base (requires snd)
|
|
|
+#
|
|
|
+# snd-msnd-classic - Base audio/mixer support for Classic, Monetery and
|
|
|
+# Tahiti cards
|
|
|
+#
|
|
|
+# snd-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 snd-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 snd-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
|
|
|
+# snd-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 snd-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 snd-msnd-pinnacle module (or
|
|
|
+# during kernel configuration when compiling the driver into the
|
|
|
+# kernel).
|
|
|
+#
|
|
|
+# If you specify cfg=0x250 for the snd-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 `snd-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 snd
|
|
|
+# insmod snd-msnd-lib
|
|
|
+# insmod snd-msnd-classic io=0x290 irq=7 mem=0xd0000
|
|
|
+#
|
|
|
+# * MultiSound Pinnacle in PnP mode:
|
|
|
+#
|
|
|
+# modprobe snd
|
|
|
+# insmod snd-msnd-lib
|
|
|
+# isapnp mypinnacle.conf
|
|
|
+# insmod snd-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):
|
|
|
+#
|
|
|
+# modprobe snd
|
|
|
+# insmod snd-msnd-lib
|
|
|
+# insmod snd-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 snd
|
|
|
+# 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 snd
|
|
|
+# pinnaclecfg 0x250 mpu 0x330 9
|
|
|
+# insmod mpu401 io=0x330 irq=9
|
|
|
+#
|
|
|
+# -- OR you can use the following sequence without pinnaclecfg in non-PnP mode:
|
|
|
+#
|
|
|
+# modprobe snd
|
|
|
+# insmod snd-msnd-lib
|
|
|
+# insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 mpu_io=0x330 mpu_irq=9
|
|
|
+# insmod snd
|
|
|
+# 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 snd-msnd-pinnacle with the following:
|
|
|
+#
|
|
|
+# modprobe snd
|
|
|
+# insmod snd-msnd-lib
|
|
|
+# insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 joystick_io=0x200
|
|
|
+#
|
|
|
+#
|
|
|
+# snd-msnd-classic, snd-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
|
|
|
+#
|
|
|
+#
|
|
|
+# snd-msnd-classic, snd-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).
|
|
|
+#
|
|
|
+#
|
|
|
+# snd-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
|
|
|
+# ------ ---------- ------------------------------------------
|
|
|
+# 2064 -rw-rw-r-- MultiSound.d/setdigital.c
|
|
|
+# 10224 -rw-rw-r-- MultiSound.d/pinnaclecfg.c
|
|
|
+# 106 -rw-rw-r-- MultiSound.d/Makefile
|
|
|
+# 146 -rw-rw-r-- MultiSound.d/conv.l
|
|
|
+# 1491 -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 <stdlib.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 2064 -eq "$shar_count" ||
|
|
|
+ $echo 'MultiSound.d/setdigital.c:' 'original size' '2064,' '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/types.h>
|
|
|
+#include <sys/io.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 10224 -eq "$shar_count" ||
|
|
|
+ $echo 'MultiSound.d/pinnaclecfg.c:' 'original size' '10224,' '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; }
|
|
|
+void 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 146 -eq "$shar_count" ||
|
|
|
+ $echo 'MultiSound.d/conv.l:' 'original size' '146,' '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 <stdlib.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 1491 -eq "$shar_count" ||
|
|
|
+ $echo 'MultiSound.d/msndreset.c:' 'original size' '1491,' 'current size' "$shar_count!"
|
|
|
+ fi
|
|
|
+fi
|
|
|
+rm -fr _sh01426
|
|
|
+exit 0
|