/*****************************************************************************/
/*
* cmpci.c -- C-Media PCI audio driver.
*
* Copyright (C) 1999 ChenLi Tien (cltien@home.com)
* C-media support (support@cmedia.com.tw)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Special thanks to David C. Niemi, Jan Pfeifer
*
*
* Module command line parameters:
* none so far
*
*
* Supported devices:
* /dev/dsp standard /dev/dsp device, (mostly) OSS compatible
* /dev/mixer standard /dev/mixer device, (mostly) OSS compatible
* /dev/midi simple MIDI UART interface, no ioctl
*
* The card has both an FM and a Wavetable synth, but I have to figure
* out first how to drive them...
*
* Revision history
* 06.05.98 0.1 Initial release
* 10.05.98 0.2 Fixed many bugs, esp. ADC rate calculation
* First stab at a simple midi interface (no bells&whistles)
* 13.05.98 0.3 Fix stupid cut&paste error: set_adc_rate was called instead of
* set_dac_rate in the FMODE_WRITE case in cm_open
* Fix hwptr out of bounds (now mpg123 works)
* 14.05.98 0.4 Don't allow excessive interrupt rates
* 08.06.98 0.5 First release using Alan Cox' soundcore instead of miscdevice
* 03.08.98 0.6 Do not include modversions.h
* Now mixer behaviour can basically be selected between
* "OSS documented" and "OSS actual" behaviour
* 31.08.98 0.7 Fix realplayer problems - dac.count issues
* 10.12.98 0.8 Fix drain_dac trying to wait on not yet initialized DMA
* 16.12.98 0.9 Fix a few f_file & FMODE_ bugs
* 06.01.99 0.10 remove the silly SA_INTERRUPT flag.
* hopefully killed the egcs section type conflict
* 12.03.99 0.11 cinfo.blocks should be reset after GETxPTR ioctl.
* reported by Johan Maes <joma@telindus.be>
* 22.03.99 0.12 return EAGAIN instead of EBUSY when O_NONBLOCK
* read/write cannot be executed
* 18.08.99 1.5 Only deallocate DMA buffer when unloading.
* 02.09.99 1.6 Enable SPDIF LOOP
* Change the mixer read back
* 21.09.99 2.33 Use RCS version as driver version.
* Add support for modem, S/PDIF loop and 4 channels.
* (8738 only)
* Fix bug cause x11amp cannot play.
*
*/
/*****************************************************************************/
#define EXPORT_SYMTAB
#include <linux/version.h>
#include <linux/config.h>
#include <linux/module.h>
#include <linux/string.h>
#include <linux/ioport.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/sound.h>
#include <linux/malloc.h>
#include <linux/soundcard.h>
#include <linux/pci.h>
#include <asm/io.h>
#include <asm/dma.h>
#include <linux/init.h>
#include <linux/poll.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
#include <linux/spinlock.h>
#else
#include <asm/spinlock.h>
#endif
#include <asm/uaccess.h>
#include <asm/hardirq.h>
#include "dm.h"
/* --------------------------------------------------------------------- */
#undef OSS_DOCUMENTED_MIXER_SEMANTICS
/* --------------------------------------------------------------------- */
#ifndef PCI_VENDOR_ID_CMEDIA
#define PCI_VENDOR_ID_CMEDIA 0x13F6
#endif
#ifndef PCI_DEVICE_ID_CMEDIA_CM8338A
#define PCI_DEVICE_ID_CMEDIA_CM8338A 0x0100
#endif
#ifndef PCI_DEVICE_ID_CMEDIA_CM8338B
#define PCI_DEVICE_ID_CMEDIA_CM8338B 0x0101
#endif
#ifndef PCI_DEVICE_ID_CMEDIA_CM8738
#define PCI_DEVICE_ID_CMEDIA_CM8738 0x0111
#endif
#ifndef PCI_DEVICE_ID_CMEDIA_CM8738B
#define PCI_DEVICE_ID_CMEDIA_CM8738B 0x0112
#endif
#define CM_MAGIC ((PCI_VENDOR_ID_CMEDIA<<16)|PCI_DEVICE_ID_CMEDIA_CM8338A)
/*
* CM8338 registers definition
*/
#define CODEC_CMI_FUNCTRL0 (0x00)
#define CODEC_CMI_FUNCTRL1 (0x04)
#define CODEC_CMI_CHFORMAT (0x08)
#define CODEC_CMI_INT_HLDCLR (0x0C)
#define CODEC_CMI_INT_STATUS (0x10)
#define CODEC_CMI_LEGACY_CTRL (0x14)
#define CODEC_CMI_MISC_CTRL (0x18)
#define CODEC_CMI_TDMA_POS (0x1C)
#define CODEC_CMI_MIXER (0x20)
#define CODEC_SB16_DATA (0x22)
#define CODEC_SB16_ADDR (0x23)
#define CODEC_CMI_MIXER1 (0x24)
#define CODEC_CMI_MIXER2 (0x25)
#define CODEC_CMI_AUX_VOL (0x26)
#define CODEC_CMI_MISC (0x27)
#define CODEC_CMI_AC97 (0x28)
#define CODEC_CMI_CH0_FRAME1 (0x80)
#define CODEC_CMI_CH0_FRAME2 (0x84)
#define CODEC_CMI_CH1_FRAME1 (0x88)
#define CODEC_CMI_CH1_FRAME2 (0x8C)
#define CODEC_CMI_EXT_REG (0xF0)
#define UCHAR unsigned char
/*
** Mixer registers for SB16
*/
#define DSP_MIX_DATARESETIDX ((UCHAR)(0x00))
#define DSP_MIX_MASTERVOLIDX_L ((UCHAR)(0x30))
#define DSP_MIX_MASTERVOLIDX_R ((UCHAR)(0x31))
#define DSP_MIX_VOICEVOLIDX_L ((UCHAR)(0x32))
#define DSP_MIX_VOICEVOLIDX_R ((UCHAR)(0x33))
#define DSP_MIX_FMVOLIDX_L ((UCHAR)(0x34))
#define DSP_MIX_FMVOLIDX_R ((UCHAR)(0x35))
#define DSP_MIX_CDVOLIDX_L ((UCHAR)(0x36))
#define DSP_MIX_CDVOLIDX_R ((UCHAR)(0x37))
#define DSP_MIX_LINEVOLIDX_L ((UCHAR)(0x38))
#define DSP_MIX_LINEVOLIDX_R ((UCHAR)(0x39))
#define DSP_MIX_MICVOLIDX ((UCHAR)(0x3A))
#define DSP_MIX_SPKRVOLIDX ((UCHAR)(0x3B))
#define DSP_MIX_OUTMIXIDX ((UCHAR)(0x3C))
#define DSP_MIX_ADCMIXIDX_L ((UCHAR)(0x3D))
#define DSP_MIX_ADCMIXIDX_R ((UCHAR)(0x3E))
#define DSP_MIX_INGAINIDX_L ((UCHAR)(0x3F))
#define DSP_MIX_INGAINIDX_R ((UCHAR)(0x40))
#define DSP_MIX_OUTGAINIDX_L ((UCHAR)(0x41))
#define DSP_MIX_OUTGAINIDX_R ((UCHAR)(0x42))
#define DSP_MIX_AGCIDX ((UCHAR)(0x43))
#define DSP_MIX_TREBLEIDX_L ((UCHAR)(0x44))
#define DSP_MIX_TREBLEIDX_R ((UCHAR)(0x45))
#define DSP_MIX_BASSIDX_L ((UCHAR)(0x46))
#define DSP_MIX_BASSIDX_R ((UCHAR)(0x47))
#define CM_CH0_RESET 0x04
#define CM_CH1_RESET 0x08
#define CM_EXTENT_CODEC 0x100
#define CM_EXTENT_MIDI 0x2
#define CM_EXTENT_SYNTH 0x4
#define CM_INT_CH0 1
#define CM_INT_CH1 2
#define CM_CFMT_STEREO 0x01
#define CM_CFMT_16BIT 0x02
#define CM_CFMT_MASK 0x03
#define CM_CFMT_DACSHIFT 0
#define CM_CFMT_ADCSHIFT 2
static const unsigned sample_size[] = { 1, 2, 2, 4 };
static const unsigned sample_shift[] = { 0, 1, 1, 2 };
#define CM_CENABLE_RE 0x2
#define CM_CENABLE_PE 0x1
/* MIDI buffer sizes */
#define MIDIINBUF 256
#define MIDIOUTBUF 256
#define FMODE_MIDI_SHIFT 2
#define FMODE_MIDI_READ (FMODE_READ << FMODE_MIDI_SHIFT)
#define FMODE_MIDI_WRITE (FMODE_WRITE << FMODE_MIDI_SHIFT)
#define FMODE_DMFM 0x10
#define SND_DEV_DSP16 5
#ifdef CONFIG_SOUND_CMPCI_4CH
#define DUAL_DAC
#endif
#ifdef DUAL_DAC
#define set_dac1_rate set_adc_rate
#define stop_dac1 stop_adc
#define get_dmadac1 get_dmaadc
#endif
/* --------------------------------------------------------------------- */
struct cm_state {
/* magic */
unsigned int magic;
/* we keep cm cards in a linked list */
struct cm_state *next;
/* soundcore stuff */
int dev_audio;
int dev_mixer;
#ifdef DUAL_DAC
int dev_dsp;
int dual_mode;
int hw_dual_dac;
#endif
int four_ch;
int dev_
没有合适的资源?快使用搜索试试~ 我知道了~
ci18738forlinux
需积分: 0 1 下载量 188 浏览量
2008-09-05
16:34:05
上传
评论
收藏 208KB GZ 举报
温馨提示
共6个文件
makefile:1个
in:1个
help:1个
ci18738forlinux 网卡驱动
资源详情
资源评论
资源推荐
收起资源包目录
cmpci-4.03.tar.gz (6个子文件)
Config.in 10KB
Configure.help 699KB
cmpci.c 97KB
README 3KB
cmpci 3KB
Makefile 9KB
共 6 条
- 1
czt666
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0