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 + -
显示快捷键?