xref: /linux/Documentation/sound/cards/multisound.sh (revision 3eb66e91a25497065c5322b1268cbc3953642227)
15c10ed43SMauro Carvalho Chehab#! /bin/sh
25c10ed43SMauro Carvalho Chehab#
35c10ed43SMauro Carvalho Chehab#  Turtle Beach MultiSound Driver Notes
45c10ed43SMauro Carvalho Chehab#  -- Andrew Veliath <andrewtv@usa.net>
55c10ed43SMauro Carvalho Chehab#
65c10ed43SMauro Carvalho Chehab#  Last update:                      September 10, 1998
75c10ed43SMauro Carvalho Chehab#  Corresponding msnd driver:        0.8.3
85c10ed43SMauro Carvalho Chehab#
95c10ed43SMauro Carvalho Chehab# ** This file is a README (top part) and shell archive (bottom part).
105c10ed43SMauro Carvalho Chehab#    The corresponding archived utility sources can be unpacked by
115c10ed43SMauro Carvalho Chehab#    running `sh MultiSound' (the utilities are only needed for the
125c10ed43SMauro Carvalho Chehab#    Pinnacle and Fiji cards). **
135c10ed43SMauro Carvalho Chehab#
145c10ed43SMauro Carvalho Chehab#
155c10ed43SMauro Carvalho Chehab#  -=-=- Getting Firmware -=-=-
165c10ed43SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
175c10ed43SMauro Carvalho Chehab#
185c10ed43SMauro Carvalho Chehab#  See the section `Obtaining and Creating Firmware Files' in this
195c10ed43SMauro Carvalho Chehab#  document for instructions on obtaining the necessary firmware
205c10ed43SMauro Carvalho Chehab#  files.
215c10ed43SMauro Carvalho Chehab#
225c10ed43SMauro Carvalho Chehab#
235c10ed43SMauro Carvalho Chehab#  Supported Features
245c10ed43SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~
255c10ed43SMauro Carvalho Chehab#
265c10ed43SMauro Carvalho Chehab#  Currently, full-duplex digital audio (/dev/dsp only, /dev/audio is
275c10ed43SMauro Carvalho Chehab#  not currently available) and mixer functionality (/dev/mixer) are
285c10ed43SMauro Carvalho Chehab#  supported (memory mapped digital audio is not yet supported).
295c10ed43SMauro Carvalho Chehab#  Digital transfers and monitoring can be done as well if you have
305c10ed43SMauro Carvalho Chehab#  the digital daughterboard (see the section on using the S/PDIF port
315c10ed43SMauro Carvalho Chehab#  for more information).
325c10ed43SMauro Carvalho Chehab#
335c10ed43SMauro Carvalho Chehab#  Support for the Turtle Beach MultiSound Hurricane architecture is
345c10ed43SMauro Carvalho Chehab#  composed of the following modules (these can also operate compiled
355c10ed43SMauro Carvalho Chehab#  into the kernel):
365c10ed43SMauro Carvalho Chehab#
37*513f9306SMauro Carvalho Chehab#  snd-msnd-lib           - MultiSound base (requires snd)
385c10ed43SMauro Carvalho Chehab#
39*513f9306SMauro Carvalho Chehab#  snd-msnd-classic       - Base audio/mixer support for Classic, Monetery and
405c10ed43SMauro Carvalho Chehab#                           Tahiti cards
415c10ed43SMauro Carvalho Chehab#
42*513f9306SMauro Carvalho Chehab#  snd-msnd-pinnacle      - Base audio/mixer support for Pinnacle and Fiji cards
435c10ed43SMauro Carvalho Chehab#
445c10ed43SMauro Carvalho Chehab#
455c10ed43SMauro Carvalho Chehab#  Important Notes - Read Before Using
465c10ed43SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
475c10ed43SMauro Carvalho Chehab#
485c10ed43SMauro Carvalho Chehab#  The firmware files are not included (may change in future).  You
495c10ed43SMauro Carvalho Chehab#  must obtain these images from Turtle Beach (they are included in
505c10ed43SMauro Carvalho Chehab#  the MultiSound Development Kits), and place them in /etc/sound for
515c10ed43SMauro Carvalho Chehab#  example, and give the full paths in the Linux configuration.  If
525c10ed43SMauro Carvalho Chehab#  you are compiling in support for the MultiSound driver rather than
535c10ed43SMauro Carvalho Chehab#  using it as a module, these firmware files must be accessible
545c10ed43SMauro Carvalho Chehab#  during kernel compilation.
555c10ed43SMauro Carvalho Chehab#
565c10ed43SMauro Carvalho Chehab#  Please note these files must be binary files, not assembler.  See
575c10ed43SMauro Carvalho Chehab#  the section later in this document for instructions to obtain these
585c10ed43SMauro Carvalho Chehab#  files.
595c10ed43SMauro Carvalho Chehab#
605c10ed43SMauro Carvalho Chehab#
615c10ed43SMauro Carvalho Chehab#  Configuring Card Resources
625c10ed43SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~~~~~~~~~
635c10ed43SMauro Carvalho Chehab#
645c10ed43SMauro Carvalho Chehab#  ** This section is very important, as your card may not work at all
655c10ed43SMauro Carvalho Chehab#     or your machine may crash if you do not do this correctly. **
665c10ed43SMauro Carvalho Chehab#
675c10ed43SMauro Carvalho Chehab#  * Classic/Monterey/Tahiti
685c10ed43SMauro Carvalho Chehab#
69*513f9306SMauro Carvalho Chehab#  These cards are configured through the driver snd-msnd-classic.  You must
705c10ed43SMauro Carvalho Chehab#  know the io port, then the driver will select the irq and memory resources
715c10ed43SMauro Carvalho Chehab#  on the card.  It is up to you to know if these are free locations or now,
725c10ed43SMauro Carvalho Chehab#  a conflict can lock the machine up.
735c10ed43SMauro Carvalho Chehab#
745c10ed43SMauro Carvalho Chehab#  * Pinnacle/Fiji
755c10ed43SMauro Carvalho Chehab#
765c10ed43SMauro Carvalho Chehab#  The Pinnacle and Fiji cards have an extra config port, either
775c10ed43SMauro Carvalho Chehab#  0x250, 0x260 or 0x270.  This port can be disabled to have the card
785c10ed43SMauro Carvalho Chehab#  configured strictly through PnP, however you lose the ability to
795c10ed43SMauro Carvalho Chehab#  access the IDE controller and joystick devices on this card when
805c10ed43SMauro Carvalho Chehab#  using PnP.  The included pinnaclecfg program in this shell archive
815c10ed43SMauro Carvalho Chehab#  can be used to configure the card in non-PnP mode, and in PnP mode
825c10ed43SMauro Carvalho Chehab#  you can use isapnptools.  These are described briefly here.
835c10ed43SMauro Carvalho Chehab#
84*513f9306SMauro Carvalho Chehab#  pinnaclecfg is not required; you can use the snd-msnd-pinnacle module
855c10ed43SMauro Carvalho Chehab#  to fully configure the card as well.  However, pinnaclecfg can be
865c10ed43SMauro Carvalho Chehab#  used to change the resource values of a particular device after the
87*513f9306SMauro Carvalho Chehab#  snd-msnd-pinnacle module has been loaded.  If you are compiling the
885c10ed43SMauro Carvalho Chehab#  driver into the kernel, you must set these values during compile
895c10ed43SMauro Carvalho Chehab#  time, however other peripheral resource values can be changed with
905c10ed43SMauro Carvalho Chehab#  the pinnaclecfg program after the kernel is loaded.
915c10ed43SMauro Carvalho Chehab#
925c10ed43SMauro Carvalho Chehab#
935c10ed43SMauro Carvalho Chehab#  *** PnP mode
945c10ed43SMauro Carvalho Chehab#
955c10ed43SMauro Carvalho Chehab#  Use pnpdump to obtain a sample configuration if you can; I was able
965c10ed43SMauro Carvalho Chehab#  to obtain one with the command `pnpdump 1 0x203' -- this may vary
975c10ed43SMauro Carvalho Chehab#  for you (running pnpdump by itself did not work for me).  Then,
985c10ed43SMauro Carvalho Chehab#  edit this file and use isapnp to uncomment and set the card values.
99*513f9306SMauro Carvalho Chehab#  Use these values when inserting the snd-msnd-pinnacle module.  Using
1005c10ed43SMauro Carvalho Chehab#  this method, you can set the resources for the DSP and the Kurzweil
1015c10ed43SMauro Carvalho Chehab#  synth (Pinnacle).  Since Linux does not directly support PnP
1025c10ed43SMauro Carvalho Chehab#  devices, you may have difficulty when using the card in PnP mode
1035c10ed43SMauro Carvalho Chehab#  when it the driver is compiled into the kernel.  Using non-PnP mode
1045c10ed43SMauro Carvalho Chehab#  is preferable in this case.
1055c10ed43SMauro Carvalho Chehab#
1065c10ed43SMauro Carvalho Chehab#  Here is an example mypinnacle.conf for isapnp that sets the card to
1075c10ed43SMauro Carvalho Chehab#  io base 0x210, irq 5 and mem 0xd8000, and also sets the Kurzweil
1085c10ed43SMauro Carvalho Chehab#  synth to 0x330 and irq 9 (may need editing for your system):
1095c10ed43SMauro Carvalho Chehab#
1105c10ed43SMauro Carvalho Chehab#  (READPORT 0x0203)
1115c10ed43SMauro Carvalho Chehab#  (CSN 2)
1125c10ed43SMauro Carvalho Chehab#  (IDENTIFY *)
1135c10ed43SMauro Carvalho Chehab#
1145c10ed43SMauro Carvalho Chehab#  # DSP
1155c10ed43SMauro Carvalho Chehab#  (CONFIGURE BVJ0440/-1 (LD 0
1165c10ed43SMauro Carvalho Chehab#          (INT 0 (IRQ 5 (MODE +E))) (IO 0 (BASE 0x0210)) (MEM 0 (BASE 0x0d8000))
1175c10ed43SMauro Carvalho Chehab#          (ACT Y)))
1185c10ed43SMauro Carvalho Chehab#
1195c10ed43SMauro Carvalho Chehab#  # Kurzweil Synth (Pinnacle Only)
1205c10ed43SMauro Carvalho Chehab#  (CONFIGURE BVJ0440/-1 (LD 1
1215c10ed43SMauro Carvalho Chehab#          (IO 0 (BASE 0x0330)) (INT 0 (IRQ 9 (MODE +E)))
1225c10ed43SMauro Carvalho Chehab#          (ACT Y)))
1235c10ed43SMauro Carvalho Chehab#
1245c10ed43SMauro Carvalho Chehab#  (WAITFORKEY)
1255c10ed43SMauro Carvalho Chehab#
1265c10ed43SMauro Carvalho Chehab#
1275c10ed43SMauro Carvalho Chehab#  *** Non-PnP mode
1285c10ed43SMauro Carvalho Chehab#
1295c10ed43SMauro Carvalho Chehab#  The second way is by running the card in non-PnP mode.  This
1305c10ed43SMauro Carvalho Chehab#  actually has some advantages in that you can access some other
1315c10ed43SMauro Carvalho Chehab#  devices on the card, such as the joystick and IDE controller.  To
1325c10ed43SMauro Carvalho Chehab#  configure the card, unpack this shell archive and build the
1335c10ed43SMauro Carvalho Chehab#  pinnaclecfg program.  Using this program, you can assign the
1345c10ed43SMauro Carvalho Chehab#  resource values to the card's devices, or disable the devices.  As
1355c10ed43SMauro Carvalho Chehab#  an alternative to using pinnaclecfg, you can specify many of the
136*513f9306SMauro Carvalho Chehab#  configuration values when loading the snd-msnd-pinnacle module (or
1375c10ed43SMauro Carvalho Chehab#  during kernel configuration when compiling the driver into the
1385c10ed43SMauro Carvalho Chehab#  kernel).
1395c10ed43SMauro Carvalho Chehab#
140*513f9306SMauro Carvalho Chehab#  If you specify cfg=0x250 for the snd-msnd-pinnacle module, it
1415c10ed43SMauro Carvalho Chehab#  automatically configure the card to the given io, irq and memory
1425c10ed43SMauro Carvalho Chehab#  values using that config port (the config port is jumper selectable
1435c10ed43SMauro Carvalho Chehab#  on the card to 0x250, 0x260 or 0x270).
1445c10ed43SMauro Carvalho Chehab#
145*513f9306SMauro Carvalho Chehab#  See the `snd-msnd-pinnacle Additional Options' section below for more
1465c10ed43SMauro Carvalho Chehab#  information on these parameters (also, if you compile the driver
1475c10ed43SMauro Carvalho Chehab#  directly into the kernel, these extra parameters can be useful
1485c10ed43SMauro Carvalho Chehab#  here).
1495c10ed43SMauro Carvalho Chehab#
1505c10ed43SMauro Carvalho Chehab#
1515c10ed43SMauro Carvalho Chehab# ** It is very easy to cause problems in your machine if you choose a
1525c10ed43SMauro Carvalho Chehab#    resource value which is incorrect. **
1535c10ed43SMauro Carvalho Chehab#
1545c10ed43SMauro Carvalho Chehab#
1555c10ed43SMauro Carvalho Chehab#  Examples
1565c10ed43SMauro Carvalho Chehab#  ~~~~~~~~
1575c10ed43SMauro Carvalho Chehab#
1585c10ed43SMauro Carvalho Chehab#  * MultiSound Classic/Monterey/Tahiti:
1595c10ed43SMauro Carvalho Chehab#
160*513f9306SMauro Carvalho Chehab#  modprobe snd
161*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-lib
162*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-classic io=0x290 irq=7 mem=0xd0000
1635c10ed43SMauro Carvalho Chehab#
1645c10ed43SMauro Carvalho Chehab#  * MultiSound Pinnacle in PnP mode:
1655c10ed43SMauro Carvalho Chehab#
166*513f9306SMauro Carvalho Chehab#  modprobe snd
167*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-lib
1685c10ed43SMauro Carvalho Chehab#  isapnp mypinnacle.conf
169*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-pinnacle io=0x210 irq=5 mem=0xd8000 <-- match mypinnacle.conf values
1705c10ed43SMauro Carvalho Chehab#
1715c10ed43SMauro Carvalho Chehab#  * MultiSound Pinnacle in non-PnP mode (replace 0x250 with your configuration port,
1725c10ed43SMauro Carvalho Chehab#    one of 0x250, 0x260 or 0x270):
1735c10ed43SMauro Carvalho Chehab#
174*513f9306SMauro Carvalho Chehab#  modprobe snd
175*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-lib
176*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000
1775c10ed43SMauro Carvalho Chehab#
1785c10ed43SMauro Carvalho Chehab# * To use the MPU-compatible Kurzweil synth on the Pinnacle in PnP
1795c10ed43SMauro Carvalho Chehab#   mode, add the following (assumes you did `isapnp mypinnacle.conf'):
1805c10ed43SMauro Carvalho Chehab#
181*513f9306SMauro Carvalho Chehab#  insmod snd
1825c10ed43SMauro Carvalho Chehab#  insmod mpu401 io=0x330 irq=9                    <-- match mypinnacle.conf values
1835c10ed43SMauro Carvalho Chehab#
1845c10ed43SMauro Carvalho Chehab# * To use the MPU-compatible Kurzweil synth on the Pinnacle in non-PnP
1855c10ed43SMauro Carvalho Chehab#   mode, add the following.  Note how we first configure the peripheral's
1865c10ed43SMauro Carvalho Chehab#   resources, _then_ install a Linux driver for it:
1875c10ed43SMauro Carvalho Chehab#
188*513f9306SMauro Carvalho Chehab#  insmod snd
1895c10ed43SMauro Carvalho Chehab#  pinnaclecfg 0x250 mpu 0x330 9
1905c10ed43SMauro Carvalho Chehab#  insmod mpu401 io=0x330 irq=9
1915c10ed43SMauro Carvalho Chehab#
1925c10ed43SMauro Carvalho Chehab#  -- OR you can use the following sequence without pinnaclecfg in non-PnP mode:
1935c10ed43SMauro Carvalho Chehab#
194*513f9306SMauro Carvalho Chehab#  modprobe snd
195*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-lib
196*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 mpu_io=0x330 mpu_irq=9
197*513f9306SMauro Carvalho Chehab#  insmod snd
1985c10ed43SMauro Carvalho Chehab#  insmod mpu401 io=0x330 irq=9
1995c10ed43SMauro Carvalho Chehab#
2005c10ed43SMauro Carvalho Chehab# * To setup the joystick port on the Pinnacle in non-PnP mode (though
2015c10ed43SMauro Carvalho Chehab#   you have to find the actual Linux joystick driver elsewhere), you
2025c10ed43SMauro Carvalho Chehab#   can use pinnaclecfg:
2035c10ed43SMauro Carvalho Chehab#
2045c10ed43SMauro Carvalho Chehab#   pinnaclecfg 0x250 joystick 0x200
2055c10ed43SMauro Carvalho Chehab#
206*513f9306SMauro Carvalho Chehab#  -- OR you can configure this using snd-msnd-pinnacle with the following:
2075c10ed43SMauro Carvalho Chehab#
208*513f9306SMauro Carvalho Chehab#  modprobe snd
209*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-lib
210*513f9306SMauro Carvalho Chehab#  insmod snd-msnd-pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 joystick_io=0x200
2115c10ed43SMauro Carvalho Chehab#
2125c10ed43SMauro Carvalho Chehab#
213*513f9306SMauro Carvalho Chehab#  snd-msnd-classic, snd-msnd-pinnacle Required Options
214*513f9306SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2155c10ed43SMauro Carvalho Chehab#
2165c10ed43SMauro Carvalho Chehab#  If the following options are not given, the module will not load.
2175c10ed43SMauro Carvalho Chehab#  Examine the kernel message log for informative error messages.
2185c10ed43SMauro Carvalho Chehab#  WARNING--probing isn't supported so try to make sure you have the
2195c10ed43SMauro Carvalho Chehab#  correct shared memory area, otherwise you may experience problems.
2205c10ed43SMauro Carvalho Chehab#
2215c10ed43SMauro Carvalho Chehab#  io                   I/O base of DSP, e.g. io=0x210
2225c10ed43SMauro Carvalho Chehab#  irq                  IRQ number, e.g. irq=5
2235c10ed43SMauro Carvalho Chehab#  mem                  Shared memory area, e.g. mem=0xd8000
2245c10ed43SMauro Carvalho Chehab#
2255c10ed43SMauro Carvalho Chehab#
226*513f9306SMauro Carvalho Chehab#  snd-msnd-classic, snd-msnd-pinnacle Additional Options
227*513f9306SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2285c10ed43SMauro Carvalho Chehab#
2295c10ed43SMauro Carvalho Chehab#  fifosize             The digital audio FIFOs, in kilobytes.  If not
2305c10ed43SMauro Carvalho Chehab#                       specified, the default will be used.  Increasing
2315c10ed43SMauro Carvalho Chehab#                       this value will reduce the chance of a FIFO
2325c10ed43SMauro Carvalho Chehab#                       underflow at the expense of increasing overall
2335c10ed43SMauro Carvalho Chehab#                       latency.  For example, fifosize=512 will
2345c10ed43SMauro Carvalho Chehab#                       allocate 512kB read and write FIFOs (1MB total).
2355c10ed43SMauro Carvalho Chehab#                       While this may reduce dropouts, a heavy machine
2365c10ed43SMauro Carvalho Chehab#                       load will undoubtedly starve the FIFO of data
2375c10ed43SMauro Carvalho Chehab#                       and you will eventually get dropouts.  One
2385c10ed43SMauro Carvalho Chehab#                       option is to alter the scheduling priority of
2395c10ed43SMauro Carvalho Chehab#                       the playback process, using `nice' or some form
2405c10ed43SMauro Carvalho Chehab#                       of POSIX soft real-time scheduling.
2415c10ed43SMauro Carvalho Chehab#
2425c10ed43SMauro Carvalho Chehab#  calibrate_signal     Setting this to one calibrates the ADCs to the
2435c10ed43SMauro Carvalho Chehab#                       signal, zero calibrates to the card (defaults
2445c10ed43SMauro Carvalho Chehab#                       to zero).
2455c10ed43SMauro Carvalho Chehab#
2465c10ed43SMauro Carvalho Chehab#
247*513f9306SMauro Carvalho Chehab#  snd-msnd-pinnacle Additional Options
248*513f9306SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2495c10ed43SMauro Carvalho Chehab#
2505c10ed43SMauro Carvalho Chehab#  digital              Specify digital=1 to enable the S/PDIF input
2515c10ed43SMauro Carvalho Chehab#                       if you have the digital daughterboard
2525c10ed43SMauro Carvalho Chehab#                       adapter. This will enable access to the
2535c10ed43SMauro Carvalho Chehab#                       DIGITAL1 input for the soundcard in the mixer.
2545c10ed43SMauro Carvalho Chehab#                       Some mixer programs might have trouble setting
2555c10ed43SMauro Carvalho Chehab#                       the DIGITAL1 source as an input.  If you have
2565c10ed43SMauro Carvalho Chehab#                       trouble, you can try the setdigital.c program
2575c10ed43SMauro Carvalho Chehab#                       at the bottom of this document.
2585c10ed43SMauro Carvalho Chehab#
2595c10ed43SMauro Carvalho Chehab#  cfg                  Non-PnP configuration port for the Pinnacle
2605c10ed43SMauro Carvalho Chehab#                       and Fiji (typically 0x250, 0x260 or 0x270,
2615c10ed43SMauro Carvalho Chehab#                       depending on the jumper configuration).  If
2625c10ed43SMauro Carvalho Chehab#                       this option is omitted, then it is assumed
2635c10ed43SMauro Carvalho Chehab#                       that the card is in PnP mode, and that the
2645c10ed43SMauro Carvalho Chehab#                       specified DSP resource values are already
2655c10ed43SMauro Carvalho Chehab#                       configured with PnP (i.e. it won't attempt to
2665c10ed43SMauro Carvalho Chehab#                       do any sort of configuration).
2675c10ed43SMauro Carvalho Chehab#
2685c10ed43SMauro Carvalho Chehab#  When the Pinnacle is in non-PnP mode, you can use the following
2695c10ed43SMauro Carvalho Chehab#  options to configure particular devices.  If a full specification
2705c10ed43SMauro Carvalho Chehab#  for a device is not given, then the device is not configured.  Note
2715c10ed43SMauro Carvalho Chehab#  that you still must use a Linux driver for any of these devices
2725c10ed43SMauro Carvalho Chehab#  once their resources are setup (such as the Linux joystick driver,
2735c10ed43SMauro Carvalho Chehab#  or the MPU401 driver from OSS for the Kurzweil synth).
2745c10ed43SMauro Carvalho Chehab#
2755c10ed43SMauro Carvalho Chehab#  mpu_io               I/O port of MPU (on-board Kurzweil synth)
2765c10ed43SMauro Carvalho Chehab#  mpu_irq              IRQ of MPU (on-board Kurzweil synth)
2775c10ed43SMauro Carvalho Chehab#  ide_io0		First I/O port of IDE controller
2785c10ed43SMauro Carvalho Chehab#  ide_io1		Second I/O port of IDE controller
2795c10ed43SMauro Carvalho Chehab#  ide_irq		IRQ IDE controller
2805c10ed43SMauro Carvalho Chehab#  joystick_io          I/O port of joystick
2815c10ed43SMauro Carvalho Chehab#
2825c10ed43SMauro Carvalho Chehab#
2835c10ed43SMauro Carvalho Chehab#  Obtaining and Creating Firmware Files
2845c10ed43SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2855c10ed43SMauro Carvalho Chehab#
2865c10ed43SMauro Carvalho Chehab#       For the Classic/Tahiti/Monterey
2875c10ed43SMauro Carvalho Chehab#       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2885c10ed43SMauro Carvalho Chehab#
2895c10ed43SMauro Carvalho Chehab#  Download to /tmp and unzip the following file from Turtle Beach:
2905c10ed43SMauro Carvalho Chehab#
2915c10ed43SMauro Carvalho Chehab#       ftp://ftp.voyetra.com/pub/tbs/msndcl/msndvkit.zip
2925c10ed43SMauro Carvalho Chehab#
2935c10ed43SMauro Carvalho Chehab#  When unzipped, unzip the file named MsndFiles.zip.  Then copy the
2945c10ed43SMauro Carvalho Chehab#  following firmware files to /etc/sound (note the file renaming):
2955c10ed43SMauro Carvalho Chehab#
2965c10ed43SMauro Carvalho Chehab#    cp DSPCODE/MSNDINIT.BIN /etc/sound/msndinit.bin
2975c10ed43SMauro Carvalho Chehab#    cp DSPCODE/MSNDPERM.REB /etc/sound/msndperm.bin
2985c10ed43SMauro Carvalho Chehab#
2995c10ed43SMauro Carvalho Chehab#  When configuring the Linux kernel, specify /etc/sound/msndinit.bin and
3005c10ed43SMauro Carvalho Chehab#  /etc/sound/msndperm.bin for the two firmware files (Linux kernel
3015c10ed43SMauro Carvalho Chehab#  versions older than 2.2 do not ask for firmware paths, and are
3025c10ed43SMauro Carvalho Chehab#  hardcoded to /etc/sound).
3035c10ed43SMauro Carvalho Chehab#
3045c10ed43SMauro Carvalho Chehab#  If you are compiling the driver into the kernel, these files must
3055c10ed43SMauro Carvalho Chehab#  be accessible during compilation, but will not be needed later.
3065c10ed43SMauro Carvalho Chehab#  The files must remain, however, if the driver is used as a module.
3075c10ed43SMauro Carvalho Chehab#
3085c10ed43SMauro Carvalho Chehab#
3095c10ed43SMauro Carvalho Chehab#       For the Pinnacle/Fiji
3105c10ed43SMauro Carvalho Chehab#       ~~~~~~~~~~~~~~~~~~~~~
3115c10ed43SMauro Carvalho Chehab#
3125c10ed43SMauro Carvalho Chehab#  Download to /tmp and unzip the following file from Turtle Beach (be
3135c10ed43SMauro Carvalho Chehab#  sure to use the entire URL; some have had trouble navigating to the
3145c10ed43SMauro Carvalho Chehab#  URL):
3155c10ed43SMauro Carvalho Chehab#
3165c10ed43SMauro Carvalho Chehab#       ftp://ftp.voyetra.com/pub/tbs/pinn/pnddk100.zip
3175c10ed43SMauro Carvalho Chehab#
3185c10ed43SMauro Carvalho Chehab#  Unpack this shell archive, and run make in the created directory
3195c10ed43SMauro Carvalho Chehab#  (you need a C compiler and flex to build the utilities).  This
3205c10ed43SMauro Carvalho Chehab#  should give you the executables conv, pinnaclecfg and setdigital.
3215c10ed43SMauro Carvalho Chehab#  conv is only used temporarily here to create the firmware files,
3225c10ed43SMauro Carvalho Chehab#  while pinnaclecfg is used to configure the Pinnacle or Fiji card in
3235c10ed43SMauro Carvalho Chehab#  non-PnP mode, and setdigital can be used to set the S/PDIF input on
3245c10ed43SMauro Carvalho Chehab#  the mixer (pinnaclecfg and setdigital should be copied to a
3255c10ed43SMauro Carvalho Chehab#  convenient place, possibly run during system initialization).
3265c10ed43SMauro Carvalho Chehab#
3275c10ed43SMauro Carvalho Chehab#  To generating the firmware files with the `conv' program, we create
3285c10ed43SMauro Carvalho Chehab#  the binary firmware files by doing the following conversion
3295c10ed43SMauro Carvalho Chehab#  (assuming the archive unpacked into a directory named PINNDDK):
3305c10ed43SMauro Carvalho Chehab#
3315c10ed43SMauro Carvalho Chehab#    ./conv < PINNDDK/dspcode/pndspini.asm > /etc/sound/pndspini.bin
3325c10ed43SMauro Carvalho Chehab#    ./conv < PINNDDK/dspcode/pndsperm.asm > /etc/sound/pndsperm.bin
3335c10ed43SMauro Carvalho Chehab#
3345c10ed43SMauro Carvalho Chehab#  The conv (and conv.l) program is not needed after conversion and can
3355c10ed43SMauro Carvalho Chehab#  be safely deleted.  Then, when configuring the Linux kernel, specify
3365c10ed43SMauro Carvalho Chehab#  /etc/sound/pndspini.bin and /etc/sound/pndsperm.bin for the two
3375c10ed43SMauro Carvalho Chehab#  firmware files (Linux kernel versions older than 2.2 do not ask for
3385c10ed43SMauro Carvalho Chehab#  firmware paths, and are hardcoded to /etc/sound).
3395c10ed43SMauro Carvalho Chehab#
3405c10ed43SMauro Carvalho Chehab#  If you are compiling the driver into the kernel, these files must
3415c10ed43SMauro Carvalho Chehab#  be accessible during compilation, but will not be needed later.
3425c10ed43SMauro Carvalho Chehab#  The files must remain, however, if the driver is used as a module.
3435c10ed43SMauro Carvalho Chehab#
3445c10ed43SMauro Carvalho Chehab#
3455c10ed43SMauro Carvalho Chehab#  Using Digital I/O with the S/PDIF Port
3465c10ed43SMauro Carvalho Chehab#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3475c10ed43SMauro Carvalho Chehab#
3485c10ed43SMauro Carvalho Chehab#  If you have a Pinnacle or Fiji with the digital daughterboard and
3495c10ed43SMauro Carvalho Chehab#  want to set it as the input source, you can use this program if you
3505c10ed43SMauro Carvalho Chehab#  have trouble trying to do it with a mixer program (be sure to
3515c10ed43SMauro Carvalho Chehab#  insert the module with the digital=1 option, or say Y to the option
3525c10ed43SMauro Carvalho Chehab#  during compiled-in kernel operation).  Upon selection of the S/PDIF
3535c10ed43SMauro Carvalho Chehab#  port, you should be able monitor and record from it.
3545c10ed43SMauro Carvalho Chehab#
3555c10ed43SMauro Carvalho Chehab#  There is something to note about using the S/PDIF port.  Digital
3565c10ed43SMauro Carvalho Chehab#  timing is taken from the digital signal, so if a signal is not
3575c10ed43SMauro Carvalho Chehab#  connected to the port and it is selected as recording input, you
3585c10ed43SMauro Carvalho Chehab#  will find PCM playback to be distorted in playback rate.  Also,
3595c10ed43SMauro Carvalho Chehab#  attempting to record at a sampling rate other than the DAT rate may
3605c10ed43SMauro Carvalho Chehab#  be problematic (i.e. trying to record at 8000Hz when the DAT signal
3615c10ed43SMauro Carvalho Chehab#  is 44100Hz).  If you have a problem with this, set the recording
3625c10ed43SMauro Carvalho Chehab#  input to analog if you need to record at a rate other than that of
3635c10ed43SMauro Carvalho Chehab#  the DAT rate.
3645c10ed43SMauro Carvalho Chehab#
3655c10ed43SMauro Carvalho Chehab#
3665c10ed43SMauro Carvalho Chehab#  -- Shell archive attached below, just run `sh MultiSound' to extract.
3675c10ed43SMauro Carvalho Chehab#     Contains Pinnacle/Fiji utilities to convert firmware, configure
3685c10ed43SMauro Carvalho Chehab#     in non-PnP mode, and select the DIGITAL1 input for the mixer.
3695c10ed43SMauro Carvalho Chehab#
3705c10ed43SMauro Carvalho Chehab#
3715c10ed43SMauro Carvalho Chehab#!/bin/sh
3725c10ed43SMauro Carvalho Chehab# This is a shell archive (produced by GNU sharutils 4.2).
3735c10ed43SMauro Carvalho Chehab# To extract the files from this archive, save it to some FILE, remove
3745c10ed43SMauro Carvalho Chehab# everything before the `!/bin/sh' line above, then type `sh FILE'.
3755c10ed43SMauro Carvalho Chehab#
3765c10ed43SMauro Carvalho Chehab# Made on 1998-12-04 10:07 EST by <andrewtv@ztransform.velsoft.com>.
3775c10ed43SMauro Carvalho Chehab# Source directory was `/home/andrewtv/programming/pinnacle/pinnacle'.
3785c10ed43SMauro Carvalho Chehab#
3795c10ed43SMauro Carvalho Chehab# Existing files will *not* be overwritten unless `-c' is specified.
3805c10ed43SMauro Carvalho Chehab#
3815c10ed43SMauro Carvalho Chehab# This shar contains:
3825c10ed43SMauro Carvalho Chehab# length mode       name
3835c10ed43SMauro Carvalho Chehab# ------ ---------- ------------------------------------------
38406501a6dSMauro Carvalho Chehab#   2064 -rw-rw-r-- MultiSound.d/setdigital.c
38506501a6dSMauro Carvalho Chehab#  10224 -rw-rw-r-- MultiSound.d/pinnaclecfg.c
3865c10ed43SMauro Carvalho Chehab#    106 -rw-rw-r-- MultiSound.d/Makefile
38706501a6dSMauro Carvalho Chehab#    146 -rw-rw-r-- MultiSound.d/conv.l
38806501a6dSMauro Carvalho Chehab#   1491 -rw-rw-r-- MultiSound.d/msndreset.c
3895c10ed43SMauro Carvalho Chehab#
3905c10ed43SMauro Carvalho Chehabsave_IFS="${IFS}"
3915c10ed43SMauro Carvalho ChehabIFS="${IFS}:"
3925c10ed43SMauro Carvalho Chehabgettext_dir=FAILED
3935c10ed43SMauro Carvalho Chehablocale_dir=FAILED
3945c10ed43SMauro Carvalho Chehabfirst_param="$1"
3955c10ed43SMauro Carvalho Chehabfor dir in $PATH
3965c10ed43SMauro Carvalho Chehabdo
3975c10ed43SMauro Carvalho Chehab  if test "$gettext_dir" = FAILED && test -f $dir/gettext \
3985c10ed43SMauro Carvalho Chehab     && ($dir/gettext --version >/dev/null 2>&1)
3995c10ed43SMauro Carvalho Chehab  then
4005c10ed43SMauro Carvalho Chehab    set `$dir/gettext --version 2>&1`
4015c10ed43SMauro Carvalho Chehab    if test "$3" = GNU
4025c10ed43SMauro Carvalho Chehab    then
4035c10ed43SMauro Carvalho Chehab      gettext_dir=$dir
4045c10ed43SMauro Carvalho Chehab    fi
4055c10ed43SMauro Carvalho Chehab  fi
4065c10ed43SMauro Carvalho Chehab  if test "$locale_dir" = FAILED && test -f $dir/shar \
4075c10ed43SMauro Carvalho Chehab     && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
4085c10ed43SMauro Carvalho Chehab  then
4095c10ed43SMauro Carvalho Chehab    locale_dir=`$dir/shar --print-text-domain-dir`
4105c10ed43SMauro Carvalho Chehab  fi
4115c10ed43SMauro Carvalho Chehabdone
4125c10ed43SMauro Carvalho ChehabIFS="$save_IFS"
4135c10ed43SMauro Carvalho Chehabif test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
4145c10ed43SMauro Carvalho Chehabthen
4155c10ed43SMauro Carvalho Chehab  echo=echo
4165c10ed43SMauro Carvalho Chehabelse
4175c10ed43SMauro Carvalho Chehab  TEXTDOMAINDIR=$locale_dir
4185c10ed43SMauro Carvalho Chehab  export TEXTDOMAINDIR
4195c10ed43SMauro Carvalho Chehab  TEXTDOMAIN=sharutils
4205c10ed43SMauro Carvalho Chehab  export TEXTDOMAIN
4215c10ed43SMauro Carvalho Chehab  echo="$gettext_dir/gettext -s"
4225c10ed43SMauro Carvalho Chehabfi
4235c10ed43SMauro Carvalho Chehabtouch -am 1231235999 $$.touch >/dev/null 2>&1
4245c10ed43SMauro Carvalho Chehabif test ! -f 1231235999 && test -f $$.touch; then
4255c10ed43SMauro Carvalho Chehab  shar_touch=touch
4265c10ed43SMauro Carvalho Chehabelse
4275c10ed43SMauro Carvalho Chehab  shar_touch=:
4285c10ed43SMauro Carvalho Chehab  echo
4295c10ed43SMauro Carvalho Chehab  $echo 'WARNING: not restoring timestamps.  Consider getting and'
4305c10ed43SMauro Carvalho Chehab  $echo "installing GNU \`touch', distributed in GNU File Utilities..."
4315c10ed43SMauro Carvalho Chehab  echo
4325c10ed43SMauro Carvalho Chehabfi
4335c10ed43SMauro Carvalho Chehabrm -f 1231235999 $$.touch
4345c10ed43SMauro Carvalho Chehab#
4355c10ed43SMauro Carvalho Chehabif mkdir _sh01426; then
4365c10ed43SMauro Carvalho Chehab  $echo 'x -' 'creating lock directory'
4375c10ed43SMauro Carvalho Chehabelse
4385c10ed43SMauro Carvalho Chehab  $echo 'failed to create lock directory'
4395c10ed43SMauro Carvalho Chehab  exit 1
4405c10ed43SMauro Carvalho Chehabfi
4415c10ed43SMauro Carvalho Chehab# ============= MultiSound.d/setdigital.c ==============
4425c10ed43SMauro Carvalho Chehabif test ! -d 'MultiSound.d'; then
4435c10ed43SMauro Carvalho Chehab  $echo 'x -' 'creating directory' 'MultiSound.d'
4445c10ed43SMauro Carvalho Chehab  mkdir 'MultiSound.d'
4455c10ed43SMauro Carvalho Chehabfi
4465c10ed43SMauro Carvalho Chehabif test -f 'MultiSound.d/setdigital.c' && test "$first_param" != -c; then
4475c10ed43SMauro Carvalho Chehab  $echo 'x -' SKIPPING 'MultiSound.d/setdigital.c' '(file already exists)'
4485c10ed43SMauro Carvalho Chehabelse
4495c10ed43SMauro Carvalho Chehab  $echo 'x -' extracting 'MultiSound.d/setdigital.c' '(text)'
4505c10ed43SMauro Carvalho Chehab  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/setdigital.c' &&
4515c10ed43SMauro Carvalho Chehab/*********************************************************************
4525c10ed43SMauro Carvalho ChehabX *
4535c10ed43SMauro Carvalho ChehabX * setdigital.c - sets the DIGITAL1 input for a mixer
4545c10ed43SMauro Carvalho ChehabX *
4555c10ed43SMauro Carvalho ChehabX * Copyright (C) 1998 Andrew Veliath
4565c10ed43SMauro Carvalho ChehabX *
4575c10ed43SMauro Carvalho ChehabX * This program is free software; you can redistribute it and/or modify
4585c10ed43SMauro Carvalho ChehabX * it under the terms of the GNU General Public License as published by
4595c10ed43SMauro Carvalho ChehabX * the Free Software Foundation; either version 2 of the License, or
4605c10ed43SMauro Carvalho ChehabX * (at your option) any later version.
4615c10ed43SMauro Carvalho ChehabX *
4625c10ed43SMauro Carvalho ChehabX * This program is distributed in the hope that it will be useful,
4635c10ed43SMauro Carvalho ChehabX * but WITHOUT ANY WARRANTY; without even the implied warranty of
4645c10ed43SMauro Carvalho ChehabX * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4655c10ed43SMauro Carvalho ChehabX * GNU General Public License for more details.
4665c10ed43SMauro Carvalho ChehabX *
4675c10ed43SMauro Carvalho ChehabX * You should have received a copy of the GNU General Public License
4685c10ed43SMauro Carvalho ChehabX * along with this program; if not, write to the Free Software
4695c10ed43SMauro Carvalho ChehabX * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
4705c10ed43SMauro Carvalho ChehabX *
4715c10ed43SMauro Carvalho ChehabX ********************************************************************/
4725c10ed43SMauro Carvalho ChehabX
4735c10ed43SMauro Carvalho Chehab#include <stdio.h>
47406501a6dSMauro Carvalho Chehab#include <stdlib.h>
4755c10ed43SMauro Carvalho Chehab#include <unistd.h>
4765c10ed43SMauro Carvalho Chehab#include <fcntl.h>
4775c10ed43SMauro Carvalho Chehab#include <sys/types.h>
4785c10ed43SMauro Carvalho Chehab#include <sys/stat.h>
4795c10ed43SMauro Carvalho Chehab#include <sys/ioctl.h>
4805c10ed43SMauro Carvalho Chehab#include <sys/soundcard.h>
4815c10ed43SMauro Carvalho ChehabX
4825c10ed43SMauro Carvalho Chehabint main(int argc, char *argv[])
4835c10ed43SMauro Carvalho Chehab{
4845c10ed43SMauro Carvalho ChehabX	int fd;
4855c10ed43SMauro Carvalho ChehabX	unsigned long recmask, recsrc;
4865c10ed43SMauro Carvalho ChehabX
4875c10ed43SMauro Carvalho ChehabX	if (argc != 2) {
4885c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "usage: setdigital <mixer device>\n");
4895c10ed43SMauro Carvalho ChehabX		exit(1);
4905c10ed43SMauro Carvalho ChehabX	}
4915c10ed43SMauro Carvalho ChehabX
4925c10ed43SMauro Carvalho ChehabX	if ((fd = open(argv[1], O_RDWR)) < 0) {
4935c10ed43SMauro Carvalho ChehabX		perror(argv[1]);
4945c10ed43SMauro Carvalho ChehabX		exit(1);
4955c10ed43SMauro Carvalho ChehabX	}
4965c10ed43SMauro Carvalho ChehabX
4975c10ed43SMauro Carvalho ChehabX	if (ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask) < 0) {
4985c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: ioctl read recording mask failed\n");
4995c10ed43SMauro Carvalho ChehabX		perror("ioctl");
5005c10ed43SMauro Carvalho ChehabX		close(fd);
5015c10ed43SMauro Carvalho ChehabX		exit(1);
5025c10ed43SMauro Carvalho ChehabX	}
5035c10ed43SMauro Carvalho ChehabX
5045c10ed43SMauro Carvalho ChehabX	if (!(recmask & SOUND_MASK_DIGITAL1)) {
5055c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: cannot find DIGITAL1 device in mixer\n");
5065c10ed43SMauro Carvalho ChehabX		close(fd);
5075c10ed43SMauro Carvalho ChehabX		exit(1);
5085c10ed43SMauro Carvalho ChehabX	}
5095c10ed43SMauro Carvalho ChehabX
5105c10ed43SMauro Carvalho ChehabX	if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) < 0) {
5115c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: ioctl read recording source failed\n");
5125c10ed43SMauro Carvalho ChehabX		perror("ioctl");
5135c10ed43SMauro Carvalho ChehabX		close(fd);
5145c10ed43SMauro Carvalho ChehabX		exit(1);
5155c10ed43SMauro Carvalho ChehabX	}
5165c10ed43SMauro Carvalho ChehabX
5175c10ed43SMauro Carvalho ChehabX	recsrc |= SOUND_MASK_DIGITAL1;
5185c10ed43SMauro Carvalho ChehabX
5195c10ed43SMauro Carvalho ChehabX	if (ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &recsrc) < 0) {
5205c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: ioctl write recording source failed\n");
5215c10ed43SMauro Carvalho ChehabX		perror("ioctl");
5225c10ed43SMauro Carvalho ChehabX		close(fd);
5235c10ed43SMauro Carvalho ChehabX		exit(1);
5245c10ed43SMauro Carvalho ChehabX	}
5255c10ed43SMauro Carvalho ChehabX
5265c10ed43SMauro Carvalho ChehabX	close(fd);
5275c10ed43SMauro Carvalho ChehabX
5285c10ed43SMauro Carvalho ChehabX	return 0;
5295c10ed43SMauro Carvalho Chehab}
5305c10ed43SMauro Carvalho ChehabSHAR_EOF
5315c10ed43SMauro Carvalho Chehab  $shar_touch -am 1204092598 'MultiSound.d/setdigital.c' &&
5325c10ed43SMauro Carvalho Chehab  chmod 0664 'MultiSound.d/setdigital.c' ||
5335c10ed43SMauro Carvalho Chehab  $echo 'restore of' 'MultiSound.d/setdigital.c' 'failed'
5345c10ed43SMauro Carvalho Chehab  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
5355c10ed43SMauro Carvalho Chehab  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
5365c10ed43SMauro Carvalho Chehab    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
5375c10ed43SMauro Carvalho Chehab    || $echo 'MultiSound.d/setdigital.c:' 'MD5 check failed'
5385c10ed43SMauro Carvalho Chehabe87217fc3e71288102ba41fd81f71ec4  MultiSound.d/setdigital.c
5395c10ed43SMauro Carvalho ChehabSHAR_EOF
5405c10ed43SMauro Carvalho Chehab  else
5415c10ed43SMauro Carvalho Chehab    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/setdigital.c'`"
54206501a6dSMauro Carvalho Chehab    test 2064 -eq "$shar_count" ||
54306501a6dSMauro Carvalho Chehab    $echo 'MultiSound.d/setdigital.c:' 'original size' '2064,' 'current size' "$shar_count!"
5445c10ed43SMauro Carvalho Chehab  fi
5455c10ed43SMauro Carvalho Chehabfi
5465c10ed43SMauro Carvalho Chehab# ============= MultiSound.d/pinnaclecfg.c ==============
5475c10ed43SMauro Carvalho Chehabif test -f 'MultiSound.d/pinnaclecfg.c' && test "$first_param" != -c; then
5485c10ed43SMauro Carvalho Chehab  $echo 'x -' SKIPPING 'MultiSound.d/pinnaclecfg.c' '(file already exists)'
5495c10ed43SMauro Carvalho Chehabelse
5505c10ed43SMauro Carvalho Chehab  $echo 'x -' extracting 'MultiSound.d/pinnaclecfg.c' '(text)'
5515c10ed43SMauro Carvalho Chehab  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/pinnaclecfg.c' &&
5525c10ed43SMauro Carvalho Chehab/*********************************************************************
5535c10ed43SMauro Carvalho ChehabX *
5545c10ed43SMauro Carvalho ChehabX * pinnaclecfg.c - Pinnacle/Fiji Device Configuration Program
5555c10ed43SMauro Carvalho ChehabX *
5565c10ed43SMauro Carvalho ChehabX * This is for NON-PnP mode only.  For PnP mode, use isapnptools.
5575c10ed43SMauro Carvalho ChehabX *
5585c10ed43SMauro Carvalho ChehabX * This is Linux-specific, and must be run with root permissions.
5595c10ed43SMauro Carvalho ChehabX *
5605c10ed43SMauro Carvalho ChehabX * Part of the Turtle Beach MultiSound Sound Card Driver for Linux
5615c10ed43SMauro Carvalho ChehabX *
5625c10ed43SMauro Carvalho ChehabX * Copyright (C) 1998 Andrew Veliath
5635c10ed43SMauro Carvalho ChehabX *
5645c10ed43SMauro Carvalho ChehabX * This program is free software; you can redistribute it and/or modify
5655c10ed43SMauro Carvalho ChehabX * it under the terms of the GNU General Public License as published by
5665c10ed43SMauro Carvalho ChehabX * the Free Software Foundation; either version 2 of the License, or
5675c10ed43SMauro Carvalho ChehabX * (at your option) any later version.
5685c10ed43SMauro Carvalho ChehabX *
5695c10ed43SMauro Carvalho ChehabX * This program is distributed in the hope that it will be useful,
5705c10ed43SMauro Carvalho ChehabX * but WITHOUT ANY WARRANTY; without even the implied warranty of
5715c10ed43SMauro Carvalho ChehabX * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5725c10ed43SMauro Carvalho ChehabX * GNU General Public License for more details.
5735c10ed43SMauro Carvalho ChehabX *
5745c10ed43SMauro Carvalho ChehabX * You should have received a copy of the GNU General Public License
5755c10ed43SMauro Carvalho ChehabX * along with this program; if not, write to the Free Software
5765c10ed43SMauro Carvalho ChehabX * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
5775c10ed43SMauro Carvalho ChehabX *
5785c10ed43SMauro Carvalho ChehabX ********************************************************************/
5795c10ed43SMauro Carvalho ChehabX
5805c10ed43SMauro Carvalho Chehab#include <stdio.h>
5815c10ed43SMauro Carvalho Chehab#include <stdlib.h>
5825c10ed43SMauro Carvalho Chehab#include <string.h>
5835c10ed43SMauro Carvalho Chehab#include <errno.h>
5845c10ed43SMauro Carvalho Chehab#include <unistd.h>
5855c10ed43SMauro Carvalho Chehab#include <asm/types.h>
58606501a6dSMauro Carvalho Chehab#include <sys/io.h>
5875c10ed43SMauro Carvalho ChehabX
5885c10ed43SMauro Carvalho Chehab#define IREG_LOGDEVICE		0x07
5895c10ed43SMauro Carvalho Chehab#define IREG_ACTIVATE		0x30
5905c10ed43SMauro Carvalho Chehab#define LD_ACTIVATE		0x01
5915c10ed43SMauro Carvalho Chehab#define LD_DISACTIVATE		0x00
5925c10ed43SMauro Carvalho Chehab#define IREG_EECONTROL		0x3F
5935c10ed43SMauro Carvalho Chehab#define IREG_MEMBASEHI		0x40
5945c10ed43SMauro Carvalho Chehab#define IREG_MEMBASELO		0x41
5955c10ed43SMauro Carvalho Chehab#define IREG_MEMCONTROL		0x42
5965c10ed43SMauro Carvalho Chehab#define IREG_MEMRANGEHI		0x43
5975c10ed43SMauro Carvalho Chehab#define IREG_MEMRANGELO		0x44
5985c10ed43SMauro Carvalho Chehab#define MEMTYPE_8BIT		0x00
5995c10ed43SMauro Carvalho Chehab#define MEMTYPE_16BIT		0x02
6005c10ed43SMauro Carvalho Chehab#define MEMTYPE_RANGE		0x00
6015c10ed43SMauro Carvalho Chehab#define MEMTYPE_HIADDR		0x01
6025c10ed43SMauro Carvalho Chehab#define IREG_IO0_BASEHI		0x60
6035c10ed43SMauro Carvalho Chehab#define IREG_IO0_BASELO		0x61
6045c10ed43SMauro Carvalho Chehab#define IREG_IO1_BASEHI		0x62
6055c10ed43SMauro Carvalho Chehab#define IREG_IO1_BASELO		0x63
6065c10ed43SMauro Carvalho Chehab#define IREG_IRQ_NUMBER		0x70
6075c10ed43SMauro Carvalho Chehab#define IREG_IRQ_TYPE		0x71
6085c10ed43SMauro Carvalho Chehab#define IRQTYPE_HIGH		0x02
6095c10ed43SMauro Carvalho Chehab#define IRQTYPE_LOW		0x00
6105c10ed43SMauro Carvalho Chehab#define IRQTYPE_LEVEL		0x01
6115c10ed43SMauro Carvalho Chehab#define IRQTYPE_EDGE		0x00
6125c10ed43SMauro Carvalho ChehabX
6135c10ed43SMauro Carvalho Chehab#define HIBYTE(w)		((BYTE)(((WORD)(w) >> 8) & 0xFF))
6145c10ed43SMauro Carvalho Chehab#define LOBYTE(w)		((BYTE)(w))
6155c10ed43SMauro Carvalho Chehab#define MAKEWORD(low,hi)	((WORD)(((BYTE)(low))|(((WORD)((BYTE)(hi)))<<8)))
6165c10ed43SMauro Carvalho ChehabX
6175c10ed43SMauro Carvalho Chehabtypedef __u8			BYTE;
6185c10ed43SMauro Carvalho Chehabtypedef __u16			USHORT;
6195c10ed43SMauro Carvalho Chehabtypedef __u16			WORD;
6205c10ed43SMauro Carvalho ChehabX
6215c10ed43SMauro Carvalho Chehabstatic int config_port = -1;
6225c10ed43SMauro Carvalho ChehabX
6235c10ed43SMauro Carvalho Chehabstatic int msnd_write_cfg(int cfg, int reg, int value)
6245c10ed43SMauro Carvalho Chehab{
6255c10ed43SMauro Carvalho ChehabX	outb(reg, cfg);
6265c10ed43SMauro Carvalho ChehabX	outb(value, cfg + 1);
6275c10ed43SMauro Carvalho ChehabX	if (value != inb(cfg + 1)) {
6285c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: msnd_write_cfg: I/O error\n");
6295c10ed43SMauro Carvalho ChehabX		return -EIO;
6305c10ed43SMauro Carvalho ChehabX	}
6315c10ed43SMauro Carvalho ChehabX	return 0;
6325c10ed43SMauro Carvalho Chehab}
6335c10ed43SMauro Carvalho ChehabX
6345c10ed43SMauro Carvalho Chehabstatic int msnd_read_cfg(int cfg, int reg)
6355c10ed43SMauro Carvalho Chehab{
6365c10ed43SMauro Carvalho ChehabX	outb(reg, cfg);
6375c10ed43SMauro Carvalho ChehabX	return inb(cfg + 1);
6385c10ed43SMauro Carvalho Chehab}
6395c10ed43SMauro Carvalho ChehabX
6405c10ed43SMauro Carvalho Chehabstatic int msnd_write_cfg_io0(int cfg, int num, WORD io)
6415c10ed43SMauro Carvalho Chehab{
6425c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
6435c10ed43SMauro Carvalho ChehabX		return -EIO;
6445c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_IO0_BASEHI, HIBYTE(io)))
6455c10ed43SMauro Carvalho ChehabX		return -EIO;
6465c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_IO0_BASELO, LOBYTE(io)))
6475c10ed43SMauro Carvalho ChehabX		return -EIO;
6485c10ed43SMauro Carvalho ChehabX	return 0;
6495c10ed43SMauro Carvalho Chehab}
6505c10ed43SMauro Carvalho ChehabX
6515c10ed43SMauro Carvalho Chehabstatic int msnd_read_cfg_io0(int cfg, int num, WORD *io)
6525c10ed43SMauro Carvalho Chehab{
6535c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
6545c10ed43SMauro Carvalho ChehabX		return -EIO;
6555c10ed43SMauro Carvalho ChehabX
6565c10ed43SMauro Carvalho ChehabX	*io = MAKEWORD(msnd_read_cfg(cfg, IREG_IO0_BASELO),
6575c10ed43SMauro Carvalho ChehabX		       msnd_read_cfg(cfg, IREG_IO0_BASEHI));
6585c10ed43SMauro Carvalho ChehabX
6595c10ed43SMauro Carvalho ChehabX	return 0;
6605c10ed43SMauro Carvalho Chehab}
6615c10ed43SMauro Carvalho ChehabX
6625c10ed43SMauro Carvalho Chehabstatic int msnd_write_cfg_io1(int cfg, int num, WORD io)
6635c10ed43SMauro Carvalho Chehab{
6645c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
6655c10ed43SMauro Carvalho ChehabX		return -EIO;
6665c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_IO1_BASEHI, HIBYTE(io)))
6675c10ed43SMauro Carvalho ChehabX		return -EIO;
6685c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_IO1_BASELO, LOBYTE(io)))
6695c10ed43SMauro Carvalho ChehabX		return -EIO;
6705c10ed43SMauro Carvalho ChehabX	return 0;
6715c10ed43SMauro Carvalho Chehab}
6725c10ed43SMauro Carvalho ChehabX
6735c10ed43SMauro Carvalho Chehabstatic int msnd_read_cfg_io1(int cfg, int num, WORD *io)
6745c10ed43SMauro Carvalho Chehab{
6755c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
6765c10ed43SMauro Carvalho ChehabX		return -EIO;
6775c10ed43SMauro Carvalho ChehabX
6785c10ed43SMauro Carvalho ChehabX	*io = MAKEWORD(msnd_read_cfg(cfg, IREG_IO1_BASELO),
6795c10ed43SMauro Carvalho ChehabX		       msnd_read_cfg(cfg, IREG_IO1_BASEHI));
6805c10ed43SMauro Carvalho ChehabX
6815c10ed43SMauro Carvalho ChehabX	return 0;
6825c10ed43SMauro Carvalho Chehab}
6835c10ed43SMauro Carvalho ChehabX
6845c10ed43SMauro Carvalho Chehabstatic int msnd_write_cfg_irq(int cfg, int num, WORD irq)
6855c10ed43SMauro Carvalho Chehab{
6865c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
6875c10ed43SMauro Carvalho ChehabX		return -EIO;
6885c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_IRQ_NUMBER, LOBYTE(irq)))
6895c10ed43SMauro Carvalho ChehabX		return -EIO;
6905c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_IRQ_TYPE, IRQTYPE_EDGE))
6915c10ed43SMauro Carvalho ChehabX		return -EIO;
6925c10ed43SMauro Carvalho ChehabX	return 0;
6935c10ed43SMauro Carvalho Chehab}
6945c10ed43SMauro Carvalho ChehabX
6955c10ed43SMauro Carvalho Chehabstatic int msnd_read_cfg_irq(int cfg, int num, WORD *irq)
6965c10ed43SMauro Carvalho Chehab{
6975c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
6985c10ed43SMauro Carvalho ChehabX		return -EIO;
6995c10ed43SMauro Carvalho ChehabX
7005c10ed43SMauro Carvalho ChehabX	*irq = msnd_read_cfg(cfg, IREG_IRQ_NUMBER);
7015c10ed43SMauro Carvalho ChehabX
7025c10ed43SMauro Carvalho ChehabX	return 0;
7035c10ed43SMauro Carvalho Chehab}
7045c10ed43SMauro Carvalho ChehabX
7055c10ed43SMauro Carvalho Chehabstatic int msnd_write_cfg_mem(int cfg, int num, int mem)
7065c10ed43SMauro Carvalho Chehab{
7075c10ed43SMauro Carvalho ChehabX	WORD wmem;
7085c10ed43SMauro Carvalho ChehabX
7095c10ed43SMauro Carvalho ChehabX	mem >>= 8;
7105c10ed43SMauro Carvalho ChehabX	mem &= 0xfff;
7115c10ed43SMauro Carvalho ChehabX	wmem = (WORD)mem;
7125c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
7135c10ed43SMauro Carvalho ChehabX		return -EIO;
7145c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_MEMBASEHI, HIBYTE(wmem)))
7155c10ed43SMauro Carvalho ChehabX		return -EIO;
7165c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_MEMBASELO, LOBYTE(wmem)))
7175c10ed43SMauro Carvalho ChehabX		return -EIO;
7185c10ed43SMauro Carvalho ChehabX	if (wmem && msnd_write_cfg(cfg, IREG_MEMCONTROL, (MEMTYPE_HIADDR | MEMTYPE_16BIT)))
7195c10ed43SMauro Carvalho ChehabX		return -EIO;
7205c10ed43SMauro Carvalho ChehabX	return 0;
7215c10ed43SMauro Carvalho Chehab}
7225c10ed43SMauro Carvalho ChehabX
7235c10ed43SMauro Carvalho Chehabstatic int msnd_read_cfg_mem(int cfg, int num, int *mem)
7245c10ed43SMauro Carvalho Chehab{
7255c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
7265c10ed43SMauro Carvalho ChehabX		return -EIO;
7275c10ed43SMauro Carvalho ChehabX
7285c10ed43SMauro Carvalho ChehabX	*mem = MAKEWORD(msnd_read_cfg(cfg, IREG_MEMBASELO),
7295c10ed43SMauro Carvalho ChehabX			msnd_read_cfg(cfg, IREG_MEMBASEHI));
7305c10ed43SMauro Carvalho ChehabX	*mem <<= 8;
7315c10ed43SMauro Carvalho ChehabX
7325c10ed43SMauro Carvalho ChehabX	return 0;
7335c10ed43SMauro Carvalho Chehab}
7345c10ed43SMauro Carvalho ChehabX
7355c10ed43SMauro Carvalho Chehabstatic int msnd_activate_logical(int cfg, int num)
7365c10ed43SMauro Carvalho Chehab{
7375c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
7385c10ed43SMauro Carvalho ChehabX		return -EIO;
7395c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_ACTIVATE, LD_ACTIVATE))
7405c10ed43SMauro Carvalho ChehabX		return -EIO;
7415c10ed43SMauro Carvalho ChehabX	return 0;
7425c10ed43SMauro Carvalho Chehab}
7435c10ed43SMauro Carvalho ChehabX
7445c10ed43SMauro Carvalho Chehabstatic int msnd_write_cfg_logical(int cfg, int num, WORD io0, WORD io1, WORD irq, int mem)
7455c10ed43SMauro Carvalho Chehab{
7465c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
7475c10ed43SMauro Carvalho ChehabX		return -EIO;
7485c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg_io0(cfg, num, io0))
7495c10ed43SMauro Carvalho ChehabX		return -EIO;
7505c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg_io1(cfg, num, io1))
7515c10ed43SMauro Carvalho ChehabX		return -EIO;
7525c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg_irq(cfg, num, irq))
7535c10ed43SMauro Carvalho ChehabX		return -EIO;
7545c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg_mem(cfg, num, mem))
7555c10ed43SMauro Carvalho ChehabX		return -EIO;
7565c10ed43SMauro Carvalho ChehabX	if (msnd_activate_logical(cfg, num))
7575c10ed43SMauro Carvalho ChehabX		return -EIO;
7585c10ed43SMauro Carvalho ChehabX	return 0;
7595c10ed43SMauro Carvalho Chehab}
7605c10ed43SMauro Carvalho ChehabX
7615c10ed43SMauro Carvalho Chehabstatic int msnd_read_cfg_logical(int cfg, int num, WORD *io0, WORD *io1, WORD *irq, int *mem)
7625c10ed43SMauro Carvalho Chehab{
7635c10ed43SMauro Carvalho ChehabX	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num))
7645c10ed43SMauro Carvalho ChehabX		return -EIO;
7655c10ed43SMauro Carvalho ChehabX	if (msnd_read_cfg_io0(cfg, num, io0))
7665c10ed43SMauro Carvalho ChehabX		return -EIO;
7675c10ed43SMauro Carvalho ChehabX	if (msnd_read_cfg_io1(cfg, num, io1))
7685c10ed43SMauro Carvalho ChehabX		return -EIO;
7695c10ed43SMauro Carvalho ChehabX	if (msnd_read_cfg_irq(cfg, num, irq))
7705c10ed43SMauro Carvalho ChehabX		return -EIO;
7715c10ed43SMauro Carvalho ChehabX	if (msnd_read_cfg_mem(cfg, num, mem))
7725c10ed43SMauro Carvalho ChehabX		return -EIO;
7735c10ed43SMauro Carvalho ChehabX	return 0;
7745c10ed43SMauro Carvalho Chehab}
7755c10ed43SMauro Carvalho ChehabX
7765c10ed43SMauro Carvalho Chehabstatic void usage(void)
7775c10ed43SMauro Carvalho Chehab{
7785c10ed43SMauro Carvalho ChehabX	fprintf(stderr,
7795c10ed43SMauro Carvalho ChehabX		"\n"
7805c10ed43SMauro Carvalho ChehabX		"pinnaclecfg 1.0\n"
7815c10ed43SMauro Carvalho ChehabX		"\n"
7825c10ed43SMauro Carvalho ChehabX		"usage: pinnaclecfg <config port> [device config]\n"
7835c10ed43SMauro Carvalho ChehabX		"\n"
7845c10ed43SMauro Carvalho ChehabX		"This is for use with the card in NON-PnP mode only.\n"
7855c10ed43SMauro Carvalho ChehabX		"\n"
7865c10ed43SMauro Carvalho ChehabX		"Available devices (not all available for Fiji):\n"
7875c10ed43SMauro Carvalho ChehabX		"\n"
7885c10ed43SMauro Carvalho ChehabX		"        Device                       Description\n"
7895c10ed43SMauro Carvalho ChehabX		"        -------------------------------------------------------------------\n"
7905c10ed43SMauro Carvalho ChehabX		"        reset                        Reset all devices (i.e. disable)\n"
7915c10ed43SMauro Carvalho ChehabX		"        show                         Display current device configurations\n"
7925c10ed43SMauro Carvalho ChehabX		"\n"
7935c10ed43SMauro Carvalho ChehabX		"        dsp <io> <irq> <mem>         Audio device\n"
7945c10ed43SMauro Carvalho ChehabX		"        mpu <io> <irq>               Internal Kurzweil synth\n"
7955c10ed43SMauro Carvalho ChehabX		"        ide <io0> <io1> <irq>        On-board IDE controller\n"
7965c10ed43SMauro Carvalho ChehabX		"        joystick <io>                Joystick port\n"
7975c10ed43SMauro Carvalho ChehabX		"\n");
7985c10ed43SMauro Carvalho ChehabX	exit(1);
7995c10ed43SMauro Carvalho Chehab}
8005c10ed43SMauro Carvalho ChehabX
8015c10ed43SMauro Carvalho Chehabstatic int cfg_reset(void)
8025c10ed43SMauro Carvalho Chehab{
8035c10ed43SMauro Carvalho ChehabX	int i;
8045c10ed43SMauro Carvalho ChehabX
8055c10ed43SMauro Carvalho ChehabX	for (i = 0; i < 4; ++i)
8065c10ed43SMauro Carvalho ChehabX		msnd_write_cfg_logical(config_port, i, 0, 0, 0, 0);
8075c10ed43SMauro Carvalho ChehabX
8085c10ed43SMauro Carvalho ChehabX	return 0;
8095c10ed43SMauro Carvalho Chehab}
8105c10ed43SMauro Carvalho ChehabX
8115c10ed43SMauro Carvalho Chehabstatic int cfg_show(void)
8125c10ed43SMauro Carvalho Chehab{
8135c10ed43SMauro Carvalho ChehabX	int i;
8145c10ed43SMauro Carvalho ChehabX	int count = 0;
8155c10ed43SMauro Carvalho ChehabX
8165c10ed43SMauro Carvalho ChehabX	for (i = 0; i < 4; ++i) {
8175c10ed43SMauro Carvalho ChehabX		WORD io0, io1, irq;
8185c10ed43SMauro Carvalho ChehabX		int mem;
8195c10ed43SMauro Carvalho ChehabX		msnd_read_cfg_logical(config_port, i, &io0, &io1, &irq, &mem);
8205c10ed43SMauro Carvalho ChehabX		switch (i) {
8215c10ed43SMauro Carvalho ChehabX		case 0:
8225c10ed43SMauro Carvalho ChehabX			if (io0 || irq || mem) {
8235c10ed43SMauro Carvalho ChehabX				printf("dsp 0x%x %d 0x%x\n", io0, irq, mem);
8245c10ed43SMauro Carvalho ChehabX				++count;
8255c10ed43SMauro Carvalho ChehabX			}
8265c10ed43SMauro Carvalho ChehabX			break;
8275c10ed43SMauro Carvalho ChehabX		case 1:
8285c10ed43SMauro Carvalho ChehabX			if (io0 || irq) {
8295c10ed43SMauro Carvalho ChehabX				printf("mpu 0x%x %d\n", io0, irq);
8305c10ed43SMauro Carvalho ChehabX				++count;
8315c10ed43SMauro Carvalho ChehabX			}
8325c10ed43SMauro Carvalho ChehabX			break;
8335c10ed43SMauro Carvalho ChehabX		case 2:
8345c10ed43SMauro Carvalho ChehabX			if (io0 || io1 || irq) {
8355c10ed43SMauro Carvalho ChehabX				printf("ide 0x%x 0x%x %d\n", io0, io1, irq);
8365c10ed43SMauro Carvalho ChehabX				++count;
8375c10ed43SMauro Carvalho ChehabX			}
8385c10ed43SMauro Carvalho ChehabX			break;
8395c10ed43SMauro Carvalho ChehabX		case 3:
8405c10ed43SMauro Carvalho ChehabX			if (io0) {
8415c10ed43SMauro Carvalho ChehabX				printf("joystick 0x%x\n", io0);
8425c10ed43SMauro Carvalho ChehabX				++count;
8435c10ed43SMauro Carvalho ChehabX			}
8445c10ed43SMauro Carvalho ChehabX			break;
8455c10ed43SMauro Carvalho ChehabX		}
8465c10ed43SMauro Carvalho ChehabX	}
8475c10ed43SMauro Carvalho ChehabX
8485c10ed43SMauro Carvalho ChehabX	if (count == 0)
8495c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "no devices configured\n");
8505c10ed43SMauro Carvalho ChehabX
8515c10ed43SMauro Carvalho ChehabX	return 0;
8525c10ed43SMauro Carvalho Chehab}
8535c10ed43SMauro Carvalho ChehabX
8545c10ed43SMauro Carvalho Chehabstatic int cfg_dsp(int argc, char *argv[])
8555c10ed43SMauro Carvalho Chehab{
8565c10ed43SMauro Carvalho ChehabX	int io, irq, mem;
8575c10ed43SMauro Carvalho ChehabX
8585c10ed43SMauro Carvalho ChehabX	if (argc < 3 ||
8595c10ed43SMauro Carvalho ChehabX	    sscanf(argv[0], "0x%x", &io) != 1 ||
8605c10ed43SMauro Carvalho ChehabX	    sscanf(argv[1], "%d", &irq) != 1 ||
8615c10ed43SMauro Carvalho ChehabX	    sscanf(argv[2], "0x%x", &mem) != 1)
8625c10ed43SMauro Carvalho ChehabX		usage();
8635c10ed43SMauro Carvalho ChehabX
8645c10ed43SMauro Carvalho ChehabX	if (!(io == 0x290 ||
8655c10ed43SMauro Carvalho ChehabX	      io == 0x260 ||
8665c10ed43SMauro Carvalho ChehabX	      io == 0x250 ||
8675c10ed43SMauro Carvalho ChehabX	      io == 0x240 ||
8685c10ed43SMauro Carvalho ChehabX	      io == 0x230 ||
8695c10ed43SMauro Carvalho ChehabX	      io == 0x220 ||
8705c10ed43SMauro Carvalho ChehabX	      io == 0x210 ||
8715c10ed43SMauro Carvalho ChehabX	      io == 0x3e0)) {
8725c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: io must be one of "
8735c10ed43SMauro Carvalho ChehabX			"210, 220, 230, 240, 250, 260, 290, or 3E0\n");
8745c10ed43SMauro Carvalho ChehabX		usage();
8755c10ed43SMauro Carvalho ChehabX	}
8765c10ed43SMauro Carvalho ChehabX
8775c10ed43SMauro Carvalho ChehabX	if (!(irq == 5 ||
8785c10ed43SMauro Carvalho ChehabX	      irq == 7 ||
8795c10ed43SMauro Carvalho ChehabX	      irq == 9 ||
8805c10ed43SMauro Carvalho ChehabX	      irq == 10 ||
8815c10ed43SMauro Carvalho ChehabX	      irq == 11 ||
8825c10ed43SMauro Carvalho ChehabX	      irq == 12)) {
8835c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: irq must be one of "
8845c10ed43SMauro Carvalho ChehabX			"5, 7, 9, 10, 11 or 12\n");
8855c10ed43SMauro Carvalho ChehabX		usage();
8865c10ed43SMauro Carvalho ChehabX	}
8875c10ed43SMauro Carvalho ChehabX
8885c10ed43SMauro Carvalho ChehabX	if (!(mem == 0xb0000 ||
8895c10ed43SMauro Carvalho ChehabX	      mem == 0xc8000 ||
8905c10ed43SMauro Carvalho ChehabX	      mem == 0xd0000 ||
8915c10ed43SMauro Carvalho ChehabX	      mem == 0xd8000 ||
8925c10ed43SMauro Carvalho ChehabX	      mem == 0xe0000 ||
8935c10ed43SMauro Carvalho ChehabX	      mem == 0xe8000)) {
8945c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: mem must be one of "
8955c10ed43SMauro Carvalho ChehabX			"0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or 0xe8000\n");
8965c10ed43SMauro Carvalho ChehabX		usage();
8975c10ed43SMauro Carvalho ChehabX	}
8985c10ed43SMauro Carvalho ChehabX
8995c10ed43SMauro Carvalho ChehabX	return msnd_write_cfg_logical(config_port, 0, io, 0, irq, mem);
9005c10ed43SMauro Carvalho Chehab}
9015c10ed43SMauro Carvalho ChehabX
9025c10ed43SMauro Carvalho Chehabstatic int cfg_mpu(int argc, char *argv[])
9035c10ed43SMauro Carvalho Chehab{
9045c10ed43SMauro Carvalho ChehabX	int io, irq;
9055c10ed43SMauro Carvalho ChehabX
9065c10ed43SMauro Carvalho ChehabX	if (argc < 2 ||
9075c10ed43SMauro Carvalho ChehabX	    sscanf(argv[0], "0x%x", &io) != 1 ||
9085c10ed43SMauro Carvalho ChehabX	    sscanf(argv[1], "%d", &irq) != 1)
9095c10ed43SMauro Carvalho ChehabX		usage();
9105c10ed43SMauro Carvalho ChehabX
9115c10ed43SMauro Carvalho ChehabX	return msnd_write_cfg_logical(config_port, 1, io, 0, irq, 0);
9125c10ed43SMauro Carvalho Chehab}
9135c10ed43SMauro Carvalho ChehabX
9145c10ed43SMauro Carvalho Chehabstatic int cfg_ide(int argc, char *argv[])
9155c10ed43SMauro Carvalho Chehab{
9165c10ed43SMauro Carvalho ChehabX	int io0, io1, irq;
9175c10ed43SMauro Carvalho ChehabX
9185c10ed43SMauro Carvalho ChehabX	if (argc < 3 ||
9195c10ed43SMauro Carvalho ChehabX	    sscanf(argv[0], "0x%x", &io0) != 1 ||
9205c10ed43SMauro Carvalho ChehabX	    sscanf(argv[0], "0x%x", &io1) != 1 ||
9215c10ed43SMauro Carvalho ChehabX	    sscanf(argv[1], "%d", &irq) != 1)
9225c10ed43SMauro Carvalho ChehabX		usage();
9235c10ed43SMauro Carvalho ChehabX
9245c10ed43SMauro Carvalho ChehabX	return msnd_write_cfg_logical(config_port, 2, io0, io1, irq, 0);
9255c10ed43SMauro Carvalho Chehab}
9265c10ed43SMauro Carvalho ChehabX
9275c10ed43SMauro Carvalho Chehabstatic int cfg_joystick(int argc, char *argv[])
9285c10ed43SMauro Carvalho Chehab{
9295c10ed43SMauro Carvalho ChehabX	int io;
9305c10ed43SMauro Carvalho ChehabX
9315c10ed43SMauro Carvalho ChehabX	if (argc < 1 ||
9325c10ed43SMauro Carvalho ChehabX	    sscanf(argv[0], "0x%x", &io) != 1)
9335c10ed43SMauro Carvalho ChehabX		usage();
9345c10ed43SMauro Carvalho ChehabX
9355c10ed43SMauro Carvalho ChehabX	return msnd_write_cfg_logical(config_port, 3, io, 0, 0, 0);
9365c10ed43SMauro Carvalho Chehab}
9375c10ed43SMauro Carvalho ChehabX
9385c10ed43SMauro Carvalho Chehabint main(int argc, char *argv[])
9395c10ed43SMauro Carvalho Chehab{
9405c10ed43SMauro Carvalho ChehabX	char *device;
9415c10ed43SMauro Carvalho ChehabX	int rv = 0;
9425c10ed43SMauro Carvalho ChehabX
9435c10ed43SMauro Carvalho ChehabX	--argc; ++argv;
9445c10ed43SMauro Carvalho ChehabX
9455c10ed43SMauro Carvalho ChehabX	if (argc < 2)
9465c10ed43SMauro Carvalho ChehabX		usage();
9475c10ed43SMauro Carvalho ChehabX
9485c10ed43SMauro Carvalho ChehabX	sscanf(argv[0], "0x%x", &config_port);
9495c10ed43SMauro Carvalho ChehabX	if (config_port != 0x250 && config_port != 0x260 && config_port != 0x270) {
9505c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: <config port> must be 0x250, 0x260 or 0x270\n");
9515c10ed43SMauro Carvalho ChehabX		exit(1);
9525c10ed43SMauro Carvalho ChehabX	}
9535c10ed43SMauro Carvalho ChehabX	if (ioperm(config_port, 2, 1)) {
9545c10ed43SMauro Carvalho ChehabX		perror("ioperm");
9555c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "note: pinnaclecfg must be run as root\n");
9565c10ed43SMauro Carvalho ChehabX		exit(1);
9575c10ed43SMauro Carvalho ChehabX	}
9585c10ed43SMauro Carvalho ChehabX	device = argv[1];
9595c10ed43SMauro Carvalho ChehabX
9605c10ed43SMauro Carvalho ChehabX	argc -= 2; argv += 2;
9615c10ed43SMauro Carvalho ChehabX
9625c10ed43SMauro Carvalho ChehabX	if (strcmp(device, "reset") == 0)
9635c10ed43SMauro Carvalho ChehabX		rv = cfg_reset();
9645c10ed43SMauro Carvalho ChehabX	else if (strcmp(device, "show") == 0)
9655c10ed43SMauro Carvalho ChehabX		rv = cfg_show();
9665c10ed43SMauro Carvalho ChehabX	else if (strcmp(device, "dsp") == 0)
9675c10ed43SMauro Carvalho ChehabX		rv = cfg_dsp(argc, argv);
9685c10ed43SMauro Carvalho ChehabX	else if (strcmp(device, "mpu") == 0)
9695c10ed43SMauro Carvalho ChehabX		rv = cfg_mpu(argc, argv);
9705c10ed43SMauro Carvalho ChehabX	else if (strcmp(device, "ide") == 0)
9715c10ed43SMauro Carvalho ChehabX		rv = cfg_ide(argc, argv);
9725c10ed43SMauro Carvalho ChehabX	else if (strcmp(device, "joystick") == 0)
9735c10ed43SMauro Carvalho ChehabX		rv = cfg_joystick(argc, argv);
9745c10ed43SMauro Carvalho ChehabX	else {
9755c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: unknown device %s\n", device);
9765c10ed43SMauro Carvalho ChehabX		usage();
9775c10ed43SMauro Carvalho ChehabX	}
9785c10ed43SMauro Carvalho ChehabX
9795c10ed43SMauro Carvalho ChehabX	if (rv)
9805c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: device configuration failed\n");
9815c10ed43SMauro Carvalho ChehabX
9825c10ed43SMauro Carvalho ChehabX	return 0;
9835c10ed43SMauro Carvalho Chehab}
9845c10ed43SMauro Carvalho ChehabSHAR_EOF
9855c10ed43SMauro Carvalho Chehab  $shar_touch -am 1204092598 'MultiSound.d/pinnaclecfg.c' &&
9865c10ed43SMauro Carvalho Chehab  chmod 0664 'MultiSound.d/pinnaclecfg.c' ||
9875c10ed43SMauro Carvalho Chehab  $echo 'restore of' 'MultiSound.d/pinnaclecfg.c' 'failed'
9885c10ed43SMauro Carvalho Chehab  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
9895c10ed43SMauro Carvalho Chehab  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
9905c10ed43SMauro Carvalho Chehab    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
9915c10ed43SMauro Carvalho Chehab    || $echo 'MultiSound.d/pinnaclecfg.c:' 'MD5 check failed'
9925c10ed43SMauro Carvalho Chehab366bdf27f0db767a3c7921d0a6db20fe  MultiSound.d/pinnaclecfg.c
9935c10ed43SMauro Carvalho ChehabSHAR_EOF
9945c10ed43SMauro Carvalho Chehab  else
9955c10ed43SMauro Carvalho Chehab    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/pinnaclecfg.c'`"
99606501a6dSMauro Carvalho Chehab    test 10224 -eq "$shar_count" ||
99706501a6dSMauro Carvalho Chehab    $echo 'MultiSound.d/pinnaclecfg.c:' 'original size' '10224,' 'current size' "$shar_count!"
9985c10ed43SMauro Carvalho Chehab  fi
9995c10ed43SMauro Carvalho Chehabfi
10005c10ed43SMauro Carvalho Chehab# ============= MultiSound.d/Makefile ==============
10015c10ed43SMauro Carvalho Chehabif test -f 'MultiSound.d/Makefile' && test "$first_param" != -c; then
10025c10ed43SMauro Carvalho Chehab  $echo 'x -' SKIPPING 'MultiSound.d/Makefile' '(file already exists)'
10035c10ed43SMauro Carvalho Chehabelse
10045c10ed43SMauro Carvalho Chehab  $echo 'x -' extracting 'MultiSound.d/Makefile' '(text)'
10055c10ed43SMauro Carvalho Chehab  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/Makefile' &&
10065c10ed43SMauro Carvalho ChehabCC	= gcc
10075c10ed43SMauro Carvalho ChehabCFLAGS	= -O
10085c10ed43SMauro Carvalho ChehabPROGS	= setdigital msndreset pinnaclecfg conv
10095c10ed43SMauro Carvalho ChehabX
10105c10ed43SMauro Carvalho Chehaball: $(PROGS)
10115c10ed43SMauro Carvalho ChehabX
10125c10ed43SMauro Carvalho Chehabclean:
10135c10ed43SMauro Carvalho ChehabX	rm -f $(PROGS)
10145c10ed43SMauro Carvalho ChehabSHAR_EOF
10155c10ed43SMauro Carvalho Chehab  $shar_touch -am 1204092398 'MultiSound.d/Makefile' &&
10165c10ed43SMauro Carvalho Chehab  chmod 0664 'MultiSound.d/Makefile' ||
10175c10ed43SMauro Carvalho Chehab  $echo 'restore of' 'MultiSound.d/Makefile' 'failed'
10185c10ed43SMauro Carvalho Chehab  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
10195c10ed43SMauro Carvalho Chehab  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
10205c10ed43SMauro Carvalho Chehab    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
10215c10ed43SMauro Carvalho Chehab    || $echo 'MultiSound.d/Makefile:' 'MD5 check failed'
10225c10ed43SMauro Carvalho Chehab76ca8bb44e3882edcf79c97df6c81845  MultiSound.d/Makefile
10235c10ed43SMauro Carvalho ChehabSHAR_EOF
10245c10ed43SMauro Carvalho Chehab  else
10255c10ed43SMauro Carvalho Chehab    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/Makefile'`"
10265c10ed43SMauro Carvalho Chehab    test 106 -eq "$shar_count" ||
10275c10ed43SMauro Carvalho Chehab    $echo 'MultiSound.d/Makefile:' 'original size' '106,' 'current size' "$shar_count!"
10285c10ed43SMauro Carvalho Chehab  fi
10295c10ed43SMauro Carvalho Chehabfi
10305c10ed43SMauro Carvalho Chehab# ============= MultiSound.d/conv.l ==============
10315c10ed43SMauro Carvalho Chehabif test -f 'MultiSound.d/conv.l' && test "$first_param" != -c; then
10325c10ed43SMauro Carvalho Chehab  $echo 'x -' SKIPPING 'MultiSound.d/conv.l' '(file already exists)'
10335c10ed43SMauro Carvalho Chehabelse
10345c10ed43SMauro Carvalho Chehab  $echo 'x -' extracting 'MultiSound.d/conv.l' '(text)'
10355c10ed43SMauro Carvalho Chehab  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/conv.l' &&
10365c10ed43SMauro Carvalho Chehab%%
10375c10ed43SMauro Carvalho Chehab[ \n\t,\r]
10385c10ed43SMauro Carvalho Chehab\;.*
10395c10ed43SMauro Carvalho ChehabDB
10405c10ed43SMauro Carvalho Chehab[0-9A-Fa-f]+H	{ int n; sscanf(yytext, "%xH", &n); printf("%c", n); }
10415c10ed43SMauro Carvalho Chehab%%
10425c10ed43SMauro Carvalho Chehabint yywrap() { return 1; }
104306501a6dSMauro Carvalho Chehabvoid main() { yylex(); }
10445c10ed43SMauro Carvalho ChehabSHAR_EOF
10455c10ed43SMauro Carvalho Chehab  $shar_touch -am 0828231798 'MultiSound.d/conv.l' &&
10465c10ed43SMauro Carvalho Chehab  chmod 0664 'MultiSound.d/conv.l' ||
10475c10ed43SMauro Carvalho Chehab  $echo 'restore of' 'MultiSound.d/conv.l' 'failed'
10485c10ed43SMauro Carvalho Chehab  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
10495c10ed43SMauro Carvalho Chehab  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
10505c10ed43SMauro Carvalho Chehab    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
10515c10ed43SMauro Carvalho Chehab    || $echo 'MultiSound.d/conv.l:' 'MD5 check failed'
10525c10ed43SMauro Carvalho Chehabd2411fc32cd71a00dcdc1f009e858dd2  MultiSound.d/conv.l
10535c10ed43SMauro Carvalho ChehabSHAR_EOF
10545c10ed43SMauro Carvalho Chehab  else
10555c10ed43SMauro Carvalho Chehab    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/conv.l'`"
105606501a6dSMauro Carvalho Chehab    test 146 -eq "$shar_count" ||
105706501a6dSMauro Carvalho Chehab    $echo 'MultiSound.d/conv.l:' 'original size' '146,' 'current size' "$shar_count!"
10585c10ed43SMauro Carvalho Chehab  fi
10595c10ed43SMauro Carvalho Chehabfi
10605c10ed43SMauro Carvalho Chehab# ============= MultiSound.d/msndreset.c ==============
10615c10ed43SMauro Carvalho Chehabif test -f 'MultiSound.d/msndreset.c' && test "$first_param" != -c; then
10625c10ed43SMauro Carvalho Chehab  $echo 'x -' SKIPPING 'MultiSound.d/msndreset.c' '(file already exists)'
10635c10ed43SMauro Carvalho Chehabelse
10645c10ed43SMauro Carvalho Chehab  $echo 'x -' extracting 'MultiSound.d/msndreset.c' '(text)'
10655c10ed43SMauro Carvalho Chehab  sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/msndreset.c' &&
10665c10ed43SMauro Carvalho Chehab/*********************************************************************
10675c10ed43SMauro Carvalho ChehabX *
10685c10ed43SMauro Carvalho ChehabX * msndreset.c - resets the MultiSound card
10695c10ed43SMauro Carvalho ChehabX *
10705c10ed43SMauro Carvalho ChehabX * Copyright (C) 1998 Andrew Veliath
10715c10ed43SMauro Carvalho ChehabX *
10725c10ed43SMauro Carvalho ChehabX * This program is free software; you can redistribute it and/or modify
10735c10ed43SMauro Carvalho ChehabX * it under the terms of the GNU General Public License as published by
10745c10ed43SMauro Carvalho ChehabX * the Free Software Foundation; either version 2 of the License, or
10755c10ed43SMauro Carvalho ChehabX * (at your option) any later version.
10765c10ed43SMauro Carvalho ChehabX *
10775c10ed43SMauro Carvalho ChehabX * This program is distributed in the hope that it will be useful,
10785c10ed43SMauro Carvalho ChehabX * but WITHOUT ANY WARRANTY; without even the implied warranty of
10795c10ed43SMauro Carvalho ChehabX * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10805c10ed43SMauro Carvalho ChehabX * GNU General Public License for more details.
10815c10ed43SMauro Carvalho ChehabX *
10825c10ed43SMauro Carvalho ChehabX * You should have received a copy of the GNU General Public License
10835c10ed43SMauro Carvalho ChehabX * along with this program; if not, write to the Free Software
10845c10ed43SMauro Carvalho ChehabX * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
10855c10ed43SMauro Carvalho ChehabX *
10865c10ed43SMauro Carvalho ChehabX ********************************************************************/
10875c10ed43SMauro Carvalho ChehabX
10885c10ed43SMauro Carvalho Chehab#include <stdio.h>
108906501a6dSMauro Carvalho Chehab#include <stdlib.h>
10905c10ed43SMauro Carvalho Chehab#include <unistd.h>
10915c10ed43SMauro Carvalho Chehab#include <fcntl.h>
10925c10ed43SMauro Carvalho Chehab#include <sys/types.h>
10935c10ed43SMauro Carvalho Chehab#include <sys/stat.h>
10945c10ed43SMauro Carvalho Chehab#include <sys/ioctl.h>
10955c10ed43SMauro Carvalho Chehab#include <sys/soundcard.h>
10965c10ed43SMauro Carvalho ChehabX
10975c10ed43SMauro Carvalho Chehabint main(int argc, char *argv[])
10985c10ed43SMauro Carvalho Chehab{
10995c10ed43SMauro Carvalho ChehabX	int fd;
11005c10ed43SMauro Carvalho ChehabX
11015c10ed43SMauro Carvalho ChehabX	if (argc != 2) {
11025c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "usage: msndreset <mixer device>\n");
11035c10ed43SMauro Carvalho ChehabX		exit(1);
11045c10ed43SMauro Carvalho ChehabX	}
11055c10ed43SMauro Carvalho ChehabX
11065c10ed43SMauro Carvalho ChehabX	if ((fd = open(argv[1], O_RDWR)) < 0) {
11075c10ed43SMauro Carvalho ChehabX		perror(argv[1]);
11085c10ed43SMauro Carvalho ChehabX		exit(1);
11095c10ed43SMauro Carvalho ChehabX	}
11105c10ed43SMauro Carvalho ChehabX
11115c10ed43SMauro Carvalho ChehabX	if (ioctl(fd, SOUND_MIXER_PRIVATE1, 0) < 0) {
11125c10ed43SMauro Carvalho ChehabX		fprintf(stderr, "error: msnd ioctl reset failed\n");
11135c10ed43SMauro Carvalho ChehabX		perror("ioctl");
11145c10ed43SMauro Carvalho ChehabX		close(fd);
11155c10ed43SMauro Carvalho ChehabX		exit(1);
11165c10ed43SMauro Carvalho ChehabX	}
11175c10ed43SMauro Carvalho ChehabX
11185c10ed43SMauro Carvalho ChehabX	close(fd);
11195c10ed43SMauro Carvalho ChehabX
11205c10ed43SMauro Carvalho ChehabX	return 0;
11215c10ed43SMauro Carvalho Chehab}
11225c10ed43SMauro Carvalho ChehabSHAR_EOF
11235c10ed43SMauro Carvalho Chehab  $shar_touch -am 1204100698 'MultiSound.d/msndreset.c' &&
11245c10ed43SMauro Carvalho Chehab  chmod 0664 'MultiSound.d/msndreset.c' ||
11255c10ed43SMauro Carvalho Chehab  $echo 'restore of' 'MultiSound.d/msndreset.c' 'failed'
11265c10ed43SMauro Carvalho Chehab  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
11275c10ed43SMauro Carvalho Chehab  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
11285c10ed43SMauro Carvalho Chehab    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
11295c10ed43SMauro Carvalho Chehab    || $echo 'MultiSound.d/msndreset.c:' 'MD5 check failed'
11305c10ed43SMauro Carvalho Chehabc52f876521084e8eb25e12e01dcccb8a  MultiSound.d/msndreset.c
11315c10ed43SMauro Carvalho ChehabSHAR_EOF
11325c10ed43SMauro Carvalho Chehab  else
11335c10ed43SMauro Carvalho Chehab    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/msndreset.c'`"
113406501a6dSMauro Carvalho Chehab    test 1491 -eq "$shar_count" ||
113506501a6dSMauro Carvalho Chehab    $echo 'MultiSound.d/msndreset.c:' 'original size' '1491,' 'current size' "$shar_count!"
11365c10ed43SMauro Carvalho Chehab  fi
11375c10ed43SMauro Carvalho Chehabfi
11385c10ed43SMauro Carvalho Chehabrm -fr _sh01426
11395c10ed43SMauro Carvalho Chehabexit 0
1140