📄 cad7175.c
字号:
/******************************************************************************//* CAd7175.c : Implementation of the AD7175A 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/CAD7175_implementation * NAME * HwLib/CAD7175_implementation * COPYRIGHT * Copyright Sigma Designs Inc * Sigma Designs Proprietary and confidential * DESCRIPTION * CAD7175 implementation of the ITvEncoder interface: * void CAD7175__Init(ITvEncoder* pITvEncoder) * void CAD7175__InitTvEncoder(ITvEncoder* pITvEncoder) * void CAD7175__ProgramTV(ITvEncoder* pITvEncoder, * DWORD TvMaster, DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable) * void CAD7175__SetNTSCSubcarrier(ITvEncoder* pITvEncoder, DWORD value) * void CAD7175__SetPALSubcarrier(ITvEncoder* pITvEncoder, DWORD value) * void CAD7175__SetTVStandard(ITvEncoder* pITvEncoder, DWORD TvStandard) * void CAD7175__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) * void CAD7175__SendCCData(ITvEncoder* pITvEncoder, BYTE field, BYTE* Data) * void CAD7175__ShowCloseCaption(ITvEncoder* pITvEncoder) * void CAD7175__HideCloseCaption(ITvEncoder* pITvEncoder) * void CAD7175__DisableTVBlackout(ITvEncoder* pITvEncoder)/******************************************************************************/#include "pch.h"#if defined AD7175_OBJECT#include "ci2c.h"#include "ctvenc.h"#include "cad7175.h"BYTE init7175Regs[] = { 0x00, // 0x00= 00 Mode Reg 0 0x7F, // 0x01= 01 Mode Reg 1 - power down 0x1F, // 0x02= 02 Subcarrier Frequency Reg0 0x7C, // 0x03= 03 Subcarrier Frequency Reg1 0xF0, // 0x04= 04 Subcarrier Frequency Reg2 0x21, // 0x05= 05 Subcarrier Frequency Reg3 0x00, // 0x06= 06 Subcarrier Phase Reg 0x04, // 0x07= 07 Timing reg 0 - 8 bit, slave, mode 2, blackout 0x00, // 0x08= 08 Closed Captioning Ext Reg0 0x00, // 0x09= 09 Closed Captioning Ext Reg1 0x00, // 0x0a= 10 Closed Captioning Reg0 0x00, // 0x0b= 11 Closed Captioning Reg1 0x73, // 0x0c= 12 Timing reg 1 - some delays 0x08, // 0x0d= 13 Mode Reg 2 - not lower power mode, enable color, CCIR 601 0x00, // 0x0e= 14 Pedestal Control Reg0 0x00, // 0x0f= 15 Pedestal Control Reg1 0x00, // 0x10= 16 Pedestal Control Reg2 0x00, // 0x11= 17 Pedestal Control Reg3 0x40, // 0x12= 18 mode reg 3};////////////////////////////////////////////////////////////////////////////void CAD7175__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 = CAD7175__InitTvEncoder; this->VTable.ProgramTV = CAD7175__ProgramTV; this->VTable.SetTVStandard = CAD7175__SetTVStandard; this->VTable.EnableMacrovision = CAD7175__EnableMacrovision; this->VTable.SendCCData = CAD7175__SendCCData; this->VTable.ShowCloseCaption = CAD7175__ShowCloseCaption; this->VTable.HideCloseCaption = CAD7175__HideCloseCaption; this->VTable.DisableTVBlackout = CAD7175__DisableTVBlackout; this->VTable.SetPALSubcarrier = CAD7175__SetPALSubcarrier; this->VTable.SetNTSCSubcarrier = CAD7175__SetNTSCSubcarrier; this->VTable.SetCurrentYcYuvRgb = CAD7175__SetCurrentYcYuvRgb; this->TVRegsTable = init7175Regs;}void CAD7175__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 + 0xc) = 0x73; // timing OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+2); II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable, 18); // without Macrovision}void CAD7175__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 else *(this->TVRegsTable + 1) = 0x7F; // Power down DACs of TVEncoder if(nbits == 8) nbits = 0x00; else nbits = 0x40; *(this->TVRegsTable + 0xc) = 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 if( TvMaster ) *(this->TVRegsTable + 0xc) = 0x73; // timing } CAD7175__SetTVStandard(pITvEncoder, TvStandard); switch(this->YcYuvRgb) { case COMPONENT_YUV: *(this->TVRegsTable + 0) |= 0x40; // select component output YUV or RGB *(this->TVRegsTable + 0xd) = 0x48; // select YUV component break; case COMPONENT_RGB: *(this->TVRegsTable + 0) |= 0x40; // select component output YUV or RGB *(this->TVRegsTable + 0xd) = 0x08; // select RGB component break; case COMPOSITE: default: *(this->TVRegsTable + 0) |= 0x00; // select YC output *(this->TVRegsTable + 0xd) = 0x08; // don't care ? break; } // let's write the first 14 TV registers II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable, 0x0e);}void CAD7175__SetNTSCSubcarrier(ITvEncoder* pITvEncoder, DWORD value){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; this->NTSC_SubcarrierFrequency = value; OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+2); if (this->CurrentTvStandard == SET_NTSC) II2C_Write((II2C*)this->m_pII2C, 2, this->TVRegsTable+2, 4);}void CAD7175__SetPALSubcarrier(ITvEncoder* pITvEncoder, DWORD value){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; this->PAL_SubcarrierFrequency = value; OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+2); if ( (this->CurrentTvStandard == SET_PAL) || (this->CurrentTvStandard == SET_PAL60) ) II2C_Write((II2C*)this->m_pII2C, 2,this->TVRegsTable+2,4);}void CAD7175__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+2); } else if( TvStandard == SET_PAL60 ) { // PAL-60 settings *(this->TVRegsTable + 0) = 0x02 | AD_LUMA_FILTER_EXTENDED_MODE; OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+2); } else { // NTSC settings *(this->TVRegsTable + 0) = 0x00 | AD_LUMA_FILTER_EXTENDED_MODE; OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+2); } this->CurrentTvStandard = TvStandard; CAD7175__EnableMacrovision( pITvEncoder, CURRENT_MACROVISION );}void CAD7175__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb){ CTvEncoder* this = (CTvEncoder*) pITvEncoder; this->YcYuvRgb = YcYuvRgb; *(this->TVRegsTable + 0) &= ~0x040; // clear mask switch(this->YcYuvRgb) { case COMPONENT_YUV: *(this->TVRegsTable + 0) |= 0x40; // select component output YUV or RGB *(this->TVRegsTable + 0xd) = 0x48; // select YUV component break; case COMPONENT_RGB: *(this->TVRegsTable + 0) |= 0x40; // select component output YUV or RGB *(this->TVRegsTable + 0xd) = 0x08; // select RGB component break; case COMPOSITE: default: *(this->TVRegsTable + 0) |= 0x00; // select YC output *(this->TVRegsTable + 0xd) = 0x08; // don't care ? break; } // update to hardware II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable + 0, 1); II2C_Write((II2C*)this->m_pII2C, 0xd, this->TVRegsTable + 0xd, 1);} void CAD7175__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, 0x0a, Data, 2); // CloseCaption registers } else { this->CC_FieldEnable |= AD_ECCF2; II2C_Write((II2C*)this->m_pII2C, 0x08, 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 CAD7175__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 CAD7175__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 CAD7175__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 // ! AD7175_OBJECTvoid CAD7175__Init(ITvEncoder* pITvEncoder){}#endif // AD7175_OBJECT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -