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

📄 debi.cpp

📁 vc ad
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "cardtestdlg.h"

void CCard::InitDebi(int nChannel)
{
	WriteReg(MC1, ENABLE_DEBI);	//enable DEBI port
	WriteReg(DEBI_CONFIG, DBC_INTEL|DBC_FAST|(2<<22));
	//WriteReg(DEBI_CONFIG, DBC_INTEL|(15<<22));
	WriteReg(DEBI_PAGE, 0);//page
	UploadDebi();
	if(m_nBoardVersion!=REVSS3000){
		EnableDSPLogic();
		ResetDSP(nChannel);
		SelectDSP();
		g_Main->OutString("初始化 DSP...");
		if(nChannel==0)
			InitDSPHpi();
		else
			InitDSPHpi2();
	}
	else{
		WriteByte(0x3f, 0x55);//test register
		if(ReadByte(0x3f)!=0x55){
			g_Main->OutString("DSP寄存器校验错!");
			return;
		}
		WriteByte(0x3f, 0xaa);//test register
		if(ReadByte(0x3f)!=0xaa){
			g_Main->OutString("DSP寄存器校验错!");
			return;
		}
		g_Main->OutString("DSP寄存器校验成功.");
		//set clock
		WriteByte(0x0a, 0x6e);
		//soft reset
		if(Reset(nChannel))
			g_Main->OutString("DSP复位成功.");
	}
}
void CCard::StopCompress(int nChannel)
{
	if(m_nBoardVersion==REVSS3000){
		if(Stop(nChannel))
			g_Main->OutString("停止 DSP 成功。");
		return;
	}
	int i=Stop(nChannel);
	if(i)
	    g_Main->OutString("停止 DSP 成功。");
	CString s;
	s.Format("状态为 %x",GetDSPStatus(nChannel));
	g_Main->OutString(s);
	if(WaitDSPInt(nChannel))
		g_Main->OutString("DSP 已停止。");
	s.Format("状态为 %x",GetDSPStatus(nChannel));
	g_Main->OutString(s);
}
void CCard::UploadDebi()
{
	WriteReg(MC2, 0x00020002);
}
#include "dspcode.h"
#include "dspcode5.h"
int TestAFGPIO(void);
/*
void ReadDSPRegisters(void);
int Reset(int nChannel);
int GetDSPInt(int nChannel);
void ClearDSPInt(int nChannel);
void InitDSPHpi();
void InitDSPHpi2();
void InformDSP(int nChannel);
void WriteHPIC(unsigned int wData);
void WriteHPIA(unsigned int wData);
void WriteChipMemory(unsigned int nAddress, unsigned int wData);
unsigned int ReadChipMemory2(unsigned int nAddress);
void WriteChipMemory2(unsigned int nAddress, unsigned int wData);
unsigned int ReadChipMemory(unsigned int nAddress);
void WriteWord(int nAddress, unsigned int wData);
unsigned int ReadWord(int nAddress);
void WriteByte(int nAddress, unsigned char byData);
unsigned char ReadByte(int nAddress);
*/
enum{VIDEO_PAL=0, VIDEO_NTSC=1};
enum{ARATE_32=1,
	ARATE_48,
	ARATE_56,
	ARATE_64,
	ARATE_80,
	ARATE_96,
	ARATE_112,
	ARATE_128,
	ARATE_160,
	ARATE_192,
	ARATE_224,
	ARATE_256,
	ARATE_320,
	ARATE_384};
enum{AUDIO_MONO=0, AUDIO_STEREO};

void CCard::EnableDSPLogic()
{
	WriteByte(0xe0, 0x55);//Open DSP Logic
}
void CCard::DisableDSPLogic()
{
	WriteByte(0xe0, 0x0);//Close DSP Logic
}
void CCard::ResetDSP(int nChannel)
{
	if(m_nBoardVersion<=REVA1){
		long t=ReadReg(GPIO_CTRL);
		t &= 0xff00ffff;
		t |= GP2_LOW;
		WriteReg(GPIO_CTRL, t);
		Sleep(1);
		t &= 0xff00ffff;
		t |= GP2_HIGH;
		WriteReg(GPIO_CTRL, t);
	}
	else{
	    if(nChannel==0){
			WriteByte(0xf0, 0xef);
			Sleep(1);
			WriteByte(0xf0, 0xff);
	    }
		else{
			WriteByte(0xf0, 0xdf);
			Sleep(1);
			WriteByte(0xf0, 0xff);
		}
	}
}
void CCard::SelectDSP(void)
{
	if(m_nBoardVersion<=REVA1){
		long t=ReadReg(GPIO_CTRL);
		t &= 0xffff00ff;
		t |= GP1_LOW;
		WriteReg(GPIO_CTRL, t);
	}
}
void CCard::DisselectDSP(void)
{
	if(m_nBoardVersion<=REVA1){
		long t=ReadReg(GPIO_CTRL);
		t &= 0xffff00ff;
		t |= GP1_HIGH;
		WriteReg(GPIO_CTRL, t);
	}
}

//#define CODELENGTH	6
int CCard::LoadDSPCode(int nChannel)
{
	int nAddress,i;
	CString s;
	g_Main->OutString("装载 DSP 代码...");
	if(m_nBoardVersion==REVSS3000){
		WriteByte(0x2E, 0x00);//sys_config
		WriteByte(0x0c, 0x03);//int_enable
		WriteByte(0x11, 0x18);//work_mode
		WriteByte(0x10, 0x20);//threshold
		//for each bank
		for(int i=0; i<sizeof(DspCodeSegs)/sizeof(DataSeg); i++){//
			int nBank=DspCodeSegs[i].nBank;
			unsigned char *pData=DspCodeSegs[i].pData;
			for(int j=0; j<DspCodeSegs[i].nLength; j++){//
				WriteByte(0x3f, nBank>>8);
				WriteByte(0x3e, nBank&0xff);
				WriteByte(0x08, 0x04);//start
				if(!WaitDSPInt(0, 0x02))
					g_Main->OutString("DSP未响应.");
				for(int k=0; k<256; k++)
					WriteByte(0x01, *pData++);
				if(!WaitDSPInt(0, 0x01))
					g_Main->OutString("DSP未响应.");
				//CString s;
				//s.Format("Bank 0x%03x 装载成功.", nBank);
				//g_Main->OutString(s);
				nBank++;
			}
		}
	}
	else{
		for(i=0,nAddress=CODESTART;i<CODELENGTH;i++,nAddress++){
			if(nChannel==0)
				WriteChipMemory(nAddress, nDSPCode[i]);
			else
				WriteChipMemory2(nAddress, nDSPCode[i]);
		}
	}
	return 1;
}
int CCard::VerifyDSPCode(int nChannel)
{
	int nAddress,i;
	CString s;
	if(m_nBoardVersion==REVSS3000){
		return 1;
	}
	else{
		g_Main->OutString("校验 DSP 代码...");
		for(i=0,nAddress=CODESTART;i<CODELENGTH;i++,nAddress++){
			unsigned int nRead;
			if(nChannel==0)
				nRead=ReadChipMemory(nAddress);
			else
				nRead=ReadChipMemory2(nAddress);
			if(nRead!=nDSPCode[i]){
				s.Format("校验错: 数据 %d 应为 %x 错为 %x",i,nDSPCode[i],nRead);
				g_Main->OutString(s);
				DisselectDSP();
				g_Main->OutString("校验失败。");
				return 0;
			}
		}
	}
	g_Main->OutString("校验成功。");
	return 1;
}
int CCard::StartDSP(int nChannel)
{
	CString s;
	if(m_nBoardVersion==REVSS3000){
		if(Reset(nChannel))
			g_Main->OutString("复位 DSP 成功。");
		ConfigMPEG(VIDEO_PAL, ARATE_224, AUDIO_STEREO, nChannel);
		if(Start(nChannel))
			g_Main->OutString("启动 DSP 成功。");
		else{
			g_Main->OutString("启动 DSP 失败。");
			return 0;
		}
		Release(nChannel);
		
		g_Main->OutString("产生数据流...");
		//s.Format("状态为 %x",GetDSPStatus(nChannel));
		//g_Main->OutString(s);
		
		return 1;
	}
	if(nChannel==0)
		WriteChipMemory(0x007f,0x0080);
	else
		WriteChipMemory2(0x007f,0x0080);
	if(WaitDSPInt(nChannel))
		g_Main->OutString("DSP 已响应。");
	s.Format("状态为 %x",GetDSPStatus(nChannel));
	g_Main->OutString(s);
	DisselectDSP();
	if(Reset(nChannel))
		g_Main->OutString("复位 DSP 成功。");
	s.Format("状态为 %x",GetDSPStatus(nChannel));
	g_Main->OutString(s);
	ConfigMPEG(VIDEO_PAL, ARATE_224, AUDIO_STEREO, nChannel);
	if(Start(nChannel))
		g_Main->OutString("启动 DSP 成功。");
	s.Format("状态为 %x",GetDSPStatus(nChannel));
	g_Main->OutString(s);
	Release(nChannel);
	g_Main->OutString("产生数据流...");
	s.Format("状态为 %x",GetDSPStatus(nChannel));
	g_Main->OutString(s);
	return 1;
}
#define SetDSPReg(a, b) WriteChipMemory((a)+0x100,(b))
#define GetDSPReg(a) ReadChipMemory((a)+0x100)
#define SetDSPReg2(a, b) WriteChipMemory2((a)+0x100,(b))
#define GetDSPReg2(a) ReadChipMemory2((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
#define VSLICE_HEADER	0x1a
#define VGOP_HEADER	0x1b
#define VIN_OFFSET	0x20
#define VIN_CNTL	0x21
#define VIN_PICTURE	0x22
#define I2SIN_CONFA	0x24
#define I2SOUT_CONFA	0x26
#define I2SOUT_CONFB	0x27
#define ARATE		0x28
#define AUDIO_CNTL	0x29
#define CD_FORMATTING	0x2d
#define INIT_MINUTE	0x30
#define INIT_SECOND	0x31
#define INIT_SECTOR	0x32
#define PAUSE_LENGTH	0x33
#define LINK_LENGTH	0x34
#define REAR_MARGIN	0x35
#define SECTOR_NUM_L	0x36
#define SECTOR_NUM_M	0x37

//DSP register bits
#define CM_RESET	0x00
#define CM_SLEEP	0x01
#define CM_WAKEUP	0x02
#define CM_START	0x04
#define CM_STOP		0x05
#define CM_RELEASE	0x08
#define CM_GPUPDATE	0xff

#define WORK_AV		0x05

#define VF_PAL		0x08
#define VF_NTSC		0x00

#define SCDETECT_EN	0x40
#define SCDETECT_DS	0x00

#define BITMAP_NONE	0x00

#define OUT_MASTER	0x04
#define OUT_SLAVE	0x00

#define INSERTHEADER	0x00
#define FILLHEADER0	0x00
#define SCRAMBLE	0x01

int CCard::GetDSPStatus(int nChannel)
{
	int u;
	if(m_nBoardVersion==REVSS3000){
		u=ReadByte(0x0d);
	}
	else{
		SelectDSP();
		if(nChannel==0)
			u=GetDSPReg(DSP_STATUS);
		else
			u=GetDSPReg2(DSP_STATUS);
		DisselectDSP();
	}
	ClearDSPStatus(nChannel);
	return u;
}
void CCard::ClearDSPStatus(int nChannel)
{
	if(m_nBoardVersion==REVSS3000){
		WriteByte(0x0f, 0xff);
		return;
	}
  SelectDSP();
  if(nChannel==0)
    SetDSPReg(DSP_STATUS,0);
  else
    SetDSPReg2(DSP_STATUS,0);
  DisselectDSP();
}
int CCard::Start(int nChannel)
{
	if(m_nBoardVersion==REVSS3000){
		WriteByte(0x08, 0x04);
	}
	else{
		SelectDSP();
		if(nChannel==0)
			SetDSPReg(DSP_COMMAND,CM_START);
		else
			SetDSPReg2(DSP_COMMAND,CM_START);
		InformDSP(nChannel);
		DisselectDSP();
	}
	if(WaitDSPInt(nChannel))
		return 1;
	else

⌨️ 快捷键说明

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