debi.c

来自「driver wdk」· C语言 代码 · 共 1,196 行 · 第 1/3 页

C
1,196
字号
#define LOGOTEST 1

#include "ave2k.h"
#include "ave2kif.h"
#include "ave2kregs.h"
#include "ave2kutil.h"
#include "audioctrl.h"
#include "saa7111.h"
#include "dsp.h"
#include "debi.h"

#ifndef WORD
#define WORD unsigned short
#endif

//#include "reg7146.h"
static void UploadDebi(PDEVICE_EXTENSION pDE);
int LoadDSPCode(PDEVICE_EXTENSION pDE, int nChannel);

#define EXPORT		0xf0
#define LOCK		0xe0
#define OFFFRAME	0xd0
#define ONFRAME		0xc0
#define EXPORT2		0xb0
//bits of expanded port 1
#define EX_RESET1	0x10
#define EX_RESET2	0x20 //double card
#define EX_SELLINE	0x20  //0x20->0x80 //quad card
#define EX_CLOCKV0	0x20 //for AVE-V
#define EX_DATA		0x40 //double card, M62429 data
#define EX_VOL0		0x40  //0x40->0x20 //quad card, volume bit0
#define EX_CLOCKV1	0x40 //for AVE-V
#define EX_CLOCK	0x80 //double card, M62429 clock
#define EX_VOL1		0x80 //0x80->0x40 //quad card, volume bit 1
#define EX_DATA_V	0x40 //for AVE-V
//bit of expanded port 2
#define EX_AM_ON	0x80
#define EX_ALMOUT	0x40

void UploadDebi(PDEVICE_EXTENSION pDE)
{
	Ave2kWriteRegister(pDE, MC2, 0x00020002);
 // Reg[MC2]=0x00020002;
}
#include "dspcode.h"

#pragma warning(disable:4761)
void ResetDSP(PDEVICE_EXTENSION pDE, int nChannel);
static WORD GetDSPStatus(PDEVICE_EXTENSION pDE, int nChannel);
static void ClearDSPStatus(PDEVICE_EXTENSION pDE, int nChannel);
static int TestAFGPIO(PDEVICE_EXTENSION pDE, int nChannel);
static int Release(PDEVICE_EXTENSION pDE, int nChannel);
static int Start(PDEVICE_EXTENSION pDE, int nChannel);
static int Stop(PDEVICE_EXTENSION pDE, int nChannel);
static int ConfigMPEG(PDEVICE_EXTENSION pDE,int nChannel);

//static void ReadDSPRegisters(PDEVICE_EXTENSION pDE);
int Reset(PDEVICE_EXTENSION pDE, int nChannel);
static int WaitDSPInt(PDEVICE_EXTENSION pDE, int nChannel);
static int GetDSPInt(PDEVICE_EXTENSION pDE);
static int GetDSPInt2(PDEVICE_EXTENSION pDE);
static void ClearDSPInt(PDEVICE_EXTENSION pDE);
static void ClearDSPInt2(PDEVICE_EXTENSION pDE);
static void InitDSPHpi(PDEVICE_EXTENSION pDE);
static void InitDSPHpi2(PDEVICE_EXTENSION pDE);
static void InformDSP(PDEVICE_EXTENSION pDE);
static void InformDSP2(PDEVICE_EXTENSION pDE);
//static void WriteHPIC(PDEVICE_EXTENSION pDE,unsigned int wData);
//static void WriteHPIA(PDEVICE_EXTENSION pDE,unsigned int wData);
static void WriteChipMemory(PDEVICE_EXTENSION pDE,int nAddress, int wData);
static WORD ReadChipMemory(PDEVICE_EXTENSION pDE,int nAddress);
static void WriteChipMemory2(PDEVICE_EXTENSION pDE,int nAddress, int wData);
static WORD ReadChipMemory2(PDEVICE_EXTENSION pDE,int nAddress);
static void WriteWord(PDEVICE_EXTENSION pDE,int nAddress, int wData);
static WORD ReadWord(PDEVICE_EXTENSION pDE,int nAddress);
static void WriteByte(PDEVICE_EXTENSION pDE,int nAddress, unsigned char byData);
static unsigned char ReadByte(PDEVICE_EXTENSION pDE,int nAddress);
static void EnableLogic(PDEVICE_EXTENSION pDE);
static void DisableLogic(PDEVICE_EXTENSION pDE);

static void OutData(PDEVICE_EXTENSION pDE, ULONG Value);
static void OutClock(PDEVICE_EXTENSION pDE, ULONG Value);

static void OutDataV(PDEVICE_EXTENSION pDE, ULONG Value);
static void OutClockV0(PDEVICE_EXTENSION pDE, ULONG Value);
static void OutClockV1(PDEVICE_EXTENSION pDE, ULONG Value);

enum{VIDEO_PAL=0, VIDEO_NTSC=1};
enum{AUDIO_MONO=0, AUDIO_STEREO};

int GetAlarmStatus(PDEVICE_EXTENSION pDE)
{
	ULONG lPsr;
	int nStatus;
	lPsr=Ave2kReadRegister(pDE, PSR);
	nStatus=(lPsr>>5)&0x03;
	if(nStatus==0)
		return AVE2K_ALM_STATUS_NORMAL;
	if(pDE->AlarmConfig==AVE2K_ALARMCFG_NO){
		if(nStatus==1)//short
			return AVE2K_ALM_STATUS_DETECTED;
		else
			return AVE2K_ALM_STATUS_BAD;
	}
	else{
		if(nStatus==2)//open
			return AVE2K_ALM_STATUS_DETECTED;
		else
			return AVE2K_ALM_STATUS_BAD;
	}
}
void ConfigAlarmInterface(PDEVICE_EXTENSION pDE, int nAlarmConfig)
{
	pDE->AlarmConfig=(USHORT)nAlarmConfig;
}
void SetCompressFrameRate(PDEVICE_EXTENSION pDE, int nOnFrame, int nOffFrame)
{
	if(pDE->bFrmAdjMode2)
		nOnFrame|=0x08;
	WriteByte(pDE, ONFRAME, (UCHAR)((nOnFrame)<<4));
	WriteByte(pDE, OFFFRAME, (UCHAR)((nOffFrame)<<4));
}

void SetAudioMonitor(PDEVICE_EXTENSION pDE, int bEnable)
{
	if(bEnable)
		pDE->Export2 |= EX_AM_ON;
	else
		pDE->Export2 &= ~EX_AM_ON;
	WriteByte(pDE, EXPORT2, pDE->Export2);
}

void SetAlarmOutput(PDEVICE_EXTENSION pDE, BOOLEAN bAlarm)
{
	if(bAlarm)
		pDE->Export2 |= EX_ALMOUT;
	else
		pDE->Export2 &= ~EX_ALMOUT;
	WriteByte(pDE, EXPORT2, pDE->Export2);
}

void SetAudioSource(PDEVICE_EXTENSION pDE, int bSelLine)
{
	if(bSelLine)
		pDE->Export |= EX_SELLINE;
	else
		pDE->Export &= ~EX_SELLINE;
	WriteByte(pDE, EXPORT, pDE->Export);
}

void SetAnalogSwitchVolume(PDEVICE_EXTENSION pDE, ULONG nVolume)
{
	if(nVolume>99)
		nVolume=99;
	nVolume/=33;
	nVolume<<=6;
	pDE->Export &= 0x3f;
	pDE->Export |= nVolume;
	WriteByte(pDE, EXPORT, pDE->Export);
}


void InitDebiPort(PDEVICE_EXTENSION pDE)
{
//Init DEBI port
	Ave2kWriteRegister(pDE, MC1, ENABLE_DEBI);
	Ave2kWriteRegister(pDE, DEBI_CONFIG, DBC_INTEL|DBC_FAST);
	Ave2kWriteRegister(pDE, DEBI_PAGE, 0);
}
BOOLEAN Ave2kLoadDSPCode(PDEVICE_EXTENSION pDE)
{

  //Unlock EPLD 
	EnableLogic(pDE);
	//pDE->Export= EX_RESET1 | EX_RESET2;
	ResetDSP(pDE, 0);
    LoadDSPCode(pDE, 0);
	if(pDE->Double){
		ResetDSP(pDE, 1);
		LoadDSPCode(pDE, 1);
	}
	return TRUE;
}
BOOLEAN Ave2kReStartDSP(PDEVICE_EXTENSION pDE, ULONG nChannel)
{
	//KIRQL  OldIrql;
	//OldIrql=KeGetCurrentIrql();
	if(pDE->ExStat[nChannel]&(EXSTAT_LOADFAIL|EXSTAT_STATFAIL))
		return FALSE;
	//Ave2kStopDSP(pDE, nChannel);
	Reset(pDE, nChannel);
	if(Ave2kStartDSP(pDE, nChannel)==FALSE){
		ResetDSP(pDE, nChannel);
		if(LoadDSPCode(pDE, nChannel)==FALSE){
			//pDE->ExStat[nChannel]|=ERR_DSPFAIL;
			return FALSE;
		}
		if(Ave2kStartDSP(pDE, nChannel)==FALSE){
			//pDE->ExStat[nChannel]|=ERR_DSPFAIL;
			return FALSE;
		}
	}
	return TRUE;
}
BOOLEAN Ave2kStartDSP(PDEVICE_EXTENSION pDE, ULONG nChannel)
{
   //Unlock EPLD 
	ULONG Status;
	int i=0;
	if(pDE->ExStat[nChannel]&(EXSTAT_LOADFAIL|EXSTAT_STATFAIL))
		return FALSE;
  KdPrint(("Start compressing...\n"));
#if 0
  if(Reset(pDE, nChannel))
	  KdPrint(("Reset DSP OK.\n"));
  while(i<5){
	Status=GetDSPStatus(pDE, nChannel);
	if(Status==1)
		break;
	i++;
	ave2kDelay(100);
  }
  KdPrint(("Ave2kStartDSP: Reset() Status=%x\n",Status));
  if(Status!=1){
	pDE->ExStat[nChannel]|=EXSTAT_STATFAIL;
	return FALSE;
  }
#endif
  ConfigMPEG(pDE, nChannel);
  //ReadDSPRegisters(pDE);
  if(Start(pDE, nChannel))
    KdPrint(("Start OK.\n"));
  KdPrint(("Ave2kStartDSP: Start() Status=%x\n",GetDSPStatus(pDE, nChannel)));
  Release(pDE, nChannel);
  KdPrint(("Releasing stream...\n"));
  KdPrint(("Ave2kStartDSP: Release() Status=%x\n",GetDSPStatus(pDE, nChannel)));
  return TRUE;
}


BOOLEAN Ave2kStopDSP(PDEVICE_EXTENSION pDE, ULONG nChannel)
{
  int i;
  int nStatus;
	if(pDE->ExStat[nChannel]&(EXSTAT_LOADFAIL|EXSTAT_STATFAIL))
		return FALSE;
  i=Stop(pDE, nChannel);
  if(i)
    KdPrint(("Stop OK.\n"));
  nStatus=GetDSPStatus(pDE, nChannel);
  KdPrint(("Ave2kStopDSP: Stop(): Status=%x\n",nStatus));
  if(nStatus!=0x20)
	pDE->ExStat[nChannel]|=EXSTAT_ENDFAIL;
  if(WaitDSPInt(pDE,nChannel))
    KdPrint(("Really stopped.\n"));
  KdPrint(("Status=%x\n",GetDSPStatus(pDE, nChannel)));
  return TRUE;
}

//++++++++++++++++++++++++++++++++++++
//Static functions
//------------------------------------
void SelectDSP(PDEVICE_EXTENSION pDE)
{
	if(pDE->BoardVersion<=REVA1){
		long t=Ave2kReadRegister(pDE,GPIO_CTRL);
		t &= 0xffff00ff;
		t |= GP1_LOW;
		Ave2kWriteRegister(pDE, GPIO_CTRL,t);
		//Reg[GPIO_CTRL]=t;
	}
}
void DisselectDSP(PDEVICE_EXTENSION pDE)
{
	if(pDE->BoardVersion<=REVA1){
		long t=Ave2kReadRegister(pDE,GPIO_CTRL);
		//Reg[GPIO_CTRL];
		t &= 0xffff00ff;
		t |= GP1_HIGH;
		// Reg[GPIO_CTRL]=t;
		Ave2kWriteRegister(pDE, GPIO_CTRL, t);
	}
}

//#define CODELENGTH	6
int LoadDSPCode(PDEVICE_EXTENSION pDE, int nChannel)
{
	int nAddress,i;
	int nStatus;
	SelectDSP(pDE);
	if(nChannel==0){
		InitDSPHpi(pDE);
		KdPrint(("Loading DSP code...\n"));
		for(i=0,nAddress=CODESTART;i<CODELENGTH;i++,nAddress++)
		{
			WriteChipMemory(pDE, nAddress, nDSPCode[i]);
		}
		KdPrint(("Verifing DSP code...\n"));
		for(i=0,nAddress=CODESTART;i<16;i++,nAddress++)
		{
			WORD nRead;
			nRead=ReadChipMemory(pDE,nAddress);
			if(nRead!=nDSPCode[i]){
				KdPrint(("Error in verify: data %d should be %x but is %x\n",i,nDSPCode[i],nRead));
				DisselectDSP(pDE);
				pDE->ExStat[nChannel]|=EXSTAT_LOADFAIL;
				KdPrint(("Verify failed.\n"));
				return 0;
			} 
		}
		KdPrint(("Verify OK.\n"));
	
		WriteChipMemory(pDE,0x007f,0x0080);
	}
	else{
		InitDSPHpi2(pDE);
		KdPrint(("Loading DSP2 code...\n"));
		for(i=0,nAddress=CODESTART;i<CODELENGTH;i++,nAddress++)
		{
			WriteChipMemory2(pDE, nAddress, nDSPCode[i]);
		}
		KdPrint(("Verifing DSP2 code...\n"));
		for(i=0,nAddress=CODESTART;i<16;i++,nAddress++)
		{
			WORD nRead;
			nRead=ReadChipMemory2(pDE,nAddress);
			if(nRead!=nDSPCode[i]){
				KdPrint(("Error in verify2: data %d should be %x but is %x\n",i,nDSPCode[i],nRead));
				pDE->ExStat[nChannel]|=EXSTAT_LOADFAIL;
				DisselectDSP(pDE);
				KdPrint(("Verify failed.\n"));
				return 0;
			} 
		}
		KdPrint(("Verify OK.\n"));

		WriteChipMemory2(pDE,0x007f,0x0080);
	}
	if(WaitDSPInt(pDE, nChannel))
		KdPrint(("DSP responsed.\n"));
	nStatus=GetDSPStatus(pDE, nChannel);
	KdPrint(("Device %d/%d: DSP status=%x\n",pDE->NtDeviceNumber+1, nChannel, nStatus));
	if(nStatus!=1){
		pDE->ExStat[nChannel]|=EXSTAT_STATFAIL;
		return 0;
	}
	DisselectDSP(pDE);
	if(Reset(pDE,nChannel))
		return 1;
	else
		return 0;
	//	KdPrint(("Reset DSP OK.\n"));
	//KdPrint(("Reset-Status=%x\n",GetDSPStatus(pDE, nChannel)));
	//  printf("Press any key to start compression.\n");
	//return 1;
}
#if (LOGOTEST==1)
void LoadLogo(PDEVICE_EXTENSION pDE, int nChannel)
{
	int i, nAddress;
	int nValue;
	PUCHAR Logo=pDE->Logo[nChannel].Logo;
	if(nChannel==0){
		for(i=0,nAddress=0x0c00;i<LOGOSIZE;i+=2,nAddress++)
		{
			nValue=(Logo[i]<<8)|(Logo[i+1]);
			WriteChipMemory(pDE, nAddress, nValue);
		}
	}
	else{
		for(i=0,nAddress=0x0c00;i<LOGOSIZE;i+=2,nAddress++)
		{
			nValue=(Logo[i]<<8)|(Logo[i+1]);
			WriteChipMemory2(pDE, nAddress, nValue);
		}
		/*for(i=0,nAddress=0x0c00;i<LOGOSIZE;i+=2,nAddress++)
		{
			//nValue=(Logo[i]<<8)|(Logo[i+1]);
			nValue=ReadChipMemory2(pDE, nAddress);
			Logo[i]=nValue>>8;
			Logo[i+1]=nValue&0xff;
		}*/
	}
}
#endif

#define SetDSPReg(pDE,a, b) WriteChipMemory(pDE,(a)+0x100,(b))
#define GetDSPReg(pDE,a) ReadChipMemory(pDE,(a)+0x100)
#define SetDSPReg2(pDE,a, b) WriteChipMemory2(pDE,(a)+0x100,(b))
#define GetDSPReg2(pDE,a) ReadChipMemory2(pDE,(a)+0x100)
//DSP registers
#define GPIO_CNTL	0x02
#define GPIO_OUT	0x04
#define DSP_COMMAND	0x08
#define DSP_STATUS	0x0d
#define WORK_MODE	0x11
#define VIDEO_FORMAT	0x12
#define VENC_CNTL	0x13
#define VFRAME_PATTERN	0x14

⌨️ 快捷键说明

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