Support for the OPTi 82C931 chip
--------------------------------
Note: parts of this README file apply also to other
cards that use the mad16 driver.

Some items in this README file are based on features
added to the sound driver after Linux-2.1.91 was out.
By the time of writing this I do not know which official
kernel release will include these features.
Please do not report inconsistencies on older Linux
kernels.

The OPTi 82C931 is supported in its non-PnP mode.
Usually you do not need to set jumpers, etc. The sound driver
will check the card status and if it is required it will
force the card into a mode in which it can be programmed.

If you have another OS installed on your computer it is recommended
that Linux and the other OS use the same resources.

Also, it is recommended that resources specified in /etc/modprobe.d/*.conf
and resources specified in /etc/isapnp.conf agree.

Compiling the sound driver
--------------------------
I highly recommend that you build a modularized sound driver.
This document does not cover a sound-driver which is built in
the kernel.

Sound card support should be enabled as a module (chose m).
Answer 'm' for  these items:
  Generic OPL2/OPL3 FM synthesizer support		(CONFIG_SOUND_ADLIB)
  Microsoft Sound System support			(CONFIG_SOUND_MSS)
  Support for OPTi MAD16 and/or Mozart based cards	(CONFIG_SOUND_MAD16)
  FM synthesizer (YM3812/OPL-3) support			(CONFIG_SOUND_YM3812)

The configuration menu may ask for addresses, IRQ lines or DMA
channels. If the card is used as a module the module loading
options will override these values.

For the OPTi 931 you can answer 'n' to:
  Support MIDI in older MAD16 based cards (requires SB)	(CONFIG_SOUND_MAD16_OLDCARD)
If you do need MIDI support in a Mozart or C928 based card you
need to answer 'm' to the above question. In that case you will
also need to answer 'm' to:
  '100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support' (CONFIG_SOUND_SB)

Go on and compile your kernel and modules. Install the modules. Run depmod -a.

Using isapnptools
-----------------
In most systems with a PnP BIOS you do not need to use isapnp. The
initialization provided by the BIOS is sufficient for the driver
to pick up the card and continue initialization.

If that fails, or if you have other PnP cards, you need to use isapnp
to initialize the card.
This was tested with isapnptools-1.11 but I recommend that you use
isapnptools-1.13 (or newer). Run pnpdump to dump the information
about your PnP cards. Then edit the resulting file and select
the options of your choice. This file is normally installed as
/etc/isapnp.conf.

The driver has one limitation with respect to I/O port resources:
IO3 base must be 0x0E0C.  Although isapnp allows other ports, this
address is hard-coded into the driver.

Using kmod and autoloading the sound driver
-------------------------------------------
Config files in '/etc/modprobe.d/' are used as below:

alias mixer0 mad16
alias audio0 mad16
alias midi0  mad16
alias synth0 opl3
options sb mad16=1
options mad16 irq=10 dma=0 dma16=1 io=0x530 joystick=1 cdtype=0
options opl3 io=0x388
install mad16 /sbin/modprobe -i mad16 && /sbin/ad1848_mixer_reroute 14 8 15 3 16 6

If you have an MPU daughtercard or onboard MPU you will want to add to the
"options mad16" line - eg 

options mad16 irq=5 dma=0 dma16=3 io=0x530 mpu_io=0x330 mpu_irq=9

To set the I/O and IRQ of the MPU.


Explain:

alias mixer0 mad16
alias audio0 mad16
alias midi0  mad16
alias synth0 opl3

When any sound device is opened the kernel requests auto-loading
of char-major-14. There is a built-in alias that translates this
request to loading the main sound module.

The sound module in its turn will request loading of a sub-driver
for mixer, audio, midi or synthesizer device. The first 3 are
supported by the mad16 driver. The synth device is supported
by the opl3 driver.

There is currently no way to autoload the sound device driver
if more than one card is installed.

options sb mad16=1

This is left for historical reasons. If you enable the
config option 'Support MIDI in older MAD16 based cards (requires SB)'
or if you use an older mad16 driver it will force loading of the
SoundBlaster driver. This option tells the SB driver not to look
for a SB card but to wait for the mad16 driver.

options mad16 irq=10 dma=0 dma16=1 io=0x530 joystick=1 cdtype=0
options opl3 io=0x388

post-install mad16 /sbin/ad1848_mixer_reroute 14 8 15 3 16 6

This sets resources and options for the mad16 and opl3 drivers.
I use two DMA channels (only one is required) to enable full duplex.
joystick=1 enables the joystick port. cdtype=0 disables the cd port.
You can also set mpu_io and mpu_irq in the mad16 options for the
uart401 driver.

This tells modprobe to run /sbin/ad1848_mixer_reroute after
mad16 is successfully loaded and initialized. The source
for ad1848_mixer_reroute is appended to the end of this readme
file. It is impossible for the sound driver to know the actual
connections to the mixer. The 3 inputs intended for cd, synth
and line-in are mapped to the generic inputs line1, line2 and
line3. This program reroutes these mixer channels to their
right names (note the right mapping depends on the actual sound
card that you use).
The numeric parameters mean:
 14=line1 8=cd    - reroute line1 to the CD input.
 15=line2 3=synth - reroute line2 to the synthesizer input.
 16=line3 6=line  - reroute line3 to the line input.
For reference on other input names look at the file
/usr/include/linux/soundcard.h.

Using a joystick
-----------------
You must enable a joystick in the mad16 options. (also
in /etc/isapnp.conf if you use it).
Tested with regular analog joysticks.

A CDROM drive connected to the sound card
-----------------------------------------
The 82C931 chip has support only for secondary ATAPI cdrom.
(cdtype=8). Loading the mad16 driver resets the C931 chip
and if a cdrom was already mounted it may cause a complete
system hang. Do not use the sound card if you have an alternative.
If you do use the sound card it is important that you load
the mad16 driver (use "modprobe mad16" to prevent auto-unloading)
before the cdrom is accessed the first time.

Using the sound driver built-in to the kernel may help here, but...
Most new systems have a PnP BIOS and also two IDE controllers.
The IDE controller on the sound card may be needed only on older
systems (which have only one IDE controller) but these systems
also do not have a PnP BIOS - requiring isapnptools and a modularized
driver.

Known problems
--------------
1. See the section on "A CDROM drive connected to the sound card".

2. On my system the codec cannot capture companded sound samples.
   (eg., recording from /dev/audio). When any companded capture is
   requested I get stereo-16 bit samples instead. Playback of
   companded samples works well. Apparently this problem is not common
   to all C931 based cards. I do not know how to identify cards that
   have this problem.

Source for ad1848_mixer_reroute.c
---------------------------------
#include <stdio.h>
#include <fcntl.h>
#include <linux/soundcard.h>

static char *mixer_names[SOUND_MIXER_NRDEVICES] =
	SOUND_DEVICE_LABELS;

int
main(int argc, char **argv) {
	int val, from, to;
	int i, fd;

	fd = open("/dev/mixer", O_RDWR);
	if(fd < 0) {
		perror("/dev/mixer");
		return 1;
	}

	for(i = 2; i < argc; i += 2) {
		from = atoi(argv[i-1]);
		to = atoi(argv[i]);

		if(to == SOUND_MIXER_NONE)
			fprintf(stderr, "%s: turning off mixer %s\n",
				argv[0], mixer_names[to]);
		else
			fprintf(stderr, "%s: rerouting mixer %s to %s\n",
				argv[0], mixer_names[from], mixer_names[to]);

		val = from << 8 | to;

		if(ioctl(fd, SOUND_MIXER_PRIVATE2, &val)) {
			perror("AD1848 mixer reroute");
			return 1;
		}
	}

	return 0;
}

