📄 cnec.c
字号:
/******************************************************************************//* cnec.c : specific code for NEC board* REALmagic Quasar Hardware Library* Created by Aurelia Popa-Radu* Copyright Sigma Designs Inc* Sigma Designs Proprietary and confidential* Created on 03/06/01* Description:/******************************************************************************//****h* HwLib/CNec_Implementation * DESCRIPTION * CNec implementation of the IDecoderBoard interface. * NEC uses EM8470, EEPROM components to implement TV output, HDTV output. * NO VCXO and NO Videoin. * Identified by HwLib reading PciSubsystemID = 0x0002 and SubsystemVendorID = 0x1033. * PIO0 - IIC Clock for Eeprom * PIO1 - IIC Data for Eeprom * PIO5 - audio dac DZF pin - input for HwLib * PIO6 - Spdif enable - output for HwLib * PIO7 - audio dac PDN pin (powerdown) - output for HwLib * Implementation based on CVE2000. * Specific implementation: * QRESULT CNec__AudioSetSampleRate(IDecoderBoard* pIDecoderBoard, DWORD Rate)/******************************************************************************/#include "pch.h"#if defined NEC_BRD#include "cqsrbrd.h"// use predefined PIO0 and PIO1 for I2C_CLK_PIO, I2C_DATA_PIO#define AUDIO_SPDIF_ENABLE_PIO PIO6#define AUDIO_POWERDOWN_PIO PIO7QRESULT CNec__AudioSetSampleRate(IDecoderBoard* pIDecoderBoard, DWORD Rate){ CQuasarBoard *this = (CQuasarBoard*) pIDecoderBoard; if( (!(this->BoardAudioRate & FORCED_HW_UPDATE)) && (this->BoardAudioRate == Rate) ) return Q_OK; this->BoardAudioRate = Rate & ~FORCED_HW_UPDATE; // use most significant bit to force programming QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT(" CNec__AudioSetSampleRate= %d"), this->BoardAudioRate)); IDecoder_SetAudioSampleRate(this->m_pIDecoder, this->BoardAudioRate); IDecoder_WritePIO(this->m_pIDecoder, AUDIO_SPDIF_ENABLE_PIO, 1); IDecoder_WritePIO(this->m_pIDecoder, AUDIO_POWERDOWN_PIO, 1); { // we need reset for changing the sample rate BYTE AK4363_0 = 0x0B; BYTE AK4363_1 = 0x00; BYTE AK4363_2 = 0x05; II2C_Write(this->m_pII2C, 2, &AK4363_2, 1 ); // Set MUTE AK4363_1 |= ( (this->BoardAudioRate==32000) ? 0x80 : ((this->BoardAudioRate==44100)? 0x00 : 0x40) ); II2C_Write(this->m_pII2C, 1, &AK4363_1, 1 ); // Set audio sampling rate & reset on second register II2C_Write(this->m_pII2C, 0, &AK4363_0, 1 ); // Cancel reset on first register! AK4363_2 = 0x94; II2C_Write(this->m_pII2C, 2, &AK4363_2, 1 ); // Cancel MUTE } return Q_OK;}QRESULT CNec__HwReset(IDecoderBoard* pIDecoderBoard){ CQuasarBoard *this = (CQuasarBoard*) pIDecoderBoard; QRESULT qr = Q_OK; BYTE AK4363[5] = {0x0b, 0x01, 0x94, 0xff, 0xff}; // normal LR// BYTE AK4363[5] = {0x0b, 0x01, 0x64, 0xff, 0xff}; // reverse LR int i; qr = CVE2000__HwReset(pIDecoderBoard); IDecoder_WritePIO(this->m_pIDecoder, AUDIO_SPDIF_ENABLE_PIO, 1); IDecoder_WritePIO(this->m_pIDecoder, AUDIO_POWERDOWN_PIO, 1); for( i=0; i< sizeof(AK4363); i++) II2C_Write(this->m_pII2C, (BYTE)i, &AK4363[i], 1 ); return qr;}void CNec__InitVtable(IDecoderBoard* pIDecoderBoard){ CQuasarBoard* this = (CQuasarBoard*) pIDecoderBoard; this->lpVtbl->HwReset = CNec__HwReset; this->lpVtbl->UpdateOverlay = CVE2000__UpdateOverlay; this->lpVtbl->SetCustomTvHdtv = CVE2000__SetCustomTvHdtv; this->lpVtbl->SelectVClk = C847xBrd__SelectVClk; this->lpVtbl->AudioSetSampleRate = CNec__AudioSetSampleRate; this->lpVtbl->VidSetVGATV = C847xDigBrd__VidSetVGATV;}QRESULT CNec__SpecificCreateInstance(IDecoderBoard* pIDecoderBoard, DWORD dwInstance){ CQuasarBoard* this = (CQuasarBoard*) pIDecoderBoard; this->BoardCapabilities |= ( MPEG_CAPABILITY_TV_YUV_COMPONENT | MPEG_CAPABILITY_TV_RGB_COMPONENT | MPEG_CAPABILITY_HDTV_OUTPUT ); this->pRegistry->Ccir_656 = CCIR_656; this->pRegistry->SyncEnable = 0; // by default disable VS,HS,VVLD for 656 this->pRegistry->TvOut = SET_TV | SET_NTSC | SET_ONETOONE; this->TvOut = SET_TV; // overwrite necessary values CNec__InitVtable(pIDecoderBoard); this->DeviceId = VENTURA2000_DEVICEID; this->BoardVersion = NEC; this->SubId = (this->BoardVersion>>8); if( (this->PciSubsystemID != 0x02) && (this->PciSubsystemVendorID != 0x1033) ) QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("\n\nERROR: Create NEC is FORCED !") )); { DWORD Value = I2S_SCkinSCIN_Jda1CkinGCK_ScinIN_DamckIN; 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); } //VG (10/30/2002 6:39:12 PM) // updated on NEC request. originally was ( this->m_pII2C, 0x20, 0x21, 1) // II2C_SetI2CAddress( this->m_pII2C, 0x20, 0x21, 100); return Q_OK;}#endif // NEC_BRD#if defined NEC_BRD && !defined ANY_BRDQRESULT CreateInstance(DWORD* pInstance, void* pHwLibConf){ QRESULT qr = CommonCreateInstance(pInstance, pHwLibConf); if( QSUCCEEDED(qr) ) qr = CNec__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 // NEC_BRD && !ANY_BRD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -