| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #! /bin/sh | 
|  | 2 | # | 
|  | 3 | #  Turtle Beach MultiSound Driver Notes | 
|  | 4 | #  -- Andrew Veliath <andrewtv@usa.net> | 
|  | 5 | # | 
|  | 6 | #  Last update:                      September 10, 1998 | 
|  | 7 | #  Corresponding msnd driver:        0.8.3 | 
|  | 8 | # | 
|  | 9 | # ** This file is a README (top part) and shell archive (bottom part). | 
|  | 10 | #    The corresponding archived utility sources can be unpacked by | 
|  | 11 | #    running `sh MultiSound' (the utilities are only needed for the | 
|  | 12 | #    Pinnacle and Fiji cards). ** | 
|  | 13 | # | 
|  | 14 | # | 
|  | 15 | #  -=-=- Getting Firmware -=-=- | 
|  | 16 | #  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 17 | # | 
|  | 18 | #  See the section `Obtaining and Creating Firmware Files' in this | 
|  | 19 | #  document for instructions on obtaining the necessary firmware | 
|  | 20 | #  files. | 
|  | 21 | # | 
|  | 22 | # | 
|  | 23 | #  Supported Features | 
|  | 24 | #  ~~~~~~~~~~~~~~~~~~ | 
|  | 25 | # | 
|  | 26 | #  Currently, full-duplex digital audio (/dev/dsp only, /dev/audio is | 
|  | 27 | #  not currently available) and mixer functionality (/dev/mixer) are | 
|  | 28 | #  supported (memory mapped digital audio is not yet supported). | 
|  | 29 | #  Digital transfers and monitoring can be done as well if you have | 
|  | 30 | #  the digital daughterboard (see the section on using the S/PDIF port | 
|  | 31 | #  for more information). | 
|  | 32 | # | 
|  | 33 | #  Support for the Turtle Beach MultiSound Hurricane architecture is | 
|  | 34 | #  composed of the following modules (these can also operate compiled | 
|  | 35 | #  into the kernel): | 
|  | 36 | # | 
|  | 37 | #  msnd               - MultiSound base (requires soundcore) | 
|  | 38 | # | 
|  | 39 | #  msnd_classic       - Base audio/mixer support for Classic, Monetery and | 
|  | 40 | #                       Tahiti cards | 
|  | 41 | # | 
|  | 42 | #  msnd_pinnacle      - Base audio/mixer support for Pinnacle and Fiji cards | 
|  | 43 | # | 
|  | 44 | # | 
|  | 45 | #  Important Notes - Read Before Using | 
|  | 46 | #  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 47 | # | 
|  | 48 | #  The firmware files are not included (may change in future).  You | 
|  | 49 | #  must obtain these images from Turtle Beach (they are included in | 
|  | 50 | #  the MultiSound Development Kits), and place them in /etc/sound for | 
|  | 51 | #  example, and give the full paths in the Linux configuration.  If | 
|  | 52 | #  you are compiling in support for the MultiSound driver rather than | 
|  | 53 | #  using it as a module, these firmware files must be accessible | 
|  | 54 | #  during kernel compilation. | 
|  | 55 | # | 
|  | 56 | #  Please note these files must be binary files, not assembler.  See | 
|  | 57 | #  the section later in this document for instructions to obtain these | 
|  | 58 | #  files. | 
|  | 59 | # | 
|  | 60 | # | 
|  | 61 | #  Configuring Card Resources | 
|  | 62 | #  ~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 63 | # | 
|  | 64 | #  ** This section is very important, as your card may not work at all | 
|  | 65 | #     or your machine may crash if you do not do this correctly. ** | 
|  | 66 | # | 
|  | 67 | #  * Classic/Monterey/Tahiti | 
|  | 68 | # | 
|  | 69 | #  These cards are configured through the driver msnd_classic.  You must | 
|  | 70 | #  know the io port, then the driver will select the irq and memory resources | 
|  | 71 | #  on the card.  It is up to you to know if these are free locations or now, | 
|  | 72 | #  a conflict can lock the machine up. | 
|  | 73 | # | 
|  | 74 | #  * Pinnacle/Fiji | 
|  | 75 | # | 
|  | 76 | #  The Pinnacle and Fiji cards have an extra config port, either | 
|  | 77 | #  0x250, 0x260 or 0x270.  This port can be disabled to have the card | 
|  | 78 | #  configured strictly through PnP, however you lose the ability to | 
|  | 79 | #  access the IDE controller and joystick devices on this card when | 
|  | 80 | #  using PnP.  The included pinnaclecfg program in this shell archive | 
|  | 81 | #  can be used to configure the card in non-PnP mode, and in PnP mode | 
|  | 82 | #  you can use isapnptools.  These are described briefly here. | 
|  | 83 | # | 
|  | 84 | #  pinnaclecfg is not required; you can use the msnd_pinnacle module | 
|  | 85 | #  to fully configure the card as well.  However, pinnaclecfg can be | 
|  | 86 | #  used to change the resource values of a particular device after the | 
|  | 87 | #  msnd_pinnacle module has been loaded.  If you are compiling the | 
|  | 88 | #  driver into the kernel, you must set these values during compile | 
|  | 89 | #  time, however other peripheral resource values can be changed with | 
|  | 90 | #  the pinnaclecfg program after the kernel is loaded. | 
|  | 91 | # | 
|  | 92 | # | 
|  | 93 | #  *** PnP mode | 
|  | 94 | # | 
|  | 95 | #  Use pnpdump to obtain a sample configuration if you can; I was able | 
|  | 96 | #  to obtain one with the command `pnpdump 1 0x203' -- this may vary | 
|  | 97 | #  for you (running pnpdump by itself did not work for me).  Then, | 
|  | 98 | #  edit this file and use isapnp to uncomment and set the card values. | 
|  | 99 | #  Use these values when inserting the msnd_pinnacle module.  Using | 
|  | 100 | #  this method, you can set the resources for the DSP and the Kurzweil | 
|  | 101 | #  synth (Pinnacle).  Since Linux does not directly support PnP | 
|  | 102 | #  devices, you may have difficulty when using the card in PnP mode | 
|  | 103 | #  when it the driver is compiled into the kernel.  Using non-PnP mode | 
|  | 104 | #  is preferable in this case. | 
|  | 105 | # | 
|  | 106 | #  Here is an example mypinnacle.conf for isapnp that sets the card to | 
|  | 107 | #  io base 0x210, irq 5 and mem 0xd8000, and also sets the Kurzweil | 
|  | 108 | #  synth to 0x330 and irq 9 (may need editing for your system): | 
|  | 109 | # | 
|  | 110 | #  (READPORT 0x0203) | 
|  | 111 | #  (CSN 2) | 
|  | 112 | #  (IDENTIFY *) | 
|  | 113 | # | 
|  | 114 | #  # DSP | 
|  | 115 | #  (CONFIGURE BVJ0440/-1 (LD 0 | 
|  | 116 | #          (INT 0 (IRQ 5 (MODE +E))) (IO 0 (BASE 0x0210)) (MEM 0 (BASE 0x0d8000)) | 
|  | 117 | #          (ACT Y))) | 
|  | 118 | # | 
|  | 119 | #  # Kurzweil Synth (Pinnacle Only) | 
|  | 120 | #  (CONFIGURE BVJ0440/-1 (LD 1 | 
|  | 121 | #          (IO 0 (BASE 0x0330)) (INT 0 (IRQ 9 (MODE +E))) | 
|  | 122 | #          (ACT Y))) | 
|  | 123 | # | 
|  | 124 | #  (WAITFORKEY) | 
|  | 125 | # | 
|  | 126 | # | 
|  | 127 | #  *** Non-PnP mode | 
|  | 128 | # | 
|  | 129 | #  The second way is by running the card in non-PnP mode.  This | 
|  | 130 | #  actually has some advantages in that you can access some other | 
|  | 131 | #  devices on the card, such as the joystick and IDE controller.  To | 
|  | 132 | #  configure the card, unpack this shell archive and build the | 
|  | 133 | #  pinnaclecfg program.  Using this program, you can assign the | 
|  | 134 | #  resource values to the card's devices, or disable the devices.  As | 
|  | 135 | #  an alternative to using pinnaclecfg, you can specify many of the | 
|  | 136 | #  configuration values when loading the msnd_pinnacle module (or | 
|  | 137 | #  during kernel configuration when compiling the driver into the | 
|  | 138 | #  kernel). | 
|  | 139 | # | 
|  | 140 | #  If you specify cfg=0x250 for the msnd_pinnacle module, it | 
|  | 141 | #  automatically configure the card to the given io, irq and memory | 
|  | 142 | #  values using that config port (the config port is jumper selectable | 
|  | 143 | #  on the card to 0x250, 0x260 or 0x270). | 
|  | 144 | # | 
|  | 145 | #  See the `msnd_pinnacle Additional Options' section below for more | 
|  | 146 | #  information on these parameters (also, if you compile the driver | 
|  | 147 | #  directly into the kernel, these extra parameters can be useful | 
|  | 148 | #  here). | 
|  | 149 | # | 
|  | 150 | # | 
|  | 151 | # ** It is very easy to cause problems in your machine if you choose a | 
|  | 152 | #    resource value which is incorrect. ** | 
|  | 153 | # | 
|  | 154 | # | 
|  | 155 | #  Examples | 
|  | 156 | #  ~~~~~~~~ | 
|  | 157 | # | 
|  | 158 | #  * MultiSound Classic/Monterey/Tahiti: | 
|  | 159 | # | 
|  | 160 | #  modprobe soundcore | 
|  | 161 | #  insmod msnd | 
|  | 162 | #  insmod msnd_classic io=0x290 irq=7 mem=0xd0000 | 
|  | 163 | # | 
|  | 164 | #  * MultiSound Pinnacle in PnP mode: | 
|  | 165 | # | 
|  | 166 | #  modprobe soundcore | 
|  | 167 | #  insmod msnd | 
|  | 168 | #  isapnp mypinnacle.conf | 
|  | 169 | #  insmod msnd_pinnacle io=0x210 irq=5 mem=0xd8000 <-- match mypinnacle.conf values | 
|  | 170 | # | 
|  | 171 | #  * MultiSound Pinnacle in non-PnP mode (replace 0x250 with your configuration port, | 
|  | 172 | #    one of 0x250, 0x260 or 0x270): | 
|  | 173 | # | 
|  | 174 | #  insmod soundcore | 
|  | 175 | #  insmod msnd | 
|  | 176 | #  insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 | 
|  | 177 | # | 
|  | 178 | # * To use the MPU-compatible Kurzweil synth on the Pinnacle in PnP | 
|  | 179 | #   mode, add the following (assumes you did `isapnp mypinnacle.conf'): | 
|  | 180 | # | 
|  | 181 | #  insmod sound | 
|  | 182 | #  insmod mpu401 io=0x330 irq=9                    <-- match mypinnacle.conf values | 
|  | 183 | # | 
|  | 184 | # * To use the MPU-compatible Kurzweil synth on the Pinnacle in non-PnP | 
|  | 185 | #   mode, add the following.  Note how we first configure the peripheral's | 
|  | 186 | #   resources, _then_ install a Linux driver for it: | 
|  | 187 | # | 
|  | 188 | #  insmod sound | 
|  | 189 | #  pinnaclecfg 0x250 mpu 0x330 9 | 
|  | 190 | #  insmod mpu401 io=0x330 irq=9 | 
|  | 191 | # | 
|  | 192 | #  -- OR you can use the following sequence without pinnaclecfg in non-PnP mode: | 
|  | 193 | # | 
|  | 194 | #  insmod soundcore | 
|  | 195 | #  insmod msnd | 
|  | 196 | #  insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 mpu_io=0x330 mpu_irq=9 | 
|  | 197 | #  insmod sound | 
|  | 198 | #  insmod mpu401 io=0x330 irq=9 | 
|  | 199 | # | 
|  | 200 | # * To setup the joystick port on the Pinnacle in non-PnP mode (though | 
|  | 201 | #   you have to find the actual Linux joystick driver elsewhere), you | 
|  | 202 | #   can use pinnaclecfg: | 
|  | 203 | # | 
|  | 204 | #   pinnaclecfg 0x250 joystick 0x200 | 
|  | 205 | # | 
|  | 206 | #  -- OR you can configure this using msnd_pinnacle with the following: | 
|  | 207 | # | 
|  | 208 | #  insmod soundcore | 
|  | 209 | #  insmod msnd | 
|  | 210 | #  insmod msnd_pinnacle cfg=0x250 io=0x290 irq=5 mem=0xd0000 joystick_io=0x200 | 
|  | 211 | # | 
|  | 212 | # | 
|  | 213 | #  msnd_classic, msnd_pinnacle Required Options | 
|  | 214 | #  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 215 | # | 
|  | 216 | #  If the following options are not given, the module will not load. | 
|  | 217 | #  Examine the kernel message log for informative error messages. | 
|  | 218 | #  WARNING--probing isn't supported so try to make sure you have the | 
|  | 219 | #  correct shared memory area, otherwise you may experience problems. | 
|  | 220 | # | 
|  | 221 | #  io                   I/O base of DSP, e.g. io=0x210 | 
|  | 222 | #  irq                  IRQ number, e.g. irq=5 | 
|  | 223 | #  mem                  Shared memory area, e.g. mem=0xd8000 | 
|  | 224 | # | 
|  | 225 | # | 
|  | 226 | #  msnd_classic, msnd_pinnacle Additional Options | 
|  | 227 | #  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 228 | # | 
|  | 229 | #  fifosize             The digital audio FIFOs, in kilobytes.  If not | 
|  | 230 | #                       specified, the default will be used.  Increasing | 
|  | 231 | #                       this value will reduce the chance of a FIFO | 
|  | 232 | #                       underflow at the expense of increasing overall | 
|  | 233 | #                       latency.  For example, fifosize=512 will | 
|  | 234 | #                       allocate 512kB read and write FIFOs (1MB total). | 
|  | 235 | #                       While this may reduce dropouts, a heavy machine | 
|  | 236 | #                       load will undoubtedly starve the FIFO of data | 
|  | 237 | #                       and you will eventually get dropouts.  One | 
|  | 238 | #                       option is to alter the scheduling priority of | 
|  | 239 | #                       the playback process, using `nice' or some form | 
|  | 240 | #                       of POSIX soft real-time scheduling. | 
|  | 241 | # | 
|  | 242 | #  calibrate_signal     Setting this to one calibrates the ADCs to the | 
|  | 243 | #                       signal, zero calibrates to the card (defaults | 
|  | 244 | #                       to zero). | 
|  | 245 | # | 
|  | 246 | # | 
|  | 247 | #  msnd_pinnacle Additional Options | 
|  | 248 | #  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 249 | # | 
|  | 250 | #  digital              Specify digital=1 to enable the S/PDIF input | 
|  | 251 | #                       if you have the digital daughterboard | 
|  | 252 | #                       adapter. This will enable access to the | 
|  | 253 | #                       DIGITAL1 input for the soundcard in the mixer. | 
|  | 254 | #                       Some mixer programs might have trouble setting | 
|  | 255 | #                       the DIGITAL1 source as an input.  If you have | 
|  | 256 | #                       trouble, you can try the setdigital.c program | 
|  | 257 | #                       at the bottom of this document. | 
|  | 258 | # | 
|  | 259 | #  cfg                  Non-PnP configuration port for the Pinnacle | 
|  | 260 | #                       and Fiji (typically 0x250, 0x260 or 0x270, | 
|  | 261 | #                       depending on the jumper configuration).  If | 
|  | 262 | #                       this option is omitted, then it is assumed | 
|  | 263 | #                       that the card is in PnP mode, and that the | 
|  | 264 | #                       specified DSP resource values are already | 
|  | 265 | #                       configured with PnP (i.e. it won't attempt to | 
|  | 266 | #                       do any sort of configuration). | 
|  | 267 | # | 
|  | 268 | #  When the Pinnacle is in non-PnP mode, you can use the following | 
|  | 269 | #  options to configure particular devices.  If a full specification | 
|  | 270 | #  for a device is not given, then the device is not configured.  Note | 
|  | 271 | #  that you still must use a Linux driver for any of these devices | 
|  | 272 | #  once their resources are setup (such as the Linux joystick driver, | 
|  | 273 | #  or the MPU401 driver from OSS for the Kurzweil synth). | 
|  | 274 | # | 
|  | 275 | #  mpu_io               I/O port of MPU (on-board Kurzweil synth) | 
|  | 276 | #  mpu_irq              IRQ of MPU (on-board Kurzweil synth) | 
|  | 277 | #  ide_io0		First I/O port of IDE controller | 
|  | 278 | #  ide_io1		Second I/O port of IDE controller | 
|  | 279 | #  ide_irq		IRQ IDE controller | 
|  | 280 | #  joystick_io          I/O port of joystick | 
|  | 281 | # | 
|  | 282 | # | 
|  | 283 | #  Obtaining and Creating Firmware Files | 
|  | 284 | #  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 285 | # | 
|  | 286 | #       For the Classic/Tahiti/Monterey | 
|  | 287 | #       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 288 | # | 
|  | 289 | #  Download to /tmp and unzip the following file from Turtle Beach: | 
|  | 290 | # | 
|  | 291 | #       ftp://ftp.voyetra.com/pub/tbs/msndcl/msndvkit.zip | 
|  | 292 | # | 
|  | 293 | #  When unzipped, unzip the file named MsndFiles.zip.  Then copy the | 
|  | 294 | #  following firmware files to /etc/sound (note the file renaming): | 
|  | 295 | # | 
|  | 296 | #    cp DSPCODE/MSNDINIT.BIN /etc/sound/msndinit.bin | 
|  | 297 | #    cp DSPCODE/MSNDPERM.REB /etc/sound/msndperm.bin | 
|  | 298 | # | 
|  | 299 | #  When configuring the Linux kernel, specify /etc/sound/msndinit.bin and | 
|  | 300 | #  /etc/sound/msndperm.bin for the two firmware files (Linux kernel | 
|  | 301 | #  versions older than 2.2 do not ask for firmware paths, and are | 
|  | 302 | #  hardcoded to /etc/sound). | 
|  | 303 | # | 
|  | 304 | #  If you are compiling the driver into the kernel, these files must | 
|  | 305 | #  be accessible during compilation, but will not be needed later. | 
|  | 306 | #  The files must remain, however, if the driver is used as a module. | 
|  | 307 | # | 
|  | 308 | # | 
|  | 309 | #       For the Pinnacle/Fiji | 
|  | 310 | #       ~~~~~~~~~~~~~~~~~~~~~ | 
|  | 311 | # | 
|  | 312 | #  Download to /tmp and unzip the following file from Turtle Beach (be | 
|  | 313 | #  sure to use the entire URL; some have had trouble navigating to the | 
|  | 314 | #  URL): | 
|  | 315 | # | 
|  | 316 | #       ftp://ftp.voyetra.com/pub/tbs/pinn/pnddk100.zip | 
|  | 317 | # | 
|  | 318 | #  Unpack this shell archive, and run make in the created directory | 
|  | 319 | #  (you need a C compiler and flex to build the utilities).  This | 
|  | 320 | #  should give you the executables conv, pinnaclecfg and setdigital. | 
|  | 321 | #  conv is only used temporarily here to create the firmware files, | 
|  | 322 | #  while pinnaclecfg is used to configure the Pinnacle or Fiji card in | 
|  | 323 | #  non-PnP mode, and setdigital can be used to set the S/PDIF input on | 
|  | 324 | #  the mixer (pinnaclecfg and setdigital should be copied to a | 
|  | 325 | #  convenient place, possibly run during system initialization). | 
|  | 326 | # | 
|  | 327 | #  To generating the firmware files with the `conv' program, we create | 
|  | 328 | #  the binary firmware files by doing the following conversion | 
|  | 329 | #  (assuming the archive unpacked into a directory named PINNDDK): | 
|  | 330 | # | 
|  | 331 | #    ./conv < PINNDDK/dspcode/pndspini.asm > /etc/sound/pndspini.bin | 
|  | 332 | #    ./conv < PINNDDK/dspcode/pndsperm.asm > /etc/sound/pndsperm.bin | 
|  | 333 | # | 
|  | 334 | #  The conv (and conv.l) program is not needed after conversion and can | 
|  | 335 | #  be safely deleted.  Then, when configuring the Linux kernel, specify | 
|  | 336 | #  /etc/sound/pndspini.bin and /etc/sound/pndsperm.bin for the two | 
|  | 337 | #  firmware files (Linux kernel versions older than 2.2 do not ask for | 
|  | 338 | #  firmware paths, and are hardcoded to /etc/sound). | 
|  | 339 | # | 
|  | 340 | #  If you are compiling the driver into the kernel, these files must | 
|  | 341 | #  be accessible during compilation, but will not be needed later. | 
|  | 342 | #  The files must remain, however, if the driver is used as a module. | 
|  | 343 | # | 
|  | 344 | # | 
|  | 345 | #  Using Digital I/O with the S/PDIF Port | 
|  | 346 | #  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 347 | # | 
|  | 348 | #  If you have a Pinnacle or Fiji with the digital daughterboard and | 
|  | 349 | #  want to set it as the input source, you can use this program if you | 
|  | 350 | #  have trouble trying to do it with a mixer program (be sure to | 
|  | 351 | #  insert the module with the digital=1 option, or say Y to the option | 
|  | 352 | #  during compiled-in kernel operation).  Upon selection of the S/PDIF | 
|  | 353 | #  port, you should be able monitor and record from it. | 
|  | 354 | # | 
|  | 355 | #  There is something to note about using the S/PDIF port.  Digital | 
|  | 356 | #  timing is taken from the digital signal, so if a signal is not | 
|  | 357 | #  connected to the port and it is selected as recording input, you | 
|  | 358 | #  will find PCM playback to be distorted in playback rate.  Also, | 
|  | 359 | #  attempting to record at a sampling rate other than the DAT rate may | 
|  | 360 | #  be problematic (i.e. trying to record at 8000Hz when the DAT signal | 
|  | 361 | #  is 44100Hz).  If you have a problem with this, set the recording | 
|  | 362 | #  input to analog if you need to record at a rate other than that of | 
|  | 363 | #  the DAT rate. | 
|  | 364 | # | 
|  | 365 | # | 
|  | 366 | #  -- Shell archive attached below, just run `sh MultiSound' to extract. | 
|  | 367 | #     Contains Pinnacle/Fiji utilities to convert firmware, configure | 
|  | 368 | #     in non-PnP mode, and select the DIGITAL1 input for the mixer. | 
|  | 369 | # | 
|  | 370 | # | 
|  | 371 | #!/bin/sh | 
|  | 372 | # This is a shell archive (produced by GNU sharutils 4.2). | 
|  | 373 | # To extract the files from this archive, save it to some FILE, remove | 
|  | 374 | # everything before the `!/bin/sh' line above, then type `sh FILE'. | 
|  | 375 | # | 
|  | 376 | # Made on 1998-12-04 10:07 EST by <andrewtv@ztransform.velsoft.com>. | 
|  | 377 | # Source directory was `/home/andrewtv/programming/pinnacle/pinnacle'. | 
|  | 378 | # | 
|  | 379 | # Existing files will *not* be overwritten unless `-c' is specified. | 
|  | 380 | # | 
|  | 381 | # This shar contains: | 
|  | 382 | # length mode       name | 
|  | 383 | # ------ ---------- ------------------------------------------ | 
|  | 384 | #   2046 -rw-rw-r-- MultiSound.d/setdigital.c | 
|  | 385 | #  10235 -rw-rw-r-- MultiSound.d/pinnaclecfg.c | 
|  | 386 | #    106 -rw-rw-r-- MultiSound.d/Makefile | 
|  | 387 | #    141 -rw-rw-r-- MultiSound.d/conv.l | 
|  | 388 | #   1472 -rw-rw-r-- MultiSound.d/msndreset.c | 
|  | 389 | # | 
|  | 390 | save_IFS="${IFS}" | 
|  | 391 | IFS="${IFS}:" | 
|  | 392 | gettext_dir=FAILED | 
|  | 393 | locale_dir=FAILED | 
|  | 394 | first_param="$1" | 
|  | 395 | for dir in $PATH | 
|  | 396 | do | 
|  | 397 | if test "$gettext_dir" = FAILED && test -f $dir/gettext \ | 
|  | 398 | && ($dir/gettext --version >/dev/null 2>&1) | 
|  | 399 | then | 
|  | 400 | set `$dir/gettext --version 2>&1` | 
|  | 401 | if test "$3" = GNU | 
|  | 402 | then | 
|  | 403 | gettext_dir=$dir | 
|  | 404 | fi | 
|  | 405 | fi | 
|  | 406 | if test "$locale_dir" = FAILED && test -f $dir/shar \ | 
|  | 407 | && ($dir/shar --print-text-domain-dir >/dev/null 2>&1) | 
|  | 408 | then | 
|  | 409 | locale_dir=`$dir/shar --print-text-domain-dir` | 
|  | 410 | fi | 
|  | 411 | done | 
|  | 412 | IFS="$save_IFS" | 
|  | 413 | if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED | 
|  | 414 | then | 
|  | 415 | echo=echo | 
|  | 416 | else | 
|  | 417 | TEXTDOMAINDIR=$locale_dir | 
|  | 418 | export TEXTDOMAINDIR | 
|  | 419 | TEXTDOMAIN=sharutils | 
|  | 420 | export TEXTDOMAIN | 
|  | 421 | echo="$gettext_dir/gettext -s" | 
|  | 422 | fi | 
|  | 423 | touch -am 1231235999 $$.touch >/dev/null 2>&1 | 
|  | 424 | if test ! -f 1231235999 && test -f $$.touch; then | 
|  | 425 | shar_touch=touch | 
|  | 426 | else | 
|  | 427 | shar_touch=: | 
|  | 428 | echo | 
|  | 429 | $echo 'WARNING: not restoring timestamps.  Consider getting and' | 
|  | 430 | $echo "installing GNU \`touch', distributed in GNU File Utilities..." | 
|  | 431 | echo | 
|  | 432 | fi | 
|  | 433 | rm -f 1231235999 $$.touch | 
|  | 434 | # | 
|  | 435 | if mkdir _sh01426; then | 
|  | 436 | $echo 'x -' 'creating lock directory' | 
|  | 437 | else | 
|  | 438 | $echo 'failed to create lock directory' | 
|  | 439 | exit 1 | 
|  | 440 | fi | 
|  | 441 | # ============= MultiSound.d/setdigital.c ============== | 
|  | 442 | if test ! -d 'MultiSound.d'; then | 
|  | 443 | $echo 'x -' 'creating directory' 'MultiSound.d' | 
|  | 444 | mkdir 'MultiSound.d' | 
|  | 445 | fi | 
|  | 446 | if test -f 'MultiSound.d/setdigital.c' && test "$first_param" != -c; then | 
|  | 447 | $echo 'x -' SKIPPING 'MultiSound.d/setdigital.c' '(file already exists)' | 
|  | 448 | else | 
|  | 449 | $echo 'x -' extracting 'MultiSound.d/setdigital.c' '(text)' | 
|  | 450 | sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/setdigital.c' && | 
|  | 451 | /********************************************************************* | 
|  | 452 | X * | 
|  | 453 | X * setdigital.c - sets the DIGITAL1 input for a mixer | 
|  | 454 | X * | 
|  | 455 | X * Copyright (C) 1998 Andrew Veliath | 
|  | 456 | X * | 
|  | 457 | X * This program is free software; you can redistribute it and/or modify | 
|  | 458 | X * it under the terms of the GNU General Public License as published by | 
|  | 459 | X * the Free Software Foundation; either version 2 of the License, or | 
|  | 460 | X * (at your option) any later version. | 
|  | 461 | X * | 
|  | 462 | X * This program is distributed in the hope that it will be useful, | 
|  | 463 | X * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 464 | X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 465 | X * GNU General Public License for more details. | 
|  | 466 | X * | 
|  | 467 | X * You should have received a copy of the GNU General Public License | 
|  | 468 | X * along with this program; if not, write to the Free Software | 
|  | 469 | X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
|  | 470 | X * | 
|  | 471 | X ********************************************************************/ | 
|  | 472 | X | 
|  | 473 | #include <stdio.h> | 
|  | 474 | #include <unistd.h> | 
|  | 475 | #include <fcntl.h> | 
|  | 476 | #include <sys/types.h> | 
|  | 477 | #include <sys/stat.h> | 
|  | 478 | #include <sys/ioctl.h> | 
|  | 479 | #include <sys/soundcard.h> | 
|  | 480 | X | 
|  | 481 | int main(int argc, char *argv[]) | 
|  | 482 | { | 
|  | 483 | X	int fd; | 
|  | 484 | X	unsigned long recmask, recsrc; | 
|  | 485 | X | 
|  | 486 | X	if (argc != 2) { | 
|  | 487 | X		fprintf(stderr, "usage: setdigital <mixer device>\n"); | 
|  | 488 | X		exit(1); | 
|  | 489 | X	} | 
|  | 490 | X | 
|  | 491 | X	if ((fd = open(argv[1], O_RDWR)) < 0) { | 
|  | 492 | X		perror(argv[1]); | 
|  | 493 | X		exit(1); | 
|  | 494 | X	} | 
|  | 495 | X | 
|  | 496 | X	if (ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask) < 0) { | 
|  | 497 | X		fprintf(stderr, "error: ioctl read recording mask failed\n"); | 
|  | 498 | X		perror("ioctl"); | 
|  | 499 | X		close(fd); | 
|  | 500 | X		exit(1); | 
|  | 501 | X	} | 
|  | 502 | X | 
|  | 503 | X	if (!(recmask & SOUND_MASK_DIGITAL1)) { | 
|  | 504 | X		fprintf(stderr, "error: cannot find DIGITAL1 device in mixer\n"); | 
|  | 505 | X		close(fd); | 
|  | 506 | X		exit(1); | 
|  | 507 | X	} | 
|  | 508 | X | 
|  | 509 | X	if (ioctl(fd, SOUND_MIXER_READ_RECSRC, &recsrc) < 0) { | 
|  | 510 | X		fprintf(stderr, "error: ioctl read recording source failed\n"); | 
|  | 511 | X		perror("ioctl"); | 
|  | 512 | X		close(fd); | 
|  | 513 | X		exit(1); | 
|  | 514 | X	} | 
|  | 515 | X | 
|  | 516 | X	recsrc |= SOUND_MASK_DIGITAL1; | 
|  | 517 | X | 
|  | 518 | X	if (ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &recsrc) < 0) { | 
|  | 519 | X		fprintf(stderr, "error: ioctl write recording source failed\n"); | 
|  | 520 | X		perror("ioctl"); | 
|  | 521 | X		close(fd); | 
|  | 522 | X		exit(1); | 
|  | 523 | X	} | 
|  | 524 | X | 
|  | 525 | X	close(fd); | 
|  | 526 | X | 
|  | 527 | X	return 0; | 
|  | 528 | } | 
|  | 529 | SHAR_EOF | 
|  | 530 | $shar_touch -am 1204092598 'MultiSound.d/setdigital.c' && | 
|  | 531 | chmod 0664 'MultiSound.d/setdigital.c' || | 
|  | 532 | $echo 'restore of' 'MultiSound.d/setdigital.c' 'failed' | 
|  | 533 | if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ | 
|  | 534 | && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then | 
|  | 535 | md5sum -c << SHAR_EOF >/dev/null 2>&1 \ | 
|  | 536 | || $echo 'MultiSound.d/setdigital.c:' 'MD5 check failed' | 
|  | 537 | e87217fc3e71288102ba41fd81f71ec4  MultiSound.d/setdigital.c | 
|  | 538 | SHAR_EOF | 
|  | 539 | else | 
|  | 540 | shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/setdigital.c'`" | 
|  | 541 | test 2046 -eq "$shar_count" || | 
|  | 542 | $echo 'MultiSound.d/setdigital.c:' 'original size' '2046,' 'current size' "$shar_count!" | 
|  | 543 | fi | 
|  | 544 | fi | 
|  | 545 | # ============= MultiSound.d/pinnaclecfg.c ============== | 
|  | 546 | if test -f 'MultiSound.d/pinnaclecfg.c' && test "$first_param" != -c; then | 
|  | 547 | $echo 'x -' SKIPPING 'MultiSound.d/pinnaclecfg.c' '(file already exists)' | 
|  | 548 | else | 
|  | 549 | $echo 'x -' extracting 'MultiSound.d/pinnaclecfg.c' '(text)' | 
|  | 550 | sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/pinnaclecfg.c' && | 
|  | 551 | /********************************************************************* | 
|  | 552 | X * | 
|  | 553 | X * pinnaclecfg.c - Pinnacle/Fiji Device Configuration Program | 
|  | 554 | X * | 
|  | 555 | X * This is for NON-PnP mode only.  For PnP mode, use isapnptools. | 
|  | 556 | X * | 
|  | 557 | X * This is Linux-specific, and must be run with root permissions. | 
|  | 558 | X * | 
|  | 559 | X * Part of the Turtle Beach MultiSound Sound Card Driver for Linux | 
|  | 560 | X * | 
|  | 561 | X * Copyright (C) 1998 Andrew Veliath | 
|  | 562 | X * | 
|  | 563 | X * This program is free software; you can redistribute it and/or modify | 
|  | 564 | X * it under the terms of the GNU General Public License as published by | 
|  | 565 | X * the Free Software Foundation; either version 2 of the License, or | 
|  | 566 | X * (at your option) any later version. | 
|  | 567 | X * | 
|  | 568 | X * This program is distributed in the hope that it will be useful, | 
|  | 569 | X * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 570 | X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 571 | X * GNU General Public License for more details. | 
|  | 572 | X * | 
|  | 573 | X * You should have received a copy of the GNU General Public License | 
|  | 574 | X * along with this program; if not, write to the Free Software | 
|  | 575 | X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
|  | 576 | X * | 
|  | 577 | X ********************************************************************/ | 
|  | 578 | X | 
|  | 579 | #include <stdio.h> | 
|  | 580 | #include <stdlib.h> | 
|  | 581 | #include <string.h> | 
|  | 582 | #include <errno.h> | 
|  | 583 | #include <unistd.h> | 
|  | 584 | #include <asm/io.h> | 
|  | 585 | #include <asm/types.h> | 
|  | 586 | X | 
|  | 587 | #define IREG_LOGDEVICE		0x07 | 
|  | 588 | #define IREG_ACTIVATE		0x30 | 
|  | 589 | #define LD_ACTIVATE		0x01 | 
|  | 590 | #define LD_DISACTIVATE		0x00 | 
|  | 591 | #define IREG_EECONTROL		0x3F | 
|  | 592 | #define IREG_MEMBASEHI		0x40 | 
|  | 593 | #define IREG_MEMBASELO		0x41 | 
|  | 594 | #define IREG_MEMCONTROL		0x42 | 
|  | 595 | #define IREG_MEMRANGEHI		0x43 | 
|  | 596 | #define IREG_MEMRANGELO		0x44 | 
|  | 597 | #define MEMTYPE_8BIT		0x00 | 
|  | 598 | #define MEMTYPE_16BIT		0x02 | 
|  | 599 | #define MEMTYPE_RANGE		0x00 | 
|  | 600 | #define MEMTYPE_HIADDR		0x01 | 
|  | 601 | #define IREG_IO0_BASEHI		0x60 | 
|  | 602 | #define IREG_IO0_BASELO		0x61 | 
|  | 603 | #define IREG_IO1_BASEHI		0x62 | 
|  | 604 | #define IREG_IO1_BASELO		0x63 | 
|  | 605 | #define IREG_IRQ_NUMBER		0x70 | 
|  | 606 | #define IREG_IRQ_TYPE		0x71 | 
|  | 607 | #define IRQTYPE_HIGH		0x02 | 
|  | 608 | #define IRQTYPE_LOW		0x00 | 
|  | 609 | #define IRQTYPE_LEVEL		0x01 | 
|  | 610 | #define IRQTYPE_EDGE		0x00 | 
|  | 611 | X | 
|  | 612 | #define HIBYTE(w)		((BYTE)(((WORD)(w) >> 8) & 0xFF)) | 
|  | 613 | #define LOBYTE(w)		((BYTE)(w)) | 
|  | 614 | #define MAKEWORD(low,hi)	((WORD)(((BYTE)(low))|(((WORD)((BYTE)(hi)))<<8))) | 
|  | 615 | X | 
|  | 616 | typedef __u8			BYTE; | 
|  | 617 | typedef __u16			USHORT; | 
|  | 618 | typedef __u16			WORD; | 
|  | 619 | X | 
|  | 620 | static int config_port = -1; | 
|  | 621 | X | 
|  | 622 | static int msnd_write_cfg(int cfg, int reg, int value) | 
|  | 623 | { | 
|  | 624 | X	outb(reg, cfg); | 
|  | 625 | X	outb(value, cfg + 1); | 
|  | 626 | X	if (value != inb(cfg + 1)) { | 
|  | 627 | X		fprintf(stderr, "error: msnd_write_cfg: I/O error\n"); | 
|  | 628 | X		return -EIO; | 
|  | 629 | X	} | 
|  | 630 | X	return 0; | 
|  | 631 | } | 
|  | 632 | X | 
|  | 633 | static int msnd_read_cfg(int cfg, int reg) | 
|  | 634 | { | 
|  | 635 | X	outb(reg, cfg); | 
|  | 636 | X	return inb(cfg + 1); | 
|  | 637 | } | 
|  | 638 | X | 
|  | 639 | static int msnd_write_cfg_io0(int cfg, int num, WORD io) | 
|  | 640 | { | 
|  | 641 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 642 | X		return -EIO; | 
|  | 643 | X	if (msnd_write_cfg(cfg, IREG_IO0_BASEHI, HIBYTE(io))) | 
|  | 644 | X		return -EIO; | 
|  | 645 | X	if (msnd_write_cfg(cfg, IREG_IO0_BASELO, LOBYTE(io))) | 
|  | 646 | X		return -EIO; | 
|  | 647 | X	return 0; | 
|  | 648 | } | 
|  | 649 | X | 
|  | 650 | static int msnd_read_cfg_io0(int cfg, int num, WORD *io) | 
|  | 651 | { | 
|  | 652 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 653 | X		return -EIO; | 
|  | 654 | X | 
|  | 655 | X	*io = MAKEWORD(msnd_read_cfg(cfg, IREG_IO0_BASELO), | 
|  | 656 | X		       msnd_read_cfg(cfg, IREG_IO0_BASEHI)); | 
|  | 657 | X | 
|  | 658 | X	return 0; | 
|  | 659 | } | 
|  | 660 | X | 
|  | 661 | static int msnd_write_cfg_io1(int cfg, int num, WORD io) | 
|  | 662 | { | 
|  | 663 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 664 | X		return -EIO; | 
|  | 665 | X	if (msnd_write_cfg(cfg, IREG_IO1_BASEHI, HIBYTE(io))) | 
|  | 666 | X		return -EIO; | 
|  | 667 | X	if (msnd_write_cfg(cfg, IREG_IO1_BASELO, LOBYTE(io))) | 
|  | 668 | X		return -EIO; | 
|  | 669 | X	return 0; | 
|  | 670 | } | 
|  | 671 | X | 
|  | 672 | static int msnd_read_cfg_io1(int cfg, int num, WORD *io) | 
|  | 673 | { | 
|  | 674 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 675 | X		return -EIO; | 
|  | 676 | X | 
|  | 677 | X	*io = MAKEWORD(msnd_read_cfg(cfg, IREG_IO1_BASELO), | 
|  | 678 | X		       msnd_read_cfg(cfg, IREG_IO1_BASEHI)); | 
|  | 679 | X | 
|  | 680 | X	return 0; | 
|  | 681 | } | 
|  | 682 | X | 
|  | 683 | static int msnd_write_cfg_irq(int cfg, int num, WORD irq) | 
|  | 684 | { | 
|  | 685 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 686 | X		return -EIO; | 
|  | 687 | X	if (msnd_write_cfg(cfg, IREG_IRQ_NUMBER, LOBYTE(irq))) | 
|  | 688 | X		return -EIO; | 
|  | 689 | X	if (msnd_write_cfg(cfg, IREG_IRQ_TYPE, IRQTYPE_EDGE)) | 
|  | 690 | X		return -EIO; | 
|  | 691 | X	return 0; | 
|  | 692 | } | 
|  | 693 | X | 
|  | 694 | static int msnd_read_cfg_irq(int cfg, int num, WORD *irq) | 
|  | 695 | { | 
|  | 696 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 697 | X		return -EIO; | 
|  | 698 | X | 
|  | 699 | X	*irq = msnd_read_cfg(cfg, IREG_IRQ_NUMBER); | 
|  | 700 | X | 
|  | 701 | X	return 0; | 
|  | 702 | } | 
|  | 703 | X | 
|  | 704 | static int msnd_write_cfg_mem(int cfg, int num, int mem) | 
|  | 705 | { | 
|  | 706 | X	WORD wmem; | 
|  | 707 | X | 
|  | 708 | X	mem >>= 8; | 
|  | 709 | X	mem &= 0xfff; | 
|  | 710 | X	wmem = (WORD)mem; | 
|  | 711 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 712 | X		return -EIO; | 
|  | 713 | X	if (msnd_write_cfg(cfg, IREG_MEMBASEHI, HIBYTE(wmem))) | 
|  | 714 | X		return -EIO; | 
|  | 715 | X	if (msnd_write_cfg(cfg, IREG_MEMBASELO, LOBYTE(wmem))) | 
|  | 716 | X		return -EIO; | 
|  | 717 | X	if (wmem && msnd_write_cfg(cfg, IREG_MEMCONTROL, (MEMTYPE_HIADDR | MEMTYPE_16BIT))) | 
|  | 718 | X		return -EIO; | 
|  | 719 | X	return 0; | 
|  | 720 | } | 
|  | 721 | X | 
|  | 722 | static int msnd_read_cfg_mem(int cfg, int num, int *mem) | 
|  | 723 | { | 
|  | 724 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 725 | X		return -EIO; | 
|  | 726 | X | 
|  | 727 | X	*mem = MAKEWORD(msnd_read_cfg(cfg, IREG_MEMBASELO), | 
|  | 728 | X			msnd_read_cfg(cfg, IREG_MEMBASEHI)); | 
|  | 729 | X	*mem <<= 8; | 
|  | 730 | X | 
|  | 731 | X	return 0; | 
|  | 732 | } | 
|  | 733 | X | 
|  | 734 | static int msnd_activate_logical(int cfg, int num) | 
|  | 735 | { | 
|  | 736 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 737 | X		return -EIO; | 
|  | 738 | X	if (msnd_write_cfg(cfg, IREG_ACTIVATE, LD_ACTIVATE)) | 
|  | 739 | X		return -EIO; | 
|  | 740 | X	return 0; | 
|  | 741 | } | 
|  | 742 | X | 
|  | 743 | static int msnd_write_cfg_logical(int cfg, int num, WORD io0, WORD io1, WORD irq, int mem) | 
|  | 744 | { | 
|  | 745 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 746 | X		return -EIO; | 
|  | 747 | X	if (msnd_write_cfg_io0(cfg, num, io0)) | 
|  | 748 | X		return -EIO; | 
|  | 749 | X	if (msnd_write_cfg_io1(cfg, num, io1)) | 
|  | 750 | X		return -EIO; | 
|  | 751 | X	if (msnd_write_cfg_irq(cfg, num, irq)) | 
|  | 752 | X		return -EIO; | 
|  | 753 | X	if (msnd_write_cfg_mem(cfg, num, mem)) | 
|  | 754 | X		return -EIO; | 
|  | 755 | X	if (msnd_activate_logical(cfg, num)) | 
|  | 756 | X		return -EIO; | 
|  | 757 | X	return 0; | 
|  | 758 | } | 
|  | 759 | X | 
|  | 760 | static int msnd_read_cfg_logical(int cfg, int num, WORD *io0, WORD *io1, WORD *irq, int *mem) | 
|  | 761 | { | 
|  | 762 | X	if (msnd_write_cfg(cfg, IREG_LOGDEVICE, num)) | 
|  | 763 | X		return -EIO; | 
|  | 764 | X	if (msnd_read_cfg_io0(cfg, num, io0)) | 
|  | 765 | X		return -EIO; | 
|  | 766 | X	if (msnd_read_cfg_io1(cfg, num, io1)) | 
|  | 767 | X		return -EIO; | 
|  | 768 | X	if (msnd_read_cfg_irq(cfg, num, irq)) | 
|  | 769 | X		return -EIO; | 
|  | 770 | X	if (msnd_read_cfg_mem(cfg, num, mem)) | 
|  | 771 | X		return -EIO; | 
|  | 772 | X	return 0; | 
|  | 773 | } | 
|  | 774 | X | 
|  | 775 | static void usage(void) | 
|  | 776 | { | 
|  | 777 | X	fprintf(stderr, | 
|  | 778 | X		"\n" | 
|  | 779 | X		"pinnaclecfg 1.0\n" | 
|  | 780 | X		"\n" | 
|  | 781 | X		"usage: pinnaclecfg <config port> [device config]\n" | 
|  | 782 | X		"\n" | 
|  | 783 | X		"This is for use with the card in NON-PnP mode only.\n" | 
|  | 784 | X		"\n" | 
|  | 785 | X		"Available devices (not all available for Fiji):\n" | 
|  | 786 | X		"\n" | 
|  | 787 | X		"        Device                       Description\n" | 
|  | 788 | X		"        -------------------------------------------------------------------\n" | 
|  | 789 | X		"        reset                        Reset all devices (i.e. disable)\n" | 
|  | 790 | X		"        show                         Display current device configurations\n" | 
|  | 791 | X		"\n" | 
|  | 792 | X		"        dsp <io> <irq> <mem>         Audio device\n" | 
|  | 793 | X		"        mpu <io> <irq>               Internal Kurzweil synth\n" | 
|  | 794 | X		"        ide <io0> <io1> <irq>        On-board IDE controller\n" | 
|  | 795 | X		"        joystick <io>                Joystick port\n" | 
|  | 796 | X		"\n"); | 
|  | 797 | X	exit(1); | 
|  | 798 | } | 
|  | 799 | X | 
|  | 800 | static int cfg_reset(void) | 
|  | 801 | { | 
|  | 802 | X	int i; | 
|  | 803 | X | 
|  | 804 | X	for (i = 0; i < 4; ++i) | 
|  | 805 | X		msnd_write_cfg_logical(config_port, i, 0, 0, 0, 0); | 
|  | 806 | X | 
|  | 807 | X	return 0; | 
|  | 808 | } | 
|  | 809 | X | 
|  | 810 | static int cfg_show(void) | 
|  | 811 | { | 
|  | 812 | X	int i; | 
|  | 813 | X	int count = 0; | 
|  | 814 | X | 
|  | 815 | X	for (i = 0; i < 4; ++i) { | 
|  | 816 | X		WORD io0, io1, irq; | 
|  | 817 | X		int mem; | 
|  | 818 | X		msnd_read_cfg_logical(config_port, i, &io0, &io1, &irq, &mem); | 
|  | 819 | X		switch (i) { | 
|  | 820 | X		case 0: | 
|  | 821 | X			if (io0 || irq || mem) { | 
|  | 822 | X				printf("dsp 0x%x %d 0x%x\n", io0, irq, mem); | 
|  | 823 | X				++count; | 
|  | 824 | X			} | 
|  | 825 | X			break; | 
|  | 826 | X		case 1: | 
|  | 827 | X			if (io0 || irq) { | 
|  | 828 | X				printf("mpu 0x%x %d\n", io0, irq); | 
|  | 829 | X				++count; | 
|  | 830 | X			} | 
|  | 831 | X			break; | 
|  | 832 | X		case 2: | 
|  | 833 | X			if (io0 || io1 || irq) { | 
|  | 834 | X				printf("ide 0x%x 0x%x %d\n", io0, io1, irq); | 
|  | 835 | X				++count; | 
|  | 836 | X			} | 
|  | 837 | X			break; | 
|  | 838 | X		case 3: | 
|  | 839 | X			if (io0) { | 
|  | 840 | X				printf("joystick 0x%x\n", io0); | 
|  | 841 | X				++count; | 
|  | 842 | X			} | 
|  | 843 | X			break; | 
|  | 844 | X		} | 
|  | 845 | X	} | 
|  | 846 | X | 
|  | 847 | X	if (count == 0) | 
|  | 848 | X		fprintf(stderr, "no devices configured\n"); | 
|  | 849 | X | 
|  | 850 | X	return 0; | 
|  | 851 | } | 
|  | 852 | X | 
|  | 853 | static int cfg_dsp(int argc, char *argv[]) | 
|  | 854 | { | 
|  | 855 | X	int io, irq, mem; | 
|  | 856 | X | 
|  | 857 | X	if (argc < 3 || | 
|  | 858 | X	    sscanf(argv[0], "0x%x", &io) != 1 || | 
|  | 859 | X	    sscanf(argv[1], "%d", &irq) != 1 || | 
|  | 860 | X	    sscanf(argv[2], "0x%x", &mem) != 1) | 
|  | 861 | X		usage(); | 
|  | 862 | X | 
|  | 863 | X	if (!(io == 0x290 || | 
|  | 864 | X	      io == 0x260 || | 
|  | 865 | X	      io == 0x250 || | 
|  | 866 | X	      io == 0x240 || | 
|  | 867 | X	      io == 0x230 || | 
|  | 868 | X	      io == 0x220 || | 
|  | 869 | X	      io == 0x210 || | 
|  | 870 | X	      io == 0x3e0)) { | 
|  | 871 | X		fprintf(stderr, "error: io must be one of " | 
|  | 872 | X			"210, 220, 230, 240, 250, 260, 290, or 3E0\n"); | 
|  | 873 | X		usage(); | 
|  | 874 | X	} | 
|  | 875 | X | 
|  | 876 | X	if (!(irq == 5 || | 
|  | 877 | X	      irq == 7 || | 
|  | 878 | X	      irq == 9 || | 
|  | 879 | X	      irq == 10 || | 
|  | 880 | X	      irq == 11 || | 
|  | 881 | X	      irq == 12)) { | 
|  | 882 | X		fprintf(stderr, "error: irq must be one of " | 
|  | 883 | X			"5, 7, 9, 10, 11 or 12\n"); | 
|  | 884 | X		usage(); | 
|  | 885 | X	} | 
|  | 886 | X | 
|  | 887 | X	if (!(mem == 0xb0000 || | 
|  | 888 | X	      mem == 0xc8000 || | 
|  | 889 | X	      mem == 0xd0000 || | 
|  | 890 | X	      mem == 0xd8000 || | 
|  | 891 | X	      mem == 0xe0000 || | 
|  | 892 | X	      mem == 0xe8000)) { | 
|  | 893 | X		fprintf(stderr, "error: mem must be one of " | 
|  | 894 | X			"0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or 0xe8000\n"); | 
|  | 895 | X		usage(); | 
|  | 896 | X	} | 
|  | 897 | X | 
|  | 898 | X	return msnd_write_cfg_logical(config_port, 0, io, 0, irq, mem); | 
|  | 899 | } | 
|  | 900 | X | 
|  | 901 | static int cfg_mpu(int argc, char *argv[]) | 
|  | 902 | { | 
|  | 903 | X	int io, irq; | 
|  | 904 | X | 
|  | 905 | X	if (argc < 2 || | 
|  | 906 | X	    sscanf(argv[0], "0x%x", &io) != 1 || | 
|  | 907 | X	    sscanf(argv[1], "%d", &irq) != 1) | 
|  | 908 | X		usage(); | 
|  | 909 | X | 
|  | 910 | X	return msnd_write_cfg_logical(config_port, 1, io, 0, irq, 0); | 
|  | 911 | } | 
|  | 912 | X | 
|  | 913 | static int cfg_ide(int argc, char *argv[]) | 
|  | 914 | { | 
|  | 915 | X	int io0, io1, irq; | 
|  | 916 | X | 
|  | 917 | X	if (argc < 3 || | 
|  | 918 | X	    sscanf(argv[0], "0x%x", &io0) != 1 || | 
|  | 919 | X	    sscanf(argv[0], "0x%x", &io1) != 1 || | 
|  | 920 | X	    sscanf(argv[1], "%d", &irq) != 1) | 
|  | 921 | X		usage(); | 
|  | 922 | X | 
|  | 923 | X	return msnd_write_cfg_logical(config_port, 2, io0, io1, irq, 0); | 
|  | 924 | } | 
|  | 925 | X | 
|  | 926 | static int cfg_joystick(int argc, char *argv[]) | 
|  | 927 | { | 
|  | 928 | X	int io; | 
|  | 929 | X | 
|  | 930 | X	if (argc < 1 || | 
|  | 931 | X	    sscanf(argv[0], "0x%x", &io) != 1) | 
|  | 932 | X		usage(); | 
|  | 933 | X | 
|  | 934 | X	return msnd_write_cfg_logical(config_port, 3, io, 0, 0, 0); | 
|  | 935 | } | 
|  | 936 | X | 
|  | 937 | int main(int argc, char *argv[]) | 
|  | 938 | { | 
|  | 939 | X	char *device; | 
|  | 940 | X	int rv = 0; | 
|  | 941 | X | 
|  | 942 | X	--argc; ++argv; | 
|  | 943 | X | 
|  | 944 | X	if (argc < 2) | 
|  | 945 | X		usage(); | 
|  | 946 | X | 
|  | 947 | X	sscanf(argv[0], "0x%x", &config_port); | 
|  | 948 | X	if (config_port != 0x250 && config_port != 0x260 && config_port != 0x270) { | 
|  | 949 | X		fprintf(stderr, "error: <config port> must be 0x250, 0x260 or 0x270\n"); | 
|  | 950 | X		exit(1); | 
|  | 951 | X	} | 
|  | 952 | X	if (ioperm(config_port, 2, 1)) { | 
|  | 953 | X		perror("ioperm"); | 
|  | 954 | X		fprintf(stderr, "note: pinnaclecfg must be run as root\n"); | 
|  | 955 | X		exit(1); | 
|  | 956 | X	} | 
|  | 957 | X	device = argv[1]; | 
|  | 958 | X | 
|  | 959 | X	argc -= 2; argv += 2; | 
|  | 960 | X | 
|  | 961 | X	if (strcmp(device, "reset") == 0) | 
|  | 962 | X		rv = cfg_reset(); | 
|  | 963 | X	else if (strcmp(device, "show") == 0) | 
|  | 964 | X		rv = cfg_show(); | 
|  | 965 | X	else if (strcmp(device, "dsp") == 0) | 
|  | 966 | X		rv = cfg_dsp(argc, argv); | 
|  | 967 | X	else if (strcmp(device, "mpu") == 0) | 
|  | 968 | X		rv = cfg_mpu(argc, argv); | 
|  | 969 | X	else if (strcmp(device, "ide") == 0) | 
|  | 970 | X		rv = cfg_ide(argc, argv); | 
|  | 971 | X	else if (strcmp(device, "joystick") == 0) | 
|  | 972 | X		rv = cfg_joystick(argc, argv); | 
|  | 973 | X	else { | 
|  | 974 | X		fprintf(stderr, "error: unknown device %s\n", device); | 
|  | 975 | X		usage(); | 
|  | 976 | X	} | 
|  | 977 | X | 
|  | 978 | X	if (rv) | 
|  | 979 | X		fprintf(stderr, "error: device configuration failed\n"); | 
|  | 980 | X | 
|  | 981 | X	return 0; | 
|  | 982 | } | 
|  | 983 | SHAR_EOF | 
|  | 984 | $shar_touch -am 1204092598 'MultiSound.d/pinnaclecfg.c' && | 
|  | 985 | chmod 0664 'MultiSound.d/pinnaclecfg.c' || | 
|  | 986 | $echo 'restore of' 'MultiSound.d/pinnaclecfg.c' 'failed' | 
|  | 987 | if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ | 
|  | 988 | && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then | 
|  | 989 | md5sum -c << SHAR_EOF >/dev/null 2>&1 \ | 
|  | 990 | || $echo 'MultiSound.d/pinnaclecfg.c:' 'MD5 check failed' | 
|  | 991 | 366bdf27f0db767a3c7921d0a6db20fe  MultiSound.d/pinnaclecfg.c | 
|  | 992 | SHAR_EOF | 
|  | 993 | else | 
|  | 994 | shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/pinnaclecfg.c'`" | 
|  | 995 | test 10235 -eq "$shar_count" || | 
|  | 996 | $echo 'MultiSound.d/pinnaclecfg.c:' 'original size' '10235,' 'current size' "$shar_count!" | 
|  | 997 | fi | 
|  | 998 | fi | 
|  | 999 | # ============= MultiSound.d/Makefile ============== | 
|  | 1000 | if test -f 'MultiSound.d/Makefile' && test "$first_param" != -c; then | 
|  | 1001 | $echo 'x -' SKIPPING 'MultiSound.d/Makefile' '(file already exists)' | 
|  | 1002 | else | 
|  | 1003 | $echo 'x -' extracting 'MultiSound.d/Makefile' '(text)' | 
|  | 1004 | sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/Makefile' && | 
|  | 1005 | CC	= gcc | 
|  | 1006 | CFLAGS	= -O | 
|  | 1007 | PROGS	= setdigital msndreset pinnaclecfg conv | 
|  | 1008 | X | 
|  | 1009 | all: $(PROGS) | 
|  | 1010 | X | 
|  | 1011 | clean: | 
|  | 1012 | X	rm -f $(PROGS) | 
|  | 1013 | SHAR_EOF | 
|  | 1014 | $shar_touch -am 1204092398 'MultiSound.d/Makefile' && | 
|  | 1015 | chmod 0664 'MultiSound.d/Makefile' || | 
|  | 1016 | $echo 'restore of' 'MultiSound.d/Makefile' 'failed' | 
|  | 1017 | if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ | 
|  | 1018 | && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then | 
|  | 1019 | md5sum -c << SHAR_EOF >/dev/null 2>&1 \ | 
|  | 1020 | || $echo 'MultiSound.d/Makefile:' 'MD5 check failed' | 
|  | 1021 | 76ca8bb44e3882edcf79c97df6c81845  MultiSound.d/Makefile | 
|  | 1022 | SHAR_EOF | 
|  | 1023 | else | 
|  | 1024 | shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/Makefile'`" | 
|  | 1025 | test 106 -eq "$shar_count" || | 
|  | 1026 | $echo 'MultiSound.d/Makefile:' 'original size' '106,' 'current size' "$shar_count!" | 
|  | 1027 | fi | 
|  | 1028 | fi | 
|  | 1029 | # ============= MultiSound.d/conv.l ============== | 
|  | 1030 | if test -f 'MultiSound.d/conv.l' && test "$first_param" != -c; then | 
|  | 1031 | $echo 'x -' SKIPPING 'MultiSound.d/conv.l' '(file already exists)' | 
|  | 1032 | else | 
|  | 1033 | $echo 'x -' extracting 'MultiSound.d/conv.l' '(text)' | 
|  | 1034 | sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/conv.l' && | 
|  | 1035 | %% | 
|  | 1036 | [ \n\t,\r] | 
|  | 1037 | \;.* | 
|  | 1038 | DB | 
|  | 1039 | [0-9A-Fa-f]+H	{ int n; sscanf(yytext, "%xH", &n); printf("%c", n); } | 
|  | 1040 | %% | 
|  | 1041 | int yywrap() { return 1; } | 
|  | 1042 | main() { yylex(); } | 
|  | 1043 | SHAR_EOF | 
|  | 1044 | $shar_touch -am 0828231798 'MultiSound.d/conv.l' && | 
|  | 1045 | chmod 0664 'MultiSound.d/conv.l' || | 
|  | 1046 | $echo 'restore of' 'MultiSound.d/conv.l' 'failed' | 
|  | 1047 | if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ | 
|  | 1048 | && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then | 
|  | 1049 | md5sum -c << SHAR_EOF >/dev/null 2>&1 \ | 
|  | 1050 | || $echo 'MultiSound.d/conv.l:' 'MD5 check failed' | 
|  | 1051 | d2411fc32cd71a00dcdc1f009e858dd2  MultiSound.d/conv.l | 
|  | 1052 | SHAR_EOF | 
|  | 1053 | else | 
|  | 1054 | shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/conv.l'`" | 
|  | 1055 | test 141 -eq "$shar_count" || | 
|  | 1056 | $echo 'MultiSound.d/conv.l:' 'original size' '141,' 'current size' "$shar_count!" | 
|  | 1057 | fi | 
|  | 1058 | fi | 
|  | 1059 | # ============= MultiSound.d/msndreset.c ============== | 
|  | 1060 | if test -f 'MultiSound.d/msndreset.c' && test "$first_param" != -c; then | 
|  | 1061 | $echo 'x -' SKIPPING 'MultiSound.d/msndreset.c' '(file already exists)' | 
|  | 1062 | else | 
|  | 1063 | $echo 'x -' extracting 'MultiSound.d/msndreset.c' '(text)' | 
|  | 1064 | sed 's/^X//' << 'SHAR_EOF' > 'MultiSound.d/msndreset.c' && | 
|  | 1065 | /********************************************************************* | 
|  | 1066 | X * | 
|  | 1067 | X * msndreset.c - resets the MultiSound card | 
|  | 1068 | X * | 
|  | 1069 | X * Copyright (C) 1998 Andrew Veliath | 
|  | 1070 | X * | 
|  | 1071 | X * This program is free software; you can redistribute it and/or modify | 
|  | 1072 | X * it under the terms of the GNU General Public License as published by | 
|  | 1073 | X * the Free Software Foundation; either version 2 of the License, or | 
|  | 1074 | X * (at your option) any later version. | 
|  | 1075 | X * | 
|  | 1076 | X * This program is distributed in the hope that it will be useful, | 
|  | 1077 | X * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 1078 | X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 1079 | X * GNU General Public License for more details. | 
|  | 1080 | X * | 
|  | 1081 | X * You should have received a copy of the GNU General Public License | 
|  | 1082 | X * along with this program; if not, write to the Free Software | 
|  | 1083 | X * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
|  | 1084 | X * | 
|  | 1085 | X ********************************************************************/ | 
|  | 1086 | X | 
|  | 1087 | #include <stdio.h> | 
|  | 1088 | #include <unistd.h> | 
|  | 1089 | #include <fcntl.h> | 
|  | 1090 | #include <sys/types.h> | 
|  | 1091 | #include <sys/stat.h> | 
|  | 1092 | #include <sys/ioctl.h> | 
|  | 1093 | #include <sys/soundcard.h> | 
|  | 1094 | X | 
|  | 1095 | int main(int argc, char *argv[]) | 
|  | 1096 | { | 
|  | 1097 | X	int fd; | 
|  | 1098 | X | 
|  | 1099 | X	if (argc != 2) { | 
|  | 1100 | X		fprintf(stderr, "usage: msndreset <mixer device>\n"); | 
|  | 1101 | X		exit(1); | 
|  | 1102 | X	} | 
|  | 1103 | X | 
|  | 1104 | X	if ((fd = open(argv[1], O_RDWR)) < 0) { | 
|  | 1105 | X		perror(argv[1]); | 
|  | 1106 | X		exit(1); | 
|  | 1107 | X	} | 
|  | 1108 | X | 
|  | 1109 | X	if (ioctl(fd, SOUND_MIXER_PRIVATE1, 0) < 0) { | 
|  | 1110 | X		fprintf(stderr, "error: msnd ioctl reset failed\n"); | 
|  | 1111 | X		perror("ioctl"); | 
|  | 1112 | X		close(fd); | 
|  | 1113 | X		exit(1); | 
|  | 1114 | X	} | 
|  | 1115 | X | 
|  | 1116 | X	close(fd); | 
|  | 1117 | X | 
|  | 1118 | X	return 0; | 
|  | 1119 | } | 
|  | 1120 | SHAR_EOF | 
|  | 1121 | $shar_touch -am 1204100698 'MultiSound.d/msndreset.c' && | 
|  | 1122 | chmod 0664 'MultiSound.d/msndreset.c' || | 
|  | 1123 | $echo 'restore of' 'MultiSound.d/msndreset.c' 'failed' | 
|  | 1124 | if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ | 
|  | 1125 | && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then | 
|  | 1126 | md5sum -c << SHAR_EOF >/dev/null 2>&1 \ | 
|  | 1127 | || $echo 'MultiSound.d/msndreset.c:' 'MD5 check failed' | 
|  | 1128 | c52f876521084e8eb25e12e01dcccb8a  MultiSound.d/msndreset.c | 
|  | 1129 | SHAR_EOF | 
|  | 1130 | else | 
|  | 1131 | shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'MultiSound.d/msndreset.c'`" | 
|  | 1132 | test 1472 -eq "$shar_count" || | 
|  | 1133 | $echo 'MultiSound.d/msndreset.c:' 'original size' '1472,' 'current size' "$shar_count!" | 
|  | 1134 | fi | 
|  | 1135 | fi | 
|  | 1136 | rm -fr _sh01426 | 
|  | 1137 | exit 0 |