summaryrefslogtreecommitdiffstats
path: root/api/e4000.c
diff options
context:
space:
mode:
Diffstat (limited to 'api/e4000.c')
-rw-r--r--api/e4000.c859
1 files changed, 859 insertions, 0 deletions
diff --git a/api/e4000.c b/api/e4000.c
new file mode 100644
index 0000000..0b41e43
--- /dev/null
+++ b/api/e4000.c
@@ -0,0 +1,859 @@
+/**
+ * @(#)Afa_E4000.cpp
+ *
+ * ==========================================================
+ * Version: 2.0
+ * Date: 2008.07.02
+ * ==========================================================
+ *
+ * ==========================================================
+ * History:
+ *
+ * Date Author Description
+ * ----------------------------------------------------------
+ *
+ * 2008.07.02 Tom Lin added tuner version
+ * ==========================================================
+ *
+ * Copyright 2005 Afatech, Inc. All rights reserved.
+ *
+ */
+
+
+//#include <stdio.h> //for Linux
+#include "type.h"
+#include "error.h"
+#include "user.h"
+#include "standard.h"
+
+
+extern Demodulator* E4000_demodulator;
+extern Byte E4000_chip;
+extern Dword Ref_clk;
+extern Dword E4000_frequency;
+extern Word E4000_bandwidth;
+
+/****************************************************************************\
+* Function: tunerreset
+*
+* Detailed Description:
+* The function resets the E4000 tuner. (Register 0x00).
+*
+\****************************************************************************/
+
+Dword E4000_tunerreset (
+
+ )
+{
+ Dword error = 0;
+ Byte buffer[1];
+ buffer[0] = 0x01;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x00, 1, buffer);
+ return (Error_NO_ERROR);
+}
+
+/****************************************************************************\
+* Function: Tunerclock
+*
+* Detailed Description:
+* The function configures the E4000 clock. (Register 0x06, 0x7a).
+* Function enablesa CMOS clock - values can be modified to disable if required.
+\****************************************************************************/
+
+Dword E4000_Tunerclock()
+{
+ Dword error = 0;
+ Byte buffer[1];
+ buffer[0] = 0x06;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x06, 1, buffer);
+ //buffer[0] = 0x96;
+ // error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x7a, 1, buffer);
+ //**Modify commands above with value required if output clock is not required,
+ return (Error_NO_ERROR);
+}
+
+/****************************************************************************\
+* Function: filtercal
+*
+* Detailed Description:
+* Instructs RC filter calibration. (Register 0x7b).
+*
+\****************************************************************************/
+
+//Dword filtercal()
+//{
+// Dword error = 0;
+// Byte buffer[1];
+// buffer[0] = 0x01;
+// error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x7b, 1, buffer);
+// return (Error_NO_ERROR);
+//}
+/****************************************************************************\
+* Function: Qpeak()
+*
+* Detailed Description:
+* The function configures the E4000 gains.
+* Also sigma delta controller. (Register 0x82).
+*
+\****************************************************************************/
+Dword E4000_Qpeak()
+{
+ Dword error = 0;
+ Byte buffer[2];
+ buffer[0] = 0x01;
+ buffer[1]=0xfe;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x7e, 2, buffer);
+ buffer[0] = 0x00;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x82, 1, buffer);
+ buffer[0] = 0x05;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x24, 1, buffer);
+ buffer[0] = 0x20;
+ buffer[1]=0x01;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x87, 2, buffer);
+ buffer[0] = 0x7f;
+ buffer[1]=0x07;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x9f, 2, buffer);
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: PLL
+*
+* Detailed Description:
+* Configures E4000 PLL divider & sigma delta. 0x0d,0x09, 0x0a, 0x0b).
+*
+\****************************************************************************/
+
+Dword E4000_PLL()
+{
+ //printf("freq=%d", E4000_frequency);
+ //printf("ref clock=%d", Ref_clk);
+ Dword VCO_freq;
+ Dword error = 0;
+ Byte buffer[5];
+ if (E4000_frequency<=72400)
+ {
+ buffer[4] = 15;
+ VCO_freq=E4000_frequency*48;
+ }
+ else if (E4000_frequency<=81200)
+ {
+ buffer[4] = 14;
+ VCO_freq=E4000_frequency*40;
+ }
+ else if (E4000_frequency<=108300)
+ {
+ buffer[4]=13;
+ VCO_freq=E4000_frequency*32;
+ }
+ else if (E4000_frequency<=162500)
+ {
+ buffer[4]=12;
+ VCO_freq=E4000_frequency*24;
+ }
+ else if (E4000_frequency<=216600)
+ {
+ buffer[4]=11;
+ VCO_freq=E4000_frequency*16;
+ }
+ else if (E4000_frequency<=325000)
+ {
+ buffer[4]=10;
+ VCO_freq=E4000_frequency*12;
+ }
+ else if (E4000_frequency<=350000)
+ {
+ buffer[4]=9;
+ VCO_freq=E4000_frequency*8;
+ }
+ else if (E4000_frequency<=432000)
+ {
+ buffer[4]=3;
+ VCO_freq=E4000_frequency*8;
+ }
+ else if (E4000_frequency<=700000)
+ {
+ buffer[4]=2;
+ VCO_freq=E4000_frequency*6;
+ }
+ else if (E4000_frequency<=1200000)
+ {
+ buffer[4]=1;
+ VCO_freq=E4000_frequency*4;
+ }
+ else
+ {
+ buffer[4]=0;
+ VCO_freq=E4000_frequency*2;
+ }
+
+ Dword divider;
+ Dword intVCOfreq;
+ Dword SigDel;
+ Dword SigDel2;
+ Dword SigDel3;
+ divider = VCO_freq / Ref_clk;
+
+ buffer[0]= divider;
+ intVCOfreq = divider * Ref_clk;
+
+ SigDel=65536 * (VCO_freq - intVCOfreq) / Ref_clk;
+
+if (SigDel<=512)
+{
+ SigDel = 512;
+}
+else if (SigDel>=65024)
+{
+ SigDel=65024;
+}
+SigDel2 = SigDel / 256;
+
+buffer[2] = SigDel2;
+SigDel3 = SigDel - (256 * SigDel2);
+
+buffer[1]= SigDel3;
+buffer[3]=0;
+error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x09, 5, buffer);
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: LNAfilter
+*
+* Detailed Description:
+* The function configures the E4000 LNA filter. (Register 0x10).
+*
+\****************************************************************************/
+
+Dword E4000_LNAfilter()
+{
+ Dword error = 0;
+ Byte buffer[1];
+ if(E4000_frequency<=370000)
+ {
+ buffer[0]=0;
+ }
+else if(E4000_frequency<=392500)
+ {
+ buffer[0]=1;
+ }
+ else if(E4000_frequency<=415000)
+ {
+ buffer[0] =2;
+ }
+ else if(E4000_frequency<=437500)
+ {
+ buffer[0]=3;
+ }
+ else if(E4000_frequency<=462500)
+ {
+ buffer[0]=4;
+ }
+ else if(E4000_frequency<=490000)
+ {
+ buffer[0]=5;
+ }
+ else if(E4000_frequency<=522500)
+ {
+ buffer[0]=6;
+ }
+ else if(E4000_frequency<=557500)
+ {
+ buffer[0]=7;
+ }
+ else if(E4000_frequency<=595000)
+ {
+ buffer[0]=8;
+ }
+ else if(E4000_frequency<=642500)
+ {
+ buffer[0]=9;
+ }
+else if(E4000_frequency<=695000)
+ {
+ buffer[0]=10;
+ }
+else if(E4000_frequency<=740000)
+ {
+ buffer[0]=11;
+ }
+else if(E4000_frequency<=800000)
+ {
+ buffer[0]=12;
+ }
+else if(E4000_frequency<=865000)
+ {
+ buffer[0] =13;
+ }
+else if(E4000_frequency<=930000)
+ {
+ buffer[0]=14;
+ }
+else if(E4000_frequency<=1000000)
+ {
+ buffer[0]=15;
+ }
+else if(E4000_frequency<=1310000)
+ {
+ buffer[0]=0;
+ }
+else if(E4000_frequency<=1340000)
+ {
+ buffer[0]=1;
+ }
+else if(E4000_frequency<=1385000)
+ {
+ buffer[0]=2;
+ }
+else if(E4000_frequency<=1427500)
+ {
+ buffer[0]=3;
+ }
+else if(E4000_frequency<=1452500)
+ {
+ buffer[0]=4;
+ }
+else if(E4000_frequency<=1475000)
+ {
+ buffer[0]=5;
+ }
+else if(E4000_frequency<=1510000)
+ {
+ buffer[0]=6;
+ }
+else if(E4000_frequency<=1545000)
+ {
+ buffer[0]=7;
+ }
+else if(E4000_frequency<=1575000)
+ {
+ buffer[0] =8;
+ }
+else if(E4000_frequency<=1615000)
+ {
+ buffer[0]=9;
+ }
+else if(E4000_frequency<=1650000)
+ {
+ buffer[0] =10;
+ }
+else if(E4000_frequency<=1670000)
+ {
+ buffer[0]=11;
+ }
+else if(E4000_frequency<=1690000)
+ {
+ buffer[0]=12;
+ }
+else if(E4000_frequency<=1710000)
+ {
+ buffer[0]=13;
+ }
+else if(E4000_frequency<=1735000)
+ {
+ buffer[0]=14;
+ }
+else
+ {
+ buffer[0]=15;
+ }
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x10, 1, buffer);
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: IFfilter
+*
+* Detailed Description:
+* The function configures the E4000 IF filter. (Register 0x11,0x12).
+*
+\****************************************************************************/
+Dword E4000_IFfilter()
+{
+ Dword error = 0;
+ Byte buffer[2];
+ Word IF_BW;
+ IF_BW = E4000_bandwidth / 2;
+ if(IF_BW<=2150)
+ {
+ buffer[0]=0xfd;
+ buffer[1]=0x1f;
+ }
+ else if(IF_BW<=2200)
+ {
+ buffer[0]=0xfd;
+ buffer[1]=0x1e;
+ }
+ else if(IF_BW<=2240)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x1d;
+ }
+ else if(IF_BW<=2280)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x1c;
+ }
+ else if(IF_BW<=2300)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x1b;
+ }
+ else if(IF_BW<=2400)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x1a;
+ }
+ else if(IF_BW<=2450)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x19;
+ }
+ else if(IF_BW<=2500)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x18;
+ }
+ else if(IF_BW<=2550)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x17;
+ }
+ else if(IF_BW<=2600)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x16;
+ }
+ else if(IF_BW<=2700)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x15;
+ }
+ else if(IF_BW<=2750)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x14;
+ }
+ else if(IF_BW<=2800)
+ {
+ buffer[0]=0xfc;
+ buffer[1]=0x13;
+ }
+ else if(IF_BW<=2900)
+ {
+ buffer[0]==0xfb;
+ buffer[1]=0x12;
+ }
+ else if(IF_BW<=2950)
+ {
+ buffer[0]=0xfb;
+ buffer[1]=0x11;
+ }
+ else if(IF_BW<=3000)
+ {
+ buffer[0]=0xfb;
+ buffer[1]=0x10;
+ }
+ else if(IF_BW<=3100)
+ {
+ buffer[0]=0xfb;
+ buffer[1]=0x0f;
+ }
+ else if(IF_BW<=3200)
+ {
+ buffer[0]=0xfa;
+ buffer[1]=0x0e;
+ }
+ else if(IF_BW<=3300)
+ {
+ buffer[0]=0xfa;
+ buffer[1]=0x0d;
+ }
+ else if(IF_BW<=3400)
+ {
+ buffer[0]=0xf9;
+ buffer[1]=0x0c;
+ }
+ else if(IF_BW<=3600)
+ {
+ buffer[0]=0xf9;
+ buffer[1]=0x0b;
+ }
+ else if(IF_BW<=3700)
+ {
+ buffer[0]=0xf9;
+ buffer[1]=0x0a;
+ }
+ else if(IF_BW<=3800)
+ {
+ buffer[0]=0xf8;
+ buffer[1]=0x09;
+ }
+ else if(IF_BW<=3900)
+ {
+ buffer[0]=0xf8;
+ buffer[1]=0x08;
+ }
+ else if(IF_BW<=4100)
+ {
+ buffer[0]=0xf8;
+ buffer[1]=0x07;
+ }
+ else if(IF_BW<=4300)
+ {
+ buffer[0]=0xf7;
+ buffer[1]=0x06;
+ }
+ else if(IF_BW<=4400)
+ {
+ buffer[0]=0xf7;
+ buffer[1]=0x05;
+ }
+ else if(IF_BW<=4600)
+ {
+ buffer[0]=0xf7;
+ buffer[1]=0x04;
+ }
+ else if(IF_BW<=4800)
+ {
+ buffer[0]=0xf6;
+ buffer[1]=0x03;
+ }
+ else if(IF_BW<=5000)
+ {
+ buffer[0]=0xf6;
+ buffer[1]=0x02;
+ }
+ else if(IF_BW<=5300)
+ {
+ buffer[0]=0xf5;
+ buffer[1]=0x01;
+ }
+ else if(IF_BW<=5500)
+ {
+ buffer[0]=0xf5;
+ buffer[1]=0x00;
+ }
+ else
+ {
+ buffer[0]=0x00;
+ buffer[1]=0x20;
+ }
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x11, 2, buffer);
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: freqband
+*
+* Detailed Description:
+* Configures the E4000 frequency band. (Registers 0x07, 0x78).
+*
+\****************************************************************************/
+Dword E4000_freqband()
+{
+ Dword error = 0;
+ Byte buffer[1];
+ if (E4000_frequency<=140000)
+ {
+ buffer[0] = 1;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x07, 1, buffer);
+ buffer[0] = 3;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x78, 1, buffer);
+ }
+ else if (E4000_frequency<=350000)
+ {
+ buffer[0] = 3;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x07, 1, buffer);
+ buffer[0] = 3;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x78, 1, buffer);
+ }
+ else if (E4000_frequency<=1000000)
+ {
+ buffer[0] = 5;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x07, 1, buffer);
+ buffer[0] = 3;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x78, 1, buffer);
+ }
+ else
+ {
+ buffer[0] = 7;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x07, 1, buffer);
+ buffer[0] = 0;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x78, 1, buffer);
+ }
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: DCoffLUT
+*
+* Detailed Description:
+* Populates DC offset LUT. (Registers 0x50 - 0x53, 0x60 - 0x63).
+*
+\****************************************************************************/
+Dword E4000_DCoffLUT()
+{
+ Word IOFF;
+ Word QOFF;
+ Word RANGE1;
+ Word RANGE2;
+ Word QRANGE;
+ Word IRANGE;
+ Dword error = 0;
+ Byte buffer[3];
+ buffer[0] = 0x00;
+ buffer[1] = 0x7e;
+ buffer[2] = 0x24;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x15, 3, buffer);
+ // Sets mixer & IF stage 1 gain = 00 and IF stg 2+ to max gain.
+ buffer[0] = 0x01;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x29, 1, buffer);
+ // Instructs a DC offset calibration.
+ error = Standard_readTunerRegisters (E4000_demodulator, 0, 0x2a, 3, buffer);
+ //printf("\n2a=%d",buffer[0]);
+ //printf("\n2b=%d",buffer[1]);
+ //printf("\n2c=%d",buffer[2]);
+ IOFF=buffer[0];
+ QOFF=buffer[1];
+ RANGE1=buffer[2];
+ //reads DC offset values back
+ if(RANGE1>=32)
+ {
+ RANGE1 = RANGE1 -32;
+ }
+ if(RANGE1>=16)
+ {
+ RANGE1 = RANGE1 - 16;
+ }
+ IRANGE=RANGE1;
+ QRANGE = (buffer[2] - RANGE1) / 16;
+ buffer[0] = (IRANGE * 64) + IOFF;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x60, 1, buffer);
+ buffer[0] = (QRANGE * 64) + QOFF;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x50, 1, buffer);
+ // Populate DC offset LUT
+ buffer[0] = 0;
+ buffer[1] = 127;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x15, 2, buffer);
+ // Sets mixer & IF stage 1 gain = 01 leaving IF stg 2+ at max gain.
+ buffer[0]= 1;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x29, 1, buffer);
+ // Instructs a DC offset calibration.
+ error = Standard_readTunerRegisters (E4000_demodulator, 0, 0x2a, 3, buffer);
+ //printf("\n2a=%d",buffer[0]);
+ //printf("\n2b=%d",buffer[1]);
+ //printf("\n2c=%d",buffer[2]);
+ IOFF=buffer[0];
+ QOFF=buffer[1];
+ RANGE1=buffer[2];
+ // Read DC offset values
+ if(RANGE1>=32)
+ {
+ RANGE1 = RANGE1 -32;
+ }
+ if(RANGE1>=16)
+ {
+ RANGE1 = RANGE1 - 16;
+ }
+ IRANGE = RANGE1;
+ QRANGE = (buffer[2] - RANGE1) / 16;
+ buffer[0] = (IRANGE * 64) + IOFF;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x61, 1, buffer);
+ buffer[0] = (QRANGE * 64) + QOFF;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x51, 1, buffer);
+ // Populate DC offset LUT
+ buffer[0] = 0x01;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x15, 1, buffer);
+ // Sets mixer & IF stage 1 gain = 11 leaving IF stg 2+ at max gain.
+ buffer[0] = 1;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x29, 1, buffer);
+ // Instructs a DC offset calibration.
+ error = Standard_readTunerRegisters (E4000_demodulator, 0, 0x2a, 3, buffer);
+ //printf("\n2a=%d",buffer[0]);
+ //printf("\n2b=%d",buffer[1]);
+ //printf("\n2c=%d",buffer[2]);
+ IOFF=buffer[0];
+ QOFF=buffer[1];
+ RANGE1 = buffer[2];
+ // Read DC offset values
+ if(RANGE1>=32)
+ {
+ RANGE1 = RANGE1 -32;
+ }
+ if(RANGE1>=16)
+ {
+ RANGE1 = RANGE1 - 16;
+ }
+ IRANGE = RANGE1;
+ QRANGE = (buffer[2] - RANGE1) / 16;
+ buffer[0] = (IRANGE * 64) + IOFF;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x63, 1, buffer);
+ buffer[0] = (QRANGE * 64) + QOFF;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x53, 1, buffer);
+ // Populate DC offset LUT
+ buffer[0] = 0x7e;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x16, 1, buffer);
+ // Sets mixer & IF stage 1 gain = 11 leaving IF stg 2+ at max gain.
+ buffer[0] = 0x01;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x29, 1, buffer);
+ // Instructs a DC offset calibration.
+ error = Standard_readTunerRegisters (E4000_demodulator, E4000_chip, 0x2a, 3, buffer);
+ //printf("\n2a=%d",buffer[0]);
+ //printf("\n2b=%d",buffer[1]);
+ //printf("\n2c=%d",buffer[2]);
+ IOFF=buffer[0];
+ QOFF=buffer[1];
+ RANGE1=buffer[2];
+ // Read DC offset values
+ if(RANGE1>=32)
+ {
+ RANGE1 = RANGE1 -32;
+ }
+ if(RANGE1>=16)
+ {
+ RANGE1 = RANGE1 - 16;
+ }
+ IRANGE = RANGE1;
+ QRANGE = (buffer[2] - RANGE1) / 16;
+ buffer[0]=(IRANGE * 64) + IOFF;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x62, 1, buffer);
+ buffer[0] = (QRANGE * 64) + QOFF;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x52, 1, buffer);
+ // Populate DC offset LUT
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: DCoffloop
+*
+* Detailed Description:
+* Populates DC offset LUT. (Registers 0x2d, 0x70, 0x71).
+* Turns on DC offset LUT and time varying DC offset.
+\****************************************************************************/
+Dword E4000_DCoffloop()
+{
+ Dword error = 0;
+ Byte buffer[2];
+ buffer[0] = 0x1f;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x2d, 1, buffer);
+ buffer[0] = 0x01;
+ buffer[1] = 0x01;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x70, 2, buffer);
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: commonmode
+*
+* Detailed Description:
+* Configures common mode voltage. (Registers 0x2f).
+*
+\****************************************************************************/
+//Dword E4000_commonmode()
+//{
+// //Dword error = 0;
+// //Byte buffer[1];
+// //buffer[0] = 0;
+// //error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x2f, 1, buffer);
+// // Sets 550mV. Modify if alternative is desired.
+// return (Error_NO_ERROR);
+//}
+/****************************************************************************\
+* Function: GainControlinit
+*
+* Detailed Description:
+* Configures gain control mode. (Registers 0x1d, 0x1e, 0x1f, 0x20, 0x21,
+* 0x1a, 0x74h, 0x75h).
+* User may wish to modify values depending on usage scenario.
+* Routine configures LNA: autonomous gain control
+* IF PWM gain control.
+* PWM thresholds = default
+* Mixer: switches when LNA gain =7.5dB
+* Sensitivity / Linearity mode: manual switch
+*
+\****************************************************************************/
+Dword E4000_GainControlinit()
+{
+ Dword sum=255;
+ Dword error = 0;
+ Byte buffer[5];
+ buffer[0] = 0x17;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1a, 1, buffer);
+ buffer[0] = 0x24;
+ buffer[1] = 0x06;
+ buffer[2] = 0x1a;
+ buffer[3] = 0x0f;
+ buffer[4] = 0x00;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1d, 5, buffer);
+ error = Standard_readTunerRegisters (E4000_demodulator, 0, 0x1b, 1, buffer);
+ if (buffer[0]<=sum)
+ {
+ sum=buffer[0];
+ }
+ //printf("sum1=%d",sum);
+ buffer[0]=0x1a;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1f, 1, buffer);
+ error = Standard_readTunerRegisters (E4000_demodulator, 0, 0x1b, 1, buffer);
+ if (buffer[0]<=sum)
+ {
+ sum=buffer[0];
+ }
+ // printf("sum2=%d",sum);
+ buffer[0]=0x1a;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1f, 1, buffer);
+ error = Standard_readTunerRegisters (E4000_demodulator, 0, 0x1b, 1, buffer);
+ if (buffer[0]<=sum)
+ {
+ sum=buffer[0];
+ }
+ // printf("sum3=%d",sum);
+ buffer[0]=0x1a;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1f, 1, buffer);
+ error = Standard_readTunerRegisters (E4000_demodulator, 0, 0x1b, 1, buffer);
+ if (buffer[0]<=sum)
+ {
+ sum=buffer[0];
+ }
+ //printf("sum4=%d",sum);
+ buffer[0]=0x1a;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1f, 1, buffer);
+ error = Standard_readTunerRegisters (E4000_demodulator, 0, 0x1b, 1, buffer);
+ if (buffer[0]<=sum)
+ {
+ sum=buffer[0];
+ }
+ //printf("sum5=%d",sum);
+ buffer[0]=sum;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1b, 1, buffer);
+ //buffer[0] = 0x03;
+ //buffer[1] = 0xfc;
+ //buffer[2] = 0x03;
+ //buffer[3] = 0xfc;
+ //error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x74, 4, buffer);
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: E4000_Gainmanual
+*
+* Detailed Description:
+* Sets gain to manualcontrol. (Register 0x1a).
+*
+\****************************************************************************/
+Dword E4000_Gainmanual()
+{
+ Dword error = 0;
+ Byte buffer[1];
+ buffer[0] = 0x00;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1a, 1, buffer);
+ return (Error_NO_ERROR);
+}
+/****************************************************************************\
+* Function: E4000_Gainauto
+*
+* Detailed Description:
+* Sets gain to manualcontrol. (Register 0x1a).
+*
+\****************************************************************************/
+Dword E4000_Gainauto()
+{
+ Dword error = 0;
+ Byte buffer[1];
+ buffer[0] = 0x17;
+ error = Standard_writeTunerRegisters (E4000_demodulator, E4000_chip, 0x1a, 1, buffer);
+ return (Error_NO_ERROR);
+}