亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pas2_card.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
#define _PAS2_CARD_C_
#define SND_SA_INTERRUPT
/*
 * sound/pas2_card.c
 * 
 * Detection routine for the Pro Audio Spectrum cards.
 * 
 * Copyright by Hannu Savolainen 1993
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer. 2.
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 */

#include "sound_config.h"

#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_PAS)

#define DEFINE_TRANSLATIONS
#include "pas.h"

/*
 * The Address Translation code is used to convert I/O register addresses to
 * be relative to the given base -register
 */

int             translat_code;
static int      pas_intr_mask = 0;
static int      pas_irq = 0;

static char     pas_model;
static char    *pas_model_names[] =
{"", "Pro AudioSpectrum+", "CDPC", "Pro AudioSpectrum 16", "Pro AudioSpectrum 16D"};

/* pas_read() and pas_write() are equivalents of INB() and OUTB() */
/* These routines perform the I/O address translation required */
/* to support other than the default base address */

unsigned char
pas_read (int ioaddr)
{
  return INB (ioaddr ^ translat_code);
}

void
pas_write (unsigned char data, int ioaddr)
{
  OUTB (data, ioaddr ^ translat_code);
}

void
pas2_msg (char *foo)
{
  printk ("    PAS2: %s.\n", foo);
}

/******************* Begin of the Interrupt Handler ********************/

void
pasintr (int unused)
{
  int             status;

  status = pas_read (INTERRUPT_STATUS);
  pas_write (status, INTERRUPT_STATUS);	/* Clear interrupt */

  if (status & I_S_PCM_SAMPLE_BUFFER_IRQ)
    {
#ifndef EXCLUDE_AUDIO
      pas_pcm_interrupt (status, 1);
#endif
      status &= ~I_S_PCM_SAMPLE_BUFFER_IRQ;
    }
  if (status & I_S_MIDI_IRQ)
    {
#ifndef EXCLUDE_MIDI
#ifdef EXCLUDE_PRO_MIDI
      pas_midi_interrupt ();
#endif
#endif
      status &= ~I_S_MIDI_IRQ;
    }

}

int
pas_set_intr (int mask)
{
  int             err;

  if (!mask)
    return 0;

  if (!pas_intr_mask)
    {
      if ((err = snd_set_irq_handler (pas_irq, pasintr)) < 0)
	return err;
    }
  pas_intr_mask |= mask;

  pas_write (pas_intr_mask, INTERRUPT_MASK);
  return 0;
}

int
pas_remove_intr (int mask)
{
  if (!mask)
    return 0;

  pas_intr_mask &= ~mask;
  pas_write (pas_intr_mask, INTERRUPT_MASK);

  if (!pas_intr_mask)
    {
      snd_release_irq (pas_irq);
    }
  return 0;
}

/******************* End of the Interrupt handler **********************/

/******************* Begin of the Initialization Code ******************/

int
config_pas_hw (struct address_info *hw_config)
{
  char            ok = 1;

  pas_irq = hw_config->irq;

  pas_write (0x00, INTERRUPT_MASK);

  pas_write (0x36, SAMPLE_COUNTER_CONTROL);	/* Local timer control
						 * register */

  pas_write (0x36, SAMPLE_RATE_TIMER);	/* Sample rate timer (16 bit) */
  pas_write (0, SAMPLE_RATE_TIMER);

  pas_write (0x74, SAMPLE_COUNTER_CONTROL);	/* Local timer control
						 * register */

  pas_write (0x74, SAMPLE_BUFFER_COUNTER);	/* Sample count register (16
						 * bit) */
  pas_write (0, SAMPLE_BUFFER_COUNTER);

  pas_write (F_F_PCM_BUFFER_COUNTER | F_F_PCM_RATE_COUNTER | F_F_MIXER_UNMUTE | 1, FILTER_FREQUENCY);
  pas_write (P_C_PCM_DMA_ENABLE | P_C_PCM_MONO | P_C_PCM_DAC_MODE | P_C_MIXER_CROSS_L_TO_L | P_C_MIXER_CROSS_R_TO_R, PCM_CONTROL);
  pas_write (S_M_PCM_RESET | S_M_FM_RESET | S_M_SB_RESET | S_M_MIXER_RESET /* | S_M_OPL3_DUAL_MONO */ , SERIAL_MIXER);

  pas_write (I_C_1_BOOT_RESET_ENABLE, IO_CONFIGURATION_1);

  if (pas_irq < 0 || pas_irq > 15)
    {
      printk ("PAS2: Invalid IRQ %d", pas_irq);
      ok = 0;
    }
  else
    {
      pas_write (I_C_3_PCM_IRQ_translate[pas_irq], IO_CONFIGURATION_3);
      if (!I_C_3_PCM_IRQ_translate[pas_irq])
	{
	  printk ("PAS2: Invalid IRQ %d", pas_irq);
	  ok = 0;
	}
    }

  if (hw_config->dma < 0 || hw_config->dma > 7)
    {
      printk ("PAS2: Invalid DMA selection %d", hw_config->dma);
      ok = 0;
    }
  else
    {
      pas_write (I_C_2_PCM_DMA_translate[hw_config->dma], IO_CONFIGURATION_2);
      if (!I_C_2_PCM_DMA_translate[hw_config->dma])
	{
	  printk ("PAS2: Invalid DMA selection %d", hw_config->dma);
	  ok = 0;
	}
    }
  
/*
 * This fixes the timing problems of the PAS due to the Symphony chipset
 * as per Media Vision.  Only define this if your PAS doesn't work correctly.
 */
#ifdef SYMPHONY_PAS
	OUTB(0x05,0xa8);
	OUTB(0x60,0xa9);
#endif

#ifdef BROKEN_BUS_CLOCK
  pas_write (S_C_1_PCS_ENABLE | S_C_1_PCS_STEREO | S_C_1_PCS_REALSOUND | S_C_1_FM_EMULATE_CLOCK, SYSTEM_CONFIGURATION_1);
#else
  /* pas_write(S_C_1_PCS_ENABLE, SYSTEM_CONFIGURATION_1);     */
  pas_write (S_C_1_PCS_ENABLE | S_C_1_PCS_STEREO | S_C_1_PCS_REALSOUND, SYSTEM_CONFIGURATION_1);
#endif
  pas_write (0x18, SYSTEM_CONFIGURATION_3);	/* ??? */

  pas_write (F_F_MIXER_UNMUTE | 0x01, FILTER_FREQUENCY);	/* Sets mute off and
								 * selects filter rate
								 * of 17.897 kHz */

  if (pas_model == PAS_16 || pas_model == PAS_16D)
    pas_write (8, PRESCALE_DIVIDER);
  else
    pas_write (0, PRESCALE_DIVIDER);

  pas_write (P_M_MV508_ADDRESS | 5, PARALLEL_MIXER);
  pas_write (5, PARALLEL_MIXER);

#if !defined(EXCLUDE_SB_EMULATION) || !defined(EXCLUDE_SB)

    {
	struct address_info *sb_config;

	if ((sb_config=sound_getconf(SNDCARD_SB)))
        {
		unsigned char irq_dma;

  /* Turn on Sound Blaster compatibility */
  /* bit 1 = SB emulation */
  /* bit 0 = MPU401 emulation (CDPC only :-( ) */
  pas_write (0x02, COMPATIBILITY_ENABLE);

  /* "Emulation address"	 */
            pas_write ((sb_config->io_base >> 4) & 0x0f, EMULATION_ADDRESS);

	    if (!E_C_SB_DMA_translate[sb_config->dma]) 
               printk("\n\nPAS16 Warning: Invalid SB DMA %d\n\n",
			sb_config->dma);

	    if (!E_C_SB_IRQ_translate[sb_config->irq]) 
               printk("\n\nPAS16 Warning: Invalid SB IRQ %d\n\n",
			sb_config->irq);

	    irq_dma = E_C_SB_DMA_translate[sb_config->dma] | 
		      E_C_SB_IRQ_translate[sb_config->irq];

	    pas_write(irq_dma, EMULATION_CONFIGURATION);
        }
   }
#endif

  if (!ok)
    pas2_msg ("Driver not enabled");

  return ok;
}

int
detect_pas_hw (struct address_info *hw_config)
{
  unsigned char   board_id, foo;

  /*
   * WARNING: Setting an option like W:1 or so that disables warm boot reset
   * of the card will screw up this detect code something fierce. Adding code
   * to handle this means possibly interfering with other cards on the bus if
   * you have something on base port 0x388. SO be forewarned.
   */

  OUTB (0xBC, MASTER_DECODE);	/* Talk to first board */
  OUTB (hw_config->io_base >> 2, MASTER_DECODE);	/* Set base address */
  translat_code = PAS_DEFAULT_BASE ^ hw_config->io_base;
  pas_write (1, WAIT_STATE);	/* One wait-state */

  board_id = pas_read (INTERRUPT_MASK);

  if (board_id == 0xff)
    return 0;

  /*
   * We probably have a PAS-series board, now check for a PAS2-series board
   * by trying to change the board revision bits. PAS2-series hardware won't
   * let you do this - the bits are read-only.
   */

  foo = board_id ^ 0xe0;

  pas_write (foo, INTERRUPT_MASK);
  foo = INB (INTERRUPT_MASK);
  pas_write (board_id, INTERRUPT_MASK);

  if (board_id != foo)		/* Not a PAS2 */
    return 0;

  pas_model = O_M_1_to_card[pas_read (OPERATION_MODE_1) & 0x0f];

  return pas_model;
}

long
attach_pas_card (long mem_start, struct address_info *hw_config)
{
  pas_irq = hw_config->irq;

  if (detect_pas_hw (hw_config))
    {

      if ((pas_model = O_M_1_to_card[pas_read (OPERATION_MODE_1) & 0x0f]))
	{
	  printk (" <%s rev %d>", pas_model_names[(int) pas_model], pas_read (BOARD_REV_ID));
	}

      if (config_pas_hw (hw_config))
	{

#ifndef EXCLUDE_AUDIO
	  mem_start = pas_pcm_init (mem_start, hw_config);
#endif

# if !defined(EXCLUDE_SB_EMULATION) && !defined(EXCLUDE_SB)

	  sb_dsp_disable_midi ();	/* The SB emulation don't support
					 * midi */
# endif

#ifndef EXCLUDE_YM3812
	  enable_opl3_mode (0x388, 0x38a, 0);
#endif

#ifndef EXCLUDE_MIDI
#ifdef EXCLUDE_PRO_MIDI
	  mem_start = pas_midi_init (mem_start);
#endif
#endif

	  pas_init_mixer ();
	}
    }

  return mem_start;
}

int
probe_pas (struct address_info *hw_config)
{
  return detect_pas_hw (hw_config);
}

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
制服丝袜成人动漫| 欧美三级韩国三级日本三斤 | 久久久不卡网国产精品二区 | 国产乱码精品一区二区三区五月婷| 亚洲成人动漫一区| 亚洲午夜久久久久| 亚洲综合在线视频| 五月婷婷欧美视频| 久久国产免费看| 国产一区二区女| 国产一区二区三区高清播放| 国产成人超碰人人澡人人澡| 成人免费毛片app| 91久久精品国产91性色tv| 色天使久久综合网天天| 欧美日韩在线亚洲一区蜜芽| 在线不卡中文字幕播放| 日韩欧美国产综合| 国产欧美日韩综合| 亚洲国产日韩一级| 久久精品国产999大香线蕉| 国产精品99久久久久久有的能看 | 日本午夜精品视频在线观看| 国内成人精品2018免费看| 成人av电影在线播放| 欧美性猛交一区二区三区精品| 欧美日韩激情一区二区三区| 欧美岛国在线观看| 国产精品久久看| 日韩高清在线观看| 大白屁股一区二区视频| 在线精品视频免费观看| 精品理论电影在线观看| 中文字幕在线观看一区二区| 午夜精品久久久久影视| 国产河南妇女毛片精品久久久| 欧洲一区二区av| 精品国产凹凸成av人导航| 亚洲日本在线观看| 久久精品国产亚洲高清剧情介绍 | 国产麻豆9l精品三级站| 91免费观看国产| 日韩你懂的在线观看| 亚洲美女屁股眼交| 韩国女主播成人在线观看| 欧美亚洲一区二区在线观看| 久久人人爽人人爽| 日本午夜一区二区| 欧美性色黄大片| 国产精品美女久久久久aⅴ国产馆| 午夜精品久久久久久久久久| 成人av资源下载| 久久―日本道色综合久久| 青青草原综合久久大伊人精品 | 国产视频一区不卡| 奇米精品一区二区三区四区 | 欧美日韩黄视频| 一区二区三区成人在线视频| 国产v综合v亚洲欧| 精品不卡在线视频| 日韩av二区在线播放| 91黄视频在线观看| 日韩理论片在线| 成人性生交大片免费看视频在线| 日韩欧美色电影| 日本aⅴ亚洲精品中文乱码| 欧美影片第一页| 亚洲综合色网站| 在线日韩av片| 一区二区三区四区视频精品免费| 成人深夜视频在线观看| 久久久99免费| 国产一区不卡视频| 久久久影视传媒| 国产麻豆精品久久一二三| 日韩精品专区在线影院重磅| 日韩国产欧美在线播放| 欧美区视频在线观看| 亚洲bt欧美bt精品| 666欧美在线视频| 免费观看91视频大全| 欧美大黄免费观看| 精品亚洲免费视频| 久久久蜜臀国产一区二区| 成人综合激情网| 亚洲人成精品久久久久久| 91美女视频网站| 性感美女极品91精品| 欧美一区二区三区不卡| 精品午夜久久福利影院| 久久一留热品黄| 成人av在线一区二区三区| 亚洲图片欧美激情| 欧美日韩一级片在线观看| 美美哒免费高清在线观看视频一区二区 | 久久综合九色综合97婷婷女人 | 99精品久久免费看蜜臀剧情介绍| 日韩一区中文字幕| 欧洲精品中文字幕| 蜜桃久久精品一区二区| 欧美激情中文不卡| 91久久久免费一区二区| 日韩黄色免费网站| 欧美激情综合网| 91精品婷婷国产综合久久性色 | 久久一日本道色综合| 色综合色狠狠天天综合色| 亚洲bt欧美bt精品| 久久综合九色综合欧美亚洲| 91免费在线播放| 精品午夜久久福利影院| 亚洲免费伊人电影| 日韩久久久久久| 91国产精品成人| 韩国在线一区二区| 亚洲va欧美va人人爽| 国产午夜亚洲精品午夜鲁丝片| 91久久香蕉国产日韩欧美9色| 久草中文综合在线| 一区二区三区丝袜| 中文字幕不卡在线| 日韩精品一区二区三区视频播放 | 成人午夜激情在线| 蜜臀久久99精品久久久久宅男| 中文字幕不卡一区| 精品国产自在久精品国产| 91官网在线免费观看| 国产日韩欧美电影| 欧美精品在线观看播放| 91首页免费视频| 国产精品一区在线| 免费不卡在线视频| 亚洲国产精品久久久男人的天堂| 欧美国产精品一区二区| 欧美变态tickle挠乳网站| 欧美视频在线观看一区| av亚洲产国偷v产偷v自拍| 国产在线一区二区综合免费视频| 亚洲综合视频在线| 一色屋精品亚洲香蕉网站| 26uuu色噜噜精品一区二区| 777午夜精品视频在线播放| av一区二区三区四区| 精品一区二区免费看| 日韩av一区二| 日韩成人午夜电影| 日本sm残虐另类| 日本午夜一区二区| 青青青伊人色综合久久| 午夜电影一区二区| 亚洲成av人在线观看| 亚洲国产一区二区a毛片| 亚洲欧美激情在线| 亚洲高清不卡在线| 亚洲电影一级黄| 午夜精品久久久久久久99水蜜桃| 亚洲欧美国产77777| 最新久久zyz资源站| 国产精品久久看| 中文字幕在线播放不卡一区| 亚洲欧洲日本在线| 中文字幕亚洲综合久久菠萝蜜| 国产精品视频看| **性色生活片久久毛片| 亚洲欧洲韩国日本视频| 亚洲日韩欧美一区二区在线| 亚洲精品成a人| 亚洲一二三级电影| 秋霞影院一区二区| 国产一区二区精品久久| 成人精品免费看| 色天使色偷偷av一区二区| 91久久精品日日躁夜夜躁欧美| 欧美色图12p| 欧美一卡二卡在线| 久久久不卡网国产精品一区| 中文字幕av免费专区久久| 亚洲另类在线视频| 日韩精品一卡二卡三卡四卡无卡| 九色综合狠狠综合久久| 成人教育av在线| 欧美亚洲国产一区在线观看网站| 日韩一区二区影院| 欧美激情在线一区二区三区| 一区二区三区中文字幕在线观看| 亚洲va欧美va国产va天堂影院| 蜜臀精品一区二区三区在线观看| 成人性生交大片| 欧美亚洲自拍偷拍| 国产日韩精品一区二区三区在线| 亚洲激情在线激情| 国产又粗又猛又爽又黄91精品| 91浏览器打开| 欧美一区二区视频在线观看2020| 国产三级欧美三级| 丝袜亚洲另类丝袜在线| 成人av综合一区| 精品区一区二区| 偷窥少妇高潮呻吟av久久免费| 国产精品 欧美精品|