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