You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
390 lines
11 KiB
390 lines
11 KiB
/* |
|
* dev_table.h |
|
* |
|
* Global definitions for device call tables |
|
* |
|
* |
|
* Copyright (C) by Hannu Savolainen 1993-1997 |
|
* |
|
* OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL) |
|
* Version 2 (June 1991). See the "COPYING" file distributed with this software |
|
* for more info. |
|
*/ |
|
|
|
|
|
#ifndef _DEV_TABLE_H_ |
|
#define _DEV_TABLE_H_ |
|
|
|
#include <linux/spinlock.h> |
|
/* |
|
* Sound card numbers 27 to 999. (1 to 26 are defined in soundcard.h) |
|
* Numbers 1000 to N are reserved for driver's internal use. |
|
*/ |
|
|
|
#define SNDCARD_DESKPROXL 27 /* Compaq Deskpro XL */ |
|
#define SNDCARD_VIDC 28 /* ARMs VIDC */ |
|
#define SNDCARD_SBPNP 29 |
|
#define SNDCARD_SOFTOSS 36 |
|
#define SNDCARD_VMIDI 37 |
|
#define SNDCARD_OPL3SA1 38 /* Note: clash in msnd.h */ |
|
#define SNDCARD_OPL3SA1_SB 39 |
|
#define SNDCARD_OPL3SA1_MPU 40 |
|
#define SNDCARD_WAVEFRONT 41 |
|
#define SNDCARD_OPL3SA2 42 |
|
#define SNDCARD_OPL3SA2_MPU 43 |
|
#define SNDCARD_WAVEARTIST 44 /* Waveartist */ |
|
#define SNDCARD_OPL3SA2_MSS 45 /* Originally missed */ |
|
#define SNDCARD_AD1816 88 |
|
|
|
/* |
|
* NOTE! NOTE! NOTE! NOTE! |
|
* |
|
* If you modify this file, please check the dev_table.c also. |
|
* |
|
* NOTE! NOTE! NOTE! NOTE! |
|
*/ |
|
|
|
struct driver_info |
|
{ |
|
char *driver_id; |
|
int card_subtype; /* Driver specific. Usually 0 */ |
|
int card_type; /* From soundcard.h */ |
|
char *name; |
|
void (*attach) (struct address_info *hw_config); |
|
int (*probe) (struct address_info *hw_config); |
|
void (*unload) (struct address_info *hw_config); |
|
}; |
|
|
|
struct card_info |
|
{ |
|
int card_type; /* Link (search key) to the driver list */ |
|
struct address_info config; |
|
int enabled; |
|
void *for_driver_use; |
|
}; |
|
|
|
|
|
/* |
|
* Device specific parameters (used only by dmabuf.c) |
|
*/ |
|
#define MAX_SUB_BUFFERS (32*MAX_REALTIME_FACTOR) |
|
|
|
#define DMODE_NONE 0 |
|
#define DMODE_OUTPUT PCM_ENABLE_OUTPUT |
|
#define DMODE_INPUT PCM_ENABLE_INPUT |
|
|
|
struct dma_buffparms |
|
{ |
|
int dma_mode; /* DMODE_INPUT, DMODE_OUTPUT or DMODE_NONE */ |
|
int closing; |
|
|
|
/* |
|
* Pointers to raw buffers |
|
*/ |
|
|
|
char *raw_buf; |
|
unsigned long raw_buf_phys; |
|
int buffsize; |
|
|
|
/* |
|
* Device state tables |
|
*/ |
|
|
|
unsigned long flags; |
|
#define DMA_BUSY 0x00000001 |
|
#define DMA_RESTART 0x00000002 |
|
#define DMA_ACTIVE 0x00000004 |
|
#define DMA_STARTED 0x00000008 |
|
#define DMA_EMPTY 0x00000010 |
|
#define DMA_ALLOC_DONE 0x00000020 |
|
#define DMA_SYNCING 0x00000040 |
|
#define DMA_DIRTY 0x00000080 |
|
#define DMA_POST 0x00000100 |
|
#define DMA_NODMA 0x00000200 |
|
#define DMA_NOTIMEOUT 0x00000400 |
|
|
|
int open_mode; |
|
|
|
/* |
|
* Queue parameters. |
|
*/ |
|
int qlen; |
|
int qhead; |
|
int qtail; |
|
spinlock_t lock; |
|
|
|
int cfrag; /* Current incomplete fragment (write) */ |
|
|
|
int nbufs; |
|
int counts[MAX_SUB_BUFFERS]; |
|
int subdivision; |
|
|
|
int fragment_size; |
|
int needs_reorg; |
|
int max_fragments; |
|
|
|
int bytes_in_use; |
|
|
|
int underrun_count; |
|
unsigned long byte_counter; |
|
unsigned long user_counter; |
|
unsigned long max_byte_counter; |
|
int data_rate; /* Bytes/second */ |
|
|
|
int mapping_flags; |
|
#define DMA_MAP_MAPPED 0x00000001 |
|
char neutral_byte; |
|
int dma; /* DMA channel */ |
|
|
|
int applic_profile; /* Application profile (APF_*) */ |
|
/* Interrupt callback stuff */ |
|
void (*audio_callback) (int dev, int parm); |
|
int callback_parm; |
|
|
|
int buf_flags[MAX_SUB_BUFFERS]; |
|
#define BUFF_EOF 0x00000001 /* Increment eof count */ |
|
#define BUFF_DIRTY 0x00000002 /* Buffer written */ |
|
}; |
|
|
|
/* |
|
* Structure for use with various microcontrollers and DSP processors |
|
* in the recent sound cards. |
|
*/ |
|
typedef struct coproc_operations |
|
{ |
|
char name[64]; |
|
struct module *owner; |
|
int (*open) (void *devc, int sub_device); |
|
void (*close) (void *devc, int sub_device); |
|
int (*ioctl) (void *devc, unsigned int cmd, void __user * arg, int local); |
|
void (*reset) (void *devc); |
|
|
|
void *devc; /* Driver specific info */ |
|
} coproc_operations; |
|
|
|
struct audio_driver |
|
{ |
|
struct module *owner; |
|
int (*open) (int dev, int mode); |
|
void (*close) (int dev); |
|
void (*output_block) (int dev, unsigned long buf, |
|
int count, int intrflag); |
|
void (*start_input) (int dev, unsigned long buf, |
|
int count, int intrflag); |
|
int (*ioctl) (int dev, unsigned int cmd, void __user * arg); |
|
int (*prepare_for_input) (int dev, int bufsize, int nbufs); |
|
int (*prepare_for_output) (int dev, int bufsize, int nbufs); |
|
void (*halt_io) (int dev); |
|
int (*local_qlen)(int dev); |
|
void (*copy_user) (int dev, |
|
char *localbuf, int localoffs, |
|
const char __user *userbuf, int useroffs, |
|
int max_in, int max_out, |
|
int *used, int *returned, |
|
int len); |
|
void (*halt_input) (int dev); |
|
void (*halt_output) (int dev); |
|
void (*trigger) (int dev, int bits); |
|
int (*set_speed)(int dev, int speed); |
|
unsigned int (*set_bits)(int dev, unsigned int bits); |
|
short (*set_channels)(int dev, short channels); |
|
void (*postprocess_write)(int dev); /* Device spesific postprocessing for written data */ |
|
void (*preprocess_read)(int dev); /* Device spesific preprocessing for read data */ |
|
void (*mmap)(int dev); |
|
}; |
|
|
|
struct audio_operations |
|
{ |
|
char name[128]; |
|
int flags; |
|
#define NOTHING_SPECIAL 0x00 |
|
#define NEEDS_RESTART 0x01 |
|
#define DMA_AUTOMODE 0x02 |
|
#define DMA_DUPLEX 0x04 |
|
#define DMA_PSEUDO_AUTOMODE 0x08 |
|
#define DMA_HARDSTOP 0x10 |
|
#define DMA_EXACT 0x40 |
|
#define DMA_NORESET 0x80 |
|
int format_mask; /* Bitmask for supported audio formats */ |
|
void *devc; /* Driver specific info */ |
|
struct audio_driver *d; |
|
void *portc; /* Driver specific info */ |
|
struct dma_buffparms *dmap_in, *dmap_out; |
|
struct coproc_operations *coproc; |
|
int mixer_dev; |
|
int enable_bits; |
|
int open_mode; |
|
int go; |
|
int min_fragment; /* 0 == unlimited */ |
|
int max_fragment; /* 0 == unlimited */ |
|
int parent_dev; /* 0 -> no parent, 1 to n -> parent=parent_dev+1 */ |
|
|
|
/* fields formerly in dmabuf.c */ |
|
wait_queue_head_t in_sleeper; |
|
wait_queue_head_t out_sleeper; |
|
wait_queue_head_t poll_sleeper; |
|
|
|
/* fields formerly in audio.c */ |
|
int audio_mode; |
|
|
|
#define AM_NONE 0 |
|
#define AM_WRITE OPEN_WRITE |
|
#define AM_READ OPEN_READ |
|
|
|
int local_format; |
|
int audio_format; |
|
int local_conversion; |
|
#define CNV_MU_LAW 0x00000001 |
|
|
|
/* large structures at the end to keep offsets small */ |
|
struct dma_buffparms dmaps[2]; |
|
}; |
|
|
|
int *load_mixer_volumes(char *name, int *levels, int present); |
|
|
|
struct mixer_operations |
|
{ |
|
struct module *owner; |
|
char id[16]; |
|
char name[64]; |
|
int (*ioctl) (int dev, unsigned int cmd, void __user * arg); |
|
|
|
void *devc; |
|
int modify_counter; |
|
}; |
|
|
|
struct synth_operations |
|
{ |
|
struct module *owner; |
|
char *id; /* Unique identifier (ASCII) max 29 char */ |
|
struct synth_info *info; |
|
int midi_dev; |
|
int synth_type; |
|
int synth_subtype; |
|
|
|
int (*open) (int dev, int mode); |
|
void (*close) (int dev); |
|
int (*ioctl) (int dev, unsigned int cmd, void __user * arg); |
|
int (*kill_note) (int dev, int voice, int note, int velocity); |
|
int (*start_note) (int dev, int voice, int note, int velocity); |
|
int (*set_instr) (int dev, int voice, int instr); |
|
void (*reset) (int dev); |
|
void (*hw_control) (int dev, unsigned char *event); |
|
int (*load_patch) (int dev, int format, const char __user *addr, |
|
int count, int pmgr_flag); |
|
void (*aftertouch) (int dev, int voice, int pressure); |
|
void (*controller) (int dev, int voice, int ctrl_num, int value); |
|
void (*panning) (int dev, int voice, int value); |
|
void (*volume_method) (int dev, int mode); |
|
void (*bender) (int dev, int chn, int value); |
|
int (*alloc_voice) (int dev, int chn, int note, struct voice_alloc_info *alloc); |
|
void (*setup_voice) (int dev, int voice, int chn); |
|
int (*send_sysex)(int dev, unsigned char *bytes, int len); |
|
|
|
struct voice_alloc_info alloc; |
|
struct channel_info chn_info[16]; |
|
int emulation; |
|
#define EMU_GM 1 /* General MIDI */ |
|
#define EMU_XG 2 /* Yamaha XG */ |
|
#define MAX_SYSEX_BUF 64 |
|
unsigned char sysex_buf[MAX_SYSEX_BUF]; |
|
int sysex_ptr; |
|
}; |
|
|
|
struct midi_input_info |
|
{ |
|
/* MIDI input scanner variables */ |
|
#define MI_MAX 10 |
|
volatile int m_busy; |
|
unsigned char m_buf[MI_MAX]; |
|
unsigned char m_prev_status; /* For running status */ |
|
int m_ptr; |
|
#define MST_INIT 0 |
|
#define MST_DATA 1 |
|
#define MST_SYSEX 2 |
|
int m_state; |
|
int m_left; |
|
}; |
|
|
|
struct midi_operations |
|
{ |
|
struct module *owner; |
|
struct midi_info info; |
|
struct synth_operations *converter; |
|
struct midi_input_info in_info; |
|
int (*open) (int dev, int mode, |
|
void (*inputintr)(int dev, unsigned char data), |
|
void (*outputintr)(int dev) |
|
); |
|
void (*close) (int dev); |
|
int (*ioctl) (int dev, unsigned int cmd, void __user * arg); |
|
int (*outputc) (int dev, unsigned char data); |
|
int (*start_read) (int dev); |
|
int (*end_read) (int dev); |
|
void (*kick)(int dev); |
|
int (*command) (int dev, unsigned char *data); |
|
int (*buffer_status) (int dev); |
|
int (*prefix_cmd) (int dev, unsigned char status); |
|
struct coproc_operations *coproc; |
|
void *devc; |
|
}; |
|
|
|
struct sound_lowlev_timer |
|
{ |
|
int dev; |
|
int priority; |
|
unsigned int (*tmr_start)(int dev, unsigned int usecs); |
|
void (*tmr_disable)(int dev); |
|
void (*tmr_restart)(int dev); |
|
}; |
|
|
|
struct sound_timer_operations |
|
{ |
|
struct module *owner; |
|
struct sound_timer_info info; |
|
int priority; |
|
int devlink; |
|
int (*open)(int dev, int mode); |
|
void (*close)(int dev); |
|
int (*event)(int dev, unsigned char *ev); |
|
unsigned long (*get_time)(int dev); |
|
int (*ioctl) (int dev, unsigned int cmd, void __user * arg); |
|
void (*arm_timer)(int dev, long time); |
|
}; |
|
|
|
extern struct sound_timer_operations default_sound_timer; |
|
|
|
extern struct audio_operations *audio_devs[MAX_AUDIO_DEV]; |
|
extern int num_audiodevs; |
|
extern struct mixer_operations *mixer_devs[MAX_MIXER_DEV]; |
|
extern int num_mixers; |
|
extern struct synth_operations *synth_devs[MAX_SYNTH_DEV+MAX_MIDI_DEV]; |
|
extern int num_synths; |
|
extern struct midi_operations *midi_devs[MAX_MIDI_DEV]; |
|
extern int num_midis; |
|
extern struct sound_timer_operations * sound_timer_devs[MAX_TIMER_DEV]; |
|
extern int num_sound_timers; |
|
|
|
extern int sound_map_buffer (int dev, struct dma_buffparms *dmap, buffmem_desc *info); |
|
void sound_timer_init (struct sound_lowlev_timer *t, char *name); |
|
void sound_dma_intr (int dev, struct dma_buffparms *dmap, int chan); |
|
|
|
#define AUDIO_DRIVER_VERSION 2 |
|
#define MIXER_DRIVER_VERSION 2 |
|
int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver, |
|
int driver_size, int flags, unsigned int format_mask, |
|
void *devc, int dma1, int dma2); |
|
int sound_install_mixer(int vers, char *name, struct mixer_operations *driver, |
|
int driver_size, void *devc); |
|
|
|
void sound_unload_audiodev(int dev); |
|
void sound_unload_mixerdev(int dev); |
|
void sound_unload_mididev(int dev); |
|
void sound_unload_synthdev(int dev); |
|
void sound_unload_timerdev(int dev); |
|
int sound_alloc_mixerdev(void); |
|
int sound_alloc_timerdev(void); |
|
int sound_alloc_synthdev(void); |
|
int sound_alloc_mididev(void); |
|
#endif /* _DEV_TABLE_H_ */ |
|
|
|
|