2018-06-26 12:24:37 +03:00
#! /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):
#
2018-06-26 12:24:39 +03:00
# snd-msnd-lib - MultiSound base (requires snd)
2018-06-26 12:24:37 +03:00
#
2018-06-26 12:24:39 +03:00
# snd-msnd-classic - Base audio/mixer support for Classic, Monetery and
# Tahiti cards
2018-06-26 12:24:37 +03:00
#
2018-06-26 12:24:39 +03:00
# snd-msnd-pinnacle - Base audio/mixer support for Pinnacle and Fiji cards
2018-06-26 12:24:37 +03:00
#
#
# 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
#
2018-06-26 12:24:39 +03:00
# These cards are configured through the driver snd-msnd-classic. You must
2018-06-26 12:24:37 +03:00
# 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.
#
2018-06-26 12:24:39 +03:00
# pinnaclecfg is not required; you can use the snd-msnd-pinnacle module
2018-06-26 12:24:37 +03:00
# to fully configure the card as well. However, pinnaclecfg can be
# used to change the resource values of a particular device after the
2018-06-26 12:24:39 +03:00
# snd-msnd-pinnacle module has been loaded. If you are compiling the
2018-06-26 12:24:37 +03:00
# 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.
2018-06-26 12:24:39 +03:00
# Use these values when inserting the snd-msnd-pinnacle module. Using
2018-06-26 12:24:37 +03:00
# 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
2018-06-26 12:24:39 +03:00
# configuration values when loading the snd-msnd-pinnacle module (or
2018-06-26 12:24:37 +03:00
# during kernel configuration when compiling the driver into the
# kernel).
#
2018-06-26 12:24:39 +03:00
# If you specify cfg=0x250 for the snd-msnd-pinnacle module, it
2018-06-26 12:24:37 +03:00
# 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).
#
2018-06-26 12:24:39 +03:00
# See the `snd-msnd-pinnacle Additional Options' section below for more
2018-06-26 12:24:37 +03:00
# 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:
#
2018-06-26 12:24:39 +03:00
# modprobe snd
# insmod snd-msnd-lib
# insmod snd-msnd-classic io=0x290 irq=7 mem=0xd0000
2018-06-26 12:24:37 +03:00
#
# * MultiSound Pinnacle in PnP mode:
#
2018-06-26 12:24:39 +03:00
# modprobe snd
# insmod snd-msnd-lib
2018-06-26 12:24:37 +03:00
# isapnp mypinnacle.conf
2018-06-26 12:24:39 +03:00
# insmod snd-msnd-pinnacle io=0x210 irq=5 mem=0xd8000 <-- match mypinnacle.conf values
2018-06-26 12:24:37 +03:00
#
# * MultiSound Pinnacle in non-PnP mode (replace 0x250 with your configuration port,
# one of 0x250, 0x260 or 0x270):
#
2018-06-26 12:24:39 +03:00
# modprobe snd
# insmod snd-msnd-lib
# insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000
2018-06-26 12:24:37 +03:00
#
# * To use the MPU-compatible Kurzweil synth on the Pinnacle in PnP
# mode, add the following (assumes you did `isapnp mypinnacle.conf'):
#
2018-06-26 12:24:39 +03:00
# insmod snd
2018-06-26 12:24:37 +03:00
# 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:
#
2018-06-26 12:24:39 +03:00
# insmod snd
2018-06-26 12:24:37 +03:00
# pinnaclecfg 0x250 mpu 0x330 9
# insmod mpu401 io=0x330 irq=9
#
# -- OR you can use the following sequence without pinnaclecfg in non-PnP mode:
#
2018-06-26 12:24:39 +03:00
# 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
2018-06-26 12:24:37 +03:00
# 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
#
2018-06-26 12:24:39 +03:00
# -- OR you can configure this using snd-msnd-pinnacle with the following:
2018-06-26 12:24:37 +03:00
#
2018-06-26 12:24:39 +03:00
# modprobe snd
# insmod snd-msnd-lib
# insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 joystick_io=0x200
2018-06-26 12:24:37 +03:00
#
#
2018-06-26 12:24:39 +03:00
# snd-msnd-classic, snd-msnd-pinnacle Required Options
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2018-06-26 12:24:37 +03:00
#
# 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
#
#
2018-06-26 12:24:39 +03:00
# snd-msnd-classic, snd-msnd-pinnacle Additional Options
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2018-06-26 12:24:37 +03:00
#
# 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).
#
#
2018-06-26 12:24:39 +03:00
# snd-msnd-pinnacle Additional Options
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2018-06-26 12:24:37 +03:00
#
# 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
# ------ ---------- ------------------------------------------
2018-06-26 12:24:38 +03:00
# 2064 -rw-rw-r-- MultiSound.d/setdigital.c
# 10224 -rw-rw-r-- MultiSound.d/pinnaclecfg.c
2018-06-26 12:24:37 +03:00
# 106 -rw-rw-r-- MultiSound.d/Makefile
2018-06-26 12:24:38 +03:00
# 146 -rw-rw-r-- MultiSound.d/conv.l
# 1491 -rw-rw-r-- MultiSound.d/msndreset.c
2018-06-26 12:24:37 +03:00
#
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' > 'MultiS ound.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>
2018-06-26 12:24:38 +03:00
#include <stdlib.h>
2018-06-26 12:24:37 +03:00
#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'`"
2018-06-26 12:24:38 +03:00
test 2064 -eq " $shar_count " ||
$echo 'MultiSound.d/setdigital.c:' 'original size' '2064,' 'current size' " $shar_count ! "
2018-06-26 12:24:37 +03:00
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' > 'MultiS ound.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>
2018-06-26 12:24:38 +03:00
#include <sys/io.h>
2018-06-26 12:24:37 +03:00
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'`"
2018-06-26 12:24:38 +03:00
test 10224 -eq " $shar_count " ||
$echo 'MultiSound.d/pinnaclecfg.c:' 'original size' '10224,' 'current size' " $shar_count ! "
2018-06-26 12:24:37 +03:00
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' > 'MultiS ound.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' > 'MultiS ound.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; }
2018-06-26 12:24:38 +03:00
void main( ) { yylex( ) ; }
2018-06-26 12:24:37 +03:00
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'`"
2018-06-26 12:24:38 +03:00
test 146 -eq " $shar_count " ||
$echo 'MultiSound.d/conv.l:' 'original size' '146,' 'current size' " $shar_count ! "
2018-06-26 12:24:37 +03:00
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' > 'MultiS ound.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>
2018-06-26 12:24:38 +03:00
#include <stdlib.h>
2018-06-26 12:24:37 +03:00
#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'`"
2018-06-26 12:24:38 +03:00
test 1491 -eq " $shar_count " ||
$echo 'MultiSound.d/msndreset.c:' 'original size' '1491,' 'current size' " $shar_count ! "
2018-06-26 12:24:37 +03:00
fi
fi
rm -fr _sh01426
exit 0