minix/drivers/sb16/common/sb16.h
Cristiano Giuffrida 48c6bb79f4 Driver refactory for live update and crash recovery.
SYSLIB CHANGES:
- DS calls to publish / retrieve labels consider endpoints instead of u32_t.

VFS CHANGES:
- mapdriver() only adds an entry in the dmap table in VFS.
- dev_up() is only executed upon reception of a driver up event.

INET CHANGES:
- INET no longer searches for existing drivers instances at startup.
- A newtwork driver is (re)initialized upon reception of a driver up event.
- Networking startup is now race-free by design. No need to waste 5 seconds
at startup any more.

DRIVER CHANGES:
- Every driver publishes driver up events when starting for the first time or
in case of restart when recovery actions must be taken in the upper layers.
- Driver up events are published by drivers through DS. 
- For regular drivers, VFS is normally the only subscriber, but not necessarily.
For instance, when the filter driver is in use, it must subscribe to driver
up events to initiate recovery.
- For network drivers, inet is the only subscriber for now.
- Every VFS driver is statically linked with libdriver, every network driver
is statically linked with libnetdriver.

DRIVER LIBRARIES CHANGES:
- Libdriver is extended to provide generic receive() and ds_publish() interfaces
for VFS drivers.
- driver_receive() is a wrapper for sef_receive() also used in driver_task()
to discard spurious messages that were meant to be delivered to a previous
version of the driver.
- driver_receive_mq() is the same as driver_receive() but integrates support
for queued messages.
- driver_announce() publishes a driver up event for VFS drivers and marks
the driver as initialized and expecting a DEV_OPEN message.
- Libnetdriver is introduced to provide similar receive() and ds_publish()
interfaces for network drivers (netdriver_announce() and netdriver_receive()).
- Network drivers all support live update with no state transfer now.

KERNEL CHANGES:
- Added kernel call statectl for state management. Used by driver_announce() to
unblock eventual callers sendrecing to the driver.
2010-04-08 13:41:35 +00:00

183 lines
6.2 KiB
C

#ifndef SB16_H
#define SB16_H
#include <minix/drivers.h>
#include <minix/driver.h>
#include <sys/ioc_sound.h>
#include <minix/sound.h>
#define SB_TIMEOUT 32000 /* timeout count */
/* IRQ, base address and DMA channels */
#define SB_IRQ 7
#define SB_BASE_ADDR 0x220 /* 0x210, 0x220, 0x230, 0x240,
* 0x250, 0x260, 0x280
*/
#define SB_DMA_8 1 /* 0, 1, 3 */
#define SB_DMA_16 5 /* 5, 6, 7 */
#if _WORD_SIZE == 2
#define DMA_SIZE 8192 /* Dma buffer MUST BE MULTIPLE OF 2 */
#else
#define DMA_SIZE (64 * 1024) /* Dma buffer MUST BE MULTIPLE OF 2 */
#endif
/* Some defaults for the DSP */
#define DEFAULT_SPEED 22050 /* Sample rate */
#define DEFAULT_BITS 8 /* Nr. of bits */
#define DEFAULT_SIGN 0 /* 0 = unsigned, 1 = signed */
#define DEFAULT_STEREO 0 /* 0 = mono, 1 = stereo */
/* DMA port addresses */
#define DMA8_ADDR (((SB_DMA_8 & 3) << 1) + 0x00)
#define DMA8_COUNT (((SB_DMA_8 & 3) << 1) + 0x01)
#define DMA8_MASK 0x0A
#define DMA8_MODE 0x0B
#define DMA8_CLEAR 0x0C
/* If after this preprocessing stuff DMA8_PAGE is not defined
* the 8-bit DMA channel specified is not valid
*/
#if SB_DMA_8 == 0
# define DMA8_PAGE 0x87
#else
# if SB_DMA_8 == 1
# define DMA8_PAGE 0x83
# else
# if SB_DMA_8 == 3
# define DMA8_PAGE 0x82
# endif
# endif
#endif
#define DMA16_ADDR (((SB_DMA_16 & 3) << 2) + 0xC0)
#define DMA16_COUNT (((SB_DMA_16 & 3) << 2) + 0xC2)
#define DMA16_MASK 0xD4
#define DMA16_MODE 0xD6
#define DMA16_CLEAR 0xD8
/* If after this preprocessing stuff DMA16_PAGE is not defined
* the 16-bit DMA channel specified is not valid
*/
#if SB_DMA_16 == 5
# define DMA16_PAGE 0x8B
#else
# if SB_DMA_16 == 6
# define DMA16_PAGE 0x89
# else
# if SB_DMA_16 == 7
# define DMA16_PAGE 0x8A
# endif
# endif
#endif
/* DMA modes */
#define DMA16_AUTO_PLAY (0x58 + (SB_DMA_16 & 3))
#define DMA16_AUTO_REC (0x54 + (SB_DMA_16 & 3))
#define DMA8_AUTO_PLAY (0x58 + SB_DMA_8)
#define DMA8_AUTO_REC (0x54 + SB_DMA_8)
/* IO ports for soundblaster */
#define DSP_RESET (0x6 + SB_BASE_ADDR)
#define DSP_READ (0xA + SB_BASE_ADDR)
#define DSP_WRITE (0xC + SB_BASE_ADDR)
#define DSP_COMMAND (0xC + SB_BASE_ADDR)
#define DSP_STATUS (0xC + SB_BASE_ADDR)
#define DSP_DATA_AVL (0xE + SB_BASE_ADDR)
#define DSP_DATA16_AVL (0xF + SB_BASE_ADDR)
#define MIXER_REG (0x4 + SB_BASE_ADDR)
#define MIXER_DATA (0x5 + SB_BASE_ADDR)
#define OPL3_LEFT (0x0 + SB_BASE_ADDR)
#define OPL3_RIGHT (0x2 + SB_BASE_ADDR)
#define OPL3_BOTH (0x8 + SB_BASE_ADDR)
/* DSP Commands */
#define DSP_INPUT_RATE 0x42 /* set input sample rate */
#define DSP_OUTPUT_RATE 0x41 /* set output sample rate */
#define DSP_CMD_SPKON 0xD1 /* set speaker on */
#define DSP_CMD_SPKOFF 0xD3 /* set speaker off */
#define DSP_CMD_DMA8HALT 0xD0 /* halt DMA 8-bit operation */
#define DSP_CMD_DMA8CONT 0xD4 /* continue DMA 8-bit operation */
#define DSP_CMD_DMA16HALT 0xD5 /* halt DMA 16-bit operation */
#define DSP_CMD_DMA16CONT 0xD6 /* continue DMA 16-bit operation */
#define DSP_GET_VERSION 0xE1 /* get version number of DSP */
#define DSP_CMD_8BITAUTO_IN 0xCE /* 8 bit auto-initialized input */
#define DSP_CMD_8BITAUTO_OUT 0xC6 /* 8 bit auto-initialized output */
#define DSP_CMD_16BITAUTO_IN 0xBE /* 16 bit auto-initialized input */
#define DSP_CMD_16BITAUTO_OUT 0xB6 /* 16 bit auto-initialized output */
#define DSP_CMD_IRQREQ8 0xF2 /* Interrupt request 8 bit */
#define DSP_CMD_IRQREQ16 0xF3 /* Interrupt request 16 bit */
/* DSP Modes */
#define DSP_MODE_MONO_US 0x00 /* Mono unsigned */
#define DSP_MODE_MONO_S 0x10 /* Mono signed */
#define DSP_MODE_STEREO_US 0x20 /* Stereo unsigned */
#define DSP_MODE_STEREO_S 0x30 /* Stereo signed */
/* MIXER commands */
#define MIXER_RESET 0x00 /* Reset */
#define MIXER_DAC_LEVEL 0x04 /* Used for detection only */
#define MIXER_MASTER_LEFT 0x30 /* Master volume left */
#define MIXER_MASTER_RIGHT 0x31 /* Master volume right */
#define MIXER_DAC_LEFT 0x32 /* Dac level left */
#define MIXER_DAC_RIGHT 0x33 /* Dac level right */
#define MIXER_FM_LEFT 0x34 /* Fm level left */
#define MIXER_FM_RIGHT 0x35 /* Fm level right */
#define MIXER_CD_LEFT 0x36 /* Cd audio level left */
#define MIXER_CD_RIGHT 0x37 /* Cd audio level right */
#define MIXER_LINE_LEFT 0x38 /* Line in level left */
#define MIXER_LINE_RIGHT 0x39 /* Line in level right */
#define MIXER_MIC_LEVEL 0x3A /* Microphone level */
#define MIXER_PC_LEVEL 0x3B /* Pc speaker level */
#define MIXER_OUTPUT_CTRL 0x3C /* Output control */
#define MIXER_IN_LEFT 0x3D /* Input control left */
#define MIXER_IN_RIGHT 0x3E /* Input control right */
#define MIXER_GAIN_IN_LEFT 0x3F /* Input gain control left */
#define MIXER_GAIN_IN_RIGHT 0x40 /* Input gain control right */
#define MIXER_GAIN_OUT_LEFT 0x41 /* Output gain control left */
#define MIXER_GAIN_OUT_RIGHT 0x42 /* Output gain control rigth */
#define MIXER_AGC 0x43 /* Automatic gain control */
#define MIXER_TREBLE_LEFT 0x44 /* Treble left */
#define MIXER_TREBLE_RIGHT 0x45 /* Treble right */
#define MIXER_BASS_LEFT 0x46 /* Bass left */
#define MIXER_BASS_RIGHT 0x47 /* Bass right */
#define MIXER_SET_IRQ 0x80 /* Set irq number */
#define MIXER_SET_DMA 0x81 /* Set DMA channels */
#define MIXER_IRQ_STATUS 0x82 /* Irq status */
/* Mixer constants */
#define MIC 0x01 /* Microphone */
#define CD_RIGHT 0x02
#define CD_LEFT 0x04
#define LINE_RIGHT 0x08
#define LINE_LEFT 0x10
#define FM_RIGHT 0x20
#define FM_LEFT 0x40
/* DSP constants */
#define DMA_NR_OF_BUFFERS 2
#define DSP_MAX_SPEED 44100 /* Max sample speed in KHz */
#define DSP_MIN_SPEED 4000 /* Min sample speed in KHz */
#define DSP_MAX_FRAGMENT_SIZE (DMA_SIZE / DMA_NR_OF_BUFFERS) /* Maximum fragment size */
#define DSP_MIN_FRAGMENT_SIZE 1024 /* Minimum fragment size */
#define DSP_NR_OF_BUFFERS 8
/* Number of bytes you can DMA before hitting a 64K boundary: */
#define dma_bytes_left(phys) \
((unsigned) (sizeof(int) == 2 ? 0 : 0x10000) - (unsigned) ((phys) & 0xFFFF))
_PROTOTYPE(int mixer_set, (int reg, int data));
_PROTOTYPE( int sb16_inb, (int port) );
_PROTOTYPE( void sb16_outb, (int port, int value) );
#endif /* SB16_H */