2 * drxk_hard: DRX-K DVB-C/T demodulator driver
4 * Copyright (C) 2010-2011 Digital Devices GmbH
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 only, as published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/init.h>
28 #include <linux/delay.h>
29 #include <linux/firmware.h>
30 #include <linux/i2c.h>
31 #include <linux/version.h>
32 #include <asm/div64.h>
34 #include "dvb_frontend.h"
36 #include "drxk_hard.h"
38 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode);
39 static int PowerDownQAM(struct drxk_state *state);
40 static int SetDVBTStandard(struct drxk_state *state,
41 enum OperationMode oMode);
42 static int SetQAMStandard(struct drxk_state *state,
43 enum OperationMode oMode);
44 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
46 static int SetDVBTStandard(struct drxk_state *state,
47 enum OperationMode oMode);
48 static int DVBTStart(struct drxk_state *state);
49 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
51 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus);
52 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus);
53 static int SwitchAntennaToQAM(struct drxk_state *state);
54 static int SwitchAntennaToDVBT(struct drxk_state *state);
56 static bool IsDVBT(struct drxk_state *state)
58 return state->m_OperationMode == OM_DVBT;
61 static bool IsQAM(struct drxk_state *state)
63 return state->m_OperationMode == OM_QAM_ITU_A ||
64 state->m_OperationMode == OM_QAM_ITU_B ||
65 state->m_OperationMode == OM_QAM_ITU_C;
68 bool IsA1WithPatchCode(struct drxk_state *state)
70 return state->m_DRXK_A1_PATCH_CODE;
73 bool IsA1WithRomCode(struct drxk_state *state)
75 return state->m_DRXK_A1_ROM_CODE;
80 #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
81 #define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0)
83 #define DEFAULT_MER_83 165
84 #define DEFAULT_MER_93 250
86 #ifndef DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
87 #define DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH (0x02)
90 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
91 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
94 #ifndef DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH
95 #define DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH (0x06)
98 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
99 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
101 #ifndef DRXK_KI_RAGC_ATV
102 #define DRXK_KI_RAGC_ATV 4
104 #ifndef DRXK_KI_IAGC_ATV
105 #define DRXK_KI_IAGC_ATV 6
107 #ifndef DRXK_KI_DAGC_ATV
108 #define DRXK_KI_DAGC_ATV 7
111 #ifndef DRXK_KI_RAGC_QAM
112 #define DRXK_KI_RAGC_QAM 3
114 #ifndef DRXK_KI_IAGC_QAM
115 #define DRXK_KI_IAGC_QAM 4
117 #ifndef DRXK_KI_DAGC_QAM
118 #define DRXK_KI_DAGC_QAM 7
120 #ifndef DRXK_KI_RAGC_DVBT
121 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
123 #ifndef DRXK_KI_IAGC_DVBT
124 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
126 #ifndef DRXK_KI_DAGC_DVBT
127 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
130 #ifndef DRXK_AGC_DAC_OFFSET
131 #define DRXK_AGC_DAC_OFFSET (0x800)
134 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
135 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
138 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
139 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
142 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
143 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
146 #ifndef DRXK_QAM_SYMBOLRATE_MAX
147 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
150 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT 56
151 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A 64
152 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C 0x5FE0
153 #define DRXK_BL_ROM_OFFSET_TAPS_BG 24
154 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP 32
155 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC 40
156 #define DRXK_BL_ROM_OFFSET_TAPS_FM 48
157 #define DRXK_BL_ROM_OFFSET_UCODE 0
159 #define DRXK_BLC_TIMEOUT 100
161 #define DRXK_BLCC_NR_ELEMENTS_TAPS 2
162 #define DRXK_BLCC_NR_ELEMENTS_UCODE 6
164 #define DRXK_BLDC_NR_ELEMENTS_TAPS 28
166 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
167 #define DRXK_OFDM_NE_NOTCH_WIDTH (4)
170 #define DRXK_QAM_SL_SIG_POWER_QAM16 (40960)
171 #define DRXK_QAM_SL_SIG_POWER_QAM32 (20480)
172 #define DRXK_QAM_SL_SIG_POWER_QAM64 (43008)
173 #define DRXK_QAM_SL_SIG_POWER_QAM128 (20992)
174 #define DRXK_QAM_SL_SIG_POWER_QAM256 (43520)
176 static unsigned int debug;
177 module_param(debug, int, 0644);
178 MODULE_PARM_DESC(debug, "enable debug messages");
180 #define dprintk(level, fmt, arg...) do { \
181 if (debug >= level) \
182 printk(KERN_DEBUG "drxk: %s" fmt, __func__, ## arg); \
186 static inline u32 MulDiv32(u32 a, u32 b, u32 c)
190 tmp64 = (u64) a * (u64) b;
196 inline u32 Frac28a(u32 a, u32 c)
202 R0 = (a % c) << 4; /* 32-28 == 4 shifts possible at max */
203 Q1 = a / c; /* integer part, only the 4 least significant bits
204 will be visible in the result */
206 /* division using radix 16, 7 nibbles in the result */
207 for (i = 0; i < 7; i++) {
208 Q1 = (Q1 << 4) | (R0 / c);
218 static u32 Log10Times100(u32 x)
220 static const u8 scale = 15;
221 static const u8 indexWidth = 5;
228 log2lut[n] = (1<<scale) * 200 * log2(1.0 + ((1.0/(1<<INDEXWIDTH)) * n))
229 0 <= n < ((1<<INDEXWIDTH)+1)
232 static const u32 log2lut[] = {
234 290941, /* 290941.300628 */
235 573196, /* 573196.476418 */
236 847269, /* 847269.179851 */
237 1113620, /* 1113620.489452 */
238 1372674, /* 1372673.576986 */
239 1624818, /* 1624817.752104 */
240 1870412, /* 1870411.981536 */
241 2109788, /* 2109787.962654 */
242 2343253, /* 2343252.817465 */
243 2571091, /* 2571091.461923 */
244 2793569, /* 2793568.696416 */
245 3010931, /* 3010931.055901 */
246 3223408, /* 3223408.452106 */
247 3431216, /* 3431215.635215 */
248 3634553, /* 3634553.498355 */
249 3833610, /* 3833610.244726 */
250 4028562, /* 4028562.434393 */
251 4219576, /* 4219575.925308 */
252 4406807, /* 4406806.721144 */
253 4590402, /* 4590401.736809 */
254 4770499, /* 4770499.491025 */
255 4947231, /* 4947230.734179 */
256 5120719, /* 5120719.018555 */
257 5291081, /* 5291081.217197 */
258 5458428, /* 5458427.996830 */
259 5622864, /* 5622864.249668 */
260 5784489, /* 5784489.488298 */
261 5943398, /* 5943398.207380 */
262 6099680, /* 6099680.215452 */
263 6253421, /* 6253420.939751 */
264 6404702, /* 6404701.706649 */
265 6553600, /* 6553600.000000 */
272 /* Scale x (normalize) */
273 /* computing y in log(x/y) = log(x) - log(y) */
274 if ((x & ((0xffffffff) << (scale + 1))) == 0) {
275 for (k = scale; k > 0; k--) {
276 if (x & (((u32) 1) << scale))
281 for (k = scale; k < 31; k++) {
282 if ((x & (((u32) (-1)) << (scale + 1))) == 0)
288 Now x has binary point between bit[scale] and bit[scale-1]
289 and 1.0 <= x < 2.0 */
291 /* correction for divison: log(x) = log(x/y)+log(y) */
292 y = k * ((((u32) 1) << scale) * 200);
294 /* remove integer part */
295 x &= ((((u32) 1) << scale) - 1);
297 i = (u8) (x >> (scale - indexWidth));
298 /* compute delta (x - a) */
299 d = x & ((((u32) 1) << (scale - indexWidth)) - 1);
300 /* compute log, multiplication (d* (..)) must be within range ! */
302 ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - indexWidth));
303 /* Conver to log10() */
304 y /= 108853; /* (log2(10) << scale) */
312 /****************************************************************************/
313 /* I2C **********************************************************************/
314 /****************************************************************************/
316 static int i2c_read1(struct i2c_adapter *adapter, u8 adr, u8 *val)
318 struct i2c_msg msgs[1] = { {.addr = adr, .flags = I2C_M_RD,
319 .buf = val, .len = 1}
321 return (i2c_transfer(adapter, msgs, 1) == 1) ? 0 : -1;
324 static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
326 struct i2c_msg msg = {
327 .addr = adr, .flags = 0, .buf = data, .len = len };
332 for (i = 0; i < len; i++)
333 printk(KERN_CONT " %02x", data[i]);
334 printk(KERN_CONT "\n");
336 if (i2c_transfer(adap, &msg, 1) != 1) {
337 printk(KERN_ERR "drxk: i2c write error at addr 0x%02x\n", adr);
343 static int i2c_read(struct i2c_adapter *adap,
344 u8 adr, u8 *msg, int len, u8 *answ, int alen)
346 struct i2c_msg msgs[2] = {
347 {.addr = adr, .flags = 0,
348 .buf = msg, .len = len},
349 {.addr = adr, .flags = I2C_M_RD,
350 .buf = answ, .len = alen}
355 for (i = 0; i < len; i++)
356 printk(KERN_CONT " %02x", msg[i]);
357 printk(KERN_CONT "\n");
359 if (i2c_transfer(adap, msgs, 2) != 2) {
361 printk(KERN_CONT ": ERROR!\n");
363 printk(KERN_ERR "drxk: i2c read error at addr 0x%02x\n", adr);
368 printk(KERN_CONT ": Read ");
369 for (i = 0; i < len; i++)
370 printk(KERN_CONT " %02x", msg[i]);
371 printk(KERN_CONT "\n");
376 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
378 u8 adr = state->demod_address, mm1[4], mm2[2], len;
380 if (state->single_master)
383 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
384 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
385 mm1[1] = ((reg >> 16) & 0xFF);
386 mm1[2] = ((reg >> 24) & 0xFF) | flags;
387 mm1[3] = ((reg >> 7) & 0xFF);
390 mm1[0] = ((reg << 1) & 0xFF);
391 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
394 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
395 if (i2c_read(state->i2c, adr, mm1, len, mm2, 2) < 0)
398 *data = mm2[0] | (mm2[1] << 8);
403 static int read16(struct drxk_state *state, u32 reg, u16 *data)
405 return read16_flags(state, reg, data, 0);
408 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
410 u8 adr = state->demod_address, mm1[4], mm2[4], len;
412 if (state->single_master)
415 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
416 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
417 mm1[1] = ((reg >> 16) & 0xFF);
418 mm1[2] = ((reg >> 24) & 0xFF) | flags;
419 mm1[3] = ((reg >> 7) & 0xFF);
422 mm1[0] = ((reg << 1) & 0xFF);
423 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
426 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
427 if (i2c_read(state->i2c, adr, mm1, len, mm2, 4) < 0)
430 *data = mm2[0] | (mm2[1] << 8) |
431 (mm2[2] << 16) | (mm2[3] << 24);
436 static int read32(struct drxk_state *state, u32 reg, u32 *data)
438 return read32_flags(state, reg, data, 0);
441 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
443 u8 adr = state->demod_address, mm[6], len;
445 if (state->single_master)
447 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
448 mm[0] = (((reg << 1) & 0xFF) | 0x01);
449 mm[1] = ((reg >> 16) & 0xFF);
450 mm[2] = ((reg >> 24) & 0xFF) | flags;
451 mm[3] = ((reg >> 7) & 0xFF);
454 mm[0] = ((reg << 1) & 0xFF);
455 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
458 mm[len] = data & 0xff;
459 mm[len + 1] = (data >> 8) & 0xff;
461 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
462 if (i2c_write(state->i2c, adr, mm, len + 2) < 0)
467 static int write16(struct drxk_state *state, u32 reg, u16 data)
469 return write16_flags(state, reg, data, 0);
472 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
474 u8 adr = state->demod_address, mm[8], len;
476 if (state->single_master)
478 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
479 mm[0] = (((reg << 1) & 0xFF) | 0x01);
480 mm[1] = ((reg >> 16) & 0xFF);
481 mm[2] = ((reg >> 24) & 0xFF) | flags;
482 mm[3] = ((reg >> 7) & 0xFF);
485 mm[0] = ((reg << 1) & 0xFF);
486 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
489 mm[len] = data & 0xff;
490 mm[len + 1] = (data >> 8) & 0xff;
491 mm[len + 2] = (data >> 16) & 0xff;
492 mm[len + 3] = (data >> 24) & 0xff;
493 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
494 if (i2c_write(state->i2c, adr, mm, len + 4) < 0)
499 static int write32(struct drxk_state *state, u32 reg, u32 data)
501 return write32_flags(state, reg, data, 0);
504 static int write_block(struct drxk_state *state, u32 Address,
505 const int BlockSize, const u8 pBlock[])
507 int status = 0, BlkSize = BlockSize;
510 if (state->single_master)
513 while (BlkSize > 0) {
514 int Chunk = BlkSize > state->m_ChunkSize ?
515 state->m_ChunkSize : BlkSize;
516 u8 *AdrBuf = &state->Chunk[0];
519 if (DRXDAP_FASI_LONG_FORMAT(Address) || (Flags != 0)) {
520 AdrBuf[0] = (((Address << 1) & 0xFF) | 0x01);
521 AdrBuf[1] = ((Address >> 16) & 0xFF);
522 AdrBuf[2] = ((Address >> 24) & 0xFF);
523 AdrBuf[3] = ((Address >> 7) & 0xFF);
526 if (Chunk == state->m_ChunkSize)
529 AdrBuf[0] = ((Address << 1) & 0xFF);
530 AdrBuf[1] = (((Address >> 16) & 0x0F) |
531 ((Address >> 18) & 0xF0));
534 memcpy(&state->Chunk[AdrLength], pBlock, Chunk);
535 dprintk(2, "(0x%08x, 0x%02x)\n", Address, Flags);
539 for (i = 0; i < Chunk; i++)
540 printk(KERN_CONT " %02x", pBlock[i]);
541 printk(KERN_CONT "\n");
543 status = i2c_write(state->i2c, state->demod_address,
544 &state->Chunk[0], Chunk + AdrLength);
546 printk(KERN_ERR "drxk: %s: i2c write error at addr 0x%02x\n",
551 Address += (Chunk >> 1);
557 #ifndef DRXK_MAX_RETRIES_POWERUP
558 #define DRXK_MAX_RETRIES_POWERUP 20
561 int PowerUpDevice(struct drxk_state *state)
569 status = i2c_read1(state->i2c, state->demod_address, &data);
573 if (i2c_write(state->i2c,
574 state->demod_address, &data, 1) < 0)
575 printk(KERN_ERR "drxk: powerup failed\n");
578 } while (i2c_read1(state->i2c,
579 state->demod_address, &data) < 0 &&
580 (retryCount < DRXK_MAX_RETRIES_POWERUP));
581 if (retryCount >= DRXK_MAX_RETRIES_POWERUP)
584 /* Make sure all clk domains are active */
585 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
588 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
591 /* Enable pll lock tests */
592 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
595 state->m_currentPowerMode = DRX_POWER_UP;
601 static int init_state(struct drxk_state *state)
603 u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
604 u32 ulVSBIfAgcOutputLevel = 0;
605 u32 ulVSBIfAgcMinLevel = 0;
606 u32 ulVSBIfAgcMaxLevel = 0x7FFF;
607 u32 ulVSBIfAgcSpeed = 3;
609 u32 ulVSBRfAgcMode = DRXK_AGC_CTRL_AUTO;
610 u32 ulVSBRfAgcOutputLevel = 0;
611 u32 ulVSBRfAgcMinLevel = 0;
612 u32 ulVSBRfAgcMaxLevel = 0x7FFF;
613 u32 ulVSBRfAgcSpeed = 3;
614 u32 ulVSBRfAgcTop = 9500;
615 u32 ulVSBRfAgcCutOffCurrent = 4000;
617 u32 ulATVIfAgcMode = DRXK_AGC_CTRL_AUTO;
618 u32 ulATVIfAgcOutputLevel = 0;
619 u32 ulATVIfAgcMinLevel = 0;
620 u32 ulATVIfAgcMaxLevel = 0;
621 u32 ulATVIfAgcSpeed = 3;
623 u32 ulATVRfAgcMode = DRXK_AGC_CTRL_OFF;
624 u32 ulATVRfAgcOutputLevel = 0;
625 u32 ulATVRfAgcMinLevel = 0;
626 u32 ulATVRfAgcMaxLevel = 0;
627 u32 ulATVRfAgcTop = 9500;
628 u32 ulATVRfAgcCutOffCurrent = 4000;
629 u32 ulATVRfAgcSpeed = 3;
631 u32 ulQual83 = DEFAULT_MER_83;
632 u32 ulQual93 = DEFAULT_MER_93;
634 u32 ulDVBTStaticTSClock = 1;
635 u32 ulDVBCStaticTSClock = 1;
637 u32 ulMpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
638 u32 ulDemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
640 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
641 /* io_pad_cfg_mode output mode is drive always */
642 /* io_pad_cfg_drive is set to power 2 (23 mA) */
643 u32 ulGPIOCfg = 0x0113;
645 u32 ulSerialMode = 1;
646 u32 ulInvertTSClock = 0;
647 u32 ulTSDataStrength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
648 u32 ulTSClockkStrength = DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH;
649 u32 ulDVBTBitrate = 50000000;
650 u32 ulDVBCBitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
652 u32 ulInsertRSByte = 0;
657 u32 ulAntennaDVBT = 1;
658 u32 ulAntennaDVBC = 0;
659 u32 ulAntennaSwitchDVBTDVBC = 0;
663 state->m_hasLNA = false;
664 state->m_hasDVBT = false;
665 state->m_hasDVBC = false;
666 state->m_hasATV = false;
667 state->m_hasOOB = false;
668 state->m_hasAudio = false;
670 state->m_ChunkSize = 124;
672 state->m_oscClockFreq = 0;
673 state->m_smartAntInverted = false;
674 state->m_bPDownOpenBridge = false;
676 /* real system clock frequency in kHz */
677 state->m_sysClockFreq = 151875;
678 /* Timing div, 250ns/Psys */
679 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
680 state->m_HICfgTimingDiv = ((state->m_sysClockFreq / 1000) *
681 HI_I2C_DELAY) / 1000;
683 if (state->m_HICfgTimingDiv > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
684 state->m_HICfgTimingDiv = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
685 state->m_HICfgWakeUpKey = (state->demod_address << 1);
686 /* port/bridge/power down ctrl */
687 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
689 state->m_bPowerDown = (ulPowerDown != 0);
691 state->m_DRXK_A1_PATCH_CODE = false;
692 state->m_DRXK_A1_ROM_CODE = false;
693 state->m_DRXK_A2_ROM_CODE = false;
694 state->m_DRXK_A3_ROM_CODE = false;
695 state->m_DRXK_A2_PATCH_CODE = false;
696 state->m_DRXK_A3_PATCH_CODE = false;
698 /* Init AGC and PGA parameters */
700 state->m_vsbIfAgcCfg.ctrlMode = (ulVSBIfAgcMode);
701 state->m_vsbIfAgcCfg.outputLevel = (ulVSBIfAgcOutputLevel);
702 state->m_vsbIfAgcCfg.minOutputLevel = (ulVSBIfAgcMinLevel);
703 state->m_vsbIfAgcCfg.maxOutputLevel = (ulVSBIfAgcMaxLevel);
704 state->m_vsbIfAgcCfg.speed = (ulVSBIfAgcSpeed);
705 state->m_vsbPgaCfg = 140;
708 state->m_vsbRfAgcCfg.ctrlMode = (ulVSBRfAgcMode);
709 state->m_vsbRfAgcCfg.outputLevel = (ulVSBRfAgcOutputLevel);
710 state->m_vsbRfAgcCfg.minOutputLevel = (ulVSBRfAgcMinLevel);
711 state->m_vsbRfAgcCfg.maxOutputLevel = (ulVSBRfAgcMaxLevel);
712 state->m_vsbRfAgcCfg.speed = (ulVSBRfAgcSpeed);
713 state->m_vsbRfAgcCfg.top = (ulVSBRfAgcTop);
714 state->m_vsbRfAgcCfg.cutOffCurrent = (ulVSBRfAgcCutOffCurrent);
715 state->m_vsbPreSawCfg.reference = 0x07;
716 state->m_vsbPreSawCfg.usePreSaw = true;
718 state->m_Quality83percent = DEFAULT_MER_83;
719 state->m_Quality93percent = DEFAULT_MER_93;
720 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
721 state->m_Quality83percent = ulQual83;
722 state->m_Quality93percent = ulQual93;
726 state->m_atvIfAgcCfg.ctrlMode = (ulATVIfAgcMode);
727 state->m_atvIfAgcCfg.outputLevel = (ulATVIfAgcOutputLevel);
728 state->m_atvIfAgcCfg.minOutputLevel = (ulATVIfAgcMinLevel);
729 state->m_atvIfAgcCfg.maxOutputLevel = (ulATVIfAgcMaxLevel);
730 state->m_atvIfAgcCfg.speed = (ulATVIfAgcSpeed);
733 state->m_atvRfAgcCfg.ctrlMode = (ulATVRfAgcMode);
734 state->m_atvRfAgcCfg.outputLevel = (ulATVRfAgcOutputLevel);
735 state->m_atvRfAgcCfg.minOutputLevel = (ulATVRfAgcMinLevel);
736 state->m_atvRfAgcCfg.maxOutputLevel = (ulATVRfAgcMaxLevel);
737 state->m_atvRfAgcCfg.speed = (ulATVRfAgcSpeed);
738 state->m_atvRfAgcCfg.top = (ulATVRfAgcTop);
739 state->m_atvRfAgcCfg.cutOffCurrent = (ulATVRfAgcCutOffCurrent);
740 state->m_atvPreSawCfg.reference = 0x04;
741 state->m_atvPreSawCfg.usePreSaw = true;
745 state->m_dvbtRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
746 state->m_dvbtRfAgcCfg.outputLevel = 0;
747 state->m_dvbtRfAgcCfg.minOutputLevel = 0;
748 state->m_dvbtRfAgcCfg.maxOutputLevel = 0xFFFF;
749 state->m_dvbtRfAgcCfg.top = 0x2100;
750 state->m_dvbtRfAgcCfg.cutOffCurrent = 4000;
751 state->m_dvbtRfAgcCfg.speed = 1;
755 state->m_dvbtIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
756 state->m_dvbtIfAgcCfg.outputLevel = 0;
757 state->m_dvbtIfAgcCfg.minOutputLevel = 0;
758 state->m_dvbtIfAgcCfg.maxOutputLevel = 9000;
759 state->m_dvbtIfAgcCfg.top = 13424;
760 state->m_dvbtIfAgcCfg.cutOffCurrent = 0;
761 state->m_dvbtIfAgcCfg.speed = 3;
762 state->m_dvbtIfAgcCfg.FastClipCtrlDelay = 30;
763 state->m_dvbtIfAgcCfg.IngainTgtMax = 30000;
764 /* state->m_dvbtPgaCfg = 140; */
766 state->m_dvbtPreSawCfg.reference = 4;
767 state->m_dvbtPreSawCfg.usePreSaw = false;
770 state->m_qamRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
771 state->m_qamRfAgcCfg.outputLevel = 0;
772 state->m_qamRfAgcCfg.minOutputLevel = 6023;
773 state->m_qamRfAgcCfg.maxOutputLevel = 27000;
774 state->m_qamRfAgcCfg.top = 0x2380;
775 state->m_qamRfAgcCfg.cutOffCurrent = 4000;
776 state->m_qamRfAgcCfg.speed = 3;
779 state->m_qamIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
780 state->m_qamIfAgcCfg.outputLevel = 0;
781 state->m_qamIfAgcCfg.minOutputLevel = 0;
782 state->m_qamIfAgcCfg.maxOutputLevel = 9000;
783 state->m_qamIfAgcCfg.top = 0x0511;
784 state->m_qamIfAgcCfg.cutOffCurrent = 0;
785 state->m_qamIfAgcCfg.speed = 3;
786 state->m_qamIfAgcCfg.IngainTgtMax = 5119;
787 state->m_qamIfAgcCfg.FastClipCtrlDelay = 50;
789 state->m_qamPgaCfg = 140;
790 state->m_qamPreSawCfg.reference = 4;
791 state->m_qamPreSawCfg.usePreSaw = false;
793 state->m_OperationMode = OM_NONE;
794 state->m_DrxkState = DRXK_UNINITIALIZED;
796 /* MPEG output configuration */
797 state->m_enableMPEGOutput = true; /* If TRUE; enable MPEG ouput */
798 state->m_insertRSByte = false; /* If TRUE; insert RS byte */
799 state->m_enableParallel = true; /* If TRUE;
800 parallel out otherwise serial */
801 state->m_invertDATA = false; /* If TRUE; invert DATA signals */
802 state->m_invertERR = false; /* If TRUE; invert ERR signal */
803 state->m_invertSTR = false; /* If TRUE; invert STR signals */
804 state->m_invertVAL = false; /* If TRUE; invert VAL signals */
805 state->m_invertCLK = (ulInvertTSClock != 0); /* If TRUE; invert CLK signals */
806 state->m_DVBTStaticCLK = (ulDVBTStaticTSClock != 0);
807 state->m_DVBCStaticCLK = (ulDVBCStaticTSClock != 0);
808 /* If TRUE; static MPEG clockrate will be used;
809 otherwise clockrate will adapt to the bitrate of the TS */
811 state->m_DVBTBitrate = ulDVBTBitrate;
812 state->m_DVBCBitrate = ulDVBCBitrate;
814 state->m_TSDataStrength = (ulTSDataStrength & 0x07);
815 state->m_TSClockkStrength = (ulTSClockkStrength & 0x07);
817 /* Maximum bitrate in b/s in case static clockrate is selected */
818 state->m_mpegTsStaticBitrate = 19392658;
819 state->m_disableTEIhandling = false;
822 state->m_insertRSByte = true;
824 state->m_MpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
825 if (ulMpegLockTimeOut < 10000)
826 state->m_MpegLockTimeOut = ulMpegLockTimeOut;
827 state->m_DemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
828 if (ulDemodLockTimeOut < 10000)
829 state->m_DemodLockTimeOut = ulDemodLockTimeOut;
832 state->m_Constellation = DRX_CONSTELLATION_AUTO;
833 state->m_qamInterleaveMode = DRXK_QAM_I12_J17;
834 state->m_fecRsPlen = 204 * 8; /* fecRsPlen annex A */
835 state->m_fecRsPrescale = 1;
837 state->m_sqiSpeed = DRXK_DVBT_SQI_SPEED_MEDIUM;
838 state->m_agcFastClipCtrlDelay = 0;
840 state->m_GPIOCfg = (ulGPIOCfg);
841 state->m_GPIO = (ulGPIO == 0 ? 0 : 1);
843 state->m_AntennaDVBT = (ulAntennaDVBT == 0 ? 0 : 1);
844 state->m_AntennaDVBC = (ulAntennaDVBC == 0 ? 0 : 1);
845 state->m_AntennaSwitchDVBTDVBC =
846 (ulAntennaSwitchDVBTDVBC == 0 ? 0 : 1);
848 state->m_bPowerDown = false;
849 state->m_currentPowerMode = DRX_POWER_DOWN;
851 state->m_enableParallel = (ulSerialMode == 0);
853 state->m_rfmirror = (ulRfMirror == 0);
854 state->m_IfAgcPol = false;
858 static int DRXX_Open(struct drxk_state *state)
867 /* stop lock indicator process */
868 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
871 /* Check device id */
872 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
875 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
878 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
881 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
884 status = write16(state, SIO_TOP_COMM_KEY__A, key);
891 static int GetDeviceCapabilities(struct drxk_state *state)
893 u16 sioPdrOhwCfg = 0;
894 u32 sioTopJtagidLo = 0;
900 /* stop lock indicator process */
901 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
905 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
908 status = read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg);
911 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
915 switch ((sioPdrOhwCfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
917 /* ignore (bypass ?) */
921 state->m_oscClockFreq = 27000;
925 state->m_oscClockFreq = 20250;
929 state->m_oscClockFreq = 20250;
935 Determine device capabilities
938 status = read32(state, SIO_TOP_JTAGID_LO__A, &sioTopJtagidLo);
942 switch ((sioTopJtagidLo >> 29) & 0xF) {
944 state->m_deviceSpin = DRXK_SPIN_A1;
947 state->m_deviceSpin = DRXK_SPIN_A2;
950 state->m_deviceSpin = DRXK_SPIN_A3;
953 state->m_deviceSpin = DRXK_SPIN_UNKNOWN;
957 switch ((sioTopJtagidLo >> 12) & 0xFF) {
959 /* typeId = DRX3913K_TYPE_ID */
960 state->m_hasLNA = false;
961 state->m_hasOOB = false;
962 state->m_hasATV = false;
963 state->m_hasAudio = false;
964 state->m_hasDVBT = true;
965 state->m_hasDVBC = true;
966 state->m_hasSAWSW = true;
967 state->m_hasGPIO2 = false;
968 state->m_hasGPIO1 = false;
969 state->m_hasIRQN = false;
972 /* typeId = DRX3915K_TYPE_ID */
973 state->m_hasLNA = false;
974 state->m_hasOOB = false;
975 state->m_hasATV = true;
976 state->m_hasAudio = false;
977 state->m_hasDVBT = true;
978 state->m_hasDVBC = false;
979 state->m_hasSAWSW = true;
980 state->m_hasGPIO2 = true;
981 state->m_hasGPIO1 = true;
982 state->m_hasIRQN = false;
985 /* typeId = DRX3916K_TYPE_ID */
986 state->m_hasLNA = false;
987 state->m_hasOOB = false;
988 state->m_hasATV = true;
989 state->m_hasAudio = false;
990 state->m_hasDVBT = true;
991 state->m_hasDVBC = false;
992 state->m_hasSAWSW = true;
993 state->m_hasGPIO2 = true;
994 state->m_hasGPIO1 = true;
995 state->m_hasIRQN = false;
998 /* typeId = DRX3918K_TYPE_ID */
999 state->m_hasLNA = false;
1000 state->m_hasOOB = false;
1001 state->m_hasATV = true;
1002 state->m_hasAudio = true;
1003 state->m_hasDVBT = true;
1004 state->m_hasDVBC = false;
1005 state->m_hasSAWSW = true;
1006 state->m_hasGPIO2 = true;
1007 state->m_hasGPIO1 = true;
1008 state->m_hasIRQN = false;
1011 /* typeId = DRX3921K_TYPE_ID */
1012 state->m_hasLNA = false;
1013 state->m_hasOOB = false;
1014 state->m_hasATV = true;
1015 state->m_hasAudio = true;
1016 state->m_hasDVBT = true;
1017 state->m_hasDVBC = true;
1018 state->m_hasSAWSW = true;
1019 state->m_hasGPIO2 = true;
1020 state->m_hasGPIO1 = true;
1021 state->m_hasIRQN = false;
1024 /* typeId = DRX3923K_TYPE_ID */
1025 state->m_hasLNA = false;
1026 state->m_hasOOB = false;
1027 state->m_hasATV = true;
1028 state->m_hasAudio = true;
1029 state->m_hasDVBT = true;
1030 state->m_hasDVBC = true;
1031 state->m_hasSAWSW = true;
1032 state->m_hasGPIO2 = true;
1033 state->m_hasGPIO1 = true;
1034 state->m_hasIRQN = false;
1037 /* typeId = DRX3925K_TYPE_ID */
1038 state->m_hasLNA = false;
1039 state->m_hasOOB = false;
1040 state->m_hasATV = true;
1041 state->m_hasAudio = true;
1042 state->m_hasDVBT = true;
1043 state->m_hasDVBC = true;
1044 state->m_hasSAWSW = true;
1045 state->m_hasGPIO2 = true;
1046 state->m_hasGPIO1 = true;
1047 state->m_hasIRQN = false;
1050 /* typeId = DRX3926K_TYPE_ID */
1051 state->m_hasLNA = false;
1052 state->m_hasOOB = false;
1053 state->m_hasATV = true;
1054 state->m_hasAudio = false;
1055 state->m_hasDVBT = true;
1056 state->m_hasDVBC = true;
1057 state->m_hasSAWSW = true;
1058 state->m_hasGPIO2 = true;
1059 state->m_hasGPIO1 = true;
1060 state->m_hasIRQN = false;
1063 printk(KERN_ERR "drxk: DeviceID not supported = %02x\n",
1064 ((sioTopJtagidLo >> 12) & 0xFF));
1072 static int HI_Command(struct drxk_state *state, u16 cmd, u16 *pResult)
1080 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
1083 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1087 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1088 ((state->m_HICfgCtrl) &
1089 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1090 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1091 if (powerdown_cmd == false) {
1092 /* Wait until command rdy */
1099 status = read16(state, SIO_HI_RA_RAM_CMD__A,
1101 } while ((status < 0) && (retryCount < DRXK_MAX_RETRIES)
1105 status = read16(state, SIO_HI_RA_RAM_RES__A,
1111 static int HI_CfgCommand(struct drxk_state *state)
1117 mutex_lock(&state->mutex);
1119 status = write16(state, SIO_HI_RA_RAM_PAR_6__A, state->m_HICfgTimeout);
1122 status = write16(state, SIO_HI_RA_RAM_PAR_5__A, state->m_HICfgCtrl);
1125 status = write16(state, SIO_HI_RA_RAM_PAR_4__A, state->m_HICfgWakeUpKey);
1128 status = write16(state, SIO_HI_RA_RAM_PAR_3__A, state->m_HICfgBridgeDelay);
1131 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, state->m_HICfgTimingDiv);
1134 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1137 status = HI_Command(state, SIO_HI_RA_RAM_CMD_CONFIG, 0);
1141 state->m_HICfgCtrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1143 mutex_unlock(&state->mutex);
1147 static int InitHI(struct drxk_state *state)
1151 state->m_HICfgWakeUpKey = (state->demod_address << 1);
1152 state->m_HICfgTimeout = 0x96FF;
1153 /* port/bridge/power down ctrl */
1154 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1155 return HI_CfgCommand(state);
1158 static int MPEGTSConfigurePins(struct drxk_state *state, bool mpegEnable)
1161 u16 sioPdrMclkCfg = 0;
1162 u16 sioPdrMdxCfg = 0;
1166 /* stop lock indicator process */
1167 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1171 /* MPEG TS pad configuration */
1172 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
1176 if (mpegEnable == false) {
1177 /* Set MPEG TS pads to inputmode */
1178 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1181 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1184 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1187 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1190 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1193 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1196 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1199 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1202 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1205 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1208 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1211 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1215 /* Enable MPEG output */
1217 ((state->m_TSDataStrength <<
1218 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1219 sioPdrMclkCfg = ((state->m_TSClockkStrength <<
1220 SIO_PDR_MCLK_CFG_DRIVE__B) |
1223 status = write16(state, SIO_PDR_MSTRT_CFG__A, sioPdrMdxCfg);
1226 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000); /* Disable */
1229 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000); /* Disable */
1232 if (state->m_enableParallel == true) {
1233 /* paralel -> enable MD1 to MD7 */
1234 status = write16(state, SIO_PDR_MD1_CFG__A, sioPdrMdxCfg);
1237 status = write16(state, SIO_PDR_MD2_CFG__A, sioPdrMdxCfg);
1240 status = write16(state, SIO_PDR_MD3_CFG__A, sioPdrMdxCfg);
1243 status = write16(state, SIO_PDR_MD4_CFG__A, sioPdrMdxCfg);
1246 status = write16(state, SIO_PDR_MD5_CFG__A, sioPdrMdxCfg);
1249 status = write16(state, SIO_PDR_MD6_CFG__A, sioPdrMdxCfg);
1252 status = write16(state, SIO_PDR_MD7_CFG__A, sioPdrMdxCfg);
1256 sioPdrMdxCfg = ((state->m_TSDataStrength <<
1257 SIO_PDR_MD0_CFG_DRIVE__B)
1259 /* serial -> disable MD1 to MD7 */
1260 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1263 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1266 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1269 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1272 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1275 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1278 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1282 status = write16(state, SIO_PDR_MCLK_CFG__A, sioPdrMclkCfg);
1285 status = write16(state, SIO_PDR_MD0_CFG__A, sioPdrMdxCfg);
1289 /* Enable MB output over MPEG pads and ctl input */
1290 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1293 /* Write nomagic word to enable pdr reg write */
1294 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1301 static int MPEGTSDisable(struct drxk_state *state)
1305 return MPEGTSConfigurePins(state, false);
1308 static int BLChainCmd(struct drxk_state *state,
1309 u16 romOffset, u16 nrOfElements, u32 timeOut)
1317 mutex_lock(&state->mutex);
1319 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1322 status = write16(state, SIO_BL_CHAIN_ADDR__A, romOffset);
1325 status = write16(state, SIO_BL_CHAIN_LEN__A, nrOfElements);
1328 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1331 end = jiffies + msecs_to_jiffies(timeOut);
1335 status = read16(state, SIO_BL_STATUS__A, &blStatus);
1338 } while ((blStatus == 0x1) &&
1339 ((time_is_after_jiffies(end))));
1340 if (blStatus == 0x1) {
1341 printk(KERN_ERR "drxk: SIO not ready\n");
1342 mutex_unlock(&state->mutex);
1346 mutex_unlock(&state->mutex);
1351 static int DownloadMicrocode(struct drxk_state *state,
1352 const u8 pMCImage[], u32 Length)
1354 const u8 *pSrc = pMCImage;
1367 /* down the drain (we don care about MAGIC_WORD) */
1368 Drain = (pSrc[0] << 8) | pSrc[1];
1369 pSrc += sizeof(u16);
1370 offset += sizeof(u16);
1371 nBlocks = (pSrc[0] << 8) | pSrc[1];
1372 pSrc += sizeof(u16);
1373 offset += sizeof(u16);
1375 for (i = 0; i < nBlocks; i += 1) {
1376 Address = (pSrc[0] << 24) | (pSrc[1] << 16) |
1377 (pSrc[2] << 8) | pSrc[3];
1378 pSrc += sizeof(u32);
1379 offset += sizeof(u32);
1381 BlockSize = ((pSrc[0] << 8) | pSrc[1]) * sizeof(u16);
1382 pSrc += sizeof(u16);
1383 offset += sizeof(u16);
1385 Flags = (pSrc[0] << 8) | pSrc[1];
1386 pSrc += sizeof(u16);
1387 offset += sizeof(u16);
1389 BlockCRC = (pSrc[0] << 8) | pSrc[1];
1390 pSrc += sizeof(u16);
1391 offset += sizeof(u16);
1393 if (offset + BlockSize > Length) {
1394 printk(KERN_ERR "drxk: Firmware is corrupted.\n");
1398 status = write_block(state, Address, BlockSize, pSrc);
1400 printk(KERN_ERR "drxk: Error %d while loading firmware\n", status);
1404 offset += BlockSize;
1409 static int DVBTEnableOFDMTokenRing(struct drxk_state *state, bool enable)
1413 u16 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1414 u16 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1419 if (enable == false) {
1420 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1421 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1424 status = (read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data));
1426 if (data == desiredStatus) {
1427 /* tokenring already has correct status */
1430 /* Disable/enable dvbt tokenring bridge */
1432 write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desiredCtrl);
1434 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1436 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1439 } while ((data != desiredStatus) && ((time_is_after_jiffies(end))));
1440 if (data != desiredStatus) {
1441 printk(KERN_ERR "drxk: SIO not ready\n");
1447 static int MPEGTSStop(struct drxk_state *state)
1450 u16 fecOcSncMode = 0;
1451 u16 fecOcIprMode = 0;
1456 /* Gracefull shutdown (byte boundaries) */
1457 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1460 fecOcSncMode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1461 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1465 /* Suppress MCLK during absence of data */
1466 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcIprMode);
1469 fecOcIprMode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1470 status = write16(state, FEC_OC_IPR_MODE__A, fecOcIprMode);
1477 static int scu_command(struct drxk_state *state,
1478 u16 cmd, u8 parameterLen,
1479 u16 *parameter, u8 resultLen, u16 *result)
1481 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1482 #error DRXK register mapping no longer compatible with this routine!
1490 if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) ||
1491 ((resultLen > 0) && (result == NULL)))
1494 mutex_lock(&state->mutex);
1496 /* assume that the command register is ready
1497 since it is checked afterwards */
1501 for (ii = parameterLen - 1; ii >= 0; ii -= 1) {
1502 buffer[cnt++] = (parameter[ii] & 0xFF);
1503 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1505 buffer[cnt++] = (cmd & 0xFF);
1506 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1508 write_block(state, SCU_RAM_PARAM_0__A -
1509 (parameterLen - 1), cnt, buffer);
1510 /* Wait until SCU has processed command */
1511 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1514 status = read16(state, SCU_RAM_COMMAND__A, &curCmd);
1517 } while (!(curCmd == DRX_SCU_READY)
1518 && (time_is_after_jiffies(end)));
1519 if (curCmd != DRX_SCU_READY) {
1520 printk(KERN_ERR "drxk: SCU not ready\n");
1521 mutex_unlock(&state->mutex);
1525 if ((resultLen > 0) && (result != NULL)) {
1529 for (ii = resultLen - 1; ii >= 0; ii -= 1) {
1530 status = read16(state, SCU_RAM_PARAM_0__A - ii, &result[ii]);
1535 /* Check if an error was reported by SCU */
1536 err = (s16) result[0];
1538 /* check a few fixed error codes */
1539 if (err == SCU_RESULT_UNKSTD) {
1540 printk(KERN_ERR "drxk: SCU_RESULT_UNKSTD\n");
1541 mutex_unlock(&state->mutex);
1543 } else if (err == SCU_RESULT_UNKCMD) {
1544 printk(KERN_ERR "drxk: SCU_RESULT_UNKCMD\n");
1545 mutex_unlock(&state->mutex);
1548 /* here it is assumed that negative means error,
1549 and positive no error */
1551 printk(KERN_ERR "drxk: %s ERROR\n", __func__);
1552 mutex_unlock(&state->mutex);
1557 mutex_unlock(&state->mutex);
1559 printk(KERN_ERR "drxk: %s: status = %d\n", __func__, status);
1564 static int SetIqmAf(struct drxk_state *state, bool active)
1573 status = read16(state, IQM_AF_STDBY__A, &data);
1577 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1578 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1579 | IQM_AF_STDBY_STDBY_PD_STANDBY
1580 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1581 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1582 } else { /* active */
1584 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1585 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1586 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1587 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1588 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1591 status = write16(state, IQM_AF_STDBY__A, data);
1598 static int CtrlPowerMode(struct drxk_state *state, enum DRXPowerMode *mode)
1601 u16 sioCcPwdMode = 0;
1605 /* Check arguments */
1611 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_NONE;
1613 case DRXK_POWER_DOWN_OFDM:
1614 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1616 case DRXK_POWER_DOWN_CORE:
1617 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1619 case DRXK_POWER_DOWN_PLL:
1620 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_PLL;
1622 case DRX_POWER_DOWN:
1623 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OSC;
1626 /* Unknow sleep mode */
1631 /* If already in requested power mode, do nothing */
1632 if (state->m_currentPowerMode == *mode)
1635 /* For next steps make sure to start from DRX_POWER_UP mode */
1636 if (state->m_currentPowerMode != DRX_POWER_UP) {
1638 status = PowerUpDevice(state);
1641 status = DVBTEnableOFDMTokenRing(state, true);
1647 if (*mode == DRX_POWER_UP) {
1648 /* Restore analog & pin configuartion */
1650 /* Power down to requested mode */
1651 /* Backup some register settings */
1652 /* Set pins with possible pull-ups connected
1653 to them in input mode */
1654 /* Analog power down */
1655 /* ADC power down */
1656 /* Power down device */
1657 /* stop all comm_exec */
1658 /* Stop and power down previous standard */
1660 switch (state->m_OperationMode) {
1662 status = MPEGTSStop(state);
1665 status = PowerDownDVBT(state, false);
1671 status = MPEGTSStop(state);
1674 status = PowerDownQAM(state);
1681 status = DVBTEnableOFDMTokenRing(state, false);
1684 status = write16(state, SIO_CC_PWD_MODE__A, sioCcPwdMode);
1687 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1691 if (*mode != DRXK_POWER_DOWN_OFDM) {
1692 state->m_HICfgCtrl |=
1693 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1694 status = HI_CfgCommand(state);
1700 state->m_currentPowerMode = *mode;
1704 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode)
1706 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
1714 status = read16(state, SCU_COMM_EXEC__A, &data);
1717 if (data == SCU_COMM_EXEC_ACTIVE) {
1718 /* Send OFDM stop command */
1719 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
1722 /* Send OFDM reset command */
1723 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
1728 /* Reset datapath for OFDM, processors first */
1729 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1732 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1735 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1740 status = SetIqmAf(state, false);
1744 /* powerdown to OFDM mode */
1746 status = CtrlPowerMode(state, &powerMode);
1754 static int SetOperationMode(struct drxk_state *state,
1755 enum OperationMode oMode)
1761 Stop and power down previous standard
1762 TODO investigate total power down instead of partial
1763 power down depending on "previous" standard.
1766 /* disable HW lock indicator */
1767 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1771 if (state->m_OperationMode != oMode) {
1772 switch (state->m_OperationMode) {
1773 /* OM_NONE was added for start up */
1777 status = MPEGTSStop(state);
1780 status = PowerDownDVBT(state, true);
1783 state->m_OperationMode = OM_NONE;
1788 case OM_QAM_ITU_A: /* fallthrough */
1790 status = MPEGTSStop(state);
1793 status = PowerDownQAM(state);
1796 state->m_OperationMode = OM_NONE;
1806 Power up new standard
1810 state->m_OperationMode = oMode;
1811 status = SetDVBTStandard(state, oMode);
1818 case OM_QAM_ITU_A: /* fallthrough */
1820 state->m_OperationMode = oMode;
1821 status = SetQAMStandard(state, oMode);
1836 static int Start(struct drxk_state *state, s32 offsetFreq,
1837 s32 IntermediateFrequency)
1844 s32 OffsetkHz = offsetFreq / 1000;
1846 if (state->m_DrxkState != DRXK_STOPPED &&
1847 state->m_DrxkState != DRXK_DTV_STARTED) {
1851 state->m_bMirrorFreqSpect =
1852 (state->param.inversion == INVERSION_ON);
1854 if (IntermediateFrequency < 0) {
1855 state->m_bMirrorFreqSpect =
1856 !state->m_bMirrorFreqSpect;
1857 IntermediateFrequency = -IntermediateFrequency;
1860 switch (state->m_OperationMode) {
1863 IFreqkHz = (IntermediateFrequency / 1000);
1864 status = SetQAM(state, IFreqkHz, OffsetkHz);
1867 state->m_DrxkState = DRXK_DTV_STARTED;
1870 IFreqkHz = (IntermediateFrequency / 1000);
1871 status = MPEGTSStop(state);
1874 status = SetDVBT(state, IFreqkHz, OffsetkHz);
1877 status = DVBTStart(state);
1880 state->m_DrxkState = DRXK_DTV_STARTED;
1889 static int ShutDown(struct drxk_state *state)
1897 static int GetLockStatus(struct drxk_state *state, u32 *pLockStatus,
1904 if (pLockStatus == NULL)
1907 *pLockStatus = NOT_LOCKED;
1909 /* define the SCU command code */
1910 switch (state->m_OperationMode) {
1914 status = GetQAMLockStatus(state, pLockStatus);
1917 status = GetDVBTLockStatus(state, pLockStatus);
1925 static int MPEGTSStart(struct drxk_state *state)
1929 u16 fecOcSncMode = 0;
1932 /* Allow OC to sync again */
1933 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1936 fecOcSncMode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1937 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1940 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1947 static int MPEGTSDtoInit(struct drxk_state *state)
1954 /* Rate integration settings */
1955 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1958 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1961 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1964 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1967 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
1970 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
1973 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
1976 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
1980 /* Additional configuration */
1981 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
1984 status = write16(state, FEC_OC_SNC_LWM__A, 2);
1987 status = write16(state, FEC_OC_SNC_HWM__A, 12);
1994 static int MPEGTSDtoSetup(struct drxk_state *state,
1995 enum OperationMode oMode)
1999 u16 fecOcRegMode = 0; /* FEC_OC_MODE register value */
2000 u16 fecOcRegIprMode = 0; /* FEC_OC_IPR_MODE register value */
2001 u16 fecOcDtoMode = 0; /* FEC_OC_IPR_INVERT register value */
2002 u16 fecOcFctMode = 0; /* FEC_OC_IPR_INVERT register value */
2003 u16 fecOcDtoPeriod = 2; /* FEC_OC_IPR_INVERT register value */
2004 u16 fecOcDtoBurstLen = 188; /* FEC_OC_IPR_INVERT register value */
2005 u32 fecOcRcnCtlRate = 0; /* FEC_OC_IPR_INVERT register value */
2006 u16 fecOcTmdMode = 0;
2007 u16 fecOcTmdIntUpdRate = 0;
2009 bool staticCLK = false;
2014 /* Check insertion of the Reed-Solomon parity bytes */
2015 status = read16(state, FEC_OC_MODE__A, &fecOcRegMode);
2018 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcRegIprMode);
2021 fecOcRegMode &= (~FEC_OC_MODE_PARITY__M);
2022 fecOcRegIprMode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2023 if (state->m_insertRSByte == true) {
2024 /* enable parity symbol forward */
2025 fecOcRegMode |= FEC_OC_MODE_PARITY__M;
2026 /* MVAL disable during parity bytes */
2027 fecOcRegIprMode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2028 /* TS burst length to 204 */
2029 fecOcDtoBurstLen = 204;
2032 /* Check serial or parrallel output */
2033 fecOcRegIprMode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2034 if (state->m_enableParallel == false) {
2035 /* MPEG data output is serial -> set ipr_mode[0] */
2036 fecOcRegIprMode |= FEC_OC_IPR_MODE_SERIAL__M;
2041 maxBitRate = state->m_DVBTBitrate;
2043 fecOcRcnCtlRate = 0xC00000;
2044 staticCLK = state->m_DVBTStaticCLK;
2046 case OM_QAM_ITU_A: /* fallthrough */
2048 fecOcTmdMode = 0x0004;
2049 fecOcRcnCtlRate = 0xD2B4EE; /* good for >63 Mb/s */
2050 maxBitRate = state->m_DVBCBitrate;
2051 staticCLK = state->m_DVBCStaticCLK;
2055 } /* switch (standard) */
2060 /* Configure DTO's */
2064 /* Rational DTO for MCLK source (static MCLK rate),
2065 Dynamic DTO for optimal grouping
2066 (avoid intra-packet gaps),
2067 DTO offset enable to sync TS burst with MSTRT */
2068 fecOcDtoMode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2069 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2070 fecOcFctMode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2071 FEC_OC_FCT_MODE_VIRT_ENA__M);
2073 /* Check user defined bitrate */
2074 bitRate = maxBitRate;
2075 if (bitRate > 75900000UL) { /* max is 75.9 Mb/s */
2076 bitRate = 75900000UL;
2078 /* Rational DTO period:
2079 dto_period = (Fsys / bitrate) - 2
2081 Result should be floored,
2082 to make sure >= requested bitrate
2084 fecOcDtoPeriod = (u16) (((state->m_sysClockFreq)
2086 if (fecOcDtoPeriod <= 2)
2089 fecOcDtoPeriod -= 2;
2090 fecOcTmdIntUpdRate = 8;
2092 /* (commonAttr->staticCLK == false) => dynamic mode */
2093 fecOcDtoMode = FEC_OC_DTO_MODE_DYNAMIC__M;
2094 fecOcFctMode = FEC_OC_FCT_MODE__PRE;
2095 fecOcTmdIntUpdRate = 5;
2098 /* Write appropriate registers with requested configuration */
2099 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fecOcDtoBurstLen);
2102 status = write16(state, FEC_OC_DTO_PERIOD__A, fecOcDtoPeriod);
2105 status = write16(state, FEC_OC_DTO_MODE__A, fecOcDtoMode);
2108 status = write16(state, FEC_OC_FCT_MODE__A, fecOcFctMode);
2111 status = write16(state, FEC_OC_MODE__A, fecOcRegMode);
2114 status = write16(state, FEC_OC_IPR_MODE__A, fecOcRegIprMode);
2118 /* Rate integration settings */
2119 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fecOcRcnCtlRate);
2122 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A, fecOcTmdIntUpdRate);
2125 status = write16(state, FEC_OC_TMD_MODE__A, fecOcTmdMode);
2132 static int MPEGTSConfigurePolarity(struct drxk_state *state)
2135 u16 fecOcRegIprInvert = 0;
2139 /* Data mask for the output data byte */
2140 u16 InvertDataMask =
2141 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2142 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2143 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2144 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2146 /* Control selective inversion of output bits */
2147 fecOcRegIprInvert &= (~(InvertDataMask));
2148 if (state->m_invertDATA == true)
2149 fecOcRegIprInvert |= InvertDataMask;
2150 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2151 if (state->m_invertERR == true)
2152 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MERR__M;
2153 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2154 if (state->m_invertSTR == true)
2155 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MSTRT__M;
2156 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2157 if (state->m_invertVAL == true)
2158 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MVAL__M;
2159 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2160 if (state->m_invertCLK == true)
2161 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MCLK__M;
2162 status = write16(state, FEC_OC_IPR_INVERT__A, fecOcRegIprInvert);
2166 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2168 static int SetAgcRf(struct drxk_state *state,
2169 struct SCfgAgc *pAgcCfg, bool isDTV)
2172 struct SCfgAgc *pIfAgcSettings;
2176 if (pAgcCfg == NULL)
2182 switch (pAgcCfg->ctrlMode) {
2183 case DRXK_AGC_CTRL_AUTO:
2185 /* Enable RF AGC DAC */
2186 status = read16(state, IQM_AF_STDBY__A, &data);
2189 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2190 status = write16(state, IQM_AF_STDBY__A, data);
2194 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2198 /* Enable SCU RF AGC loop */
2199 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2202 if (state->m_RfAgcPol)
2203 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2205 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2206 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2210 /* Set speed (using complementary reduction value) */
2211 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2215 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2216 data |= (~(pAgcCfg->speed <<
2217 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2218 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2220 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2225 pIfAgcSettings = &state->m_dvbtIfAgcCfg;
2226 else if (IsQAM(state))
2227 pIfAgcSettings = &state->m_qamIfAgcCfg;
2229 pIfAgcSettings = &state->m_atvIfAgcCfg;
2230 if (pIfAgcSettings == NULL)
2233 /* Set TOP, only if IF-AGC is in AUTO mode */
2234 if (pIfAgcSettings->ctrlMode == DRXK_AGC_CTRL_AUTO)
2235 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->top);
2239 /* Cut-Off current */
2240 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, pAgcCfg->cutOffCurrent);
2244 /* Max. output level */
2245 status = write16(state, SCU_RAM_AGC_RF_MAX__A, pAgcCfg->maxOutputLevel);
2251 case DRXK_AGC_CTRL_USER:
2252 /* Enable RF AGC DAC */
2253 status = read16(state, IQM_AF_STDBY__A, &data);
2256 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2257 status = write16(state, IQM_AF_STDBY__A, data);
2261 /* Disable SCU RF AGC loop */
2262 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2265 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2266 if (state->m_RfAgcPol)
2267 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2269 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2270 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2274 /* SCU c.o.c. to 0, enabling full control range */
2275 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2279 /* Write value to output pin */
2280 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, pAgcCfg->outputLevel);
2285 case DRXK_AGC_CTRL_OFF:
2286 /* Disable RF AGC DAC */
2287 status = read16(state, IQM_AF_STDBY__A, &data);
2290 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2291 status = write16(state, IQM_AF_STDBY__A, data);
2295 /* Disable SCU RF AGC loop */
2296 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2299 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2300 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2308 } /* switch (agcsettings->ctrlMode) */
2313 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2315 static int SetAgcIf(struct drxk_state *state,
2316 struct SCfgAgc *pAgcCfg, bool isDTV)
2320 struct SCfgAgc *pRfAgcSettings;
2325 switch (pAgcCfg->ctrlMode) {
2326 case DRXK_AGC_CTRL_AUTO:
2328 /* Enable IF AGC DAC */
2329 status = read16(state, IQM_AF_STDBY__A, &data);
2332 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2333 status = write16(state, IQM_AF_STDBY__A, data);
2337 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2341 /* Enable SCU IF AGC loop */
2342 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2345 if (state->m_IfAgcPol)
2346 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2348 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2349 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2353 /* Set speed (using complementary reduction value) */
2354 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2357 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2358 data |= (~(pAgcCfg->speed <<
2359 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2360 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2362 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2367 pRfAgcSettings = &state->m_qamRfAgcCfg;
2369 pRfAgcSettings = &state->m_atvRfAgcCfg;
2370 if (pRfAgcSettings == NULL)
2373 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pRfAgcSettings->top);
2378 case DRXK_AGC_CTRL_USER:
2380 /* Enable IF AGC DAC */
2381 status = read16(state, IQM_AF_STDBY__A, &data);
2384 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2385 status = write16(state, IQM_AF_STDBY__A, data);
2389 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2393 /* Disable SCU IF AGC loop */
2394 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2397 if (state->m_IfAgcPol)
2398 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2400 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2401 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2405 /* Write value to output pin */
2406 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->outputLevel);
2411 case DRXK_AGC_CTRL_OFF:
2413 /* Disable If AGC DAC */
2414 status = read16(state, IQM_AF_STDBY__A, &data);
2417 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2418 status = write16(state, IQM_AF_STDBY__A, data);
2422 /* Disable SCU IF AGC loop */
2423 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2426 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2427 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2431 } /* switch (agcSettingsIf->ctrlMode) */
2433 /* always set the top to support
2434 configurations without if-loop */
2435 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, pAgcCfg->top);
2444 static int ReadIFAgc(struct drxk_state *state, u32 *pValue)
2447 int status = read16(state, IQM_AF_AGC_IF__A, &agcDacLvl);
2455 if (agcDacLvl > DRXK_AGC_DAC_OFFSET)
2456 Level = agcDacLvl - DRXK_AGC_DAC_OFFSET;
2458 *pValue = (14000 - Level) / 4;
2465 static int GetQAMSignalToNoise(struct drxk_state *state,
2466 s32 *pSignalToNoise)
2473 /* MER calculation */
2474 u16 qamSlErrPower = 0; /* accum. error between
2475 raw and sliced symbols */
2476 u32 qamSlSigPower = 0; /* used for MER, depends of
2477 QAM constellation */
2478 u32 qamSlMer = 0; /* QAM MER */
2480 /* get the register value needed for MER */
2481 status = read16(state, QAM_SL_ERR_POWER__A, &qamSlErrPower);
2485 switch (state->param.u.qam.modulation) {
2487 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2490 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2493 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2496 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2500 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2504 if (qamSlErrPower > 0) {
2505 qamSlMer = Log10Times100(qamSlSigPower) -
2506 Log10Times100((u32) qamSlErrPower);
2508 *pSignalToNoise = qamSlMer;
2513 static int GetDVBTSignalToNoise(struct drxk_state *state,
2514 s32 *pSignalToNoise)
2519 u32 EqRegTdSqrErrI = 0;
2520 u32 EqRegTdSqrErrQ = 0;
2521 u16 EqRegTdSqrErrExp = 0;
2522 u16 EqRegTdTpsPwrOfs = 0;
2523 u16 EqRegTdReqSmbCnt = 0;
2530 u16 transmissionParams = 0;
2534 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A, &EqRegTdTpsPwrOfs);
2537 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A, &EqRegTdReqSmbCnt);
2540 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A, &EqRegTdSqrErrExp);
2543 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A, ®Data);
2546 /* Extend SQR_ERR_I operational range */
2547 EqRegTdSqrErrI = (u32) regData;
2548 if ((EqRegTdSqrErrExp > 11) &&
2549 (EqRegTdSqrErrI < 0x00000FFFUL)) {
2550 EqRegTdSqrErrI += 0x00010000UL;
2552 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®Data);
2555 /* Extend SQR_ERR_Q operational range */
2556 EqRegTdSqrErrQ = (u32) regData;
2557 if ((EqRegTdSqrErrExp > 11) &&
2558 (EqRegTdSqrErrQ < 0x00000FFFUL))
2559 EqRegTdSqrErrQ += 0x00010000UL;
2561 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A, &transmissionParams);
2565 /* Check input data for MER */
2567 /* MER calculation (in 0.1 dB) without math.h */
2568 if ((EqRegTdTpsPwrOfs == 0) || (EqRegTdReqSmbCnt == 0))
2570 else if ((EqRegTdSqrErrI + EqRegTdSqrErrQ) == 0) {
2571 /* No error at all, this must be the HW reset value
2572 * Apparently no first measurement yet
2576 SqrErrIQ = (EqRegTdSqrErrI + EqRegTdSqrErrQ) <<
2578 if ((transmissionParams &
2579 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2580 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2585 /* IMER = 100 * log10 (x)
2586 where x = (EqRegTdTpsPwrOfs^2 *
2587 EqRegTdReqSmbCnt * tpsCnt)/SqrErrIQ
2590 where a = 100 * log10 (EqRegTdTpsPwrOfs^2)
2591 b = 100 * log10 (EqRegTdReqSmbCnt * tpsCnt)
2592 c = 100 * log10 (SqrErrIQ)
2595 /* log(x) x = 9bits * 9bits->18 bits */
2596 a = Log10Times100(EqRegTdTpsPwrOfs *
2598 /* log(x) x = 16bits * 7bits->23 bits */
2599 b = Log10Times100(EqRegTdReqSmbCnt * tpsCnt);
2600 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2601 c = Log10Times100(SqrErrIQ);
2604 /* No negative MER, clip to zero */
2610 *pSignalToNoise = iMER;
2616 static int GetSignalToNoise(struct drxk_state *state, s32 *pSignalToNoise)
2620 *pSignalToNoise = 0;
2621 switch (state->m_OperationMode) {
2623 return GetDVBTSignalToNoise(state, pSignalToNoise);
2626 return GetQAMSignalToNoise(state, pSignalToNoise);
2634 static int GetDVBTQuality(struct drxk_state *state, s32 *pQuality)
2636 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2641 static s32 QE_SN[] = {
2647 108, /* 16-QAM 1/2 */
2648 131, /* 16-QAM 2/3 */
2649 146, /* 16-QAM 3/4 */
2650 156, /* 16-QAM 5/6 */
2651 160, /* 16-QAM 7/8 */
2652 165, /* 64-QAM 1/2 */
2653 187, /* 64-QAM 2/3 */
2654 202, /* 64-QAM 3/4 */
2655 216, /* 64-QAM 5/6 */
2656 225, /* 64-QAM 7/8 */
2662 s32 SignalToNoise = 0;
2663 u16 Constellation = 0;
2665 u32 SignalToNoiseRel;
2668 status = GetDVBTSignalToNoise(state, &SignalToNoise);
2671 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A, &Constellation);
2674 Constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2676 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A, &CodeRate);
2679 CodeRate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2681 if (Constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2682 CodeRate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2684 SignalToNoiseRel = SignalToNoise -
2685 QE_SN[Constellation * 5 + CodeRate];
2688 if (SignalToNoiseRel < -70)
2690 else if (SignalToNoiseRel < 30)
2691 *pQuality = ((SignalToNoiseRel + 70) *
2694 *pQuality = BERQuality;
2699 static int GetDVBCQuality(struct drxk_state *state, s32 *pQuality)
2707 u32 SignalToNoise = 0;
2708 u32 BERQuality = 100;
2709 u32 SignalToNoiseRel = 0;
2711 status = GetQAMSignalToNoise(state, &SignalToNoise);
2715 switch (state->param.u.qam.modulation) {
2717 SignalToNoiseRel = SignalToNoise - 200;
2720 SignalToNoiseRel = SignalToNoise - 230;
2721 break; /* Not in NorDig */
2723 SignalToNoiseRel = SignalToNoise - 260;
2726 SignalToNoiseRel = SignalToNoise - 290;
2730 SignalToNoiseRel = SignalToNoise - 320;
2734 if (SignalToNoiseRel < -70)
2736 else if (SignalToNoiseRel < 30)
2737 *pQuality = ((SignalToNoiseRel + 70) *
2740 *pQuality = BERQuality;
2746 static int GetQuality(struct drxk_state *state, s32 *pQuality)
2750 switch (state->m_OperationMode) {
2752 return GetDVBTQuality(state, pQuality);
2754 return GetDVBCQuality(state, pQuality);
2763 /* Free data ram in SIO HI */
2764 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2765 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2767 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2768 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2769 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2770 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2772 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2773 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2774 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2776 static int ConfigureI2CBridge(struct drxk_state *state, bool bEnableBridge)
2782 if (state->m_DrxkState == DRXK_UNINITIALIZED)
2784 if (state->m_DrxkState == DRXK_POWERED_DOWN)
2788 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2791 if (bEnableBridge) {
2792 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2796 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2801 status = HI_Command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, 0);
2808 static int SetPreSaw(struct drxk_state *state,
2809 struct SCfgPreSaw *pPreSawCfg)
2815 if ((pPreSawCfg == NULL)
2816 || (pPreSawCfg->reference > IQM_AF_PDREF__M))
2819 status = write16(state, IQM_AF_PDREF__A, pPreSawCfg->reference);
2823 static int BLDirectCmd(struct drxk_state *state, u32 targetAddr,
2824 u16 romOffset, u16 nrOfElements, u32 timeOut)
2827 u16 offset = (u16) ((targetAddr >> 0) & 0x00FFFF);
2828 u16 blockbank = (u16) ((targetAddr >> 16) & 0x000FFF);
2834 mutex_lock(&state->mutex);
2836 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2839 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2842 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2845 status = write16(state, SIO_BL_SRC_ADDR__A, romOffset);
2848 status = write16(state, SIO_BL_SRC_LEN__A, nrOfElements);
2851 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2855 end = jiffies + msecs_to_jiffies(timeOut);
2857 status = read16(state, SIO_BL_STATUS__A, &blStatus);
2860 } while ((blStatus == 0x1) && time_is_after_jiffies(end));
2861 if (blStatus == 0x1) {
2862 printk(KERN_ERR "drxk: SIO not ready\n");
2863 mutex_unlock(&state->mutex);
2867 mutex_unlock(&state->mutex);
2872 static int ADCSyncMeasurement(struct drxk_state *state, u16 *count)
2880 /* Start measurement */
2881 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2884 status = write16(state, IQM_AF_START_LOCK__A, 1);
2889 status = read16(state, IQM_AF_PHASE0__A, &data);
2893 *count = *count + 1;
2894 status = read16(state, IQM_AF_PHASE1__A, &data);
2898 *count = *count + 1;
2899 status = read16(state, IQM_AF_PHASE2__A, &data);
2903 *count = *count + 1;
2908 static int ADCSynchronization(struct drxk_state *state)
2916 status = ADCSyncMeasurement(state, &count);
2921 /* Try sampling on a diffrent edge */
2924 status = read16(state, IQM_AF_CLKNEG__A, &clkNeg);
2927 if ((clkNeg | IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2928 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2929 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2931 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2933 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2935 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2937 status = write16(state, IQM_AF_CLKNEG__A, clkNeg);
2940 status = ADCSyncMeasurement(state, &count);
2951 static int SetFrequencyShifter(struct drxk_state *state,
2952 u16 intermediateFreqkHz,
2953 s32 tunerFreqOffset, bool isDTV)
2955 bool selectPosImage = false;
2956 u32 rfFreqResidual = tunerFreqOffset;
2957 u32 fmFrequencyShift = 0;
2958 bool tunerMirror = !state->m_bMirrorFreqSpect;
2963 u32 samplingFrequency = (u32) (state->m_sysClockFreq / 3);
2970 Program frequency shifter
2971 No need to account for mirroring on RF
2974 if ((state->m_OperationMode == OM_QAM_ITU_A) ||
2975 (state->m_OperationMode == OM_QAM_ITU_C) ||
2976 (state->m_OperationMode == OM_DVBT))
2977 selectPosImage = true;
2979 selectPosImage = false;
2982 /* tuner doesn't mirror */
2983 ifFreqActual = intermediateFreqkHz +
2984 rfFreqResidual + fmFrequencyShift;
2987 ifFreqActual = intermediateFreqkHz -
2988 rfFreqResidual - fmFrequencyShift;
2989 if (ifFreqActual > samplingFrequency / 2) {
2991 adcFreq = samplingFrequency - ifFreqActual;
2994 /* adc doesn't mirror */
2995 adcFreq = ifFreqActual;
2999 frequencyShift = adcFreq;
3000 imageToSelect = state->m_rfmirror ^ tunerMirror ^
3001 adcFlip ^ selectPosImage;
3002 state->m_IqmFsRateOfs =
3003 Frac28a((frequencyShift), samplingFrequency);
3006 state->m_IqmFsRateOfs = ~state->m_IqmFsRateOfs + 1;
3008 /* Program frequency shifter with tuner offset compensation */
3009 /* frequencyShift += tunerFreqOffset; TODO */
3010 status = write32(state, IQM_FS_RATE_OFS_LO__A,
3011 state->m_IqmFsRateOfs);
3015 static int InitAGC(struct drxk_state *state, bool isDTV)
3018 u16 ingainTgtMin = 0;
3019 u16 ingainTgtMax = 0;
3027 u16 kiInnergainMin = 0;
3028 u16 ifIaccuHiTgt = 0;
3029 u16 ifIaccuHiTgtMin = 0;
3030 u16 ifIaccuHiTgtMax = 0;
3032 u16 fastClpCtrlDelay = 0;
3033 u16 clpCtrlMode = 0;
3039 /* Common settings */
3041 ifIaccuHiTgtMin = 2047;
3046 /* Standard specific settings */
3048 clpDirTo = (u16) -9;
3051 snsDirTo = (u16) -9;
3052 kiInnergainMin = (u16) -1030;
3059 ifIaccuHiTgtMax = 0x2380;
3060 ifIaccuHiTgt = 0x2380;
3061 ingainTgtMin = 0x0511;
3063 ingainTgtMax = 5119;
3065 state->m_qamIfAgcCfg.FastClipCtrlDelay;
3067 ifIaccuHiTgtMax = 0x1200;
3068 ifIaccuHiTgt = 0x1200;
3069 ingainTgtMin = 13424;
3071 ingainTgtMax = 30000;
3073 state->m_dvbtIfAgcCfg.FastClipCtrlDelay;
3075 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, fastClpCtrlDelay);
3079 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clpCtrlMode);
3082 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingainTgt);
3085 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingainTgtMin);
3088 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingainTgtMax);
3091 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, ifIaccuHiTgtMin);
3094 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, ifIaccuHiTgtMax);
3097 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3100 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3103 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3106 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3109 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clpSumMax);
3112 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, snsSumMax);
3116 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, kiInnergainMin);
3119 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, ifIaccuHiTgt);
3122 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clpCyclen);
3126 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3129 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3132 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3136 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3139 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clpSumMin);
3142 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, snsSumMin);
3145 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clpDirTo);
3148 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, snsDirTo);
3151 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3154 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3157 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3160 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3163 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3166 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3169 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3172 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3175 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3178 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3181 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3184 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3187 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3190 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3194 /* Initialize inner-loop KI gain factors */
3195 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3200 data &= ~SCU_RAM_AGC_KI_RF__M;
3201 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3202 data &= ~SCU_RAM_AGC_KI_IF__M;
3203 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3205 status = write16(state, SCU_RAM_AGC_KI__A, data);
3212 static int DVBTQAMGetAccPktErr(struct drxk_state *state, u16 *packetErr)
3218 if (packetErr == NULL) {
3219 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3223 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, packetErr);
3231 static int DVBTScCommand(struct drxk_state *state,
3232 u16 cmd, u16 subcmd,
3233 u16 param0, u16 param1, u16 param2,
3234 u16 param3, u16 param4)
3243 status = read16(state, OFDM_SC_COMM_EXEC__A, &scExec);
3245 /* SC is not running */
3249 /* Wait until sc is ready to receive command */
3253 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3255 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3256 if (retryCnt >= DRXK_MAX_RETRIES)
3258 /* Write sub-command */
3260 /* All commands using sub-cmd */
3261 case OFDM_SC_RA_RAM_CMD_PROC_START:
3262 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3263 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3265 write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3270 } /* switch (cmd->cmd) */
3272 /* Write needed parameters and the command */
3274 /* All commands using 5 parameters */
3275 /* All commands using 4 parameters */
3276 /* All commands using 3 parameters */
3277 /* All commands using 2 parameters */
3278 case OFDM_SC_RA_RAM_CMD_PROC_START:
3279 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3280 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3282 write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3283 /* All commands using 1 parameters */
3284 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3285 case OFDM_SC_RA_RAM_CMD_USER_IO:
3287 write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3288 /* All commands using 0 parameters */
3289 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3290 case OFDM_SC_RA_RAM_CMD_NULL:
3292 status = write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3295 /* Unknown command */
3297 } /* switch (cmd->cmd) */
3299 /* Wait until sc is ready processing command */
3303 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3305 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3306 if (retryCnt >= DRXK_MAX_RETRIES)
3309 /* Check for illegal cmd */
3310 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &errCode);
3311 if (errCode == 0xFFFF) {
3312 /* illegal command */
3316 /* Retreive results parameters from SC */
3318 /* All commands yielding 5 results */
3319 /* All commands yielding 4 results */
3320 /* All commands yielding 3 results */
3321 /* All commands yielding 2 results */
3322 /* All commands yielding 1 result */
3323 case OFDM_SC_RA_RAM_CMD_USER_IO:
3324 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3326 read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3327 /* All commands yielding 0 results */
3328 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3329 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3330 case OFDM_SC_RA_RAM_CMD_PROC_START:
3331 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3332 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3333 case OFDM_SC_RA_RAM_CMD_NULL:
3336 /* Unknown command */
3339 } /* switch (cmd->cmd) */
3343 static int PowerUpDVBT(struct drxk_state *state)
3345 enum DRXPowerMode powerMode = DRX_POWER_UP;
3350 status = CtrlPowerMode(state, &powerMode);
3357 static int DVBTCtrlSetIncEnable(struct drxk_state *state, bool *enabled)
3362 if (*enabled == true)
3363 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3365 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3370 #define DEFAULT_FR_THRES_8K 4000
3371 static int DVBTCtrlSetFrEnable(struct drxk_state *state, bool *enabled)
3377 if (*enabled == true) {
3378 /* write mask to 1 */
3379 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3380 DEFAULT_FR_THRES_8K);
3382 /* write mask to 0 */
3383 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3389 static int DVBTCtrlSetEchoThreshold(struct drxk_state *state,
3390 struct DRXKCfgDvbtEchoThres_t *echoThres)
3397 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3401 switch (echoThres->fftMode) {
3402 case DRX_FFTMODE_2K:
3403 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3405 ((echoThres->threshold <<
3406 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3407 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3409 case DRX_FFTMODE_8K:
3410 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3412 ((echoThres->threshold <<
3413 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3414 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3421 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3429 static int DVBTCtrlSetSqiSpeed(struct drxk_state *state,
3430 enum DRXKCfgDvbtSqiSpeed *speed)
3437 case DRXK_DVBT_SQI_SPEED_FAST:
3438 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3439 case DRXK_DVBT_SQI_SPEED_SLOW:
3444 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3449 /*============================================================================*/
3452 * \brief Activate DVBT specific presets
3453 * \param demod instance of demodulator.
3454 * \return DRXStatus_t.
3456 * Called in DVBTSetStandard
3459 static int DVBTActivatePresets(struct drxk_state *state)
3463 struct DRXKCfgDvbtEchoThres_t echoThres2k = { 0, DRX_FFTMODE_2K };
3464 struct DRXKCfgDvbtEchoThres_t echoThres8k = { 0, DRX_FFTMODE_8K };
3468 bool setincenable = false;
3469 bool setfrenable = true;
3470 status = DVBTCtrlSetIncEnable(state, &setincenable);
3473 status = DVBTCtrlSetFrEnable(state, &setfrenable);
3476 status = DVBTCtrlSetEchoThreshold(state, &echoThres2k);
3479 status = DVBTCtrlSetEchoThreshold(state, &echoThres8k);
3482 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, state->m_dvbtIfAgcCfg.IngainTgtMax);
3490 /*============================================================================*/
3493 * \brief Initialize channelswitch-independent settings for DVBT.
3494 * \param demod instance of demodulator.
3495 * \return DRXStatus_t.
3497 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3498 * the DVB-T taps from the drxk_filters.h are used.
3500 static int SetDVBTStandard(struct drxk_state *state,
3501 enum OperationMode oMode)
3511 /* added antenna switch */
3512 SwitchAntennaToDVBT(state);
3513 /* send OFDM reset command */
3514 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
3518 /* send OFDM setenv command */
3519 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 0, NULL, 1, &cmdResult);
3523 /* reset datapath for OFDM, processors first */
3524 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3527 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3530 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3535 /* synchronize on ofdstate->m_festart */
3536 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3539 /* window size for clipping ADC detection */
3540 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3543 /* window size for for sense pre-SAW detection */
3544 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3547 /* sense threshold for sense pre-SAW detection */
3548 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3551 status = SetIqmAf(state, true);
3555 status = write16(state, IQM_AF_AGC_RF__A, 0);
3559 /* Impulse noise cruncher setup */
3560 status = write16(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3563 status = write16(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3566 status = write16(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3570 status = write16(state, IQM_RC_STRETCH__A, 16);
3573 status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3576 status = write16(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3579 status = write16(state, IQM_CF_SCALE__A, 1600);
3582 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3586 /* virtual clipping threshold for clipping ADC detection */
3587 status = write16(state, IQM_AF_CLP_TH__A, 448);
3590 status = write16(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3594 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3598 status = write16(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3601 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3604 /* enable power measurement interrupt */
3605 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3608 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3612 /* IQM will not be reset from here, sync ADC and update/init AGC */
3613 status = ADCSynchronization(state);
3616 status = SetPreSaw(state, &state->m_dvbtPreSawCfg);
3620 /* Halt SCU to enable safe non-atomic accesses */
3621 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3625 status = SetAgcRf(state, &state->m_dvbtRfAgcCfg, true);
3628 status = SetAgcIf(state, &state->m_dvbtIfAgcCfg, true);
3632 /* Set Noise Estimation notch width and enable DC fix */
3633 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3636 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3637 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3641 /* Activate SCU to enable SCU commands */
3642 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3646 if (!state->m_DRXK_A3_ROM_CODE) {
3647 /* AGCInit() is not done for DVBT, so set agcFastClipCtrlDelay */
3648 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, state->m_dvbtIfAgcCfg.FastClipCtrlDelay);
3654 #ifdef COMPILE_FOR_NONRT
3655 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3658 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3664 status = write16(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3669 #ifdef COMPILE_FOR_NONRT
3670 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3674 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3678 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3682 /* Setup MPEG bus */
3683 status = MPEGTSDtoSetup(state, OM_DVBT);
3686 /* Set DVBT Presets */
3687 status = DVBTActivatePresets(state);
3694 printk(KERN_ERR "drxk: %s status - %08x\n", __func__, status);
3699 /*============================================================================*/
3701 * \brief Start dvbt demodulating for channel.
3702 * \param demod instance of demodulator.
3703 * \return DRXStatus_t.
3705 static int DVBTStart(struct drxk_state *state)
3709 /* DRXKOfdmScCmd_t scCmd; */
3712 /* Start correct processes to get in lock */
3713 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3715 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3716 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0, OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1, 0, 0, 0);
3720 status = MPEGTSStart(state);
3723 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3731 /*============================================================================*/
3734 * \brief Set up dvbt demodulator for channel.
3735 * \param demod instance of demodulator.
3736 * \return DRXStatus_t.
3737 * // original DVBTSetChannel()
3739 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
3740 s32 tunerFreqOffset)
3743 u16 transmissionParams = 0;
3744 u16 operationMode = 0;
3745 u32 iqmRcRateOfs = 0;
3751 /* printk(KERN_DEBUG "drxk: %s IF =%d, TFO = %d\n", __func__, IntermediateFreqkHz, tunerFreqOffset); */
3753 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
3757 /* Halt SCU to enable safe non-atomic accesses */
3758 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3762 /* Stop processors */
3763 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3766 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3770 /* Mandatory fix, always stop CP, required to set spl offset back to
3771 hardware default (is set to 0 by ucode during pilot detection */
3772 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3776 /*== Write channel settings to device =====================================*/
3779 switch (state->param.u.ofdm.transmission_mode) {
3780 case TRANSMISSION_MODE_AUTO:
3782 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3783 /* fall through , try first guess DRX_FFTMODE_8K */
3784 case TRANSMISSION_MODE_8K:
3785 transmissionParams |=
3786 OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3788 case TRANSMISSION_MODE_2K:
3789 transmissionParams |=
3790 OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3795 switch (state->param.u.ofdm.guard_interval) {
3797 case GUARD_INTERVAL_AUTO:
3798 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3799 /* fall through , try first guess DRX_GUARD_1DIV4 */
3800 case GUARD_INTERVAL_1_4:
3801 transmissionParams |=
3802 OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3804 case GUARD_INTERVAL_1_32:
3805 transmissionParams |=
3806 OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3808 case GUARD_INTERVAL_1_16:
3809 transmissionParams |=
3810 OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3812 case GUARD_INTERVAL_1_8:
3813 transmissionParams |=
3814 OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3819 switch (state->param.u.ofdm.hierarchy_information) {
3820 case HIERARCHY_AUTO:
3821 case HIERARCHY_NONE:
3823 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3824 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3825 /* transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3828 transmissionParams |=
3829 OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3832 transmissionParams |=
3833 OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3836 transmissionParams |=
3837 OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3843 switch (state->param.u.ofdm.constellation) {
3846 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3847 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3849 transmissionParams |=
3850 OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3853 transmissionParams |=
3854 OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3857 transmissionParams |=
3858 OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3862 /* No hierachical channels support in BDA */
3863 /* Priority (only for hierarchical channels) */
3864 switch (channel->priority) {
3865 case DRX_PRIORITY_LOW:
3866 transmissionParams |=
3867 OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3868 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3869 OFDM_EC_SB_PRIOR_LO);
3871 case DRX_PRIORITY_HIGH:
3872 transmissionParams |=
3873 OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3874 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3875 OFDM_EC_SB_PRIOR_HI));
3877 case DRX_PRIORITY_UNKNOWN: /* fall through */
3879 return DRX_STS_INVALID_ARG;
3883 /* Set Priorty high */
3884 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3885 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3891 switch (state->param.u.ofdm.code_rate_HP) {
3894 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3895 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3897 transmissionParams |=
3898 OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3901 transmissionParams |=
3902 OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3905 transmissionParams |=
3906 OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3909 transmissionParams |=
3910 OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3913 transmissionParams |=
3914 OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3918 /* SAW filter selection: normaly not necesarry, but if wanted
3919 the application can select a SAW filter via the driver by using UIOs */
3920 /* First determine real bandwidth (Hz) */
3921 /* Also set delay for impulse noise cruncher */
3922 /* Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is changed
3923 by SC for fix for some 8K,1/8 guard but is restored by InitEC and ResetEC
3925 switch (state->param.u.ofdm.bandwidth) {
3926 case BANDWIDTH_AUTO:
3927 case BANDWIDTH_8_MHZ:
3928 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3929 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3052);
3932 /* cochannel protection for PAL 8 MHz */
3933 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 7);
3936 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 7);
3939 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 7);
3942 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3946 case BANDWIDTH_7_MHZ:
3947 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3948 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3491);
3951 /* cochannel protection for PAL 7 MHz */
3952 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 8);
3955 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 8);
3958 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 4);
3961 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3965 case BANDWIDTH_6_MHZ:
3966 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3967 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 4073);
3970 /* cochannel protection for NTSC 6 MHz */
3971 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 19);
3974 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 19);
3977 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 14);
3980 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3988 if (iqmRcRateOfs == 0) {
3989 /* Now compute IQM_RC_RATE_OFS
3990 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
3992 ((SysFreq / BandWidth) * (2^21)) - (2^23)
3994 /* (SysFreq / BandWidth) * (2^28) */
3995 /* assert (MAX(sysClk)/MIN(bandwidth) < 16)
3996 => assert(MAX(sysClk) < 16*MIN(bandwidth))
3997 => assert(109714272 > 48000000) = true so Frac 28 can be used */
3998 iqmRcRateOfs = Frac28a((u32)
3999 ((state->m_sysClockFreq *
4000 1000) / 3), bandwidth);
4001 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
4002 if ((iqmRcRateOfs & 0x7fL) >= 0x40)
4003 iqmRcRateOfs += 0x80L;
4004 iqmRcRateOfs = iqmRcRateOfs >> 7;
4005 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
4006 iqmRcRateOfs = iqmRcRateOfs - (1 << 23);
4010 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
4011 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
4012 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRateOfs);
4016 /* Bandwidth setting done */
4019 status = DVBTSetFrequencyShift(demod, channel, tunerOffset);
4023 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
4027 /*== Start SC, write channel settings to SC ===============================*/
4029 /* Activate SCU to enable SCU commands */
4030 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4034 /* Enable SC after setting all other parameters */
4035 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4038 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4043 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
4047 /* Write SC parameter registers, set all AUTO flags in operation mode */
4048 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4049 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4050 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4051 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4052 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4054 DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4055 0, transmissionParams, param1, 0, 0, 0);
4056 if (!state->m_DRXK_A3_ROM_CODE)
4057 status = DVBTCtrlSetSqiSpeed(state, &state->m_sqiSpeed);
4067 /*============================================================================*/
4070 * \brief Retreive lock status .
4071 * \param demod Pointer to demodulator instance.
4072 * \param lockStat Pointer to lock status structure.
4073 * \return DRXStatus_t.
4076 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus)
4079 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4080 OFDM_SC_RA_RAM_LOCK_FEC__M);
4081 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4082 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4084 u16 ScRaRamLock = 0;
4090 /* Check if SC is running */
4091 status = read16(state, OFDM_SC_COMM_EXEC__A, &ScCommExec);
4092 if (ScCommExec == OFDM_SC_COMM_EXEC_STOP) {
4093 /* SC not active; return DRX_NOT_LOCKED */
4094 *pLockStatus = NOT_LOCKED;
4098 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &ScRaRamLock);
4100 if ((ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask)
4101 *pLockStatus = MPEG_LOCK;
4102 else if ((ScRaRamLock & fec_lock_mask) == fec_lock_mask)
4103 *pLockStatus = FEC_LOCK;
4104 else if ((ScRaRamLock & demod_lock_mask) == demod_lock_mask)
4105 *pLockStatus = DEMOD_LOCK;
4106 else if (ScRaRamLock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4107 *pLockStatus = NEVER_LOCK;
4109 *pLockStatus = NOT_LOCKED;
4114 static int PowerUpQAM(struct drxk_state *state)
4116 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
4121 status = CtrlPowerMode(state, &powerMode);
4131 /** Power Down QAM */
4132 static int PowerDownQAM(struct drxk_state *state)
4140 status = read16(state, SCU_COMM_EXEC__A, &data);
4143 if (data == SCU_COMM_EXEC_ACTIVE) {
4148 /* stop all comstate->m_exec */
4149 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4152 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
4157 status = SetIqmAf(state, false);
4165 /*============================================================================*/
4168 * \brief Setup of the QAM Measurement intervals for signal quality
4169 * \param demod instance of demod.
4170 * \param constellation current constellation.
4171 * \return DRXStatus_t.
4174 * Take into account that for certain settings the errorcounters can overflow.
4175 * The implementation does not check this.
4178 static int SetQAMMeasurement(struct drxk_state *state,
4179 enum EDrxkConstellation constellation,
4182 u32 fecBitsDesired = 0; /* BER accounting period */
4183 u32 fecRsPeriodTotal = 0; /* Total period */
4184 u16 fecRsPrescale = 0; /* ReedSolomon Measurement Prescale */
4185 u16 fecRsPeriod = 0; /* Value for corresponding I2C register */
4193 /* fecBitsDesired = symbolRate [kHz] *
4195 (constellation + 1) *
4199 switch (constellation) {
4200 case DRX_CONSTELLATION_QAM16:
4201 fecBitsDesired = 4 * symbolRate;
4203 case DRX_CONSTELLATION_QAM32:
4204 fecBitsDesired = 5 * symbolRate;
4206 case DRX_CONSTELLATION_QAM64:
4207 fecBitsDesired = 6 * symbolRate;
4209 case DRX_CONSTELLATION_QAM128:
4210 fecBitsDesired = 7 * symbolRate;
4212 case DRX_CONSTELLATION_QAM256:
4213 fecBitsDesired = 8 * symbolRate;
4222 fecBitsDesired /= 1000; /* symbolRate [Hz] -> symbolRate [kHz] */
4223 fecBitsDesired *= 500; /* meas. period [ms] */
4225 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4226 /* fecRsPeriodTotal = fecBitsDesired / 1632 */
4227 fecRsPeriodTotal = (fecBitsDesired / 1632UL) + 1; /* roughly ceil */
4229 /* fecRsPeriodTotal = fecRsPrescale * fecRsPeriod */
4230 fecRsPrescale = 1 + (u16) (fecRsPeriodTotal >> 16);
4231 if (fecRsPrescale == 0) {
4232 /* Divide by zero (though impossible) */
4239 ((u16) fecRsPeriodTotal +
4240 (fecRsPrescale >> 1)) / fecRsPrescale;
4242 /* write corresponding registers */
4243 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fecRsPeriod);
4246 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, fecRsPrescale);
4249 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fecRsPeriod);
4256 printk(KERN_ERR "drxk: %s: status - %08x\n", __func__, status);
4261 static int SetQAM16(struct drxk_state *state)
4267 /* QAM Equalizer Setup */
4269 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4272 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4275 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4278 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4281 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4284 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4287 /* Decision Feedback Equalizer */
4288 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4291 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4294 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4297 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4300 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4303 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4307 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4310 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4313 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4317 /* QAM Slicer Settings */
4318 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM16);
4322 /* QAM Loop Controller Coeficients */
4323 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4326 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4329 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4332 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4335 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4338 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4341 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4344 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4348 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4351 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4354 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4357 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4360 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4363 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4366 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4369 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4372 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4375 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4378 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4381 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4386 /* QAM State Machine (FSM) Thresholds */
4388 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4391 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4394 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4397 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4400 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4403 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4407 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4410 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4413 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4418 /* QAM FSM Tracking Parameters */
4420 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4423 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4426 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4429 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4432 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4435 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4438 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4446 /*============================================================================*/
4449 * \brief QAM32 specific setup
4450 * \param demod instance of demod.
4451 * \return DRXStatus_t.
4453 static int SetQAM32(struct drxk_state *state)
4459 /* QAM Equalizer Setup */
4461 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4464 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4467 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4470 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4473 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4476 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4480 /* Decision Feedback Equalizer */
4481 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4484 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4487 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4490 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4493 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4496 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4500 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4503 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4506 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4510 /* QAM Slicer Settings */
4512 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM32);
4517 /* QAM Loop Controller Coeficients */
4519 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4522 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4525 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4528 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4531 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4534 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4537 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4540 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4544 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4547 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4550 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4553 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4556 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4559 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4562 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4565 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4568 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4571 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4574 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4577 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4582 /* QAM State Machine (FSM) Thresholds */
4584 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4587 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4590 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4593 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4596 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4599 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4603 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4606 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4609 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4614 /* QAM FSM Tracking Parameters */
4616 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4619 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4622 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4625 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4628 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4631 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4634 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4642 /*============================================================================*/
4645 * \brief QAM64 specific setup
4646 * \param demod instance of demod.
4647 * \return DRXStatus_t.
4649 static int SetQAM64(struct drxk_state *state)
4655 /* QAM Equalizer Setup */
4657 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4660 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4663 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4666 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4669 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4672 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4676 /* Decision Feedback Equalizer */
4677 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4680 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4683 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4686 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4689 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4692 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4696 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4699 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4702 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4706 /* QAM Slicer Settings */
4707 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM64);
4712 /* QAM Loop Controller Coeficients */
4714 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4717 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4720 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4723 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4726 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4729 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4732 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4735 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4739 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4742 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4745 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4748 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4751 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4754 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4757 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4760 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4763 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4766 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4769 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4772 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4777 /* QAM State Machine (FSM) Thresholds */
4779 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4782 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4785 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4788 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4791 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4794 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4798 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4801 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4804 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4809 /* QAM FSM Tracking Parameters */
4811 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4814 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4817 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4820 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4823 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4826 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4829 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4837 /*============================================================================*/
4840 * \brief QAM128 specific setup
4841 * \param demod: instance of demod.
4842 * \return DRXStatus_t.
4844 static int SetQAM128(struct drxk_state *state)
4850 /* QAM Equalizer Setup */
4852 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4855 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4858 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4861 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4864 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4867 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4871 /* Decision Feedback Equalizer */
4872 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4875 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4878 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4881 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4884 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4887 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4891 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4894 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4897 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4902 /* QAM Slicer Settings */
4904 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM128);
4909 /* QAM Loop Controller Coeficients */
4911 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4914 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4917 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4920 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4923 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4926 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4929 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4932 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4936 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4939 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4942 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4945 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4948 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4951 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4954 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4957 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4960 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4963 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4966 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4969 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4974 /* QAM State Machine (FSM) Thresholds */
4976 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4979 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4982 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4985 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4988 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
4991 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4995 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4998 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
5002 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5006 /* QAM FSM Tracking Parameters */
5008 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5011 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
5014 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
5017 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
5020 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
5023 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5026 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5034 /*============================================================================*/
5037 * \brief QAM256 specific setup
5038 * \param demod: instance of demod.
5039 * \return DRXStatus_t.
5041 static int SetQAM256(struct drxk_state *state)
5047 /* QAM Equalizer Setup */
5049 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5052 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5055 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5058 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5061 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5064 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5068 /* Decision Feedback Equalizer */
5069 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5072 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5075 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5078 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5081 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5084 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5088 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5091 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5094 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5098 /* QAM Slicer Settings */
5100 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM256);
5105 /* QAM Loop Controller Coeficients */
5107 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5110 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5113 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5116 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5119 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5122 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5125 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5128 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5132 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5135 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5138 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5141 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5144 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5147 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5150 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5153 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5156 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5159 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5162 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5165 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5170 /* QAM State Machine (FSM) Thresholds */
5172 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5175 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5178 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5181 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5184 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5187 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5191 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5194 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5197 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5202 /* QAM FSM Tracking Parameters */
5204 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5207 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5210 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5213 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5216 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5219 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5222 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5231 /*============================================================================*/
5233 * \brief Reset QAM block.
5234 * \param demod: instance of demod.
5235 * \param channel: pointer to channel data.
5236 * \return DRXStatus_t.
5238 static int QAMResetQAM(struct drxk_state *state)
5245 /* Stop QAM comstate->m_exec */
5246 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5250 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
5255 /* All done, all OK */
5259 /*============================================================================*/
5262 * \brief Set QAM symbolrate.
5263 * \param demod: instance of demod.
5264 * \param channel: pointer to channel data.
5265 * \return DRXStatus_t.
5267 static int QAMSetSymbolrate(struct drxk_state *state)
5269 u32 adcFrequency = 0;
5278 /* Select & calculate correct IQM rate */
5279 adcFrequency = (state->m_sysClockFreq * 1000) / 3;
5281 /* printk(KERN_DEBUG "drxk: SR %d\n", state->param.u.qam.symbol_rate); */
5282 if (state->param.u.qam.symbol_rate <= 1188750)
5284 else if (state->param.u.qam.symbol_rate <= 2377500)
5286 else if (state->param.u.qam.symbol_rate <= 4755000)
5288 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5293 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5295 symbFreq = state->param.u.qam.symbol_rate * (1 << ratesel);
5296 if (symbFreq == 0) {
5297 /* Divide by zero */
5300 iqmRcRate = (adcFrequency / symbFreq) * (1 << 21) +
5301 (Frac28a((adcFrequency % symbFreq), symbFreq) >> 7) -
5303 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRate);
5306 state->m_iqmRcRate = iqmRcRate;
5308 LcSymbFreq = round (.125 * symbolrate / adcFreq * (1<<15))
5310 symbFreq = state->param.u.qam.symbol_rate;
5311 if (adcFrequency == 0) {
5312 /* Divide by zero */
5315 lcSymbRate = (symbFreq / adcFrequency) * (1 << 12) +
5316 (Frac28a((symbFreq % adcFrequency), adcFrequency) >>
5318 if (lcSymbRate > 511)
5320 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lcSymbRate);
5328 /*============================================================================*/
5331 * \brief Get QAM lock status.
5332 * \param demod: instance of demod.
5333 * \param channel: pointer to channel data.
5334 * \return DRXStatus_t.
5337 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus)
5340 u16 Result[2] = { 0, 0 };
5345 SCU_RAM_COMMAND_STANDARD_QAM |
5346 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5349 printk(KERN_ERR "drxk: %s status = %08x\n", __func__, status);
5351 if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5352 /* 0x0000 NOT LOCKED */
5353 *pLockStatus = NOT_LOCKED;
5354 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5355 /* 0x4000 DEMOD LOCKED */
5356 *pLockStatus = DEMOD_LOCK;
5357 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5358 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5359 *pLockStatus = MPEG_LOCK;
5361 /* 0xC000 NEVER LOCKED */
5362 /* (system will never be able to lock to the signal) */
5363 /* TODO: check this, intermediate & standard specific lock states are not
5364 taken into account here */
5365 *pLockStatus = NEVER_LOCK;
5370 #define QAM_MIRROR__M 0x03
5371 #define QAM_MIRROR_NORMAL 0x00
5372 #define QAM_MIRRORED 0x01
5373 #define QAM_MIRROR_AUTO_ON 0x02
5374 #define QAM_LOCKRANGE__M 0x10
5375 #define QAM_LOCKRANGE_NORMAL 0x10
5377 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
5378 s32 tunerFreqOffset)
5382 u16 setEnvParameters[5];
5383 u16 setParamParameters[4] = { 0, 0, 0, 0 };
5389 STEP 1: reset demodulator
5390 resets FEC DI and FEC RS
5392 resets SCU variables
5394 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5397 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5400 status = QAMResetQAM(state);
5405 STEP 2: configure demodulator
5407 -set params; resets IQM,QAM,FEC HW; initializes some SCU variables
5409 status = QAMSetSymbolrate(state);
5413 /* Env parameters */
5414 setEnvParameters[2] = QAM_TOP_ANNEX_A; /* Annex */
5415 if (state->m_OperationMode == OM_QAM_ITU_C)
5416 setEnvParameters[2] = QAM_TOP_ANNEX_C; /* Annex */
5417 setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
5418 /* check for LOCKRANGE Extented */
5419 /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
5423 switch (state->param.u.qam.modulation) {
5425 state->m_Constellation = DRX_CONSTELLATION_QAM256;
5429 state->m_Constellation = DRX_CONSTELLATION_QAM64;
5432 state->m_Constellation = DRX_CONSTELLATION_QAM16;
5435 state->m_Constellation = DRX_CONSTELLATION_QAM32;
5438 state->m_Constellation = DRX_CONSTELLATION_QAM128;
5447 setParamParameters[0] = state->m_Constellation; /* constellation */
5448 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5450 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 4, setParamParameters, 1, &cmdResult);
5455 /* STEP 3: enable the system in a mode where the ADC provides valid signal
5456 setup constellation independent registers */
5458 status = SetFrequency (channel, tunerFreqOffset));
5462 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
5466 /* Setup BER measurement */
5467 status = SetQAMMeasurement(state, state->m_Constellation, state->param.u. qam.symbol_rate);
5471 /* Reset default values */
5472 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5475 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5479 /* Reset default LC values */
5480 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5483 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5486 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5489 status = write16(state, QAM_LC_MODE__A, 7);
5493 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5496 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5499 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5502 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5505 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5508 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5511 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5514 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5517 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5520 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5523 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5526 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5529 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5532 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5535 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5539 /* Mirroring, QAM-block starting point not inverted */
5540 status = write16(state, QAM_SY_SP_INV__A, QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5544 /* Halt SCU to enable safe non-atomic accesses */
5545 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5549 /* STEP 4: constellation specific setup */
5550 switch (state->param.u.qam.modulation) {
5552 status = SetQAM16(state);
5557 status = SetQAM32(state);
5563 status = SetQAM64(state);
5568 status = SetQAM128(state);
5573 status = SetQAM256(state);
5581 /* Activate SCU to enable SCU commands */
5582 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5587 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5588 /* extAttr->currentChannel.constellation = channel->constellation; */
5589 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5590 status = MPEGTSDtoSetup(state, state->m_OperationMode);
5594 /* Start processes */
5595 status = MPEGTSStart(state);
5598 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5601 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5604 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5608 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5609 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
5613 /* update global DRXK data container */
5614 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5616 /* All done, all OK */
5620 printk(KERN_ERR "drxk: %s %d\n", __func__, status);
5625 static int SetQAMStandard(struct drxk_state *state,
5626 enum OperationMode oMode)
5628 #ifdef DRXK_QAM_TAPS
5629 #define DRXK_QAMA_TAPS_SELECT
5630 #include "drxk_filters.h"
5631 #undef DRXK_QAMA_TAPS_SELECT
5638 /* added antenna switch */
5639 SwitchAntennaToQAM(state);
5641 /* Ensure correct power-up mode */
5642 status = PowerUpQAM(state);
5645 /* Reset QAM block */
5646 status = QAMResetQAM(state);
5652 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5655 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5659 /* Upload IQM Channel Filter settings by
5660 boot loader from ROM table */
5663 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5668 status = BLDirectCmd(state, IQM_CF_TAP_RE0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5671 status = BLDirectCmd(state, IQM_CF_TAP_IM0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5682 status = write16(state, IQM_CF_OUT_ENA__A, (1 << IQM_CF_OUT_ENA_QAM__B));
5685 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5688 status = write16(state, IQM_CF_MIDTAP__A, ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5692 status = write16(state, IQM_RC_STRETCH__A, 21);
5695 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5698 status = write16(state, IQM_AF_CLP_TH__A, 448);
5701 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5704 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5708 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5711 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5714 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5717 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5721 /* IQM Impulse Noise Processing Unit */
5722 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5725 status = write16(state, IQM_CF_DATATH__A, 1000);
5728 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5731 status = write16(state, IQM_CF_DET_LCT__A, 0);
5734 status = write16(state, IQM_CF_WND_LEN__A, 1);
5737 status = write16(state, IQM_CF_PKDTH__A, 1);
5740 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5744 /* turn on IQMAF. Must be done before setAgc**() */
5745 status = SetIqmAf(state, true);
5748 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5752 /* IQM will not be reset from here, sync ADC and update/init AGC */
5753 status = ADCSynchronization(state);
5757 /* Set the FSM step period */
5758 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5762 /* Halt SCU to enable safe non-atomic accesses */
5763 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5767 /* No more resets of the IQM, current standard correctly set =>
5768 now AGCs can be configured. */
5770 status = InitAGC(state, true);
5773 status = SetPreSaw(state, &(state->m_qamPreSawCfg));
5777 /* Configure AGC's */
5778 status = SetAgcRf(state, &(state->m_qamRfAgcCfg), true);
5781 status = SetAgcIf(state, &(state->m_qamIfAgcCfg), true);
5785 /* Activate SCU to enable SCU commands */
5786 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5793 static int WriteGPIO(struct drxk_state *state)
5800 /* stop lock indicator process */
5801 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5805 /* Write magic word to enable pdr reg write */
5806 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5810 if (state->m_hasSAWSW) {
5811 /* write to io pad configuration register - output mode */
5812 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5816 /* use corresponding bit in io data output registar */
5817 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5820 if (state->m_GPIO == 0)
5821 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5823 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5824 /* write back to io data output register */
5825 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5830 /* Write magic word to disable pdr reg write */
5831 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5838 static int SwitchAntennaToQAM(struct drxk_state *state)
5843 if (state->m_AntennaSwitchDVBTDVBC != 0) {
5844 if (state->m_GPIO != state->m_AntennaDVBC) {
5845 state->m_GPIO = state->m_AntennaDVBC;
5846 status = WriteGPIO(state);
5852 static int SwitchAntennaToDVBT(struct drxk_state *state)
5857 if (state->m_AntennaSwitchDVBTDVBC != 0) {
5858 if (state->m_GPIO != state->m_AntennaDVBT) {
5859 state->m_GPIO = state->m_AntennaDVBT;
5860 status = WriteGPIO(state);
5867 static int PowerDownDevice(struct drxk_state *state)
5869 /* Power down to requested mode */
5870 /* Backup some register settings */
5871 /* Set pins with possible pull-ups connected to them in input mode */
5872 /* Analog power down */
5873 /* ADC power down */
5874 /* Power down device */
5879 if (state->m_bPDownOpenBridge) {
5880 /* Open I2C bridge before power down of DRXK */
5881 status = ConfigureI2CBridge(state, true);
5886 status = DVBTEnableOFDMTokenRing(state, false);
5890 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_CLOCK);
5893 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5896 state->m_HICfgCtrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
5897 status = HI_CfgCommand(state);
5908 static int load_microcode(struct drxk_state *state, const char *mc_name)
5910 const struct firmware *fw = NULL;
5915 err = request_firmware(&fw, mc_name, state->i2c->dev.parent);
5918 "drxk: Could not load firmware file %s.\n", mc_name);
5920 "drxk: Copy %s to your hotplug directory!\n", mc_name);
5923 err = DownloadMicrocode(state, fw->data, fw->size);
5924 release_firmware(fw);
5928 static int init_drxk(struct drxk_state *state)
5931 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
5935 if ((state->m_DrxkState == DRXK_UNINITIALIZED)) {
5937 status = PowerUpDevice(state);
5940 status = DRXX_Open(state);
5943 /* Soft reset of OFDM-, sys- and osc-clockdomain */
5944 status = write16(state, SIO_CC_SOFT_RST__A, SIO_CC_SOFT_RST_OFDM__M | SIO_CC_SOFT_RST_SYS__M | SIO_CC_SOFT_RST_OSC__M);
5947 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5950 /* TODO is this needed, if yes how much delay in worst case scenario */
5952 state->m_DRXK_A3_PATCH_CODE = true;
5953 status = GetDeviceCapabilities(state);
5957 /* Bridge delay, uses oscilator clock */
5958 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
5959 /* SDA brdige delay */
5960 state->m_HICfgBridgeDelay =
5961 (u16) ((state->m_oscClockFreq / 1000) *
5962 HI_I2C_BRIDGE_DELAY) / 1000;
5964 if (state->m_HICfgBridgeDelay >
5965 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
5966 state->m_HICfgBridgeDelay =
5967 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
5969 /* SCL bridge delay, same as SDA for now */
5970 state->m_HICfgBridgeDelay +=
5971 state->m_HICfgBridgeDelay <<
5972 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
5974 status = InitHI(state);
5977 /* disable various processes */
5979 if (!(state->m_DRXK_A1_ROM_CODE)
5980 && !(state->m_DRXK_A2_ROM_CODE))
5983 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5988 /* disable MPEG port */
5989 status = MPEGTSDisable(state);
5993 /* Stop AUD and SCU */
5994 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
5997 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
6001 /* enable token-ring bus through OFDM block for possible ucode upload */
6002 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6006 /* include boot loader section */
6007 status = write16(state, SIO_BL_COMM_EXEC__A, SIO_BL_COMM_EXEC_ACTIVE);
6010 status = BLChainCmd(state, 0, 6, 100);
6014 if (!state->microcode_name)
6015 load_microcode(state, "drxk_a3.mc");
6017 load_microcode(state, state->microcode_name);
6019 /* disable token-ring bus through OFDM block for possible ucode upload */
6020 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6024 /* Run SCU for a little while to initialize microcode version numbers */
6025 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6028 status = DRXX_Open(state);
6031 /* added for test */
6034 powerMode = DRXK_POWER_DOWN_OFDM;
6035 status = CtrlPowerMode(state, &powerMode);
6039 /* Stamp driver version number in SCU data RAM in BCD code
6040 Done to enable field application engineers to retreive drxdriver version
6041 via I2C from SCU RAM.
6042 Not using SCU command interface for SCU register access since no
6043 microcode may be present.
6046 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6047 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6048 ((DRXK_VERSION_MAJOR % 10) << 4) +
6049 (DRXK_VERSION_MINOR % 10);
6050 status = write16(state, SCU_RAM_DRIVER_VER_HI__A, driverVersion);
6054 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6055 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6056 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6057 (DRXK_VERSION_PATCH % 10);
6058 status = write16(state, SCU_RAM_DRIVER_VER_LO__A, driverVersion);
6062 printk(KERN_INFO "DRXK driver version %d.%d.%d\n",
6063 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6064 DRXK_VERSION_PATCH);
6066 /* Dirty fix of default values for ROM/PATCH microcode
6067 Dirty because this fix makes it impossible to setup suitable values
6068 before calling DRX_Open. This solution requires changes to RF AGC speed
6069 to be done via the CTRL function after calling DRX_Open */
6071 /* m_dvbtRfAgcCfg.speed = 3; */
6073 /* Reset driver debug flags to 0 */
6074 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6079 NOTE: No more full FEC resets allowed afterwards!! */
6080 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6083 /* MPEGTS functions are still the same */
6084 status = MPEGTSDtoInit(state);
6087 status = MPEGTSStop(state);
6090 status = MPEGTSConfigurePolarity(state);
6093 status = MPEGTSConfigurePins(state, state->m_enableMPEGOutput);
6096 /* added: configure GPIO */
6097 status = WriteGPIO(state);
6101 state->m_DrxkState = DRXK_STOPPED;
6103 if (state->m_bPowerDown) {
6104 status = PowerDownDevice(state);
6107 state->m_DrxkState = DRXK_POWERED_DOWN;
6109 state->m_DrxkState = DRXK_STOPPED;
6116 static void drxk_c_release(struct dvb_frontend *fe)
6118 struct drxk_state *state = fe->demodulator_priv;
6124 static int drxk_c_init(struct dvb_frontend *fe)
6126 struct drxk_state *state = fe->demodulator_priv;
6129 if (mutex_trylock(&state->ctlock) == 0)
6131 SetOperationMode(state, OM_QAM_ITU_A);
6135 static int drxk_c_sleep(struct dvb_frontend *fe)
6137 struct drxk_state *state = fe->demodulator_priv;
6141 mutex_unlock(&state->ctlock);
6145 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6147 struct drxk_state *state = fe->demodulator_priv;
6149 dprintk(1, "%s\n", enable ? "enable" : "disable");
6150 return ConfigureI2CBridge(state, enable ? true : false);
6153 static int drxk_set_parameters(struct dvb_frontend *fe,
6154 struct dvb_frontend_parameters *p)
6156 struct drxk_state *state = fe->demodulator_priv;
6160 if (fe->ops.i2c_gate_ctrl)
6161 fe->ops.i2c_gate_ctrl(fe, 1);
6162 if (fe->ops.tuner_ops.set_params)
6163 fe->ops.tuner_ops.set_params(fe, p);
6164 if (fe->ops.i2c_gate_ctrl)
6165 fe->ops.i2c_gate_ctrl(fe, 0);
6167 fe->ops.tuner_ops.get_frequency(fe, &IF);
6168 Start(state, 0, IF);
6170 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6175 static int drxk_c_get_frontend(struct dvb_frontend *fe,
6176 struct dvb_frontend_parameters *p)
6182 static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6184 struct drxk_state *state = fe->demodulator_priv;
6189 GetLockStatus(state, &stat, 0);
6190 if (stat == MPEG_LOCK)
6192 if (stat == FEC_LOCK)
6194 if (stat == DEMOD_LOCK)
6199 static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber)
6207 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6210 struct drxk_state *state = fe->demodulator_priv;
6214 ReadIFAgc(state, &val);
6215 *strength = val & 0xffff;
6219 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6221 struct drxk_state *state = fe->demodulator_priv;
6225 GetSignalToNoise(state, &snr2);
6226 *snr = snr2 & 0xffff;
6230 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6232 struct drxk_state *state = fe->demodulator_priv;
6236 DVBTQAMGetAccPktErr(state, &err);
6237 *ucblocks = (u32) err;
6241 static int drxk_c_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6245 sets->min_delay_ms = 3000;
6246 sets->max_drift = 0;
6247 sets->step_size = 0;
6251 static void drxk_t_release(struct dvb_frontend *fe)
6254 struct drxk_state *state = fe->demodulator_priv;
6261 static int drxk_t_init(struct dvb_frontend *fe)
6263 struct drxk_state *state = fe->demodulator_priv;
6266 if (mutex_trylock(&state->ctlock) == 0)
6268 SetOperationMode(state, OM_DVBT);
6272 static int drxk_t_sleep(struct dvb_frontend *fe)
6274 struct drxk_state *state = fe->demodulator_priv;
6277 mutex_unlock(&state->ctlock);
6281 static int drxk_t_get_frontend(struct dvb_frontend *fe,
6282 struct dvb_frontend_parameters *p)
6289 static struct dvb_frontend_ops drxk_c_ops = {
6291 .name = "DRXK DVB-C",
6293 .frequency_stepsize = 62500,
6294 .frequency_min = 47000000,
6295 .frequency_max = 862000000,
6296 .symbol_rate_min = 870000,
6297 .symbol_rate_max = 11700000,
6298 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6299 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO},
6300 .release = drxk_c_release,
6301 .init = drxk_c_init,
6302 .sleep = drxk_c_sleep,
6303 .i2c_gate_ctrl = drxk_gate_ctrl,
6305 .set_frontend = drxk_set_parameters,
6306 .get_frontend = drxk_c_get_frontend,
6307 .get_tune_settings = drxk_c_get_tune_settings,
6309 .read_status = drxk_read_status,
6310 .read_ber = drxk_read_ber,
6311 .read_signal_strength = drxk_read_signal_strength,
6312 .read_snr = drxk_read_snr,
6313 .read_ucblocks = drxk_read_ucblocks,
6316 static struct dvb_frontend_ops drxk_t_ops = {
6318 .name = "DRXK DVB-T",
6320 .frequency_min = 47125000,
6321 .frequency_max = 865000000,
6322 .frequency_stepsize = 166667,
6323 .frequency_tolerance = 0,
6324 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
6325 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
6327 FE_CAN_QAM_16 | FE_CAN_QAM_64 |
6329 FE_CAN_TRANSMISSION_MODE_AUTO |
6330 FE_CAN_GUARD_INTERVAL_AUTO |
6331 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_MUTE_TS},
6332 .release = drxk_t_release,
6333 .init = drxk_t_init,
6334 .sleep = drxk_t_sleep,
6335 .i2c_gate_ctrl = drxk_gate_ctrl,
6337 .set_frontend = drxk_set_parameters,
6338 .get_frontend = drxk_t_get_frontend,
6340 .read_status = drxk_read_status,
6341 .read_ber = drxk_read_ber,
6342 .read_signal_strength = drxk_read_signal_strength,
6343 .read_snr = drxk_read_snr,
6344 .read_ucblocks = drxk_read_ucblocks,
6347 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6348 struct i2c_adapter *i2c,
6349 struct dvb_frontend **fe_t)
6351 struct drxk_state *state = NULL;
6352 u8 adr = config->adr;
6355 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6360 state->demod_address = adr;
6361 state->single_master = config->single_master;
6362 state->microcode_name = config->microcode_name;
6364 mutex_init(&state->mutex);
6365 mutex_init(&state->ctlock);
6367 memcpy(&state->c_frontend.ops, &drxk_c_ops,
6368 sizeof(struct dvb_frontend_ops));
6369 memcpy(&state->t_frontend.ops, &drxk_t_ops,
6370 sizeof(struct dvb_frontend_ops));
6371 state->c_frontend.demodulator_priv = state;
6372 state->t_frontend.demodulator_priv = state;
6375 if (init_drxk(state) < 0)
6377 *fe_t = &state->t_frontend;
6378 return &state->c_frontend;
6381 printk(KERN_ERR "drxk: not found\n");
6385 EXPORT_SYMBOL(drxk_attach);
6387 MODULE_DESCRIPTION("DRX-K driver");
6388 MODULE_AUTHOR("Ralph Metzler");
6389 MODULE_LICENSE("GPL");