📄 ctvenc.c
字号:
/****f* HwLib/ITvEncoder_WriteN * USAGE * void ITvEncoder_WriteN(ITvEncoder* pITvEncoder, DWORD addr, BYTE* pData, int n) * void CTvEncoder__WriteN(ITvEncoder* pITvEncoder, DWORD addr, BYTE* pData, int n) * DESCRIPTION * ITvEncoder_WriteN - writes "n" consecutive bytes from buffer "pData" in registers of * TvEncoder starting from address "addr". * RETURN VALUE * TRUE /********************************************************************************************/BOOL CTvEncoder__WriteN(ITvEncoder* pITvEncoder, DWORD addr, BYTE* pData, int n){ CTvEncoder *this = (CTvEncoder*) pITvEncoder; II2C_Write(this->m_pII2C, (BYTE)addr, pData, n); QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("WriteTvEncoder at %x = %x"), addr, *pData)); return TRUE;}/****f* HwLib/ITvEncoder_ReadN * USAGE * void ITvEncoder_ReadN(ITvEncoder* pITvEncoder, DWORD addr, BYTE* pData, int n) * void CTvEncoder__ReadN(ITvEncoder* pITvEncoder, DWORD addr, BYTE* pData, int n) * DESCRIPTION * ITvEncoder_ReadN - reads "n" consecutive bytes from registers of TvEncoder starting * from address "addr" in buffer "pData". * RETURN VALUE * TRUE /********************************************************************************************/BOOL CTvEncoder__ReadN(ITvEncoder* pITvEncoder, DWORD addr, BYTE* pData, int n){ CTvEncoder *this = (CTvEncoder*) pITvEncoder; II2C_Read(this->m_pII2C, (BYTE)addr, pData, n); QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("ReadTvEncoder at %x = %x"), addr, *pData)); return TRUE;}/****f* HwLib/CTvEncoder_Check * USAGE * NOT PRESENT in ITvEncoder interface * void CTvEncoder__Check(ITvEncoder* pITvEncoder) * DESCRIPTION * CTvEncoder_Check - finds, based on I2C base address, what specific TvEncoder * is present on the board (AD7175, AD7170, AD7177, AD7178, BT869, BT865) and keeps the * specific identifier in m_bEncoderRegs. If no I2C TvEncoder is present m_bEncoderRegs is 0. * CTvEncoder__Check is called by ITvEncoder_Init. * PARAMETERS * IN ITvEncoder* pITvEncoder - pointer to the TvEncoder object * RETURN VALUE * TRUE if any of I2C TvEncoders is present. * FALSE if no I2C TvEncoder is present./********************************************************************************************/BOOL CTvEncoder__Check(ITvEncoder* pITvEncoder){ CTvEncoder *this = (CTvEncoder*) pITvEncoder; BYTE byte = 0x55; // Let's assume that is 7175A or 7170 II2C_SetI2CAddress( this->m_pII2C, AD7175_WRITE_ADDR, AD7175_READ_ADDR, 0); II2C_Write(this->m_pII2C, 1, &byte, 1); byte = 0; II2C_Read(this->m_pII2C, 1, &byte, 1); QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("byte %x"), byte)); if (byte == 0x55) { // let's differentiate between AD7175A and 7170 II2C_Read(this->m_pII2C, 0,&byte,1); if (byte & 0x20) { this->m_bEncoderRegs = AD7175_ID; QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: AD7175A") )); } else { this->m_bEncoderRegs = AD7170_ID; QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: AD7170") )); } return TRUE; } else { // It isn't 7175A or 7170. Let's try AD7177(without Macrovision) QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: AD7177 ?") )); II2C_SetI2CAddress( this->m_pII2C, AD7177_WRITE_ADDR, AD7177_READ_ADDR, 0); this->m_bEncoderRegs = AD7177_ID; // from 0 - 30 or 0x00 - 0x1e byte = 0x55; II2C_Write(this->m_pII2C, 1,&byte,1); byte = 0; II2C_Read(this->m_pII2C, 1,&byte,1); if (byte == 0x55) { QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: AD7177") )); return TRUE; } else { // It isn't 7177. Let's try AD7178(with Macrovision) QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: AD7178 ?") )); II2C_SetI2CAddress( this->m_pII2C, AD7178_WRITE_ADDR, AD7178_READ_ADDR, 0); // actually 36 registers. For now in order to distinguish 7175A let's put 37 !! this->m_bEncoderRegs = AD7178_ID; // from 0 - 35 or 0x00 - 0x23 byte = 0x55; II2C_Write(this->m_pII2C, 1,&byte,1); byte = 0; II2C_Read(this->m_pII2C, 1,&byte,1); if (byte == 0x55) { QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: AD7178") )); return TRUE; } else { // It isn't 7178. Let's try BT869 QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: BT869 ?") )); II2C_SetI2CAddress( this->m_pII2C, BT869_WRITE_ADDR, BT869_READ_ADDR, 0); this->m_bEncoderRegs = BT869_ID; II2C_Read(this->m_pII2C, 0,&byte,1); // read the chip version if (byte == 0x22) { QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: BT869") )); return TRUE; } else { // It isn't BT869. Let's try BT865 //EngSui QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: BT865 ?") )); II2C_SetI2CAddress( this->m_pII2C, BT865_WRITE_ADDR, BT865_READ_ADDR, 0); this->m_bEncoderRegs = BT865_ID; // reset the chip to make ESTATUS = 0, then read chip version II2C_Write(this->m_pII2C, BT865_MAPREG(0x53),&byte,1); II2C_Read(this->m_pII2C, 0,&byte,1); // any addr will read back chip version if(byte == BT865_ID) { QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: BT865 found") )); return TRUE; } else { QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT(" CheckTVEn: No TV Encoder") )); II2C_SetI2CAddress( this->m_pII2C, 0, 0, 0); this->m_bEncoderRegs = 0; return FALSE; } } } } }}/****f* HwLib/ITvEncoder_SetRegistry * USAGE * void ITvEncoder_SetRegistry(ITvEncoder* pITvEncoder, REGISTRY_TABLE* pRegistry) * void CTvEncoder__SetRegistry(ITvEncoder* pITvEncoder, REGISTRY_TABLE* pRegistry) * DESCRIPTION * ITvEncoder_SetRegistry - sets specific variables for TvEncoder object, like using extended * modes or field invert. * It is called by CQuasarBoard_SetRegistry. * PARAMETERS * IN ITvEncoder* pITvEncoder - pointer to the TvEncoder object * IN REGISTRY_TABLE* pRegistry - pointer to a table containing initial values for EM8400./********************************************************************************************/void CTvEncoder__SetRegistry(ITvEncoder* pITvEncoder, REGISTRY_TABLE* pRegistry){ CTvEncoder *this = (CTvEncoder*) pITvEncoder; this->pRegistry = pRegistry; this->InvertField = pRegistry->InvertField;}/****f* HwLib/ITvEncoder_InitTvEncoder * USAGE * void ITvEncoder_InitTvEncoder(ITvEncoder* pITvEncoder) * void CTvEncoder__InitTvEncoder(ITvEncoder* pITvEncoder) * DESCRIPTION * ITvEncoder_InitTvEncoder is implemented by CAD7170__InitTvEncoder, CAD7175__InitTvEncoder * CAD7177__InitTvEncoder, CEM840X__InitTvEncoder, CEM847X__InitTvEncoder . * The registers of TvEncoder are written with values from a specific TVRegsTable. * Usually the TvEncoder is programmed in slave mode, 8 bit, CCIR601, DACs disabled. * It is called by ITvEncoder_Init and IDecoderBoard_HwReset. * PARAMETERS * IN ITvEncoder* pITvEncoder - pointer to the TvEncoder object/********************************************************************************************/void CTvEncoder__InitTvEncoder(ITvEncoder* pITvEncoder){}/****f* HwLib/ITvEncoder_ProgramTV * USAGE * void ITvEncoder_ProgramTV(ITvEncoder* pITvEncoder, DWORD TvMaster, * DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable) * void CTvEncoder__ProgramTV(ITvEncoder* pITvEncoder, DWORD TvMaster, * DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable) * DESCRIPTION * ITvEncoder_ProgramTV is implemented by CAD7170__ProgramTV, CAD7175__ProgramTV * CAD7177__ProgramTV, CEM840X__ProgramTV, CEM847X__ProgramTV. * The synchronization signals (HSync, VSync) can be provided by any of: * - MpegDecoder from EM8400, * - TvEncoder from EM8400, * - an external TvEncoder. * We can choose any of them to be master ( to generate the VSync, HSync ) and in the * same time forcing the other ones to be slave. * It is called by IDecoderBoard_VidSetVGATV * PARAMETERS * IN ITvEncoder* pITvEncoder - pointer to the TvEncoder object * IN DWORD TvMaster - 1 for master ( TvEncoder generates the VSync and HSync), 0 for slave * IN DWORD nbits - 8bits(Y,U,Y,V) or 16(YU,YV) bits per clock * IN DWORD ccir - CCIR_601 or CCIR_656 * IN DWORD TvStandard - one of SET_NTSC,SET_PAL,SET_PAL60 * IN DWORD DacsEnable - 0 for TV DACs power off, 1 for TV DACs power off * SEE ALSO * IDecoder_QuasarMaster, IDecoder_QuasarSlave/********************************************************************************************/void CTvEncoder__ProgramTV(ITvEncoder* pITvEncoder, DWORD TvMaster, DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable){ CTvEncoder *this = (CTvEncoder*) pITvEncoder; this->CurrentTvStandard = TvStandard; this->TvDacsEnable = DacsEnable;}/****f* HwLib/ITvEncoder_SetTVStandard * USAGE * void ITvEncoder_SetTVStandard(ITvEncoder* pITvEncoder, DWORD StandardTV) * void CTvEncoder__SetTVStandard(ITvEncoder* pITvEncoder, DWORD StandardTV) * DESCRIPTION * ITvEncoder_SetTVStandard is implemented by CAD7170__SetTVStandard, CAD7175__SetTVStandard * CAD7177__SetTVStandard, CSigmaTv__SetTVStandard. * This function modifies the internal TVRegsTable according to "StandardTV" and takes care * also about changing the macrovision values, but doesn't program the hardware. * It is called by ITvEncoder_ProgramTV, who programs the hardware with the new values. * PARAMETERS * IN ITvEncoder* pITvEncoder - pointer to the TvEncoder object * IN DWORD StandardTV - one of SET_NTSC,SET_PAL,SET_PAL60/********************************************************************************************/void CTvEncoder__SetTVStandard(ITvEncoder* pITvEncoder, DWORD StandardTV){ CTvEncoder *this = (CTvEncoder*) pITvEncoder; this->CurrentTvStandard = StandardTV;}/****f* HwLib/ITvEncoder_GetCurrentTVStandard * USAGE * void ITvEncoder_GetCurrentTVStandard(ITvEncoder* pITvEncoder) * void CTvEncoder__GetCurrentTVStandard(ITvEncoder* pITvEncoder) * DESCRIPTION * ITvEncoder_GetCurrentTVStandard returns the current TV standard already programmed * in TvEncoder (SET_NTSC, SET_PAL, SET_PAL60). * ITvEncoder_GetCurrentTVStandard is called by IDecoderBoard_VideoHwPlay. * PARAMETERS * IN ITvEncoder* pITvEncoder - pointer to the TvEncoder object/********************************************************************************************/DWORD CTvEncoder__GetCurrentTVStandard(ITvEncoder* pITvEncoder){ CTvEncoder *this = (CTvEncoder*) pITvEncoder; return this->CurrentTvStandard;}/****f* HwLib/ITvEncoder_GetCurrentMacrovision * USAGE * void ITvEncoder_GetCurrentMacrovision(ITvEncoder* pITvEncoder) * void CTvEncoder__GetCurrentMacrovision(ITvEncoder* pITvEncoder) * DESCRIPTION * ITvEncoder_GetCurrentMacrovision returns the current level of macrovision already * programmed in TvEncoder. * PARAMETERS * IN ITvEncoder* pITvEncoder - pointer to the TvEncoder object/********************************************************************************************/DWORD CTvEncoder__GetCurrentMacrovision(ITvEncoder* pITvEncoder){ CTvEncoder *this = (CTvEncoder*) pITvEncoder; return this->CurrentMacrovision;}/****f* HwLib/ITvEncoder_SetCurrentYcYuvRgb * USAGE * void ITvEncoder_SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) * void CTvEncoder__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) * void CAD7170__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) * void CAD7175__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) * void CAD7177__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) * void CEM847X__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) * DESCRIPTION * ITvEncoder_SetCurrentYcYuvRgb selects the output signal for TV: COMPONENT_YUV, * COMPONENT_RGB, COMPOSITE. * ITvEncoder_SetCurrentYcYuvRgb is called by IDecoderBoard_SelectOutputForVideo. * PARAMETERS * IN ITvEncoder* pITvEncoder - pointer to the TvEncoder object * IN DWORD YcYuvRgb - one of supported values COMPONENT_YUV, COMPONENT_RGB, COMPOSITE * SEE ALSO * ITvEncoder_GetCurrentYcYuvRgb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -