📄 debi.cpp
字号:
#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 + -