📄 cnova.c
字号:
/******************************************************************************//* CNova.c : Implementation of the AnalogOverlay 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/CNova_implementation * NAME * CNova_implementation * DESCRIPTION * CNova_implementation of IAnalogOverlay interface * Nova or Nova1 is the name of EM9010. * COPYRIGHT * Copyright Sigma Designs Inc * Sigma Designs Proprietary and confidential/******************************************************************************/#include "pch.h"#if defined NOVA_OBJECT#include "ci2c.h"#include "cnovbase.h"#include "cnova.h"void CNova__InitVtable(IAnalogOverlay* pIAnalogOverlay){ CNova* this = (CNova*) pIAnalogOverlay; this->VTable.Delete = CNova__Delete; this->VTable.Init = CNova__Init; this->VTable.SetRegistry = CNova__SetRegistry; this->VTable.Write = CNovaBase__Write; this->VTable.Read = CNovaBase__Read; this->VTable.WriteREG12 = CNova__WriteREG12; this->VTable.ReadREG12 = CNova__ReadREG12; this->VTable.ProgramPLL = CNova__ProgramPLL; this->VTable.SetDVCLKFrequency = CNova__SetDVCLKFrequency; this->VTable.IsVGAConnected = CNova__IsVGAConnected; this->VTable.GetHFreq = CNova__GetHFreq; this->VTable.GetDefaultCorrection = CNova__GetDefaultCorrection; this->VTable.InitAnalogMux = CNova__InitAnalogMux; this->VTable.SetVGA = CNova__SetVGA; this->VTable.SetTv = CNova__SetTv; this->VTable.SlaveShowAll = CNova__SlaveShowAll; this->VTable.SetVrdyDelay = CNova__SetVrdyDelay; this->VTable.GetVrdyDelay = CNova__GetVrdyDelay; this->VTable.SetJitterAdjustment = CNova__SetJitterAdjustment; this->VTable.GetJitterAdjustment = CNova__GetJitterAdjustment; this->VTable.MakeMask = CNova__MakeMask; this->VTable.Hide = CNova__Hide; this->VTable.SetChromaKey = CNova__SetChromaKey; this->VTable.ShowAll = CNova__ShowAll; this->VTable.StartAutoCalibration = CNova__StartAutoCalibration; this->VTable.StopAutoCalibration = CNova__StopAutoCalibration; this->VTable.ClearPulse = CNova__ClearPulse; this->VTable.DetectPulse = CNova__DetectPulse; this->VTable.UpperLower = CNova__UpperLower; this->VTable.UpdateColorKey = CNova__UpdateColorKey; this->VTable.SetMode = CNova__SetMode; this->VTable.SetVgaResolution = CNova__SetVgaResolution; this->VTable.SetVgaKey = CNova__SetVgaKey; this->VTable.GetVgaKey = CNova__GetVgaKey; this->VTable.SetVgaKey2 = CNova__SetVgaKey2; this->VTable.SetColorCalibration = CNova__SetColorCalibration; this->VTable.SetOverrideRedUpper = CNova__SetOverrideRedUpper; this->VTable.GetOverrideRedUpper = CNova__GetOverrideRedUpper; this->VTable.SetOverrideRedLower = CNova__SetOverrideRedLower; this->VTable.GetOverrideRedLower = CNova__GetOverrideRedLower; this->VTable.SetOverrideGreenUpper = CNova__SetOverrideGreenUpper; this->VTable.GetOverrideGreenUpper = CNova__GetOverrideGreenUpper; this->VTable.SetOverrideGreenLower = CNova__SetOverrideGreenLower; this->VTable.GetOverrideGreenLower = CNova__GetOverrideGreenLower; this->VTable.SetOverrideBlueUpper = CNova__SetOverrideBlueUpper; this->VTable.GetOverrideBlueUpper = CNova__GetOverrideBlueUpper; this->VTable.SetOverrideBlueLower = CNova__SetOverrideBlueLower; this->VTable.GetOverrideBlueLower = CNova__GetOverrideBlueLower; this->VTable.Test = CNova__Test; this->lpVtbl = &this->VTable;}/****f* HwLib/CNova__CreateInstance * USAGE * NOT PRESENT in IAnalogOverlay interface * void CNova__CreateInstance(void **pv, DWORD dwInstance) * DESCRIPTION * CNova__CreateInstance - allocates memory for a new overlay object * PARAMETERS * IN DWORD dwInstance - instance passed down by CreateInstance. * OUT void** pv - points to a 32-bit variable that receives the pointer to object * SEE ALSO * CNova__CreateInstance/******************************************************************************/void CNova__CreateInstance(void **pv, DWORD dwInstance){ CNova__New((CNova **)pv, TEXT("Nova1"), TRUE, dwInstance);}/****f* HwLib/CNova__New * USAGE * NOT PRESENT in IAnalogOverlay interface * void CNova__New(CNova** ppCNova, TCHAR *pName, BOOL bAllocate, DWORD dwInstance) * DESCRIPTION * CNova__New - allocates memory for a new overlay object and plays the role of * the constructor in C++. * PARAMETERS * OUT CNova** ppCNova - Points to a 32-bit variable that receives the pointer to object * IN TCHAR *pName - pointer to string containing the name of the object - debug purposes. * BOOL bAllocate - usually called with TRUE to allocate memory for object. * - if FALSE ppCNova should point to an object already created. * IN DWORD dwInstance - instance passed down by CreateInstance. * SEE ALSO * IAnalogOverlay_Delete/******************************************************************************/void CNova__New(CNova** ppCNova, TCHAR *pName, BOOL bAllocate, DWORD dwInstance){ CNova* this = *ppCNova; if (bAllocate) { // Allocate CNova *ppCNova = OSmalloc(sizeof(CNova)); this = (CNova*) *ppCNova; if(this == NULL) return; OSmemset(this, 0, sizeof(CNova)); } // Call CObject constructor with bAllocate = FALSE CObject__New ((CObject**)ppCNova, pName, FALSE, dwInstance); CNova__InitVtable((IAnalogOverlay*)this);}/****f* HwLib/IAnalogOverlay_Delete * USAGE * IAnalogOverlay_Delete(IAnalogOverlay* pIAnalogOverlay, BOOL bDeleteObject) * CNova__Delete(IAnalogOverlay* pIAnalogOverlay, BOOL bDeleteObject) * DESCRIPTION * IAnalogOverlay_Delete - frees memory for the specified overlay object. * IAnalogOverlay_Delete plays the role of the destructor in C++. * PARAMETERS * IN IAnalogOverlay* pIAnalogOverlay - pointer to the object created by a previous * call to CNova__CreateInstance or CNova__New. * BOOL bDeleteObject - usually called with TRUE to free memory for object. * - if FALSE doesn't free any memory. * SEE ALSO * CNova__CreateInstance, CNova__New/******************************************************************************/void CNova__Delete(IAnalogOverlay* pIAnalogOverlay, BOOL bDeleteObject){ CNova *this = (CNova*) pIAnalogOverlay ; if (this == NULL) return; // do this for Nova1 to initialize DVClk according to registry this->m_HFreq = 2000; if(this->pRegistry) IAnalogOverlay_InitAnalogMux(pIAnalogOverlay, this->pRegistry->MaximumDvclk); // Call CObject Destructor CObject__Delete ((IObject*)this, FALSE); if (bDeleteObject) OSfree(pIAnalogOverlay);}/****f* HwLib/IAnalogOverlay_Init * USAGE * void IAnalogOverlay_Init(IAnalogOverlay* pIAnalogOverlay, DWORD* pAnalogOverlayId) * void CNova__Init(IAnalogOverlay* pIAnalogOverlay, DWORD* pAnalogOverlayId) * DESCRIPTION * IAnalogOverlay_Init - initialize the overlay object. * It is called by CreateInstance. * PARAMETERS * IN IAnalogOverlay* pIAnalogOverlay - pointer to the overlay object * IN DWORD* pAnalogOverlayId - pointer to the overlay identifier, not used/******************************************************************************/void CNova__Init(IAnalogOverlay* pIAnalogOverlay, DWORD* pAnalogOverlayId){ CNova *this = (CNova*) pIAnalogOverlay; I2CPARAMS* pI2Cparams; QueryInterface(this->m_dwInstance, IID_ISETI2CPIO, (void**)&(this->pISetI2CpIO)); ISetI2CpIO_GetI2C_params(this->pISetI2CpIO, (void**)&pI2Cparams); this->m_dwData0 = pI2Cparams->m_dwData0; this->m_dwData1 = pI2Cparams->m_dwData1; this->m_dwDataIN = pI2Cparams->m_dwDataIN; this->m_dwDataOUT = pI2Cparams->m_dwDataOUT; this->m_dwClock0 = pI2Cparams->m_dwClock0; this->m_dwClock1 = pI2Cparams->m_dwClock1; this->m_dwClkIN = pI2Cparams->m_dwClkIN; this->m_dwClkOUT = pI2Cparams->m_dwClkOUT; this->m_HFreq = 2000; this->BlackLevelUpper = 0x08; this->DeltaLevel = 0x28; this->DeltaUpperLevel = 0x14; this->m_bUse_Gamma = 0x00; this->Calibration.UpperFF = 0xd0d0d0; this->Calibration.LowerFF = 0xa0a0a0; this->Calibration.Upper80 = 0x686868; this->Calibration.Lower80 = 0x383838; this->Calibration.Upper00 = 0x101010; this->Calibration.Lower00 = 0x000000; this->PLL1_FreqLim = MAXIMUM_PLL1; // Limit of NOVA's PLL frequency in KHz}/****f* HwLib/IAnalogOverlay_SetRegistry * USAGE * void IAnalogOverlay_SetRegistry(IAnalogOverlay* pIAnalogOverlay, REGISTRY_TABLE* pRegistry) * void CNova__SetRegistry(IAnalogOverlay* pIAnalogOverlay, REGISTRY_TABLE* pRegistry) * DESCRIPTION * IAnalogOverlay_ - initialize HFreq. * It is called by CreateInstance. * PARAMETERS * IN IAnalogOverlay* pIAnalogOverlay - pointer to the overlay object * IN REGISTRY_TABLE* pRegistry - pointer to a table containing initial values for EM8400./******************************************************************************/void CNova__SetRegistry(IAnalogOverlay* pIAnalogOverlay, REGISTRY_TABLE* pRegistry){ CNova *this = (CNova*) pIAnalogOverlay ; this->pRegistry = pRegistry;}/****f* HwLib/IAnalogOverlay_WriteREG12 * USAGE * void IAnalogOverlay_WriteREG12(IAnalogOverlay* pIAnalogOverlay, WORD Select, BYTE REG1_msb, BYTE REG2_lsb) * void CNovaLite__WriteREG12(IAnalogOverlay* pIAnalogOverlay, WORD Select, BYTE REG1_msb, BYTE REG2_lsb) * void CNova__WriteREG12(IAnalogOverlay* pIAnalogOverlay, WORD Select, BYTE REG1_msb, BYTE REG2_lsb) * DESCRIPTION * IAnalogOverlay_WriteREG12 has different implementation for Nova(EM9010) and NovaLite(EM9038). * Both chips have 8 bit registers accessible through Sigma Serial Interface. * To set some parameters (PLL, key color) more than one byte is needed to be written * simultaneously, that is why register 1 and 2 are used like a pair. * IAnalogOverlay_WriteREG12 use a specific procedure to program register 1 and 2: * - it selects the required function "Select" in register 3 * - then writes register 2 with the less significant byte * - then writes register 1; this will latch both register1 and 2 values. * IAnalogOverlay_WriteREG12 is called by IAnalogOverlay_ProgramPLL, IAnalogOverlay_Test, * IAnalogOverlay_SetDVCLKFrequency, IAnalogOverlay_Hide, IAnalogOverlay_SetChromaKey, * IAnalogOverlay_StartAutoCalibration, IAnalogOverlay_StopAutoCalibration, * IAnalogOverlay_Upper, IAnalogOverlay_Lower * PARAMETERS * IN IAnalogOverlay* pIAnalogOverlay - pointer to the overlay object * IN WORD Select - it should be PLL3 for NovaLite * - one of PLL1, PLL2, PLL3, RLIMIT, GLIMIT, BLIMIT, GAMMA,RD_PIX, RD_HS for Nova * IN BYTE REG1_msb - byte to program in register 1 * IN BYTE REG2_lsb - byte to program in register 2/******************************************************************************/void CNova__WriteREG12(IAnalogOverlay* pIAnalogOverlay, WORD Select, BYTE REG1_msb, BYTE REG2_lsb){ // Select can be PLL1, PLL2, PLL3, RLIMIT, GLIMIT, BLIMIT, GAMMA,RD_PIX, RD_HS if(Select>0x80) { CNovaBase__Write( pIAnalogOverlay, 3, 0 ); CNovaBase__Write( pIAnalogOverlay, 4, (BYTE)(Select | MAIN_CK14) ); } else { CNovaBase__Write( pIAnalogOverlay, 4, MAIN_CK14 ); CNovaBase__Write( pIAnalogOverlay, 3, (BYTE)Select ); } CNovaBase__Write( pIAnalogOverlay, 2, REG2_lsb ); CNovaBase__Write( pIAnalogOverlay, 1, REG1_msb );}/****f* HwLib/IAnalogOverlay_ReadREG12 * USAGE * WORD IAnalogOverlay_ReadREG12(IAnalogOverlay* pIAnalogOverlay, WORD Select) * WORD CNovaLite__ReadREG12(IAnalogOverlay* pIAnalogOverlay, WORD Select) * WORD CNova__ReadREG12(IAnalogOverlay* pIAnalogOverlay, WORD Select) * DESCRIPTION * IAnalogOverlay_WriteREG12 has different implementation for Nova(EM9010) and NovaLite(EM9038). * Both chips have 8 bit registers accessible through Sigma Serial Interface. * IAnalogOverlay_WriteREG12 use a specific procedure to read register 1 and 2: * - it writes the required function "Select" in register 3 * - then reads register 2, * - then reads register 1. * It is called by IAnalogOverlay_Test. * PARAMETERS * IN IAnalogOverlay* pIAnalogOverlay - pointer to the overlay object * IN WORD Select - it should be PLL3 for NovaLite * - one of PLL1, PLL2, PLL3, RLIMIT, GLIMIT, BLIMIT, GAMMA,RD_PIX, RD_HS for Nova * RETURN VALUE * It returns register 1 on MSB and register 2 on LSB/******************************************************************************/WORD CNova__ReadREG12(IAnalogOverlay* pIAnalogOverlay, WORD Select){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -