⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 korg1212.c

📁 LINUX 2.6.17.4的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        snd_korg1212_setCardState(korg1212, K1212_STATE_SETUP);        rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_SelectPlayMode,                                        K1212_MODE_SetupPlay, 0, 0, 0);	if (rc)		K1212_DEBUG_PRINTK("K1212_DEBUG: SetupForPlay - RC = %d [%s]\n",				   rc, stateName[korg1212->cardState]);        if (rc != K1212_CMDRET_Success) {                return 1;        }        return 0;}/* spinlock already held */static int snd_korg1212_TriggerPlay(struct snd_korg1212 * korg1212){	int rc;	K1212_DEBUG_PRINTK("K1212_DEBUG: TriggerPlay [%s] %d\n",			   stateName[korg1212->cardState], korg1212->playcnt);        if (korg1212->playcnt++)		return 0;        snd_korg1212_setCardState(korg1212, K1212_STATE_PLAYING);        rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_TriggerPlay, 0, 0, 0, 0);	if (rc)		K1212_DEBUG_PRINTK("K1212_DEBUG: TriggerPlay - RC = %d [%s]\n",				   rc, stateName[korg1212->cardState]);        if (rc != K1212_CMDRET_Success) {                return 1;        }        return 0;}/* spinlock already held */static int snd_korg1212_StopPlay(struct snd_korg1212 * korg1212){	K1212_DEBUG_PRINTK("K1212_DEBUG: StopPlay [%s] %d\n",			   stateName[korg1212->cardState], korg1212->playcnt);        if (--(korg1212->playcnt)) 		return 0;	korg1212->setcnt = 0;        if (korg1212->cardState != K1212_STATE_ERRORSTOP)		snd_korg1212_SendStop(korg1212);	snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN);        return 0;}static void snd_korg1212_EnableCardInterrupts(struct snd_korg1212 * korg1212){	writel(PCI_INT_ENABLE_BIT            |	       PCI_DOORBELL_INT_ENABLE_BIT   |	       LOCAL_INT_ENABLE_BIT          |	       LOCAL_DOORBELL_INT_ENABLE_BIT |	       LOCAL_DMA1_INT_ENABLE_BIT,	       korg1212->statusRegPtr);}#if 0 /* not used */static int snd_korg1212_SetMonitorMode(struct snd_korg1212 *korg1212,				       enum MonitorModeSelector mode){	K1212_DEBUG_PRINTK("K1212_DEBUG: SetMonitorMode [%s]\n",			   stateName[korg1212->cardState]);        switch (mode) {	case K1212_MONMODE_Off:		if (korg1212->cardState != K1212_STATE_MONITOR)			return 0;		else {			snd_korg1212_SendStopAndWait(korg1212);			snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN);		}		break;	case K1212_MONMODE_On:		if (korg1212->cardState != K1212_STATE_OPEN)			return 0;		else {			int rc;			snd_korg1212_setCardState(korg1212, K1212_STATE_MONITOR);			rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_SelectPlayMode,							  K1212_MODE_MonitorOn, 0, 0, 0);			if (rc != K1212_CMDRET_Success)				return 0;		}		break;	default:		return 0;        }        return 1;}#endif /* not used */static inline int snd_korg1212_use_is_exclusive(struct snd_korg1212 *korg1212){	if (korg1212->playback_pid != korg1212->capture_pid &&	    korg1212->playback_pid >= 0 && korg1212->capture_pid >= 0)		return 0;	return 1;}static int snd_korg1212_SetRate(struct snd_korg1212 *korg1212, int rate){        static enum ClockSourceIndex s44[] = {		K1212_CLKIDX_AdatAt44_1K,		K1212_CLKIDX_WordAt44_1K,		K1212_CLKIDX_LocalAt44_1K	};        static enum ClockSourceIndex s48[] = {		K1212_CLKIDX_AdatAt48K,		K1212_CLKIDX_WordAt48K,		K1212_CLKIDX_LocalAt48K	};        int parm, rc;	if (!snd_korg1212_use_is_exclusive (korg1212))		return -EBUSY;	switch (rate) {	case 44100:		parm = s44[korg1212->clkSource];		break;	case 48000:		parm = s48[korg1212->clkSource];		break;	default:		return -EINVAL;	}        korg1212->clkSrcRate = parm;        korg1212->clkRate = rate;	udelay(INTERCOMMAND_DELAY);	rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_SetClockSourceRate,					  ClockSourceSelector[korg1212->clkSrcRate],					  0, 0, 0);	if (rc)		K1212_DEBUG_PRINTK("K1212_DEBUG: Set Clock Source Selector - RC = %d [%s]\n",				   rc, stateName[korg1212->cardState]);        return 0;}static int snd_korg1212_SetClockSource(struct snd_korg1212 *korg1212, int source){	if (source < 0 || source > 2)		return -EINVAL;        korg1212->clkSource = source;        snd_korg1212_SetRate(korg1212, korg1212->clkRate);        return 0;}static void snd_korg1212_DisableCardInterrupts(struct snd_korg1212 *korg1212){	writel(0, korg1212->statusRegPtr);}static int snd_korg1212_WriteADCSensitivity(struct snd_korg1212 *korg1212){        struct SensBits  sensVals;        int       bitPosition;        int       channel;        int       clkIs48K;        int       monModeSet;        u16       controlValue;    // this keeps the current value to be written to                                   //  the card's eeprom control register.        u16       count;	unsigned long flags;	K1212_DEBUG_PRINTK("K1212_DEBUG: WriteADCSensivity [%s]\n",			   stateName[korg1212->cardState]);        // ----------------------------------------------------------------------------        // initialize things.  The local init bit is always set when writing to the        // card's control register.        // ----------------------------------------------------------------------------        controlValue = 0;        SetBitInWord(&controlValue, SET_SENS_LOCALINIT_BITPOS);    // init the control value        // ----------------------------------------------------------------------------        // make sure the card is not in monitor mode when we do this update.        // ----------------------------------------------------------------------------        if (korg1212->cardState == K1212_STATE_MONITOR || korg1212->idleMonitorOn) {                monModeSet = 1;		snd_korg1212_SendStopAndWait(korg1212);        } else                monModeSet = 0;	spin_lock_irqsave(&korg1212->lock, flags);        // ----------------------------------------------------------------------------        // we are about to send new values to the card, so clear the new values queued        // flag.  Also, clear out mailbox 3, so we don't lockup.        // ----------------------------------------------------------------------------        writel(0, korg1212->mailbox3Ptr);        udelay(LOADSHIFT_DELAY);        // ----------------------------------------------------------------------------        // determine whether we are running a 48K or 44.1K clock.  This info is used        // later when setting the SPDIF FF after the volume has been shifted in.        // ----------------------------------------------------------------------------        switch (korg1212->clkSrcRate) {                case K1212_CLKIDX_AdatAt44_1K:                case K1212_CLKIDX_WordAt44_1K:                case K1212_CLKIDX_LocalAt44_1K:                        clkIs48K = 0;                        break;                case K1212_CLKIDX_WordAt48K:                case K1212_CLKIDX_AdatAt48K:                case K1212_CLKIDX_LocalAt48K:                default:                        clkIs48K = 1;                        break;        }        // ----------------------------------------------------------------------------        // start the update.  Setup the bit structure and then shift the bits.        // ----------------------------------------------------------------------------        sensVals.l.v.leftChanId   = SET_SENS_LEFTCHANID;        sensVals.r.v.rightChanId  = SET_SENS_RIGHTCHANID;        sensVals.l.v.leftChanVal  = korg1212->leftADCInSens;        sensVals.r.v.rightChanVal = korg1212->rightADCInSens;        // ----------------------------------------------------------------------------        // now start shifting the bits in.  Start with the left channel then the right.        // ----------------------------------------------------------------------------        for (channel = 0; channel < 2; channel++) {                // ----------------------------------------------------------------------------                // Bring the load/shift line low, then wait - the spec says >150ns from load/                // shift low to the first rising edge of the clock.                // ----------------------------------------------------------------------------                ClearBitInWord(&controlValue, SET_SENS_LOADSHIFT_BITPOS);                ClearBitInWord(&controlValue, SET_SENS_DATA_BITPOS);                writew(controlValue, korg1212->sensRegPtr);                          // load/shift goes low                udelay(LOADSHIFT_DELAY);                for (bitPosition = 15; bitPosition >= 0; bitPosition--) {       // for all the bits			if (channel == 0) {				if (sensVals.l.leftSensBits & (0x0001 << bitPosition))                                        SetBitInWord(&controlValue, SET_SENS_DATA_BITPOS);     // data bit set high				else					ClearBitInWord(&controlValue, SET_SENS_DATA_BITPOS);   // data bit set low			} else {                                if (sensVals.r.rightSensBits & (0x0001 << bitPosition))					SetBitInWord(&controlValue, SET_SENS_DATA_BITPOS);     // data bit set high				else					ClearBitInWord(&controlValue, SET_SENS_DATA_BITPOS);   // data bit set low			}                        ClearBitInWord(&controlValue, SET_SENS_CLOCK_BITPOS);                        writew(controlValue, korg1212->sensRegPtr);                       // clock goes low                        udelay(SENSCLKPULSE_WIDTH);                        SetBitInWord(&controlValue, SET_SENS_CLOCK_BITPOS);                        writew(controlValue, korg1212->sensRegPtr);                       // clock goes high                        udelay(SENSCLKPULSE_WIDTH);                }                // ----------------------------------------------------------------------------                // finish up SPDIF for left.  Bring the load/shift line high, then write a one                // bit if the clock rate is 48K otherwise write 0.                // ----------------------------------------------------------------------------                ClearBitInWord(&controlValue, SET_SENS_DATA_BITPOS);                ClearBitInWord(&controlValue, SET_SENS_CLOCK_BITPOS);                SetBitInWord(&controlValue, SET_SENS_LOADSHIFT_BITPOS);                writew(controlValue, korg1212->sensRegPtr);                   // load shift goes high - clk low                udelay(SENSCLKPULSE_WIDTH);                if (clkIs48K)                        SetBitInWord(&controlValue, SET_SENS_DATA_BITPOS);                writew(controlValue, korg1212->sensRegPtr);                   // set/clear data bit                udelay(ONE_RTC_TICK);                SetBitInWord(&controlValue, SET_SENS_CLOCK_BITPOS);                writew(controlValue, korg1212->sensRegPtr);                   // clock goes high                udelay(SENSCLKPULSE_WIDTH);                ClearBitInWord(&controlValue, SET_SENS_CLOCK_BITPOS);                writew(controlValue, korg1212->sensRegPtr);                   // clock goes low                udelay(SENSCLKPULSE_WIDTH);        }        // ----------------------------------------------------------------------------        // The update is complete.  Set a timeout.  This is the inter-update delay.        // Also, if the card was in monitor mode, restore it.        // ----------------------------------------------------------------------------        for (count = 0; count < 10; count++)                udelay(SENSCLKPULSE_WIDTH);        if (monModeSet) {                int rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_SelectPlayMode,                                K1212_MODE_MonitorOn, 0, 0, 0);	        if (rc)			K1212_DEBUG_PRINTK("K1212_DEBUG: WriteADCSensivity - RC = %d [%s]\n",					   rc, stateName[korg1212->cardState]);        }	spin_unlock_irqrestore(&korg1212->lock, flags);        return 1;}static void snd_korg1212_OnDSPDownloadComplete(struct snd_korg1212 *korg1212){        int channel, rc;        K1212_DEBUG_PRINTK("K1212_DEBUG: DSP download is complete. [%s]\n",			   stateName[korg1212->cardState]);        // ----------------------------------------------------        // tell the card to boot        // ----------------------------------------------------        rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_BootFromDSPPage4, 0, 0, 0, 0);	if (rc)		K1212_DEBUG_PRINTK("K1212_DEBUG: Boot from Page 4 - RC = %d [%s]\n",				   rc, stateName[korg1212->cardState]);	msleep(DSP_BOOT_DELAY_IN_MS);        // --------------------------------------------------------------------------------        // Let the card know where all the buffers are.        // --------------------------------------------------------------------------------        rc = snd_korg1212_Send1212Command(korg1212,                        K1212_DB_ConfigureBufferMemory,                        LowerWordSwap(korg1212->PlayDataPhy),                        LowerWordSwap(korg1212->RecDataPhy),                        ((kNumBuffers * kPlayBufferFrames) / 2),   // size given to the card                                                                   // is based on 2 buffers                        0        );	if (rc)		K1212_DEBUG_PRINTK("K1212_DEBUG: Configure Buffer Memory - RC = %d [%s]\n",				   rc, stateName[korg1212->cardState]);        udelay(INTERCOMMAND_DELAY);        rc = snd_korg1212_Send1212Command(korg1212,                        K1212_DB_ConfigureMiscMemory,                        LowerWordSwap(korg1212->VolumeTablePhy),                        LowerWordSwap(korg1212->RoutingTablePhy),                        LowerWordSwap(korg1212->AdatTimeCodePhy),                        0        );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -