📄 canlgpvr.c
字号:
/******************************************************************************//* canlgpvr.c : specific code for ANALOG_PVR board* REALmagic Quasar Hardware Library* Created by Aurelia Popa-Radu* Copyright Sigma Designs Inc* Sigma Designs Proprietary and confidential* Created on 8/7/01* Description:/******************************************************************************//****h* HwLib/CAnlgPvr_Implementation * DESCRIPTION * CAnlgPvr implementation of the IDecoderBoard interface. * AnalogOverlay PVR uses EM847X, EM9010, AD7170, SA7114, SM2288, Sii168 components * to implement video/audio encoding, analog overlay output, TV and scart output, * HDTV output, DVI output. * Identified by HwLib reading MD5,MD4,MD3,MD2 pins = 0111 (MDCFG_ANLG_DIG_PVR) * and first EEPROM location (0xBA). * PIO0 - IIC Clock for EM9010, AD7170, Eeprom, Sii168 * PIO1 - IIC Data for EM9010, AD7170, Eeprom, Sii168 * PIO2 - FILTER_0_PIO * PIO3 - FILTER_1_PIO * PIO4 - SCART_169_PIO * PIO5 - nSCART_EN_PIO * PIO6 - nSCART_RGB_PIO * PIO7 - DACS_VGA_PIO * PIO8 - SEL_DIG_AUDIO_IN_PIO * PIO9 - SEL2288_PIO * PIO10 - DACS_VGA_PIO = 1/0 select sm2288/saa7114 data & syncs * Implementation is based on NE2000: * Specific implementation: * QRESULT CAnlgPvr__VidSetVGATV(IDecoderBoard* pIDecoderBoard, * DWORD VideoRunning, DWORD TvOut) * QRESULT CAnlgPvr__PrepareVideoIn(IDecoderBoard* pIDecoderBoard, DWORD config) * QRESULT CAnlgPvr__PrepareLBCCapture(IDecoderBoard* pIDecoderBoard, DWORD config)/******************************************************************************/#include "pch.h"#if defined ANALOG_PVR_BRD#include "cqsrbrd.h"#include "regs847x.h"#include "em847x.h"// use predefined PIO0 and PIO1 for I2C_CLK_PIO, I2C_DATA_PIO#define FILTER_0_PIO PIO2#define FILTER_1_PIO PIO3#define SCART_169_PIO PIO4#define nSCART_EN_PIO PIO5#define nSCART_RGB_PIO PIO6#define DACS_VGA_PIO PIO7#define SEL_DIG_AUDIO_IN_PIO PIO8#define SEL2288_PIO PIO9 // 1/0=select sm2288/saa7114 data & syncs#define nAVIN_ENABLE_PIO PIO10 // 1/0=disable/enable data & syncs coming from sm2288 or saa7114QRESULT CAnlgPvr__VidSetVGATV(IDecoderBoard* pIDecoderBoard, DWORD VideoRunning, DWORD TvOut){ CQuasarBoard *this = (CQuasarBoard*) pIDecoderBoard; DWORD ccir = CCIR_601 | NO_INVERT_FIELD | SYNC_ENABLE_1; // make sure to reject wrong setting and keep the previous mode if( (TvOut == SET_VGA) && !(this->BoardCapabilities & MPEG_CAPABILITY_VGA_WINDOW) )// no analog cable connected return Q_OK; this->TvOut = TvOut; QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("CNE2000__VidSetVGATV VideoRunning=%x this->TvOut=%x"), VideoRunning, this->TvOut)); switch(this->TvOut) { case SET_VGA: // Nova master, SigmaTv slave, Quasar slave if(VideoRunning & RST_DC) IDecoder_StopDisplayController(this->m_pIDecoder); ITvEncoder_ProgramTV(this->m_pISigmaTv, TVSLAVE, 8, ccir, this->Standard_TvOut, 0); IDecoder_QuasarSlave( this->m_pIDecoder, 16, ccir, (this->Standard_TvOut == SET_PAL) ? &this->MasterParamsPal:&this->MasterParamsNtsc, VSHS_ACTIVE_HI, Q3CTRL2_NOINTERLACED | DIGITAL_DATA_ENABLE); IDecoderBoard_SelectVClk(pIDecoderBoard, VgaVClk, NULL, 0); // Nova enable DVCLK, VRDY selected - show the MPEG IAnalogOverlay_SetVGA(this->m_pINova1); // change resolution if it is any real change and update the overlay CNE2000__VidChangeResolution(pIDecoderBoard, &this->NewDisplayResolution); IDecoder_SetKmin(this->m_pIDecoder, this->SrcWnd.w + 6, this->DefHFrequency * 100); CNE2000__VGAUpdateVideoWindow(pIDecoderBoard); break; case SET_HDTV: // SigmaTv master, Quasar slave, Nova slave // Nova - DVCLK disable, GND selected - hide the MPEG IAnalogOverlay_SetTv(this->m_pINova1); C847xBrd__CheckHdtvMcrvsn(pIDecoderBoard); C847xBrd__VidSetHdtv(pIDecoderBoard, VideoRunning); break; case SET_TV: // SigmaTv master, Quasar slave, Nova slave if(VideoRunning & RST_DC) IDecoder_StopDisplayController(this->m_pIDecoder); // Nova - DVCLK disable, GND selected - hide the MPEG IAnalogOverlay_SetTv(this->m_pINova1); IDecoderBoard_SelectVClk(pIDecoderBoard, TvVClk, NULL, 0); ITvEncoder_SetCurrentYcYuvRgb(this->m_pITvEncoder, this->ReqYcYuvRgb); ITvEncoder_ProgramTV(this->m_pISigmaTv, TVMASTER, 8, ccir, this->Standard_TvOut, VideoRunning & ~RST_DC); IDecoder_QuasarSlave( this->m_pIDecoder, 8, ccir, (this->Standard_TvOut == SET_PAL) ? &this->MasterParamsPal:&this->MasterParamsNtsc, VSHS_ACTIVE_LOW, Q3CTRL2_NOINTERLACED | DIGITAL_DATA_ENABLE); CQuasarBoard__TVVMIUpdateVideoWindow(pIDecoderBoard); break; } return Q_OK;}QRESULT CAnlgPvr__PrepareVideoIn(IDecoderBoard* pIDecoderBoard, DWORD config){ CQuasarBoard *this = (CQuasarBoard*) pIDecoderBoard; // it should work 601 too DWORD ccir = CCIR_656 | NO_INVERT_FIELD | SYNC_ENABLE_1; IDecoder_WritePIO(this->m_pIDecoder, SEL2288_PIO, 0); // select saa7114 data & syncs IDecoder_WritePIO(this->m_pIDecoder, nAVIN_ENABLE_PIO, 0); // enable data & syncs from saa7114/sm2288 // AD717x is connected only on video-in signals // let's use same settings from main TvEncoder ITvEncoder_SetCurrentYcYuvRgb(this->m_pIExtTv, ITvEncoder_GetCurrentYcYuvRgb(this->m_pITvEncoder)); ITvEncoder_ProgramTV(this->m_pIExtTv, TVSLAVE, 8, ccir, this->Standard_TvOut, 1); // TV slave, dacs enabled ITvEncoder_DisableTVBlackout(this->m_pIExtTv); OSTimeDelay(1000);#ifdef EM848X_MICROCODE if( this->QuasarVersion == EM848XA_Q4 ) { IDecoder_WriteReg(this->m_pIDecoder, DRAM_portmux, (IDecoder_ReadReg(this->m_pIDecoder, DRAM_portmux) & ~(DRAM_portmux_CHW0_Mask | DRAM_portmux_CHW4_Mask)) | (DRAM_portmux_VCLuma_to_CHW0 | DRAM_portmux_VCChroma_to_CHW4)); } else#endif#ifdef EM847X_REVC_MICROCODE if( this->QuasarVersion == EM847XC_Q4 ) { IDecoder_WriteReg(this->m_pIDecoder, DRAM_portmux, (IDecoder_ReadReg(this->m_pIDecoder, DRAM_portmux) & ~(DRAM_portmux_CHW0_Mask | DRAM_portmux_CHW4_Mask)) | (DRAM_portmux_VCLuma_to_CHW0 | DRAM_portmux_VCChroma_to_CHW4)); } else#endif { IDecoder_WriteReg(this->m_pIDecoder, DRAM_portmux, (IDecoder_ReadReg(this->m_pIDecoder, DRAM_portmux) & ~(DRAM_portmux_CHW0_Mask | DRAM_portmux_CHW3_Mask)) | (DRAM_portmux_VCLuma_to_CHW0 | DRAM_portmux_VCChroma_to_CHW3)); } return Q_OK;}QRESULT CAnlgPvr__PrepareLBCCapture(IDecoderBoard* pIDecoderBoard, DWORD config){ CQuasarBoard *this = (CQuasarBoard*) pIDecoderBoard; // it should work 601 too DWORD ccir = CCIR_656 | NO_INVERT_FIELD | SYNC_ENABLE_1; IDecoder_WritePIO(this->m_pIDecoder, SEL_DIG_AUDIO_IN_PIO, 0); // enable stereo in IDecoder_WritePIO(this->m_pIDecoder, SEL2288_PIO, 1); // select sm2288 data & syncs IDecoder_WritePIO(this->m_pIDecoder, nAVIN_ENABLE_PIO, 0); // enable data & syncs from saa7114/sm2288 // let's use same settings from main TvEncoder ITvEncoder_SetCurrentYcYuvRgb(this->m_pIExtTv, ITvEncoder_GetCurrentYcYuvRgb(this->m_pITvEncoder)); ITvEncoder_ProgramTV(this->m_pIExtTv, TVSLAVE, 8, ccir, this->Standard_TvOut, 1); // TV slave, dacs enabled ITvEncoder_DisableTVBlackout(this->m_pIExtTv); OSTimeDelay(1000); return Q_OK;}void CAnlgPvr__InitVtable(IDecoderBoard* pIDecoderBoard){ CQuasarBoard* this = (CQuasarBoard*) pIDecoderBoard; CNE2000Common__InitVtable(pIDecoderBoard); this->lpVtbl->SelectVClk = C847xBrd__SelectVClk; this->lpVtbl->AudioSetSampleRate = C847xBrd__AudioSetSampleRate; this->lpVtbl->WriteDataToLBC = C847xBrd__WriteDataToLBC; this->lpVtbl->ReadDataFromLBC = C847xBrd__ReadDataFromLBC; this->lpVtbl->VidSetVGATV = CAnlgPvr__VidSetVGATV; this->lpVtbl->PrepareVideoIn = CAnlgPvr__PrepareVideoIn; this->lpVtbl->PrepareLBCCapture = CAnlgPvr__PrepareLBCCapture;#if defined SM2288_OBJECT this->lpVtbl->EnableLBCInterrupt = CSm2288PvrBrd__EnableLBCInterrupt;#endif // SM2288_OBJECT}QRESULT CAnlgPvr__SpecificCreateInstance(IDecoderBoard* pIDecoderBoard, DWORD dwInstance){ CQuasarBoard* this = (CQuasarBoard*) pIDecoderBoard; QRESULT qr; DWORD TvEncoderId = 1; if( QFAILED(qr = CNE2000Common__SpecificCreateInstance(pIDecoderBoard, dwInstance)) ) return qr; // Create CTvEncoder instance if( ModCreateInstance (dwInstance, &CLSID_CTVENCODER, &IID_ITVENCODER, (void**)&this->m_pIExtTv) != NOERROR) { return Q_FAIL; } ISetI2CpIO_SetI2C_params( this->m_pISetI2CpIO, I2C_PIO_DATA, I2C_PIO_CLOCK); ITvEncoder_Init(this->m_pIExtTv, &TvEncoderId); ITvEncoder_SetRegistry(this->m_pIExtTv, this->pRegistry);// this->m_pITvEncoder = this->m_pIExtTv; // used for Sm2288 output // Create also Csaa7174 instance if( ModCreateInstance (dwInstance, &CLSID_CSAA7114, &IID_IVIDEODECODER, (void**)&this->m_pIVideoDecoder) != NOERROR ) { return Q_FAIL; } IVideoDecoder_Init(this->m_pIVideoDecoder); IVideoDecoder_InitPropertySet(this->m_pIVideoDecoder, this->pPropSetList, sizeof(PROPERTY_SET_ITEM));#if defined SM2288_OBJECT // Create also Csm2288 instance if( ModCreateInstance (dwInstance, &CLSID_CSM2288, &IID_IMPEGENCODER, (void**)&this->m_pIMpegEncoder) != NOERROR ) { return Q_FAIL; } IMpegEncoder_Init(this->m_pIMpegEncoder); IMpegEncoder_InitPropertySet(this->m_pIMpegEncoder, this->pPropSetList, sizeof(PROPERTY_SET_ITEM)); { // initialize some parameters for transfering the encoder microcode emeXferUcodeParameters_type XferUcodeParams; CommonSymbolTable* pQ = (CommonSymbolTable*)this->pQ; XferUcodeParams.SysPhysAddr = this->HwLibConf.OsdDmaBuffPhysAddr; XferUcodeParams.SysLinAddr = (DWORD)this->HwLibConf.OsdDmaBuffLinAddr; XferUcodeParams.SysSizeInBytes = 0x8000; // 32k XferUcodeParams.DramAddr = (IDecoder_ReadDM(this->m_pIDecoder, pQ->OSD_BuffStart_Hi.addr)<<16) | (IDecoder_ReadDM(this->m_pIDecoder, pQ->OSD_BuffStart_Lo.addr)); XferUcodeParams.DramSizeInBytes = 0x8000; // 32k IDecoder_SetProperty(this->m_pIMpegEncoder, MPEG_ENCODER_SET, emeXferUcodeParameters, 0, &XferUcodeParams, sizeof(emeXferUcodeParameters_type), NULL); }#endif // SM2288_OBJECT // Create also Csii168 instance if( ModCreateInstance (dwInstance, &CLSID_CSII168, &IID_IDVITRANSMITTER, (void**)&this->m_pIDviTransmitter) != NOERROR ) { return Q_FAIL; } IDviTransmitter_Init(this->m_pIDviTransmitter); IDviTransmitter_InitPropertySet(this->m_pIDviTransmitter, this->pPropSetList, sizeof(PROPERTY_SET_ITEM)); this->BoardCapabilities |= MPEG_CAPABILITY_DVI; // overwrite necessary values CAnlgPvr__InitVtable(pIDecoderBoard); this->BoardVersion = ANALOG_PVR; this->SubId = (this->BoardVersion>>8); if( (IDecoder_ReadReg(this->m_pIDecoder, DRAM_startup) & 0x3C) != MDCFG_ANLG_DIG_PVR ) QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("\n\nERROR: Create ANALOG_PVR is FORCED !") )); { DWORD Value = JDA1_SCkinJDA1CK_Jda1CkinGCK_ScinOUT_DamckOUT; IDecoder_SetProperty(this->m_pIDecoder, DECODER_SET, edecAudioInOutConfig, 0, &Value, sizeof(DWORD), NULL); Value = 24; IDecoder_SetProperty(this->m_pIDecoder, DECODER_SET, edecAudioDacBitsPerSample, 0, &Value, sizeof(DWORD), NULL); } return Q_OK;}#endif // ANALOG_PVR_BRD#if defined ANALOG_PVR_BRD && !defined ANY_BRDQRESULT CreateInstance(DWORD* pInstance, void* pHwLibConf){ QRESULT qr = CommonCreateInstance(pInstance, pHwLibConf); if( QSUCCEEDED(qr) ) qr = CAnlgPvr__SpecificCreateInstance(g_pIDecoderBoard[*pInstance], *pInstance); if( QFAILED(qr) ) { CQuasarBoard__DeleteObjects(g_pIDecoderBoard[*pInstance]); g_pIDecoderBoard[*pInstance] = 0; return E_CREATE_INSTANCE_FAILED; } return Q_OK;}#endif // ANALOG_PVR_BRD && !ANY_BRD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -