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

📄 pip_dss.c

📁 Using DSP/BIOS I/O in Multichannel Systems
💻 C
字号:
/* 
   Copyright Texas Instruments 1998
   Texas Instruments Proprietary Data -- Internal Data
   Jack Greenbaum, TI Santa Barbara, greenbaum@ti.com
*/
/*
 *  ======== dss.c ========
 *! Revision History
 *! ================
 */

#include <std.h>
#include <log.h>
#include <swi.h>
#include <pip.h>

#include "drv.h"

extern DRV_Fxns	DSK6211_codecFxns;

DRV_Fxns *drv = &DSK6211_codecFxns;

void DSS_txPrime(int calledByIsr, int ignored);
void DSS_rxPrime(int calledByIsr, int ignored);

#define RCV_CHAN0 0
#define XMT_CHAN0 1
#define RCV_CHAN1 2
#define XMT_CHAN1 3

extern far PIP_Obj txPip0;
extern far PIP_Obj rxPip0;
extern far PIP_Obj txPip1;
extern far PIP_Obj rxPip1;

PIP_Obj far *txPips[2] =
{
    &txPip0,
    &txPip1
};

PIP_Obj far *rxPips[2] =
{
    &rxPip0,
    &rxPip1
};

Void
DSS_init(Void)
{
	drv->init(RCV_CHAN0, NULL);
	drv->init(XMT_CHAN0, NULL);
	drv->init(RCV_CHAN1, NULL);
	drv->init(XMT_CHAN1, NULL);
	drv->setCallback(RCV_CHAN0, DSS_rxPrime, RCV_CHAN0);
	drv->setCallback(XMT_CHAN0, DSS_txPrime, XMT_CHAN0);
	drv->setCallback(RCV_CHAN1, DSS_rxPrime, RCV_CHAN1);
	drv->setCallback(XMT_CHAN1, DSS_txPrime, XMT_CHAN1);

    /* these enable interrupts, maybe a problem? */
    DSS_txPrime(0,XMT_CHAN0);
    DSS_rxPrime(0,RCV_CHAN0);
    DSS_txPrime(0,XMT_CHAN1);
    DSS_rxPrime(0,RCV_CHAN1);
}

/*
 *  ======= DSS_txPrime ========
 *  This must be called  by the notifyReader function of the txPips
 */
void
DSS_txPrime(int calledByIsr, int drvChan)
{  
	int chan;

    if (drvChan == 1)
    	chan = 0;
    else
    	chan = 1;
    
    drv->stop(drvChan);

	/* return empty buffer back to client */
	if (calledByIsr && (drv->getBuf(drvChan, NULL, NULL) != NULL)) {
		PIP_free(txPip[chan]);
	}
	
	/* if there is room in the driver and a frame on the tx queue */
	if (!drv->isFull(drvChan) && PIP_getReaderNumFrames(txPip[chan]) > 0) {
	    PIP_get(txPip[chan]);
	    drv->setBuf(drvChan,
					PIP_getReaderAddr(txPip[chan]), 
					PIP_getReaderSize(txPip[chan])*2);
	}

	drv->start(drvChan);
}

/*
 *  ======= DSS_rxPrime ========
 *  This must be the notifyWriter function of the rxPips
 */
void
DSS_rxPrime(int calledByIsr, int drvChan)
{
	int chan;

    if (drvChan == 2)
    	chan = 1;
    drv->stop(drvChan);
    
	/* return full frame back to client */
	if (calledByIsr && (drv->getBuf(drvChan, NULL, NULL) != NULL)) {
	    PIP_put(rxPip[chan]);
	}

	/* if there is a frame on the rx queue */
	if (!drv->isFull(drvChan) && PIP_getWriterNumFrames(rxPip[chan]) > 0) {
	    PIP_alloc(rxPip[chan]);
	    drv->setBuf(drvChan,
					PIP_getWriterAddr(rxPip[chan]), 
					PIP_getWriterSize(rxPip[chan])*2);
	} 

    drv->start(drvChan);
}

⌨️ 快捷键说明

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