diff options
Diffstat (limited to 'api/Afa_PEACOCK.c')
-rw-r--r-- | api/Afa_PEACOCK.c | 394 |
1 files changed, 394 insertions, 0 deletions
diff --git a/api/Afa_PEACOCK.c b/api/Afa_PEACOCK.c new file mode 100644 index 0000000..50fb84d --- /dev/null +++ b/api/Afa_PEACOCK.c @@ -0,0 +1,394 @@ +/** + * @(#)Afa_PEACOCK.cpp + * + * ========================================================== + * Version: 2.0 + * Date: 2008.07.02 + * ========================================================== + * + * ========================================================== + * History: + * + * Date Author Description + * ---------------------------------------------------------- + * + * 2008.07.02 Tom Lin added tuner version + * ========================================================== + * + * Copyright 2007 Afatech, Inc. All rights reserved. + * + */ + + +//#include <stdio.h> //for Linux +#include "type.h" +#include "error.h" +#include "user.h" +#include "register.h" +#include "standard.h" +#include "Afa_Peacock_Script.h" + + +Dword PEACOCK_open ( + IN Demodulator* demodulator, + IN Byte chip +) { + return (Error_NO_ERROR); +} + + +Dword PEACOCK_close ( + IN Demodulator* demodulator, + IN Byte chip +) { + return (Error_NO_ERROR); +} + + +Dword PEACOCK_set ( + IN Demodulator* demodulator, + IN Byte chip, + IN Word bandwidth, + IN Dword frequency +) { + Dword error = Error_NO_ERROR; + Long ckxtal; + Byte l_band; + Byte lna_band; + Byte lna_cap; + Word n_div; + Long n; + Word m_lo; + Word lo_freq; + Byte lo_freq_15_10; + Byte lo_freq_9_4; + Byte lo_freq_3_0; + Long i; + Byte readTmp; + Byte lo_cap; + Long lo_cap_min = -1; + Long lo_cap_max = -1; + Byte lpf_cap = 0x0c; + Byte lpf_bw; +#if 1 + Byte lna_gain = 7; + Byte pgc_gain = 6; + Byte pga_gain = 0; + Byte ofsi = 0x20; + Byte ofsq = 0x20; +#endif + Byte tmp = 0; + + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + ckxtal = (Long) ganymede->crystalFrequency; + if (ckxtal == 0) { + error = Error_INVALID_XTAL_FREQ; + goto exit; + } + + + /////////////////////////////////////////////////// set debug port + + tmp = 0; + error = Standard_writeTunerRegisters (demodulator, chip, 0x07, 1, &tmp); // dgb_port 0:off + if (error) goto exit; + + /////////////////////////////////////////////////// set frequency + + if (frequency <= 400000) { + error = Error_FREQ_OUT_OF_RANGE; + goto exit; + } else if (frequency > 400000 && frequency <= 440000) { + l_band = 0; + lna_band = 0; + } else if (frequency > 440000 && frequency <= 484000) { + l_band = 0; + lna_band = 1; + } else if (frequency > 484000 && frequency <= 533000) { + l_band = 0; + lna_band = 2; + } else if (frequency > 533000 && frequency <= 587000) { + l_band = 0; + lna_band = 3; + } else if (frequency > 587000 && frequency <= 645000) { + l_band = 0; + lna_band = 4; + } else if (frequency > 645000 && frequency <= 710000) { + l_band = 0; + lna_band = 5; + } else if (frequency > 710000 && frequency <= 782000) { + l_band = 0; + lna_band = 6; + } else if (frequency > 782000 && frequency <= 860000) { + l_band = 0; + lna_band = 7; + } else if (frequency > 860000 && frequency <= 1450000) { + error = Error_FREQ_OUT_OF_RANGE; + goto exit; + } else if (frequency > 1450000 && frequency <= 1492000) { + l_band = 1; + lna_band = 0; + } else if (frequency > 1492000 && frequency <= 1660000) { + error = Error_FREQ_OUT_OF_RANGE; + goto exit; + } else if (frequency > 1660000 && frequency <= 1685000) { + l_band = 1; + lna_band = 1; + } else { // frequency > 1685000 + error = Error_FREQ_OUT_OF_RANGE; + goto exit; + } + + // set l_band + error = Standard_writeTunerRegisters (demodulator, chip, 0x09, 1, &l_band); + if (error) goto exit; + + // set lna_band + error = Standard_writeTunerRegisters (demodulator, chip, 0x14, 1, &lna_band); + if (error) goto exit; + + switch (lna_band) + { + case 0: + lna_cap = 0; + break; + case 1: + lna_cap = 7; + break; + case 2: + lna_cap = 15; + break; + case 3: + lna_cap = 23; + break; + case 4: + lna_cap = 32; + break; + case 5: + lna_cap = 39; + break; + case 6: + lna_cap = 48; + break; + case 7: + lna_cap = 55; + break; + } + + // set lna_cap + error = Standard_writeTunerRegisters (demodulator, chip, 0x13, 1, &lna_cap); + if (error) goto exit; + + if (frequency <= 49000) { + error = Error_FREQ_OUT_OF_RANGE; + goto exit; + } else if (frequency > 49000 && frequency <= 74000) { + n_div = 48; + n = 0; + } else if (frequency > 74000 && frequency <= 111000) { + n_div = 32; + n = 1; + } else if (frequency > 111000 && frequency <= 148000) { + n_div = 24; + n = 2; + } else if (frequency > 148000 && frequency <= 222000) { + n_div = 16; + n = 3; + } else if (frequency > 222000 && frequency <= 296000) { + n_div = 12; + n = 4; + } else if (frequency > 296000 && frequency <= 445000) { + n_div = 8; + n = 5; + } else if (frequency > 445000 && frequency <= 560000) { + n_div = 6; + n = 6; + } else if (frequency > 560000 && frequency <= 890000) { + n_div = 4; + n = 7; + } else if (frequency > 1187000 && frequency <= 1780000) { + n_div = 2; + n = 0; + } else { // frequency >1780000 + error = Error_FREQ_OUT_OF_RANGE; + goto exit; + } + + // calculate frequency value + m_lo = (Word) (n_div * 32 * frequency / ckxtal); + lo_freq = (Word) n << 13; + lo_freq += m_lo; + lo_freq_15_10 = (lo_freq & (Word) 0xfc00) >> 10; + lo_freq_9_4 = (lo_freq & (Word) 0x03f0) >> 4; + lo_freq_3_0 = lo_freq & (Word) 0x000f; + + // set lo_freq_15_10 + error = Standard_writeTunerRegisters (demodulator, chip, 0x0d, 1, &lo_freq_15_10); + if (error) goto exit; + + // set lo_freq_9_4 + error = Standard_writeTunerRegisters (demodulator, chip, 0x0e, 1, &lo_freq_9_4); + if (error) goto exit; + + // set lo_freq_3_0 + error = Standard_writeTunerRegisters (demodulator, chip, 0x0f, 1, &lo_freq_3_0); + if (error) goto exit; + + // write + error = Standard_writeTunerRegisters (demodulator, chip, 0x3f, 1, &tmp); + if (error) goto exit; + + // calculate lo_cap + for (i = 0; i < 32; i++) { + + // set 0x10 + tmp = (Byte) i; + error = Standard_writeTunerRegisters (demodulator, chip, 0x10, 1, &tmp); + if (error) goto exit; + + // write + tmp = 0; + error = Standard_writeTunerRegisters (demodulator, chip, 0x3f, 1, &tmp); + if (error) goto exit; + + // read + tmp = 0; + error = Standard_writeTunerRegisters (demodulator, chip, 0x01, 1, &tmp); + if (error) goto exit; + + // get 0x02 + error = Standard_readTunerRegisters (demodulator, chip, 0x02, 1, &readTmp); + if (error) goto exit; + + + + readTmp = readTmp >> 6 & 0x03; + + if (readTmp == 0 && lo_cap_min == -1) + lo_cap_min = i; + + if (readTmp != 0 && lo_cap_min != -1 && lo_cap_max == -1) + lo_cap_max = i - 1; + } + + if (lo_cap_min != -1 && lo_cap_max == -1) + lo_cap = (Byte) lo_cap_min; + else if (lo_cap_min == -1 && lo_cap_max == -1 && readTmp == 1) + lo_cap = 0; + else if (lo_cap_min == -1 && lo_cap_max == -1 && readTmp == 2) + lo_cap = 31; + else + lo_cap = (Byte) (lo_cap_min + lo_cap_max) / 2; + + // set lo_cap + error = Standard_writeTunerRegisters (demodulator, chip, 0x10, 1, &lo_cap); + if (error) goto exit; + + // set lpf_cap + tmp = lpf_cap; + error = Standard_writeTunerRegisters (demodulator, chip, 0x18, 1, &tmp); + if (error) goto exit; + + // write + tmp = 0; + error = Standard_writeTunerRegisters (demodulator, chip, 0x3f, 1, &tmp); + if (error) goto exit; + + + /////////////////////////////////////////////////// select BW + + if (bandwidth == 5000) + lpf_bw = 0; + else if (bandwidth == 5500) + lpf_bw = 1; + else if (bandwidth == 6000) + lpf_bw = 2; + else if (bandwidth == 6500) + lpf_bw = 3; + else if (bandwidth == 7000) + lpf_bw = 4; + else if (bandwidth == 7500) + lpf_bw = 5; + else if (bandwidth == 8000) + lpf_bw = 6; + else if (bandwidth == 8500) + lpf_bw = 7; + else { + error = Error_INVALID_BW; + goto exit; + } + + // set bandwidth + error = Standard_writeTunerRegisters (demodulator, chip, 0x19, 1, &lpf_bw); + if (error) goto exit; + + // write + tmp = 0; + error = Standard_writeTunerRegisters (demodulator, chip, 0x3f, 1, &tmp); + if (error) goto exit; + + + /////////////////////////////////////////////////// tune gain +#if 1 + // set lna_gain + tmp = lna_gain; + error = Standard_writeTunerRegisters (demodulator, chip, 0x12, 1, &tmp); + if (error) goto exit; + + // set pgc_gain + tmp = pgc_gain; + error = Standard_writeTunerRegisters (demodulator, chip, 0x17, 1, &tmp); + if (error) goto exit; + + // set pga_gain + tmp = pga_gain; + error = Standard_writeTunerRegisters (demodulator, chip, 0x15, 1, &tmp); + if (error) goto exit; + + // set 0x22 + tmp = 0x02; + error = Standard_writeTunerRegisters (demodulator, chip, 0x22, 1, &tmp); + if (error) goto exit; + + // set ofsi + tmp = ofsi; + error = Standard_writeTunerRegisters (demodulator, chip, 0x1a, 1, &tmp); + if (error) goto exit; + + // set ofsq + tmp = ofsq; + error = Standard_writeTunerRegisters (demodulator, chip, 0x1b, 1, &tmp); + if (error) goto exit; + + // set 1c + tmp = 0x2f; + error = Standard_writeTunerRegisters (demodulator, chip, 0x1c, 1, &tmp); + if (error) goto exit; + + // write + tmp = 0; + error = Standard_writeTunerRegisters (demodulator, chip, 0x3f, 1, &tmp); + if (error) goto exit; +#endif + +exit: + + return error; +} + + +TunerDescription tuner_PEACOCK = { + PEACOCK_open, + PEACOCK_close, + PEACOCK_set, + PEACOCK_scripts, + PEACOCK_scriptSets, + PEACOCK_ADDRESS, /** tuner i2c address */ + 1, /** length of tuner register address */ + 0, /** tuner if */ + True, /** spectrum inverse */ + 0x25, /** tuner id */ +}; |