////////////////////////////////////////////////////////////////////////////// // // (C) Philips Semiconductors 1998 // All rights are reserved. Reproduction in whole or in part is prohibited // without the written consent of the copyright owner. // // Philips reserves the right to make changes without notice at any time. // Philips makes no warranty, expressed, implied or statutory, including but // not limited to any implied warranty of merchantibility or fitness for any // particular purpose, or that the use will not infringe any third party // patent, copyright or trademark. Philips must not be liable for any loss // or damage arising from its use. // // MPOC.CPP // Implementation for MPOC ////////////////////////////////////////////////////////////////////////////// #include "philtune.h" #include "mpoc.h" #include "wdmdebug.h" UCHAR MpocInitArray[] = { 0x20, // 1D 0x20, // 1E 0x1F, // 1F 0x00, // 20 0x00, // 21 0x00, // 22 0x00, // 23 0x00, // 24 0x00, // 25 0x00, // 26 0x10, // 27 0x12, // 28 0x00, // 29 0x13, // 2A 0x00, // 2B 0x00, // 2C 0x00, // 2D 0x00, // 2E }; /* * MpocInit() * Input * Output : TRUE - mode initialization succeeds * FALSE - if there is an I2C error * Description: Initialize MPOC registers */ NTSTATUS CDevice::MpocInit() { NTSTATUS Status = STATUS_SUCCESS; _DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::MPOCInit(): Inside\n")); m_MpocRegisters.reg_set.offset = MPOC_CONTROL_REG_OFFSET; MemoryCopy(m_MpocRegisters.reg_set.buffer, &MpocInitArray, sizeof(MpocInitArray)); if(!m_pI2CScript->WriteSeq(MPOC_I2C_ADDRESS, (UCHAR *)(m_MpocRegisters.array), sizeof(MpocInitArray)+1)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice: MPOC Initialize failed")); return STATUS_ADAPTER_HARDWARE_ERROR; } return STATUS_SUCCESS; } /* * SetMpocIFMode() * Input * Output : TRUE - mode initialization succeeds * FALSE - if there is an I2C error * Description: Set IF Mpode on MPOC */ NTSTATUS CDevice::SetMpocIFMode(ULONG ulMode) { NTSTATUS Status = STATUS_SUCCESS; UCHAR ucBuffer; _DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::MPOCSetMode(): Inside\n")); ucBuffer = m_MpocRegisters.reg_set.buffer[MPOC_CONTROL_REG_VIDEO_ADC - MPOC_CONTROL_REG_OFFSET]; ucBuffer &= 0xF8; if(ulMode == (ULONG)KSPROPERTY_TUNER_MODE_ATSC) { // Set the appropriate bits based on the Output ( this corresponds // directly to the bits to be set for Video ADC output) if(m_BoardInfo.uiMpocVersion < 4) { ucBuffer |= MPOC_VIDEOADC_VSBI; } else { // 1/25/2000 . Versions >= N1D have the VSB-1 value shifted // by 1 (register value changes) ucBuffer |= MPOC_VIDEOADC_VSBIQ; } m_MpocRegisters.reg_set.buffer[MPOC_CONTROL_REG_VIDEO_ADC- MPOC_CONTROL_REG_OFFSET] = ucBuffer; // Set AGC to external mode m_MpocRegisters.reg_set.buffer[MPOC_CONTROL_REG_VISION_IF_1 - MPOC_CONTROL_REG_OFFSET] |= EXTERNAL_AGC; } else if(ulMode == (ULONG)KSPROPERTY_TUNER_MODE_TV) { // Set the appropriate bits based on the Output ( this corresponds // directly to the bits to be set for Video ADC output) ucBuffer |= MPOC_VIDEOADC_TV27; m_MpocRegisters.reg_set.buffer[MPOC_CONTROL_REG_VIDEO_ADC- MPOC_CONTROL_REG_OFFSET] = ucBuffer; if(m_BoardInfo.uiMpocVersion >= 4) { m_MpocRegisters.reg_set.buffer[MPOC_CONTROL_REG_VISION_IF_0 - MPOC_CONTROL_REG_OFFSET] |= MPOC_PLL_IF_FREQ_45_POINT_75; } // Set AGC to external mode m_MpocRegisters.reg_set.buffer[MPOC_CONTROL_REG_VISION_IF_1 - MPOC_CONTROL_REG_OFFSET] &= ~EXTERNAL_AGC; } else {} if(!m_pI2CScript->WriteSeq(MPOC_I2C_ADDRESS, (UCHAR *)(m_MpocRegisters.array), sizeof(m_MpocRegisters.array))) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice: SetIFMode: MPOC Write failed")); return STATUS_ADAPTER_HARDWARE_ERROR; } return STATUS_SUCCESS; } /* * GetMpocVersion() * Input: * Output: * Description: Get MPOC version number */ NTSTATUS CDevice::GetMpocVersion(UINT *p_version) { // Read EEPROM for version number // MPOC version number is in register 0xFC of EEPROM at address 0xA6 // Version N1A - 1 // N1B - 2 // N1C - 3 // N1D - 4 // N1F - 6 UCHAR ucStartAddr = 0xFC; UCHAR ucVersion = 4; NTSTATUS Status = STATUS_SUCCESS; if(!m_pI2CScript->WriteSeq(BOARD_EEPROM_ADDRESS, &ucStartAddr, 1)) { Status = STATUS_ADAPTER_HARDWARE_ERROR; // Set default version to N1D ucVersion = 4; } if(!m_pI2CScript->ReadSeq(BOARD_EEPROM_ADDRESS, &ucVersion, 1)) { Status = STATUS_ADAPTER_HARDWARE_ERROR; // Set default version to N1D ucVersion = 4; } //Mini: Test //ucVersion = 6; *p_version = (UINT)(ucVersion); _DbgPrintF( DEBUGLVL_VERBOSE,("CDevice :MPOC Version = %x \n", ucVersion)); return Status; } /* * GetMpocIFStatus() * Input: * Output: * Description: */ NTSTATUS CDevice::GetMpocStatus(UINT StatusType, UINT *puiStatus) { UCHAR ucBuffer[MAX_MPOC_STATUS_REGISTERS]; if(!m_pI2CScript->ReadSeq(MPOC_I2C_ADDRESS, ucBuffer, MAX_MPOC_STATUS_REGISTERS)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice: MPOC Read failed")); return STATUS_ADAPTER_HARDWARE_ERROR; } switch (StatusType) { case MPOC_STATUS_IF_PLL_LOCK: // Bit 5 of status register 0 *puiStatus = (ucBuffer[MPOC_STATUS_REG_0] & 0x20) ? 1 : 0; break; case MPOC_STATUS_PHASE_LOCK: // Bit 4 of status register 0 *puiStatus = (ucBuffer[MPOC_STATUS_REG_0] & 0x10) ? 1 : 0; break; case MPOC_STATUS_PLL_OFFSET: // Bits 3 and 2 of status register 2 *puiStatus = (ucBuffer[MPOC_STATUS_REG_2] & 0x0c) >> 2; break; default: return STATUS_INVALID_PARAMETER; break; } return STATUS_SUCCESS; }