summaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorSteven Toth <stoth@hauppauge.com>2008-05-01 04:57:01 -0300
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-05-14 02:56:33 -0300
commit52c99bda04d8bb1fb390821695b0f9efc1e1db44 (patch)
tree32848f7543334e688e28d5b513d5de7c4702c8c6 /drivers/media
parente4671b6bc0b5b488adc5acbcfcbfa6661abec94e (diff)
V4L/DVB (7862): Add mxl5505s driver for MaxiLinear 5505 chipsets
Initial check-in of the original driver to establish history. Signed-off-by: Chia-Ling Lu Developer <chialing@realtek.com.tw> Signed-off-by: Steven Toth <stoth@hauppauge.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/common/tuners/mxl5005s.c4989
-rw-r--r--drivers/media/common/tuners/mxl5005s.h718
2 files changed, 5707 insertions, 0 deletions
diff --git a/drivers/media/common/tuners/mxl5005s.c b/drivers/media/common/tuners/mxl5005s.c
new file mode 100644
index 000000000000..a32475fa1472
--- /dev/null
+++ b/drivers/media/common/tuners/mxl5005s.c
@@ -0,0 +1,4989 @@
+/*
+ * For the Realtek RTL chip RTL2831U
+ * Realtek Release Date: 2008-03-14, ver 080314
+ * Realtek version RTL2831 Linux driver version 080314
+ * ver 080314
+ *
+ * for linux kernel version 2.6.21.4 - 2.6.22-14
+ * support MXL5005s and MT2060 tuners (support tuner auto-detecting)
+ * support two IR types -- RC5 and NEC
+ *
+ * Known boards with Realtek RTL chip RTL2821U
+ * Freecom USB stick 14aa:0160 (version 4)
+ * Conceptronic CTVDIGRCU
+ *
+ * Copyright (c) 2008 Realtek
+ * Copyright (c) 2008 Jan Hoogenraad, Barnaby Shearer, Andy Hasper
+ * This code is placed under the terms of the GNU General Public License
+ *
+ * Released by Realtek under GPLv2.
+ * Thanks to Realtek for a lot of support we received !
+ *
+ * Revision: 080314 - original version
+ */
+
+
+/**
+
+@file
+
+@brief MxL5005S tuner module definition
+
+One can manipulate MxL5005S tuner through MxL5005S module.
+MxL5005S module is derived from tuner module.
+
+*/
+
+
+#include "tuner_mxl5005s.h"
+#include "tuner_demod_io.h"
+
+
+
+
+
+
+/**
+
+@defgroup MXL5005S_TUNER_MODULE MxL5005S tuner module
+
+MxL5005S tuner module is drived from tuner base module.
+
+@see TUNER_BASE_MODULE
+
+*/
+
+
+
+
+
+/**
+
+@defgroup MXL5005S_MODULE_BUILDER MxL5005S module builder
+@ingroup MXL5005S_TUNER_MODULE
+
+One should call MxL5005S module builder before using MxL5005S module.
+
+*/
+/// @{
+
+
+
+
+
+/**
+
+@brief MxL5005S tuner module builder
+
+Use BuildMxl5005sModule() to build MxL5005S module, set all module function pointers with the corresponding functions,
+and initialize module private variables.
+
+
+@param [in] ppTuner Pointer to MxL5005S tuner module pointer
+@param [in] pTunerModuleMemory Pointer to an allocated tuner module memory
+@param [in] pMxl5005sExtraModuleMemory Pointer to an allocated MxL5005S extra module memory
+@param [in] pI2cBridgeModuleMemory Pointer to an allocated I2C bridge module memory
+@param [in] DeviceAddr MxL5005S I2C device address
+@param [in] CrystalFreqHz MxL5005S crystal frequency in Hz
+
+
+@note \n
+ -# One should call BuildMxl5005sModule() to build MxL5005S module before using it.
+
+*/
+void
+BuildMxl5005sModule(
+ TUNER_MODULE **ppTuner,
+ TUNER_MODULE *pTunerModuleMemory,
+ MXL5005S_EXTRA_MODULE *pMxl5005sExtraModuleMemory,
+ BASE_INTERFACE_MODULE *pBaseInterfaceModuleMemory,
+ I2C_BRIDGE_MODULE *pI2cBridgeModuleMemory,
+ unsigned char DeviceAddr,
+ int StandardMode
+ )
+{
+ MXL5005S_EXTRA_MODULE *pExtra;
+
+ int MxlModMode;
+ int MxlIfMode;
+ unsigned long MxlBandwitdh;
+ unsigned long MxlIfFreqHz;
+ unsigned long MxlCrystalFreqHz;
+ int MxlAgcMode;
+ unsigned short MxlTop;
+ unsigned short MxlIfOutputLoad;
+ int MxlClockOut;
+ int MxlDivOut;
+ int MxlCapSel;
+ int MxlRssiOnOff;
+ unsigned char MxlStandard;
+ unsigned char MxlTfType;
+
+
+
+ // Set tuner module pointer, tuner extra module pointer, and I2C bridge module pointer.
+ *ppTuner = pTunerModuleMemory;
+ (*ppTuner)->pExtra = pMxl5005sExtraModuleMemory;
+ (*ppTuner)->pBaseInterface = pBaseInterfaceModuleMemory;
+ (*ppTuner)->pI2cBridge = pI2cBridgeModuleMemory;
+
+ // Get tuner extra module pointer.
+ pExtra = (MXL5005S_EXTRA_MODULE *)(*ppTuner)->pExtra;
+
+
+ // Set I2C bridge tuner arguments.
+ mxl5005s_SetI2cBridgeModuleTunerArg(*ppTuner);
+
+
+ // Set tuner module manipulating function pointers.
+ (*ppTuner)->SetDeviceAddr = mxl5005s_SetDeviceAddr;
+
+ (*ppTuner)->GetTunerType = mxl5005s_GetTunerType;
+ (*ppTuner)->GetDeviceAddr = mxl5005s_GetDeviceAddr;
+
+ (*ppTuner)->Initialize = mxl5005s_Initialize;
+ (*ppTuner)->SetRfFreqHz = mxl5005s_SetRfFreqHz;
+ (*ppTuner)->GetRfFreqHz = mxl5005s_GetRfFreqHz;
+
+
+ // Set tuner extra module manipulating function pointers.
+ pExtra->SetRegsWithTable = mxl5005s_SetRegsWithTable;
+ pExtra->SetRegMaskBits = mxl5005s_SetRegMaskBits;
+ pExtra->SetSpectrumMode = mxl5005s_SetSpectrumMode;
+ pExtra->SetBandwidthHz = mxl5005s_SetBandwidthHz;
+
+
+ // Initialize tuner parameter setting status.
+ (*ppTuner)->IsDeviceAddrSet = NO;
+ (*ppTuner)->IsRfFreqHzSet = NO;
+
+
+ // Set MxL5005S parameters.
+ MxlModMode = MXL_DIGITAL_MODE;
+ MxlIfMode = MXL_ZERO_IF;
+ MxlBandwitdh = MXL5005S_BANDWIDTH_8MHZ;
+ MxlIfFreqHz = IF_FREQ_4570000HZ;
+ MxlCrystalFreqHz = CRYSTAL_FREQ_16000000HZ;
+ MxlAgcMode = MXL_SINGLE_AGC;
+ MxlTop = MXL5005S_TOP_25P2;
+ MxlIfOutputLoad = MXL5005S_IF_OUTPUT_LOAD_200_OHM;
+ MxlClockOut = MXL_CLOCK_OUT_DISABLE;
+ MxlDivOut = MXL_DIV_OUT_4;
+ MxlCapSel = MXL_CAP_SEL_ENABLE;
+ MxlRssiOnOff = MXL_RSSI_ENABLE;
+ MxlTfType = MXL_TF_C_H;
+
+
+ // Set MxL5005S parameters according to standard mode
+ switch(StandardMode)
+ {
+ default:
+ case MXL5005S_STANDARD_DVBT: MxlStandard = MXL_DVBT; break;
+ case MXL5005S_STANDARD_ATSC: MxlStandard = MXL_ATSC; break;
+ }
+
+
+ // Set MxL5005S extra module.
+ pExtra->AgcMasterByte = (MxlAgcMode == MXL_DUAL_AGC) ? 0x4 : 0x0;
+
+ MXL5005_TunerConfig(&pExtra->MxlDefinedTunerStructure, (unsigned char)MxlModMode, (unsigned char)MxlIfMode,
+ MxlBandwitdh, MxlIfFreqHz, MxlCrystalFreqHz, (unsigned char)MxlAgcMode, MxlTop, MxlIfOutputLoad,
+ (unsigned char)MxlClockOut, (unsigned char)MxlDivOut, (unsigned char)MxlCapSel, (unsigned char)MxlRssiOnOff,
+ MxlStandard, MxlTfType);
+
+
+
+ // Note: Need to set all module arguments before using module functions.
+
+
+ // Set tuner type.
+ (*ppTuner)->TunerType = TUNER_TYPE_MXL5005S;
+
+ // Set tuner I2C device address.
+ (*ppTuner)->SetDeviceAddr(*ppTuner, DeviceAddr);
+
+
+ return;
+}
+
+
+
+
+
+/// @}
+
+
+
+
+
+/**
+
+@defgroup MXL5005S_MANIPULATING_FUNCTIONS MxL5005S manipulating functions derived from tuner base module
+@ingroup MXL5005S_TUNER_MODULE
+
+One can use the MxL5005S tuner module manipulating interface implemented by MxL5005S manipulating functions to
+manipulate MxL5005S tuner.
+
+*/
+/// @{
+
+
+
+
+
+/**
+
+@brief Set MxL5005S tuner I2C device address.
+
+@note \n
+ -# MxL5005S tuner builder will set TUNER_FP_SET_DEVICE_ADDR() function pointer with mxl5005s_SetDeviceAddr().
+
+@see TUNER_FP_SET_DEVICE_ADDR
+
+*/
+void
+mxl5005s_SetDeviceAddr(
+ TUNER_MODULE *pTuner,
+ unsigned char DeviceAddr
+ )
+{
+ // Set tuner I2C device address.
+ pTuner->DeviceAddr = DeviceAddr;
+ pTuner->IsDeviceAddrSet = YES;
+
+
+ return;
+}
+
+
+
+
+
+/**
+
+@brief Get MxL5005S tuner type.
+
+@note \n
+ -# MxL5005S tuner builder will set TUNER_FP_GET_TUNER_TYPE() function pointer with mxl5005s_GetTunerType().
+
+@see TUNER_FP_GET_TUNER_TYPE
+
+*/
+void
+mxl5005s_GetTunerType(
+ TUNER_MODULE *pTuner,
+ int *pTunerType
+ )
+{
+ // Get tuner type from tuner module.
+ *pTunerType = pTuner->TunerType;
+
+
+ return;
+}
+
+
+
+
+
+/**
+
+@brief Get MxL5005S tuner I2C device address.
+
+@note \n
+ -# MxL5005S tuner builder will set TUNER_FP_GET_DEVICE_ADDR() function pointer with mxl5005s_GetDeviceAddr().
+
+@see TUNER_FP_GET_DEVICE_ADDR
+
+*/
+int
+mxl5005s_GetDeviceAddr(
+ TUNER_MODULE *pTuner,
+ unsigned char *pDeviceAddr
+ )
+{
+ // Get tuner I2C device address from tuner module.
+ if(pTuner->IsDeviceAddrSet != YES)
+ goto error_status_get_tuner_i2c_device_addr;
+
+ *pDeviceAddr = pTuner->DeviceAddr;
+
+
+ return FUNCTION_SUCCESS;
+
+
+error_status_get_tuner_i2c_device_addr:
+ return FUNCTION_ERROR;
+}
+
+
+
+
+
+/**
+
+@brief Initialize MxL5005S tuner.
+
+@note \n
+ -# MxL5005S tuner builder will set TUNER_FP_INITIALIZE() function pointer with mxl5005s_Initialize().
+
+@see TUNER_FP_INITIALIZE
+
+*/
+int
+mxl5005s_Initialize(
+ struct dvb_usb_device* dib,
+ TUNER_MODULE *pTuner
+ )
+{
+ MXL5005S_EXTRA_MODULE *pExtra;
+
+ unsigned char AgcMasterByte;
+ unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
+ unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
+ int TableLen;
+
+
+
+ // Get tuner extra module.
+ pExtra = (MXL5005S_EXTRA_MODULE *)pTuner->pExtra;
+
+
+ // Get AGC master byte
+ AgcMasterByte = pExtra->AgcMasterByte;
+
+
+ // Initialize MxL5005S tuner according to MxL5005S tuner example code.
+
+ // Tuner initialization stage 0
+ MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
+ AddrTable[0] = MASTER_CONTROL_ADDR;
+ ByteTable[0] |= AgcMasterByte;
+
+ if(pExtra->SetRegsWithTable( dib,pTuner, AddrTable, ByteTable, LEN_1_BYTE) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ // Tuner initialization stage 1
+ MXL_GetInitRegister(&pExtra->MxlDefinedTunerStructure, AddrTable, ByteTable, &TableLen);
+
+ if(pExtra->SetRegsWithTable( dib,pTuner, AddrTable, ByteTable, TableLen) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ return FUNCTION_SUCCESS;
+
+
+error_status_set_tuner_registers:
+ return FUNCTION_ERROR;
+}
+
+
+
+
+
+/**
+
+@brief Set MxL5005S tuner RF frequency in Hz.
+
+@note \n
+ -# MxL5005S tuner builder will set TUNER_FP_SET_RF_FREQ_HZ() function pointer with mxl5005s_SetRfFreqHz().
+
+@see TUNER_FP_SET_RF_FREQ_HZ
+
+*/
+int
+mxl5005s_SetRfFreqHz(
+ struct dvb_usb_device* dib,
+ TUNER_MODULE *pTuner,
+ unsigned long RfFreqHz
+ )
+{
+ MXL5005S_EXTRA_MODULE *pExtra;
+ BASE_INTERFACE_MODULE *pBaseInterface;
+
+ unsigned char AgcMasterByte;
+ unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
+ unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
+ int TableLen;
+
+ unsigned long IfDivval;
+ unsigned char MasterControlByte;
+
+
+
+ // Get tuner extra module and base interface module.
+ pExtra = (MXL5005S_EXTRA_MODULE *)pTuner->pExtra;
+ pBaseInterface = pTuner->pBaseInterface;
+
+
+ // Get AGC master byte
+ AgcMasterByte = pExtra->AgcMasterByte;
+
+
+ // Set MxL5005S tuner RF frequency according to MxL5005S tuner example code.
+
+ // Tuner RF frequency setting stage 0
+ MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET) ;
+ AddrTable[0] = MASTER_CONTROL_ADDR;
+ ByteTable[0] |= AgcMasterByte;
+
+ if(pExtra->SetRegsWithTable( dib,pTuner, AddrTable, ByteTable, LEN_1_BYTE) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ // Tuner RF frequency setting stage 1
+ MXL_TuneRF(&pExtra->MxlDefinedTunerStructure, RfFreqHz);
+
+ MXL_ControlRead(&pExtra->MxlDefinedTunerStructure, IF_DIVVAL, &IfDivval);
+
+ MXL_ControlWrite(&pExtra->MxlDefinedTunerStructure, SEQ_FSM_PULSE, 0);
+ MXL_ControlWrite(&pExtra->MxlDefinedTunerStructure, SEQ_EXTPOWERUP, 1);
+ MXL_ControlWrite(&pExtra->MxlDefinedTunerStructure, IF_DIVVAL, 8);
+
+ MXL_GetCHRegister(&pExtra->MxlDefinedTunerStructure, AddrTable, ByteTable, &TableLen) ;
+
+ MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
+ AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
+ ByteTable[TableLen] = MasterControlByte | AgcMasterByte;
+ TableLen += 1;
+
+ if(pExtra->SetRegsWithTable( dib,pTuner, AddrTable, ByteTable, TableLen) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ // Wait 30 ms.
+ pBaseInterface->WaitMs(pBaseInterface, 30);
+
+
+ // Tuner RF frequency setting stage 2
+ MXL_ControlWrite(&pExtra->MxlDefinedTunerStructure, SEQ_FSM_PULSE, 1) ;
+ MXL_ControlWrite(&pExtra->MxlDefinedTunerStructure, IF_DIVVAL, IfDivval) ;
+ MXL_GetCHRegister_ZeroIF(&pExtra->MxlDefinedTunerStructure, AddrTable, ByteTable, &TableLen) ;
+
+ MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
+ AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
+ ByteTable[TableLen] = MasterControlByte | AgcMasterByte ;
+ TableLen += 1;
+
+ if(pExtra->SetRegsWithTable( dib,pTuner, AddrTable, ByteTable, TableLen) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ // Set tuner RF frequency parameter.
+ pTuner->RfFreqHz = RfFreqHz;
+ pTuner->IsRfFreqHzSet = YES;
+
+
+ return FUNCTION_SUCCESS;
+
+
+error_status_set_tuner_registers:
+ return FUNCTION_ERROR;
+}
+
+
+
+
+
+/**
+
+@brief Get MxL5005S tuner RF frequency in Hz.
+
+@note \n
+ -# MxL5005S tuner builder will set TUNER_FP_GET_RF_FREQ_HZ() function pointer with mxl5005s_GetRfFreqHz().
+
+@see TUNER_FP_GET_RF_FREQ_HZ
+
+*/
+int
+mxl5005s_GetRfFreqHz(
+ struct dvb_usb_device* dib,
+ TUNER_MODULE *pTuner,
+ unsigned long *pRfFreqHz
+ )
+{
+ // Get tuner RF frequency in Hz from tuner module.
+ if(pTuner->IsRfFreqHzSet != YES)
+ goto error_status_get_tuner_rf_frequency;
+
+ *pRfFreqHz = pTuner->RfFreqHz;
+
+
+ return FUNCTION_SUCCESS;
+
+
+error_status_get_tuner_rf_frequency:
+ return FUNCTION_ERROR;
+}
+
+
+
+
+
+/**
+
+@brief Set MxL5005S tuner registers with table.
+
+*/
+/*
+int
+mxl5005s_SetRegsWithTable(
+ struct dvb_usb_device* dib,
+ TUNER_MODULE *pTuner,
+ unsigned char *pAddrTable,
+ unsigned char *pByteTable,
+ int TableLen
+ )
+{
+ BASE_INTERFACE_MODULE *pBaseInterface;
+ I2C_BRIDGE_MODULE *pI2cBridge;
+ unsigned char WritingByteNumMax;
+
+ int i;
+ unsigned char WritingBuffer[I2C_BUFFER_LEN];
+ unsigned char WritingIndex;
+
+
+
+ // Get base interface, I2C bridge, and maximum writing byte number.
+ pBaseInterface = pTuner->pBaseInterface;
+ pI2cBridge = pTuner->pI2cBridge;
+ WritingByteNumMax = pBaseInterface->I2cWritingByteNumMax;
+
+
+ // Set registers with table.
+ // Note: 1. The I2C format of MxL5005S is described as follows:
+ // start_bit + (device_addr | writing_bit) + (register_addr + writing_byte) * n + stop_bit
+ // ...
+ // start_bit + (device_addr | writing_bit) + (register_addr + writing_byte) * m + latch_byte + stop_bit
+ // 2. The latch_byte is 0xfe.
+ // 3. The following writing byte separating scheme takes latch_byte as two byte data.
+ for(i = 0, WritingIndex = 0; i < TableLen; i++)
+ {
+ // Put register address and register byte value into writing buffer.
+ WritingBuffer[WritingIndex] = pAddrTable[i];
+ WritingBuffer[WritingIndex + 1] = pByteTable[i];
+ WritingIndex += 2;
+
+ // If writing buffer is full, send the I2C writing command with writing buffer.
+ if(WritingIndex > (WritingByteNumMax - 2))
+ {
+ if(pI2cBridge->ForwardI2cWritingCmd(pI2cBridge, WritingBuffer, WritingIndex) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+ WritingIndex = 0;
+ }
+ }
+
+
+ // Send the last I2C writing command with writing buffer and latch byte.
+ WritingBuffer[WritingIndex] = MXL5005S_LATCH_BYTE;
+ WritingIndex += 1;
+
+ if(pI2cBridge->ForwardI2cWritingCmd(pI2cBridge, WritingBuffer, WritingIndex) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ return FUNCTION_SUCCESS;
+
+
+error_status_set_tuner_registers:
+ return FUNCTION_ERROR;
+}
+*/
+
+
+int
+mxl5005s_SetRegsWithTable(
+ struct dvb_usb_device* dib,
+ TUNER_MODULE *pTuner,
+ unsigned char *pAddrTable,
+ unsigned char *pByteTable,
+ int TableLen
+ )
+{
+ int i;
+ u8 end_two_bytes_buf[]={ 0 , 0 };
+ u8 tuner_addr=0x00;
+
+ pTuner->GetDeviceAddr(pTuner , &tuner_addr);
+
+ for( i = 0 ; i < TableLen - 1 ; i++)
+ {
+ if ( TUNER_WI2C(dib , tuner_addr , pAddrTable[i] , &pByteTable[i] , 1 ) )
+ return FUNCTION_ERROR;
+ }
+
+ end_two_bytes_buf[0] = pByteTable[i];
+ end_two_bytes_buf[1] = MXL5005S_LATCH_BYTE;
+
+ if ( TUNER_WI2C(dib , tuner_addr , pAddrTable[i] , end_two_bytes_buf , 2 ) )
+ return FUNCTION_ERROR;
+
+ return FUNCTION_SUCCESS;
+}
+
+
+
+
+
+/**
+
+@brief Set MxL5005S tuner register bits.
+
+*/
+int
+mxl5005s_SetRegMaskBits(
+ struct dvb_usb_device* dib,
+ TUNER_MODULE *pTuner,
+ unsigned char RegAddr,
+ unsigned char Msb,
+ unsigned char Lsb,
+ const unsigned char WritingValue
+ )
+{
+ MXL5005S_EXTRA_MODULE *pExtra;
+
+ int i;
+
+ unsigned char Mask;
+ unsigned char Shift;
+
+ unsigned char RegByte;
+
+
+
+ // Get tuner extra module.
+ pExtra = (MXL5005S_EXTRA_MODULE *)pTuner->pExtra;
+
+
+ // Generate mask and shift according to MSB and LSB.
+ Mask = 0;
+ for(i = Lsb; i < (unsigned char)(Msb + 1); i++)
+ Mask |= 0x1 << i;
+
+ Shift = Lsb;
+
+
+ // Get tuner register byte according to register adddress.
+ MXL_RegRead(&pExtra->MxlDefinedTunerStructure, RegAddr, &RegByte);
+
+
+ // Reserve register byte unmask bit with mask and inlay writing value into it.
+ RegByte &= ~Mask;
+ RegByte |= (WritingValue << Shift) & Mask;
+
+
+ // Update tuner register byte table.
+ MXL_RegWrite(&pExtra->MxlDefinedTunerStructure, RegAddr, RegByte);
+
+
+ // Write tuner register byte with writing byte.
+ if(pExtra->SetRegsWithTable( dib, pTuner, &RegAddr, &RegByte, LEN_1_BYTE) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ return FUNCTION_SUCCESS;
+
+
+error_status_set_tuner_registers:
+ return FUNCTION_ERROR;
+}
+
+
+
+
+
+/**
+
+@brief Set MxL5005S tuner spectrum mode.
+
+*/
+int
+mxl5005s_SetSpectrumMode(
+ struct dvb_usb_device* dib,
+ TUNER_MODULE *pTuner,
+ int SpectrumMode
+ )
+{
+ static const unsigned char BbIqswapTable[SPECTRUM_MODE_NUM] =
+ {
+ // BB_IQSWAP
+ 0, // Normal spectrum
+ 1, // Inverse spectrum
+ };
+
+
+ MXL5005S_EXTRA_MODULE *pExtra;
+
+
+
+ // Get tuner extra module.
+ pExtra = (MXL5005S_EXTRA_MODULE *)pTuner->pExtra;
+
+
+ // Set BB_IQSWAP according to BB_IQSWAP table and spectrum mode.
+ if(pExtra->SetRegMaskBits(dib,pTuner, MXL5005S_BB_IQSWAP_ADDR, MXL5005S_BB_IQSWAP_MSB,
+ MXL5005S_BB_IQSWAP_LSB, BbIqswapTable[SpectrumMode]) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ return FUNCTION_SUCCESS;
+
+
+error_status_set_tuner_registers:
+ return FUNCTION_ERROR;
+}
+
+
+
+
+
+/**
+
+@brief Set MxL5005S tuner bandwidth in Hz.
+
+*/
+int
+mxl5005s_SetBandwidthHz(
+ struct dvb_usb_device* dib,
+ TUNER_MODULE *pTuner,
+ unsigned long BandwidthHz
+ )
+{
+ MXL5005S_EXTRA_MODULE *pExtra;
+
+ unsigned char BbDlpfBandsel;
+
+
+
+ // Get tuner extra module.
+ pExtra = (MXL5005S_EXTRA_MODULE *)pTuner->pExtra;
+
+
+ // Set BB_DLPF_BANDSEL according to bandwidth.
+ switch(BandwidthHz)
+ {
+ default:
+ case MXL5005S_BANDWIDTH_6MHZ: BbDlpfBandsel = 3; break;
+ case MXL5005S_BANDWIDTH_7MHZ: BbDlpfBandsel = 2; break;
+ case MXL5005S_BANDWIDTH_8MHZ: BbDlpfBandsel = 0; break;
+ }
+
+ if(pExtra->SetRegMaskBits(dib,pTuner, MXL5005S_BB_DLPF_BANDSEL_ADDR, MXL5005S_BB_DLPF_BANDSEL_MSB,
+ MXL5005S_BB_DLPF_BANDSEL_LSB, BbDlpfBandsel) != FUNCTION_SUCCESS)
+ goto error_status_set_tuner_registers;
+
+
+ return FUNCTION_SUCCESS;
+
+
+error_status_set_tuner_registers:
+ return FUNCTION_ERROR;
+}
+
+
+
+
+
+/// @}
+
+
+
+
+
+/**
+
+@defgroup MXL5005S_DEPENDENCE MxL5005S dependence
+@ingroup MXL5005S_TUNER_MODULE
+
+MxL5005S dependence is the related functions for MxL5005S tuner module interface.
+One should not use MxL5005S dependence directly.
+
+*/
+/// @{
+
+
+
+
+
+/**
+
+@brief Set I2C bridge module tuner arguments.
+
+MxL5005S builder will use mxl5005s_SetI2cBridgeModuleTunerArg() to set I2C bridge module tuner arguments.
+
+
+@param [in] pTuner The tuner module pointer
+
+
+@see BuildMxl5005sModule()
+
+*/
+void
+mxl5005s_SetI2cBridgeModuleTunerArg(
+ TUNER_MODULE *pTuner
+ )
+{
+ I2C_BRIDGE_MODULE *pI2cBridge;
+
+
+
+ // Get I2C bridge module.
+ pI2cBridge = pTuner->pI2cBridge;
+
+ // Set I2C bridge module tuner arguments.
+ pI2cBridge->pTunerDeviceAddr = &pTuner->DeviceAddr;
+
+
+ return;
+}
+
+
+
+
+
+/// @}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// The following context is source code provided by MaxLinear.
+
+
+
+
+
+// MaxLinear source code - MXL5005_Initialize.cpp
+
+
+
+//#ifdef _MXL_HEADER
+//#include "stdafx.h"
+//#endif
+//#include "MXL5005_c.h"
+
+_u16 MXL5005_RegisterInit (Tuner_struct * Tuner)
+{
+ Tuner->TunerRegs_Num = TUNER_REGS_NUM ;
+// Tuner->TunerRegs = (TunerReg_struct *) calloc( TUNER_REGS_NUM, sizeof(TunerReg_struct) ) ;
+
+ Tuner->TunerRegs[0].Reg_Num = 9 ;
+ Tuner->TunerRegs[0].Reg_Val = 0x40 ;
+
+ Tuner->TunerRegs[1].Reg_Num = 11 ;
+ Tuner->TunerRegs[1].Reg_Val = 0x19 ;
+
+ Tuner->TunerRegs[2].Reg_Num = 12 ;
+ Tuner->TunerRegs[2].Reg_Val = 0x60 ;
+
+ Tuner->TunerRegs[3].Reg_Num = 13 ;
+ Tuner->TunerRegs[3].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[4].Reg_Num = 14 ;
+ Tuner->TunerRegs[4].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[5].Reg_Num = 15 ;
+ Tuner->TunerRegs[5].Reg_Val = 0xC0 ;
+
+ Tuner->TunerRegs[6].Reg_Num = 16 ;
+ Tuner->TunerRegs[6].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[7].Reg_Num = 17 ;
+ Tuner->TunerRegs[7].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[8].Reg_Num = 18 ;
+ Tuner->TunerRegs[8].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[9].Reg_Num = 19 ;
+ Tuner->TunerRegs[9].Reg_Val = 0x34 ;
+
+ Tuner->TunerRegs[10].Reg_Num = 21 ;
+ Tuner->TunerRegs[10].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[11].Reg_Num = 22 ;
+ Tuner->TunerRegs[11].Reg_Val = 0x6B ;
+
+ Tuner->TunerRegs[12].Reg_Num = 23 ;
+ Tuner->TunerRegs[12].Reg_Val = 0x35 ;
+
+ Tuner->TunerRegs[13].Reg_Num = 24 ;
+ Tuner->TunerRegs[13].Reg_Val = 0x70 ;
+
+ Tuner->TunerRegs[14].Reg_Num = 25 ;
+ Tuner->TunerRegs[14].Reg_Val = 0x3E ;
+
+ Tuner->TunerRegs[15].Reg_Num = 26 ;
+ Tuner->TunerRegs[15].Reg_Val = 0x82 ;
+
+ Tuner->TunerRegs[16].Reg_Num = 31 ;
+ Tuner->TunerRegs[16].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[17].Reg_Num = 32 ;
+ Tuner->TunerRegs[17].Reg_Val = 0x40 ;
+
+ Tuner->TunerRegs[18].Reg_Num = 33 ;
+ Tuner->TunerRegs[18].Reg_Val = 0x53 ;
+
+ Tuner->TunerRegs[19].Reg_Num = 34 ;
+ Tuner->TunerRegs[19].Reg_Val = 0x81 ;
+
+ Tuner->TunerRegs[20].Reg_Num = 35 ;
+ Tuner->TunerRegs[20].Reg_Val = 0xC9 ;
+
+ Tuner->TunerRegs[21].Reg_Num = 36 ;
+ Tuner->TunerRegs[21].Reg_Val = 0x01 ;
+
+ Tuner->TunerRegs[22].Reg_Num = 37 ;
+ Tuner->TunerRegs[22].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[23].Reg_Num = 41 ;
+ Tuner->TunerRegs[23].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[24].Reg_Num = 42 ;
+ Tuner->TunerRegs[24].Reg_Val = 0xF8 ;
+
+ Tuner->TunerRegs[25].Reg_Num = 43 ;
+ Tuner->TunerRegs[25].Reg_Val = 0x43 ;
+
+ Tuner->TunerRegs[26].Reg_Num = 44 ;
+ Tuner->TunerRegs[26].Reg_Val = 0x20 ;
+
+ Tuner->TunerRegs[27].Reg_Num = 45 ;
+ Tuner->TunerRegs[27].Reg_Val = 0x80 ;
+
+ Tuner->TunerRegs[28].Reg_Num = 46 ;
+ Tuner->TunerRegs[28].Reg_Val = 0x88 ;
+
+ Tuner->TunerRegs[29].Reg_Num = 47 ;
+ Tuner->TunerRegs[29].Reg_Val = 0x86 ;
+
+ Tuner->TunerRegs[30].Reg_Num = 48 ;
+ Tuner->TunerRegs[30].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[31].Reg_Num = 49 ;
+ Tuner->TunerRegs[31].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[32].Reg_Num = 53 ;
+ Tuner->TunerRegs[32].Reg_Val = 0x94 ;
+
+ Tuner->TunerRegs[33].Reg_Num = 54 ;
+ Tuner->TunerRegs[33].Reg_Val = 0xFA ;
+
+ Tuner->TunerRegs[34].Reg_Num = 55 ;
+ Tuner->TunerRegs[34].Reg_Val = 0x92 ;
+
+ Tuner->TunerRegs[35].Reg_Num = 56 ;
+ Tuner->TunerRegs[35].Reg_Val = 0x80 ;
+
+ Tuner->TunerRegs[36].Reg_Num = 57 ;
+ Tuner->TunerRegs[36].Reg_Val = 0x41 ;
+
+ Tuner->TunerRegs[37].Reg_Num = 58 ;
+ Tuner->TunerRegs[37].Reg_Val = 0xDB ;
+
+ Tuner->TunerRegs[38].Reg_Num = 59 ;
+ Tuner->TunerRegs[38].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[39].Reg_Num = 60 ;
+ Tuner->TunerRegs[39].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[40].Reg_Num = 61 ;
+ Tuner->TunerRegs[40].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[41].Reg_Num = 62 ;
+ Tuner->TunerRegs[41].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[42].Reg_Num = 65 ;
+ Tuner->TunerRegs[42].Reg_Val = 0xF8 ;
+
+ Tuner->TunerRegs[43].Reg_Num = 66 ;
+ Tuner->TunerRegs[43].Reg_Val = 0xE4 ;
+
+ Tuner->TunerRegs[44].Reg_Num = 67 ;
+ Tuner->TunerRegs[44].Reg_Val = 0x90 ;
+
+ Tuner->TunerRegs[45].Reg_Num = 68 ;
+ Tuner->TunerRegs[45].Reg_Val = 0xC0 ;
+
+ Tuner->TunerRegs[46].Reg_Num = 69 ;
+ Tuner->TunerRegs[46].Reg_Val = 0x01 ;
+
+ Tuner->TunerRegs[47].Reg_Num = 70 ;
+ Tuner->TunerRegs[47].Reg_Val = 0x50 ;
+
+ Tuner->TunerRegs[48].Reg_Num = 71 ;
+ Tuner->TunerRegs[48].Reg_Val = 0x06 ;
+
+ Tuner->TunerRegs[49].Reg_Num = 72 ;
+ Tuner->TunerRegs[49].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[50].Reg_Num = 73 ;
+ Tuner->TunerRegs[50].Reg_Val = 0x20 ;
+
+ Tuner->TunerRegs[51].Reg_Num = 76 ;
+ Tuner->TunerRegs[51].Reg_Val = 0xBB ;
+
+ Tuner->TunerRegs[52].Reg_Num = 77 ;
+ Tuner->TunerRegs[52].Reg_Val = 0x13 ;
+
+ Tuner->TunerRegs[53].Reg_Num = 81 ;
+ Tuner->TunerRegs[53].Reg_Val = 0x04 ;
+
+ Tuner->TunerRegs[54].Reg_Num = 82 ;
+ Tuner->TunerRegs[54].Reg_Val = 0x75 ;
+
+ Tuner->TunerRegs[55].Reg_Num = 83 ;
+ Tuner->TunerRegs[55].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[56].Reg_Num = 84 ;
+ Tuner->TunerRegs[56].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[57].Reg_Num = 85 ;
+ Tuner->TunerRegs[57].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[58].Reg_Num = 91 ;
+ Tuner->TunerRegs[58].Reg_Val = 0x70 ;
+
+ Tuner->TunerRegs[59].Reg_Num = 92 ;
+ Tuner->TunerRegs[59].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[60].Reg_Num = 93 ;
+ Tuner->TunerRegs[60].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[61].Reg_Num = 94 ;
+ Tuner->TunerRegs[61].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[62].Reg_Num = 95 ;
+ Tuner->TunerRegs[62].Reg_Val = 0x0C ;
+
+ Tuner->TunerRegs[63].Reg_Num = 96 ;
+ Tuner->TunerRegs[63].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[64].Reg_Num = 97 ;
+ Tuner->TunerRegs[64].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[65].Reg_Num = 98 ;
+ Tuner->TunerRegs[65].Reg_Val = 0xE2 ;
+
+ Tuner->TunerRegs[66].Reg_Num = 99 ;
+ Tuner->TunerRegs[66].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[67].Reg_Num = 100 ;
+ Tuner->TunerRegs[67].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[68].Reg_Num = 101 ;
+ Tuner->TunerRegs[68].Reg_Val = 0x12 ;
+
+ Tuner->TunerRegs[69].Reg_Num = 102 ;
+ Tuner->TunerRegs[69].Reg_Val = 0x80 ;
+
+ Tuner->TunerRegs[70].Reg_Num = 103 ;
+ Tuner->TunerRegs[70].Reg_Val = 0x32 ;
+
+ Tuner->TunerRegs[71].Reg_Num = 104 ;
+ Tuner->TunerRegs[71].Reg_Val = 0xB4 ;
+
+ Tuner->TunerRegs[72].Reg_Num = 105 ;
+ Tuner->TunerRegs[72].Reg_Val = 0x60 ;
+
+ Tuner->TunerRegs[73].Reg_Num = 106 ;
+ Tuner->TunerRegs[73].Reg_Val = 0x83 ;
+
+ Tuner->TunerRegs[74].Reg_Num = 107 ;
+ Tuner->TunerRegs[74].Reg_Val = 0x84 ;
+
+ Tuner->TunerRegs[75].Reg_Num = 108 ;
+ Tuner->TunerRegs[75].Reg_Val = 0x9C ;
+
+ Tuner->TunerRegs[76].Reg_Num = 109 ;
+ Tuner->TunerRegs[76].Reg_Val = 0x02 ;
+
+ Tuner->TunerRegs[77].Reg_Num = 110 ;
+ Tuner->TunerRegs[77].Reg_Val = 0x81 ;
+
+ Tuner->TunerRegs[78].Reg_Num = 111 ;
+ Tuner->TunerRegs[78].Reg_Val = 0xC0 ;
+
+ Tuner->TunerRegs[79].Reg_Num = 112 ;
+ Tuner->TunerRegs[79].Reg_Val = 0x10 ;
+
+ Tuner->TunerRegs[80].Reg_Num = 131 ;
+ Tuner->TunerRegs[80].Reg_Val = 0x8A ;
+
+ Tuner->TunerRegs[81].Reg_Num = 132 ;
+ Tuner->TunerRegs[81].Reg_Val = 0x10 ;
+
+ Tuner->TunerRegs[82].Reg_Num = 133 ;
+ Tuner->TunerRegs[82].Reg_Val = 0x24 ;
+
+ Tuner->TunerRegs[83].Reg_Num = 134 ;
+ Tuner->TunerRegs[83].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[84].Reg_Num = 135 ;
+ Tuner->TunerRegs[84].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[85].Reg_Num = 136 ;
+ Tuner->TunerRegs[85].Reg_Val = 0x7E ;
+
+ Tuner->TunerRegs[86].Reg_Num = 137 ;
+ Tuner->TunerRegs[86].Reg_Val = 0x40 ;
+
+ Tuner->TunerRegs[87].Reg_Num = 138 ;
+ Tuner->TunerRegs[87].Reg_Val = 0x38 ;
+
+ Tuner->TunerRegs[88].Reg_Num = 146 ;
+ Tuner->TunerRegs[88].Reg_Val = 0xF6 ;
+
+ Tuner->TunerRegs[89].Reg_Num = 147 ;
+ Tuner->TunerRegs[89].Reg_Val = 0x1A ;
+
+ Tuner->TunerRegs[90].Reg_Num = 148 ;
+ Tuner->TunerRegs[90].Reg_Val = 0x62 ;
+
+ Tuner->TunerRegs[91].Reg_Num = 149 ;
+ Tuner->TunerRegs[91].Reg_Val = 0x33 ;
+
+ Tuner->TunerRegs[92].Reg_Num = 150 ;
+ Tuner->TunerRegs[92].Reg_Val = 0x80 ;
+
+ Tuner->TunerRegs[93].Reg_Num = 156 ;
+ Tuner->TunerRegs[93].Reg_Val = 0x56 ;
+
+ Tuner->TunerRegs[94].Reg_Num = 157 ;
+ Tuner->TunerRegs[94].Reg_Val = 0x17 ;
+
+ Tuner->TunerRegs[95].Reg_Num = 158 ;
+ Tuner->TunerRegs[95].Reg_Val = 0xA9 ;
+
+ Tuner->TunerRegs[96].Reg_Num = 159 ;
+ Tuner->TunerRegs[96].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[97].Reg_Num = 160 ;
+ Tuner->TunerRegs[97].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[98].Reg_Num = 161 ;
+ Tuner->TunerRegs[98].Reg_Val = 0x00 ;
+
+ Tuner->TunerRegs[99].Reg_Num = 162 ;
+ Tuner->TunerRegs[99].Reg_Val = 0x40 ;
+
+ Tuner->TunerRegs[100].Reg_Num = 166 ;
+ Tuner->TunerRegs[100].Reg_Val = 0xAE ;
+
+ Tuner->TunerRegs[101].Reg_Num = 167 ;
+ Tuner->TunerRegs[101].Reg_Val = 0x1B ;
+
+ Tuner->TunerRegs[102].Reg_Num = 168 ;
+ Tuner->TunerRegs[102].Reg_Val = 0xF2 ;
+
+ Tuner->TunerRegs[103].Reg_Num = 195 ;
+ Tuner->TunerRegs[103].Reg_Val = 0x00 ;
+
+ return 0 ;
+}
+
+_u16 MXL5005_ControlInit (Tuner_struct *Tuner)
+{
+ Tuner->Init_Ctrl_Num = INITCTRL_NUM ;
+
+ Tuner->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
+ Tuner->Init_Ctrl[0].size = 1 ;
+ Tuner->Init_Ctrl[0].addr[0] = 73;
+ Tuner->Init_Ctrl[0].bit[0] = 7;
+ Tuner->Init_Ctrl[0].val[0] = 0;
+
+ Tuner->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
+ Tuner->Init_Ctrl[1].size = 1 ;
+ Tuner->Init_Ctrl[1].addr[0] = 53;
+ Tuner->Init_Ctrl[1].bit[0] = 2;
+ Tuner->Init_Ctrl[1].val[0] = 1;
+
+ Tuner->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
+ Tuner->Init_Ctrl[2].size = 2 ;
+ Tuner->Init_Ctrl[2].addr[0] = 53;
+ Tuner->Init_Ctrl[2].bit[0] = 1;
+ Tuner->Init_Ctrl[2].val[0] = 0;
+ Tuner->Init_Ctrl[2].addr[1] = 57;
+ Tuner->Init_Ctrl[2].bit[1] = 0;
+ Tuner->Init_Ctrl[2].val[1] = 1;
+
+ Tuner->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
+ Tuner->Init_Ctrl[3].size = 1 ;
+ Tuner->Init_Ctrl[3].addr[0] = 53;
+ Tuner->Init_Ctrl[3].bit[0] = 0;
+ Tuner->Init_Ctrl[3].val[0] = 0;
+
+ Tuner->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
+ Tuner->Init_Ctrl[4].size = 3 ;
+ Tuner->Init_Ctrl[4].addr[0] = 53;
+ Tuner->Init_Ctrl[4].bit[0] = 5;
+ Tuner->Init_Ctrl[4].val[0] = 0;
+ Tuner->Init_Ctrl[4].addr[1] = 53;
+ Tuner->Init_Ctrl[4].bit[1] = 6;
+ Tuner->Init_Ctrl[4].val[1] = 0;
+ Tuner->Init_Ctrl[4].addr[2] = 53;
+ Tuner->Init_Ctrl[4].bit[2] = 7;
+ Tuner->Init_Ctrl[4].val[2] = 1;
+
+ Tuner->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
+ Tuner->Init_Ctrl[5].size = 1 ;
+ Tun