📄 emu10k1.h
字号:
} emu10k1_pcm_mixer_t;#define snd_emu10k1_compose_send_routing(route) \((route[0] | (route[1] << 4) | (route[2] << 8) | (route[3] << 12)) << 16)#define snd_emu10k1_compose_audigy_fxrt1(route) \(((unsigned int)route[0] | ((unsigned int)route[1] << 8) | ((unsigned int)route[2] << 16) | ((unsigned int)route[3] << 12)) << 24)#define snd_emu10k1_compose_audigy_fxrt2(route) \(((unsigned int)route[4] | ((unsigned int)route[5] << 8) | ((unsigned int)route[6] << 16) | ((unsigned int)route[7] << 12)) << 24)typedef struct snd_emu10k1_memblk { snd_util_memblk_t mem; /* private part */ int first_page, last_page, pages, mapped_page; unsigned int map_locked; struct list_head mapped_link; struct list_head mapped_order_link;} emu10k1_memblk_t;#define snd_emu10k1_memblk_offset(blk) (((blk)->mapped_page << PAGE_SHIFT) | ((blk)->mem.offset & (PAGE_SIZE - 1)))#define EMU10K1_MAX_TRAM_BLOCKS_PER_CODE 16typedef struct { struct list_head list; /* list link container */ unsigned int vcount; unsigned int count; /* count of GPR (1..16) */ unsigned char gpr[32]; /* GPR number(s) */ unsigned int value[32]; unsigned int min; /* minimum range */ unsigned int max; /* maximum range */ unsigned int translation; /* translation type (EMU10K1_GPR_TRANSLATION*) */ snd_kcontrol_t *kcontrol;} snd_emu10k1_fx8010_ctl_t;typedef void (snd_fx8010_irq_handler_t)(emu10k1_t *emu, void *private_data);typedef struct _snd_emu10k1_fx8010_irq { struct _snd_emu10k1_fx8010_irq *next; snd_fx8010_irq_handler_t *handler; unsigned char gpr_running; void *private_data;} snd_emu10k1_fx8010_irq_t;typedef struct { unsigned int valid: 1, opened: 1, active: 1; unsigned int channels; /* 16-bit channels count */ unsigned int tram_start; /* initial ring buffer position in TRAM (in samples) */ unsigned int buffer_size; /* count of buffered samples */ unsigned char gpr_size; /* GPR containing size of ring buffer in samples (host) */ unsigned char gpr_ptr; /* GPR containing current pointer in the ring buffer (host = reset, FX8010) */ unsigned char gpr_count; /* GPR containing count of samples between two interrupts (host) */ unsigned char gpr_tmpcount; /* GPR containing current count of samples to interrupt (host = set, FX8010) */ unsigned char gpr_trigger; /* GPR containing trigger (activate) information (host) */ unsigned char gpr_running; /* GPR containing info if PCM is running (FX8010) */ unsigned char etram[32]; /* external TRAM address & data */ snd_pcm_indirect_t pcm_rec; unsigned int tram_pos; unsigned int tram_shift; snd_emu10k1_fx8010_irq_t *irq;} snd_emu10k1_fx8010_pcm_t;typedef struct { unsigned short fxbus_mask; /* used FX buses (bitmask) */ unsigned short extin_mask; /* used external inputs (bitmask) */ unsigned short extout_mask; /* used external outputs (bitmask) */ unsigned short pad1; unsigned int itram_size; /* internal TRAM size in samples */ struct snd_dma_buffer etram_pages; /* external TRAM pages and size */ unsigned int dbg; /* FX debugger register */ unsigned char name[128]; int gpr_size; /* size of allocated GPR controls */ int gpr_count; /* count of used kcontrols */ struct list_head gpr_ctl; /* GPR controls */ struct semaphore lock; snd_emu10k1_fx8010_pcm_t pcm[8]; spinlock_t irq_lock; snd_emu10k1_fx8010_irq_t *irq_handlers;} snd_emu10k1_fx8010_t;#define emu10k1_gpr_ctl(n) list_entry(n, snd_emu10k1_fx8010_ctl_t, list)typedef struct { struct _snd_emu10k1 *emu; snd_rawmidi_t *rmidi; snd_rawmidi_substream_t *substream_input; snd_rawmidi_substream_t *substream_output; unsigned int midi_mode; spinlock_t input_lock; spinlock_t output_lock; spinlock_t open_lock; int tx_enable, rx_enable; int port; int ipr_tx, ipr_rx; void (*interrupt)(emu10k1_t *emu, unsigned int status);} emu10k1_midi_t;struct _snd_emu10k1 { int irq; unsigned long port; /* I/O port number */ int APS: 1, /* APS flag */ no_ac97: 1, /* no AC'97 */ tos_link: 1, /* tos link detected */ rear_ac97: 1, /* rear channels are on AC'97 */ spk71:1; /* 7.1 configuration (Audigy 2 ZS) */ unsigned int audigy; /* is Audigy? */ unsigned int revision; /* chip revision */ unsigned int serial; /* serial number */ unsigned short model; /* subsystem id */ unsigned int card_type; /* EMU10K1_CARD_* */ unsigned int ecard_ctrl; /* ecard control bits */ unsigned long dma_mask; /* PCI DMA mask */ int max_cache_pages; /* max memory size / PAGE_SIZE */ struct snd_dma_buffer silent_page; /* silent page */ struct snd_dma_buffer ptb_pages; /* page table pages */ snd_util_memhdr_t *memhdr; /* page allocation list */ emu10k1_memblk_t *reserved_page; /* reserved page */ struct list_head mapped_link_head; struct list_head mapped_order_link_head; void **page_ptr_table; unsigned long *page_addr_table; spinlock_t memblk_lock; unsigned int spdif_bits[3]; /* s/pdif out setup */ snd_emu10k1_fx8010_t fx8010; /* FX8010 info */ int gpr_base; ac97_t *ac97; struct pci_dev *pci; snd_card_t *card; snd_pcm_t *pcm; snd_pcm_t *pcm_mic; snd_pcm_t *pcm_efx; spinlock_t synth_lock; void *synth; int (*get_synth_voice)(emu10k1_t *emu); spinlock_t reg_lock; spinlock_t emu_lock; spinlock_t voice_lock; struct semaphore ptb_lock; emu10k1_voice_t voices[64]; emu10k1_pcm_mixer_t pcm_mixer[32]; snd_kcontrol_t *ctl_send_routing; snd_kcontrol_t *ctl_send_volume; snd_kcontrol_t *ctl_attn; void (*hwvol_interrupt)(emu10k1_t *emu, unsigned int status); void (*capture_interrupt)(emu10k1_t *emu, unsigned int status); void (*capture_mic_interrupt)(emu10k1_t *emu, unsigned int status); void (*capture_efx_interrupt)(emu10k1_t *emu, unsigned int status); void (*timer_interrupt)(emu10k1_t *emu); void (*spdif_interrupt)(emu10k1_t *emu, unsigned int status); void (*dsp_interrupt)(emu10k1_t *emu); snd_pcm_substream_t *pcm_capture_substream; snd_pcm_substream_t *pcm_capture_mic_substream; snd_pcm_substream_t *pcm_capture_efx_substream; emu10k1_midi_t midi; emu10k1_midi_t midi2; /* for audigy */ unsigned int efx_voices_mask[2];};int snd_emu10k1_create(snd_card_t * card, struct pci_dev *pci, unsigned short extin_mask, unsigned short extout_mask, long max_cache_bytes, int enable_ir, emu10k1_t ** remu);int snd_emu10k1_pcm(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);int snd_emu10k1_pcm_mic(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);int snd_emu10k1_pcm_efx(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);int snd_emu10k1_fx8010_pcm(emu10k1_t * emu, int device, snd_pcm_t ** rpcm);int snd_emu10k1_mixer(emu10k1_t * emu);int snd_emu10k1_fx8010_new(emu10k1_t *emu, int device, snd_hwdep_t ** rhwdep);irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs);/* initialization */void snd_emu10k1_voice_init(emu10k1_t * emu, int voice);int snd_emu10k1_init_efx(emu10k1_t *emu);void snd_emu10k1_free_efx(emu10k1_t *emu);int snd_emu10k1_fx8010_tram_setup(emu10k1_t *emu, u32 size);/* I/O functions */unsigned int snd_emu10k1_ptr_read(emu10k1_t * emu, unsigned int reg, unsigned int chn);void snd_emu10k1_ptr_write(emu10k1_t *emu, unsigned int reg, unsigned int chn, unsigned int data);void snd_emu10k1_efx_write(emu10k1_t *emu, unsigned int pc, unsigned int data);unsigned int snd_emu10k1_efx_read(emu10k1_t *emu, unsigned int pc);void snd_emu10k1_intr_enable(emu10k1_t *emu, unsigned int intrenb);void snd_emu10k1_intr_disable(emu10k1_t *emu, unsigned int intrenb);void snd_emu10k1_voice_intr_enable(emu10k1_t *emu, unsigned int voicenum);void snd_emu10k1_voice_intr_disable(emu10k1_t *emu, unsigned int voicenum);void snd_emu10k1_voice_intr_ack(emu10k1_t *emu, unsigned int voicenum);void snd_emu10k1_voice_set_loop_stop(emu10k1_t *emu, unsigned int voicenum);void snd_emu10k1_voice_clear_loop_stop(emu10k1_t *emu, unsigned int voicenum);void snd_emu10k1_wait(emu10k1_t *emu, unsigned int wait);static inline unsigned int snd_emu10k1_wc(emu10k1_t *emu) { return (inl(emu->port + WC) >> 6) & 0xfffff; }unsigned short snd_emu10k1_ac97_read(ac97_t *ac97, unsigned short reg);void snd_emu10k1_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short data);unsigned int snd_emu10k1_rate_to_pitch(unsigned int rate);unsigned char snd_emu10k1_sum_vol_attn(unsigned int value);/* memory allocation */snd_util_memblk_t *snd_emu10k1_alloc_pages(emu10k1_t *emu, snd_pcm_substream_t *substream);int snd_emu10k1_free_pages(emu10k1_t *emu, snd_util_memblk_t *blk);snd_util_memblk_t *snd_emu10k1_synth_alloc(emu10k1_t *emu, unsigned int size);int snd_emu10k1_synth_free(emu10k1_t *emu, snd_util_memblk_t *blk);int snd_emu10k1_synth_bzero(emu10k1_t *emu, snd_util_memblk_t *blk, int offset, int size);int snd_emu10k1_synth_copy_from_user(emu10k1_t *emu, snd_util_memblk_t *blk, int offset, const char __user *data, int size);int snd_emu10k1_memblk_map(emu10k1_t *emu, emu10k1_memblk_t *blk);/* voice allocation */int snd_emu10k1_voice_alloc(emu10k1_t *emu, emu10k1_voice_type_t type, int pair, emu10k1_voice_t **rvoice);int snd_emu10k1_voice_free(emu10k1_t *emu, emu10k1_voice_t *pvoice);/* MIDI uart */int snd_emu10k1_midi(emu10k1_t * emu);int snd_emu10k1_audigy_midi(emu10k1_t * emu);/* proc interface */int snd_emu10k1_proc_init(emu10k1_t * emu);/* fx8010 irq handler */int snd_emu10k1_fx8010_register_irq_handler(emu10k1_t *emu, snd_fx8010_irq_handler_t *handler, unsigned char gpr_running, void *private_data, snd_emu10k1_fx8010_irq_t **r_irq);int snd_emu10k1_fx8010_unregister_irq_handler(emu10k1_t *emu, snd_emu10k1_fx8010_irq_t *irq);#endif /* __KERNEL__ *//* * ---- FX8010 ---- */#define EMU10K1_CARD_CREATIVE 0x00000000#define EMU10K1_CARD_EMUAPS 0x00000001#define EMU10K1_FX8010_PCM_COUNT 8/* instruction set */#define iMAC0 0x00 /* R = A + (X * Y >> 31) ; saturation */#define iMAC1 0x01 /* R = A + (-X * Y >> 31) ; saturation */#define iMAC2 0x02 /* R = A + (X * Y >> 31) ; wraparound */#define iMAC3 0x03 /* R = A + (-X * Y >> 31) ; wraparound */#define iMACINT0 0x04 /* R = A + X * Y ; saturation */#define iMACINT1 0x05 /* R = A + X * Y ; wraparound (31-bit) */#define iACC3 0x06 /* R = A + X + Y ; saturation */#define iMACMV 0x07 /* R = A, acc += X * Y >> 31 */#define iANDXOR 0x08 /* R = (A & X) ^ Y */#define iTSTNEG 0x09 /* R = (A >= Y) ? X : ~X */#define iLIMITGE 0x0a /* R = (A >= Y) ? X : Y */#define iLIMITLT 0x0b /* R = (A < Y) ? X : Y */#define iLOG 0x0c /* R = linear_data, A (log_data), X (max_exp), Y (format_word) */#define iEXP 0x0d /* R = log_data, A (linear_data), X (max_exp), Y (format_word) */#define iINTERP 0x0e /* R = A + (X * (Y - A) >> 31) ; saturation */#define iSKIP 0x0f /* R = A (cc_reg), X (count), Y (cc_test) *//* GPRs */#define FXBUS(x) (0x00 + (x)) /* x = 0x00 - 0x0f */#define EXTIN(x) (0x10 + (x)) /* x = 0x00 - 0x0f */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -