1138 lines
		
	
	
	
		
			36 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			1138 lines
		
	
	
	
		
			36 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
|   | #! /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 |