📄 cad7170.c
字号:
/******************************************************************************//* CAd7170.c : Implementation of the AD7170A interface* REALmagic Quasar Hardware Library* Created by Aurelia Popa-Radu* Copyright Sigma Designs Inc* Sigma Designs Proprietary and confidential* Created on 8/27/99* Description:/******************************************************************************//****h* HwLib/CAD7170_implementation * NAME * HwLib/CAD7170_implementation * COPYRIGHT * Copyright Sigma Designs Inc * Sigma Designs Proprietary and confidential * DESCRIPTION * CAD7170 implementation of the ITvEncoder interface: * void CAD7170__Init(ITvEncoder* pITvEncoder) * void CAD7170__InitTvEncoder(ITvEncoder* pITvEncoder) * void CAD7170__ProgramTV(ITvEncoder* pITvEncoder, * DWORD TvMaster, DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable) * void CAD7170__SetNTSCSubcarrier(ITvEncoder* pITvEncoder, DWORD value) * void CAD7170__SetPALSubcarrier(ITvEncoder* pITvEncoder, DWORD value) * void CAD7170__SetTVStandard(ITvEncoder* pITvEncoder, DWORD TvStandard) * void CAD7170__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) * void CAD7170__SendCCData(ITvEncoder* pITvEncoder, BYTE field, BYTE* Data) * void CAD7170__ShowCloseCaption(ITvEncoder* pITvEncoder) * void CAD7170__HideCloseCaption(ITvEncoder* pITvEncoder) * void CAD7170__DisableTVBlackout(ITvEncoder* pITvEncoder)/******************************************************************************/#include "pch.h"#if defined AD7170_OBJECT#include "ci2c.h"#include "ctvenc.h"#include "cad7170.h"// The following values are for NTSCBYTE init7170Regs[] = { 0x00, // 0x00= 00 Mode Reg 0 0x7F, // 0x01= 01 Mode Reg 1 - power down 0x08, // 0x02= 02 Mode Reg 2 0x00, // 0x03= 03 mode reg 3 0x40, // 0x04= 04 mode reg 4 - lower power mode, enable color, CCIR 601 0x00, // 0x05= 05 reserved 0x00, // 0x06= 06 reserved 0x0c, // 0x07= 07 Timing reg 0 - 8 bit, slave, CCIR 601-HSYNC,VSYNC,BLANK 0x73, // 0x08= 08 Timing reg 1 - some delays 0x16, // 0x09= 09 Subcarrier Frequency Reg0 0x7C, // 0x0a= 10 Subcarrier Frequency Reg1 0xF0, // 0x0b= 11 Subcarrier Frequency Reg2 0x21, // 0x0c= 12 Subcarrier Frequency Reg3 0x00, // 0x0d= 13 Subcarrier Phase Reg 0x00, // 0x0e= 14 Closed Captioning Ext Reg0 0x00, // 0x0f= 15 Closed Captioning Ext Reg1 0x00, // 0x10= 16 Closed Captioning Reg0 0x00, // 0x11= 17 Closed Captioning Reg1 0x00, // 0x12= 18 NTSC Pedestal Control Reg0 0x00, // 0x13= 19 NTSC Pedestal Control Reg1 0x00, // 0x14= 20 NTSC Pedestal Control Reg2 0x00, // 0x15= 21 NTSC Pedestal Control Reg3 0x00, // 0x16= 22 CGMS_WSS_0 0x00, // 0x17= 23 CGMS_WSS_1 0x00, // 0x18= 24 CGMS_WSS_2 0x00, // 0x19= 25 Teletext Request Position 0x00, // 0x1a= 26 reserved 0x00, // 0x1b= 27 reserved 0x00, // 0x1c= 28 reserved 0x00, // 0x1d= 29 reserved};////////////////////////////////////////////////////////////////////////////void CAD7170__Init(ITvEncoder* pITvEncoder){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; // Initialize virtual table with proper functions this->VTable.Write = CTvEncoder__Write; this->VTable.Read = CTvEncoder__Read; this->VTable.WriteN = CTvEncoder__WriteN; this->VTable.ReadN = CTvEncoder__ReadN; this->VTable.InitTvEncoder = CAD7170__InitTvEncoder; this->VTable.ProgramTV = CAD7170__ProgramTV; this->VTable.SetTVStandard = CAD7170__SetTVStandard; this->VTable.EnableMacrovision = CAD7170__EnableMacrovision; this->VTable.SendCCData = CAD7170__SendCCData; this->VTable.ShowCloseCaption = CAD7170__ShowCloseCaption; this->VTable.HideCloseCaption = CAD7170__HideCloseCaption; this->VTable.DisableTVBlackout = CAD7170__DisableTVBlackout; this->VTable.SetPALSubcarrier = CAD7170__SetPALSubcarrier; this->VTable.SetNTSCSubcarrier = CAD7170__SetNTSCSubcarrier; this->VTable.SetCurrentYcYuvRgb = CAD7170__SetCurrentYcYuvRgb; this->lpVtbl = &this->VTable ; this->TVRegsTable = init7170Regs;}void CAD7170__InitTvEncoder(ITvEncoder* pITvEncoder){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; if (this->TVRegsTable == NULL) return; //VG *(this->TVRegsTable + 0) = AD_LUMA_FILTER_EXTENDED_MODE; *(this->TVRegsTable + 1) = 0x7F; *(this->TVRegsTable + 7) = 0x04; // 8 bit, slave, mode 2, blackout *(this->TVRegsTable + 8) = 0x73; // timing OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+9); II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable, 30); // without Macrovision}void CAD7170__ProgramTV(ITvEncoder* pITvEncoder, DWORD TvMaster, DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; this->TvDacsEnable = DacsEnable; if(DacsEnable) { *(this->TVRegsTable + 1) = this->CC_Enable; // Power up DACs of TVEncoder *(this->TVRegsTable + 4) = 0x00; // wake up TVEncoder } else { *(this->TVRegsTable + 1) = 0x78; // Power down DACs of TVEncoder if(!TvMaster) *(this->TVRegsTable + 4) = 0x40; // sleep mode TVEncoder else *(this->TVRegsTable + 4) = 0x00; // wake up TVEncoder } if(nbits == 8) nbits = 0x00; else nbits = 0x40; if( TvMaster ) *(this->TVRegsTable + 8) = 0x73; // timing else *(this->TVRegsTable + 8) = 0x00; // timing if( (ccir & CCIR_MASK) == CCIR_656 ) *(this->TVRegsTable + 7) = (BYTE)(0x00 | TvMaster | nbits); // BlackOut, mode 0 else // CCIR_601 *(this->TVRegsTable + 7) = (BYTE)(0x04 | TvMaster | nbits); // BlackOut, mode 2 CAD7170__SetTVStandard(pITvEncoder, TvStandard); switch(this->YcYuvRgb) { case COMPONENT_YUV: *(this->TVRegsTable + 4) |= 0x03; // select component output YUV break; case COMPONENT_RGB: *(this->TVRegsTable + 4) |= 0x05; // select component output RGB break; case OUTPUT_OFF: *(this->TVRegsTable + 1) = 0x78; // Power down DACs of TVEncoder break; case COMPOSITE: default: *(this->TVRegsTable + 4) |= 0x00; // select YC output break; } // let's write the first 13 TV registers II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable, 0x0d);}void CAD7170__SetNTSCSubcarrier(ITvEncoder* pITvEncoder, DWORD value){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; this->NTSC_SubcarrierFrequency = value; OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+9); if (this->CurrentTvStandard == SET_NTSC) II2C_Write((II2C*)this->m_pII2C, 9, this->TVRegsTable+9, 4);}void CAD7170__SetPALSubcarrier(ITvEncoder* pITvEncoder, DWORD value ){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; this->PAL_SubcarrierFrequency = value; OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+9); if ( (this->CurrentTvStandard == SET_PAL) || (this->CurrentTvStandard == SET_PAL60) ) II2C_Write((II2C*)this->m_pII2C, 9,this->TVRegsTable+9,4);}void CAD7170__SetTVStandard(ITvEncoder* pITvEncoder, DWORD TvStandard){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; if( TvStandard == SET_PAL ) { // PAL-B,D,G,H,I settings *(this->TVRegsTable + 0) = 0x01 | AD_LUMA_FILTER_EXTENDED_MODE; OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+9); } else if( TvStandard == SET_PAL60 ) { // PAL-60 settings *(this->TVRegsTable + 0) = 0x02 | AD_LUMA_FILTER_EXTENDED_MODE; OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+9); } else { // NTSC settings *(this->TVRegsTable + 0) = 0x00 | AD_LUMA_FILTER_EXTENDED_MODE; OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+9); } this->CurrentTvStandard = TvStandard; CAD7170__EnableMacrovision( pITvEncoder, CURRENT_MACROVISION );}void CAD7170__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; this->YcYuvRgb = YcYuvRgb; *(this->TVRegsTable + 4) &= ~0x07; // clear mask switch(this->YcYuvRgb) { case COMPONENT_YUV: *(this->TVRegsTable + 4) |= 0x03; // select component output YUV break; case COMPONENT_RGB: *(this->TVRegsTable + 4) |= 0x05; // select component output RGB break; case OUTPUT_OFF: *(this->TVRegsTable + 1) = 0x78; // Power down DACs of TVEncoder II2C_Write((II2C*)this->m_pII2C, 1, this->TVRegsTable + 1, 1); return; case COMPOSITE: default: *(this->TVRegsTable + 4) |= 0x00; // select YC output break; } // update to hardware II2C_Write((II2C*)this->m_pII2C, 4, this->TVRegsTable + 4, 1);} void CAD7170__SendCCData(ITvEncoder* pITvEncoder, BYTE field, BYTE* Data){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; if ( (this->CC_Enable == 0) || (this->CC_UserEnable == 0) ) return; if( field & 0x80 ) // line21_switch = 1 -> valid data { if( (field & 0x01) == 0) { this->CC_FieldEnable |= AD_ECCF1; II2C_Write((II2C*)this->m_pII2C, 0x10, Data, 2); // CloseCaption registers } else { this->CC_FieldEnable |= AD_ECCF2; II2C_Write((II2C*)this->m_pII2C, 0x0e, Data, 2); // Extended data } } else // line21_switch = 0 -> invalid data { if( (field & 0x01) == 0) this->CC_FieldEnable &= ~AD_ECCF1; else this->CC_FieldEnable &= ~AD_ECCF2; } II2C_Write((II2C*)this->m_pII2C, 0x01, &(this->CC_FieldEnable), 1); QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("_%x "), this->CC_FieldEnable));}void CAD7170__ShowCloseCaption(ITvEncoder* pITvEncoder){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; BYTE Byte = 0; this->CC_Enable = (this->CC_UserEnable) ? (AD_ECCF1 | AD_ECCF2):0; this->CC_FieldEnable = this->CC_Enable; II2C_Read((II2C*)this->m_pII2C, 0x01, &Byte, 1); Byte |= this->CC_Enable; II2C_Write((II2C*)this->m_pII2C, 0x01, &Byte, 1);}void CAD7170__HideCloseCaption(ITvEncoder* pITvEncoder){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; BYTE Byte = 0; this->CC_Enable = 0; this->CC_FieldEnable = 0; II2C_Read((II2C*)this->m_pII2C, 0x01, &Byte, 1); Byte &= ~(AD_ECCF1 | AD_ECCF2); II2C_Write((II2C*)this->m_pII2C, 0x01, &Byte, 1);}void CAD7170__DisableTVBlackout(ITvEncoder* pITvEncoder){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; *(this->TVRegsTable + 7) |= 8; // disable BlackOut for TV II2C_Write((II2C*)this->m_pII2C, 7, this->TVRegsTable + 7, 1);}#else // ! AD7170_OBJECTvoid CAD7170__Init (ITvEncoder* pITvEncoder){}#endif // AD7170_OBJECT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -