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] = { {.addr = adr, .flags = 0,
347 .buf = msg, .len = len},
348 {.addr = adr, .flags = I2C_M_RD,
349 .buf = answ, .len = alen}
354 for (i = 0; i < len; i++)
355 printk(KERN_CONT " %02x", msg[i]);
356 printk(KERN_CONT "\n");
358 if (i2c_transfer(adap, msgs, 2) != 2) {
360 printk(KERN_CONT ": ERROR!\n");
362 printk(KERN_ERR "drxk: i2c read error at addr 0x%02x\n", adr);
367 printk(KERN_CONT ": Read ");
368 for (i = 0; i < len; i++)
369 printk(KERN_CONT " %02x", msg[i]);
370 printk(KERN_CONT "\n");
375 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
377 u8 adr = state->demod_address, mm1[4], mm2[2], len;
381 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
382 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
383 mm1[1] = ((reg >> 16) & 0xFF);
384 mm1[2] = ((reg >> 24) & 0xFF) | flags;
385 mm1[3] = ((reg >> 7) & 0xFF);
388 mm1[0] = ((reg << 1) & 0xFF);
389 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
392 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
393 if (i2c_read(state->i2c, adr, mm1, len, mm2, 2) < 0)
396 *data = mm2[0] | (mm2[1] << 8);
401 static int read16(struct drxk_state *state, u32 reg, u16 *data)
403 return read16_flags(state, reg, data, 0);
406 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
408 u8 adr = state->demod_address, mm1[4], mm2[4], len;
412 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
413 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
414 mm1[1] = ((reg >> 16) & 0xFF);
415 mm1[2] = ((reg >> 24) & 0xFF) | flags;
416 mm1[3] = ((reg >> 7) & 0xFF);
419 mm1[0] = ((reg << 1) & 0xFF);
420 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
423 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
424 if (i2c_read(state->i2c, adr, mm1, len, mm2, 4) < 0)
427 *data = mm2[0] | (mm2[1] << 8) |
428 (mm2[2] << 16) | (mm2[3] << 24);
433 static int read32(struct drxk_state *state, u32 reg, u32 *data)
435 return read32_flags(state, reg, data, 0);
438 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
440 u8 adr = state->demod_address, mm[6], len;
444 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
445 mm[0] = (((reg << 1) & 0xFF) | 0x01);
446 mm[1] = ((reg >> 16) & 0xFF);
447 mm[2] = ((reg >> 24) & 0xFF) | flags;
448 mm[3] = ((reg >> 7) & 0xFF);
451 mm[0] = ((reg << 1) & 0xFF);
452 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
455 mm[len] = data & 0xff;
456 mm[len + 1] = (data >> 8) & 0xff;
458 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
459 if (i2c_write(state->i2c, adr, mm, len + 2) < 0)
464 static int write16(struct drxk_state *state, u32 reg, u16 data)
466 return write16_flags(state, reg, data, 0);
469 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
471 u8 adr = state->demod_address, mm[8], len;
475 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
476 mm[0] = (((reg << 1) & 0xFF) | 0x01);
477 mm[1] = ((reg >> 16) & 0xFF);
478 mm[2] = ((reg >> 24) & 0xFF) | flags;
479 mm[3] = ((reg >> 7) & 0xFF);
482 mm[0] = ((reg << 1) & 0xFF);
483 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
486 mm[len] = data & 0xff;
487 mm[len + 1] = (data >> 8) & 0xff;
488 mm[len + 2] = (data >> 16) & 0xff;
489 mm[len + 3] = (data >> 24) & 0xff;
490 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
491 if (i2c_write(state->i2c, adr, mm, len + 4) < 0)
496 static int write32(struct drxk_state *state, u32 reg, u32 data)
498 return write32_flags(state, reg, data, 0);
501 static int write_block(struct drxk_state *state, u32 Address,
502 const int BlockSize, const u8 pBlock[])
504 int status = 0, BlkSize = BlockSize;
509 while (BlkSize > 0) {
510 int Chunk = BlkSize > state->m_ChunkSize ?
511 state->m_ChunkSize : BlkSize;
512 u8 *AdrBuf = &state->Chunk[0];
515 if (DRXDAP_FASI_LONG_FORMAT(Address) || (Flags != 0)) {
516 AdrBuf[0] = (((Address << 1) & 0xFF) | 0x01);
517 AdrBuf[1] = ((Address >> 16) & 0xFF);
518 AdrBuf[2] = ((Address >> 24) & 0xFF);
519 AdrBuf[3] = ((Address >> 7) & 0xFF);
522 if (Chunk == state->m_ChunkSize)
525 AdrBuf[0] = ((Address << 1) & 0xFF);
526 AdrBuf[1] = (((Address >> 16) & 0x0F) |
527 ((Address >> 18) & 0xF0));
530 memcpy(&state->Chunk[AdrLength], pBlock, Chunk);
531 dprintk(2, "(0x%08x, 0x%02x)\n", Address, Flags);
535 for (i = 0; i < Chunk; i++)
536 printk(KERN_CONT " %02x", pBlock[i]);
537 printk(KERN_CONT "\n");
539 status = i2c_write(state->i2c, state->demod_address,
540 &state->Chunk[0], Chunk + AdrLength);
542 printk(KERN_ERR "drxk: %s: i2c write error at addr 0x%02x\n",
547 Address += (Chunk >> 1);
553 #ifndef DRXK_MAX_RETRIES_POWERUP
554 #define DRXK_MAX_RETRIES_POWERUP 20
557 int PowerUpDevice(struct drxk_state *state)
565 status = i2c_read1(state->i2c, state->demod_address, &data);
569 if (i2c_write(state->i2c,
570 state->demod_address, &data, 1) < 0)
571 printk(KERN_ERR "drxk: powerup failed\n");
574 } while (i2c_read1(state->i2c,
575 state->demod_address, &data) < 0 &&
576 (retryCount < DRXK_MAX_RETRIES_POWERUP));
577 if (retryCount >= DRXK_MAX_RETRIES_POWERUP)
580 /* Make sure all clk domains are active */
581 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
584 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
587 /* Enable pll lock tests */
588 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
591 state->m_currentPowerMode = DRX_POWER_UP;
597 static int init_state(struct drxk_state *state)
599 u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
600 u32 ulVSBIfAgcOutputLevel = 0;
601 u32 ulVSBIfAgcMinLevel = 0;
602 u32 ulVSBIfAgcMaxLevel = 0x7FFF;
603 u32 ulVSBIfAgcSpeed = 3;
605 u32 ulVSBRfAgcMode = DRXK_AGC_CTRL_AUTO;
606 u32 ulVSBRfAgcOutputLevel = 0;
607 u32 ulVSBRfAgcMinLevel = 0;
608 u32 ulVSBRfAgcMaxLevel = 0x7FFF;
609 u32 ulVSBRfAgcSpeed = 3;
610 u32 ulVSBRfAgcTop = 9500;
611 u32 ulVSBRfAgcCutOffCurrent = 4000;
613 u32 ulATVIfAgcMode = DRXK_AGC_CTRL_AUTO;
614 u32 ulATVIfAgcOutputLevel = 0;
615 u32 ulATVIfAgcMinLevel = 0;
616 u32 ulATVIfAgcMaxLevel = 0;
617 u32 ulATVIfAgcSpeed = 3;
619 u32 ulATVRfAgcMode = DRXK_AGC_CTRL_OFF;
620 u32 ulATVRfAgcOutputLevel = 0;
621 u32 ulATVRfAgcMinLevel = 0;
622 u32 ulATVRfAgcMaxLevel = 0;
623 u32 ulATVRfAgcTop = 9500;
624 u32 ulATVRfAgcCutOffCurrent = 4000;
625 u32 ulATVRfAgcSpeed = 3;
627 u32 ulQual83 = DEFAULT_MER_83;
628 u32 ulQual93 = DEFAULT_MER_93;
630 u32 ulDVBTStaticTSClock = 1;
631 u32 ulDVBCStaticTSClock = 1;
633 u32 ulMpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
634 u32 ulDemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
636 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
637 /* io_pad_cfg_mode output mode is drive always */
638 /* io_pad_cfg_drive is set to power 2 (23 mA) */
639 u32 ulGPIOCfg = 0x0113;
641 u32 ulSerialMode = 1;
642 u32 ulInvertTSClock = 0;
643 u32 ulTSDataStrength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
644 u32 ulTSClockkStrength = DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH;
645 u32 ulDVBTBitrate = 50000000;
646 u32 ulDVBCBitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
648 u32 ulInsertRSByte = 0;
653 u32 ulAntennaDVBT = 1;
654 u32 ulAntennaDVBC = 0;
655 u32 ulAntennaSwitchDVBTDVBC = 0;
659 state->m_hasLNA = false;
660 state->m_hasDVBT = false;
661 state->m_hasDVBC = false;
662 state->m_hasATV = false;
663 state->m_hasOOB = false;
664 state->m_hasAudio = false;
666 state->m_ChunkSize = 124;
668 state->m_oscClockFreq = 0;
669 state->m_smartAntInverted = false;
670 state->m_bPDownOpenBridge = false;
672 /* real system clock frequency in kHz */
673 state->m_sysClockFreq = 151875;
674 /* Timing div, 250ns/Psys */
675 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
676 state->m_HICfgTimingDiv = ((state->m_sysClockFreq / 1000) *
677 HI_I2C_DELAY) / 1000;
679 if (state->m_HICfgTimingDiv > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
680 state->m_HICfgTimingDiv = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
681 state->m_HICfgWakeUpKey = (state->demod_address << 1);
682 /* port/bridge/power down ctrl */
683 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
685 state->m_bPowerDown = (ulPowerDown != 0);
687 state->m_DRXK_A1_PATCH_CODE = false;
688 state->m_DRXK_A1_ROM_CODE = false;
689 state->m_DRXK_A2_ROM_CODE = false;
690 state->m_DRXK_A3_ROM_CODE = false;
691 state->m_DRXK_A2_PATCH_CODE = false;
692 state->m_DRXK_A3_PATCH_CODE = false;
694 /* Init AGC and PGA parameters */
696 state->m_vsbIfAgcCfg.ctrlMode = (ulVSBIfAgcMode);
697 state->m_vsbIfAgcCfg.outputLevel = (ulVSBIfAgcOutputLevel);
698 state->m_vsbIfAgcCfg.minOutputLevel = (ulVSBIfAgcMinLevel);
699 state->m_vsbIfAgcCfg.maxOutputLevel = (ulVSBIfAgcMaxLevel);
700 state->m_vsbIfAgcCfg.speed = (ulVSBIfAgcSpeed);
701 state->m_vsbPgaCfg = 140;
704 state->m_vsbRfAgcCfg.ctrlMode = (ulVSBRfAgcMode);
705 state->m_vsbRfAgcCfg.outputLevel = (ulVSBRfAgcOutputLevel);
706 state->m_vsbRfAgcCfg.minOutputLevel = (ulVSBRfAgcMinLevel);
707 state->m_vsbRfAgcCfg.maxOutputLevel = (ulVSBRfAgcMaxLevel);
708 state->m_vsbRfAgcCfg.speed = (ulVSBRfAgcSpeed);
709 state->m_vsbRfAgcCfg.top = (ulVSBRfAgcTop);
710 state->m_vsbRfAgcCfg.cutOffCurrent = (ulVSBRfAgcCutOffCurrent);
711 state->m_vsbPreSawCfg.reference = 0x07;
712 state->m_vsbPreSawCfg.usePreSaw = true;
714 state->m_Quality83percent = DEFAULT_MER_83;
715 state->m_Quality93percent = DEFAULT_MER_93;
716 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
717 state->m_Quality83percent = ulQual83;
718 state->m_Quality93percent = ulQual93;
722 state->m_atvIfAgcCfg.ctrlMode = (ulATVIfAgcMode);
723 state->m_atvIfAgcCfg.outputLevel = (ulATVIfAgcOutputLevel);
724 state->m_atvIfAgcCfg.minOutputLevel = (ulATVIfAgcMinLevel);
725 state->m_atvIfAgcCfg.maxOutputLevel = (ulATVIfAgcMaxLevel);
726 state->m_atvIfAgcCfg.speed = (ulATVIfAgcSpeed);
729 state->m_atvRfAgcCfg.ctrlMode = (ulATVRfAgcMode);
730 state->m_atvRfAgcCfg.outputLevel = (ulATVRfAgcOutputLevel);
731 state->m_atvRfAgcCfg.minOutputLevel = (ulATVRfAgcMinLevel);
732 state->m_atvRfAgcCfg.maxOutputLevel = (ulATVRfAgcMaxLevel);
733 state->m_atvRfAgcCfg.speed = (ulATVRfAgcSpeed);
734 state->m_atvRfAgcCfg.top = (ulATVRfAgcTop);
735 state->m_atvRfAgcCfg.cutOffCurrent = (ulATVRfAgcCutOffCurrent);
736 state->m_atvPreSawCfg.reference = 0x04;
737 state->m_atvPreSawCfg.usePreSaw = true;
741 state->m_dvbtRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
742 state->m_dvbtRfAgcCfg.outputLevel = 0;
743 state->m_dvbtRfAgcCfg.minOutputLevel = 0;
744 state->m_dvbtRfAgcCfg.maxOutputLevel = 0xFFFF;
745 state->m_dvbtRfAgcCfg.top = 0x2100;
746 state->m_dvbtRfAgcCfg.cutOffCurrent = 4000;
747 state->m_dvbtRfAgcCfg.speed = 1;
751 state->m_dvbtIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
752 state->m_dvbtIfAgcCfg.outputLevel = 0;
753 state->m_dvbtIfAgcCfg.minOutputLevel = 0;
754 state->m_dvbtIfAgcCfg.maxOutputLevel = 9000;
755 state->m_dvbtIfAgcCfg.top = 13424;
756 state->m_dvbtIfAgcCfg.cutOffCurrent = 0;
757 state->m_dvbtIfAgcCfg.speed = 3;
758 state->m_dvbtIfAgcCfg.FastClipCtrlDelay = 30;
759 state->m_dvbtIfAgcCfg.IngainTgtMax = 30000;
760 /* state->m_dvbtPgaCfg = 140; */
762 state->m_dvbtPreSawCfg.reference = 4;
763 state->m_dvbtPreSawCfg.usePreSaw = false;
766 state->m_qamRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
767 state->m_qamRfAgcCfg.outputLevel = 0;
768 state->m_qamRfAgcCfg.minOutputLevel = 6023;
769 state->m_qamRfAgcCfg.maxOutputLevel = 27000;
770 state->m_qamRfAgcCfg.top = 0x2380;
771 state->m_qamRfAgcCfg.cutOffCurrent = 4000;
772 state->m_qamRfAgcCfg.speed = 3;
775 state->m_qamIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
776 state->m_qamIfAgcCfg.outputLevel = 0;
777 state->m_qamIfAgcCfg.minOutputLevel = 0;
778 state->m_qamIfAgcCfg.maxOutputLevel = 9000;
779 state->m_qamIfAgcCfg.top = 0x0511;
780 state->m_qamIfAgcCfg.cutOffCurrent = 0;
781 state->m_qamIfAgcCfg.speed = 3;
782 state->m_qamIfAgcCfg.IngainTgtMax = 5119;
783 state->m_qamIfAgcCfg.FastClipCtrlDelay = 50;
785 state->m_qamPgaCfg = 140;
786 state->m_qamPreSawCfg.reference = 4;
787 state->m_qamPreSawCfg.usePreSaw = false;
789 state->m_OperationMode = OM_NONE;
790 state->m_DrxkState = DRXK_UNINITIALIZED;
792 /* MPEG output configuration */
793 state->m_enableMPEGOutput = true; /* If TRUE; enable MPEG ouput */
794 state->m_insertRSByte = false; /* If TRUE; insert RS byte */
795 state->m_enableParallel = true; /* If TRUE;
796 parallel out otherwise serial */
797 state->m_invertDATA = false; /* If TRUE; invert DATA signals */
798 state->m_invertERR = false; /* If TRUE; invert ERR signal */
799 state->m_invertSTR = false; /* If TRUE; invert STR signals */
800 state->m_invertVAL = false; /* If TRUE; invert VAL signals */
801 state->m_invertCLK = (ulInvertTSClock != 0); /* If TRUE; invert CLK signals */
802 state->m_DVBTStaticCLK = (ulDVBTStaticTSClock != 0);
803 state->m_DVBCStaticCLK = (ulDVBCStaticTSClock != 0);
804 /* If TRUE; static MPEG clockrate will be used;
805 otherwise clockrate will adapt to the bitrate of the TS */
807 state->m_DVBTBitrate = ulDVBTBitrate;
808 state->m_DVBCBitrate = ulDVBCBitrate;
810 state->m_TSDataStrength = (ulTSDataStrength & 0x07);
811 state->m_TSClockkStrength = (ulTSClockkStrength & 0x07);
813 /* Maximum bitrate in b/s in case static clockrate is selected */
814 state->m_mpegTsStaticBitrate = 19392658;
815 state->m_disableTEIhandling = false;
818 state->m_insertRSByte = true;
820 state->m_MpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
821 if (ulMpegLockTimeOut < 10000)
822 state->m_MpegLockTimeOut = ulMpegLockTimeOut;
823 state->m_DemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
824 if (ulDemodLockTimeOut < 10000)
825 state->m_DemodLockTimeOut = ulDemodLockTimeOut;
828 state->m_Constellation = DRX_CONSTELLATION_AUTO;
829 state->m_qamInterleaveMode = DRXK_QAM_I12_J17;
830 state->m_fecRsPlen = 204 * 8; /* fecRsPlen annex A */
831 state->m_fecRsPrescale = 1;
833 state->m_sqiSpeed = DRXK_DVBT_SQI_SPEED_MEDIUM;
834 state->m_agcFastClipCtrlDelay = 0;
836 state->m_GPIOCfg = (ulGPIOCfg);
837 state->m_GPIO = (ulGPIO == 0 ? 0 : 1);
839 state->m_AntennaDVBT = (ulAntennaDVBT == 0 ? 0 : 1);
840 state->m_AntennaDVBC = (ulAntennaDVBC == 0 ? 0 : 1);
841 state->m_AntennaSwitchDVBTDVBC =
842 (ulAntennaSwitchDVBTDVBC == 0 ? 0 : 1);
844 state->m_bPowerDown = false;
845 state->m_currentPowerMode = DRX_POWER_DOWN;
847 state->m_enableParallel = (ulSerialMode == 0);
849 state->m_rfmirror = (ulRfMirror == 0);
850 state->m_IfAgcPol = false;
854 static int DRXX_Open(struct drxk_state *state)
863 /* stop lock indicator process */
864 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
867 /* Check device id */
868 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
871 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
874 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
877 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
880 status = write16(state, SIO_TOP_COMM_KEY__A, key);
887 static int GetDeviceCapabilities(struct drxk_state *state)
889 u16 sioPdrOhwCfg = 0;
890 u32 sioTopJtagidLo = 0;
896 /* stop lock indicator process */
897 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
901 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
904 status = read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg);
907 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
911 switch ((sioPdrOhwCfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
913 /* ignore (bypass ?) */
917 state->m_oscClockFreq = 27000;
921 state->m_oscClockFreq = 20250;
925 state->m_oscClockFreq = 20250;
931 Determine device capabilities
934 status = read32(state, SIO_TOP_JTAGID_LO__A, &sioTopJtagidLo);
938 switch ((sioTopJtagidLo >> 29) & 0xF) {
940 state->m_deviceSpin = DRXK_SPIN_A1;
943 state->m_deviceSpin = DRXK_SPIN_A2;
946 state->m_deviceSpin = DRXK_SPIN_A3;
949 state->m_deviceSpin = DRXK_SPIN_UNKNOWN;
953 switch ((sioTopJtagidLo >> 12) & 0xFF) {
955 /* typeId = DRX3913K_TYPE_ID */
956 state->m_hasLNA = false;
957 state->m_hasOOB = false;
958 state->m_hasATV = false;
959 state->m_hasAudio = false;
960 state->m_hasDVBT = true;
961 state->m_hasDVBC = true;
962 state->m_hasSAWSW = true;
963 state->m_hasGPIO2 = false;
964 state->m_hasGPIO1 = false;
965 state->m_hasIRQN = false;
968 /* typeId = DRX3915K_TYPE_ID */
969 state->m_hasLNA = false;
970 state->m_hasOOB = false;
971 state->m_hasATV = true;
972 state->m_hasAudio = false;
973 state->m_hasDVBT = true;
974 state->m_hasDVBC = false;
975 state->m_hasSAWSW = true;
976 state->m_hasGPIO2 = true;
977 state->m_hasGPIO1 = true;
978 state->m_hasIRQN = false;
981 /* typeId = DRX3916K_TYPE_ID */
982 state->m_hasLNA = false;
983 state->m_hasOOB = false;
984 state->m_hasATV = true;
985 state->m_hasAudio = false;
986 state->m_hasDVBT = true;
987 state->m_hasDVBC = false;
988 state->m_hasSAWSW = true;
989 state->m_hasGPIO2 = true;
990 state->m_hasGPIO1 = true;
991 state->m_hasIRQN = false;
994 /* typeId = DRX3918K_TYPE_ID */
995 state->m_hasLNA = false;
996 state->m_hasOOB = false;
997 state->m_hasATV = true;
998 state->m_hasAudio = true;
999 state->m_hasDVBT = true;
1000 state->m_hasDVBC = false;
1001 state->m_hasSAWSW = true;
1002 state->m_hasGPIO2 = true;
1003 state->m_hasGPIO1 = true;
1004 state->m_hasIRQN = false;
1007 /* typeId = DRX3921K_TYPE_ID */
1008 state->m_hasLNA = false;
1009 state->m_hasOOB = false;
1010 state->m_hasATV = true;
1011 state->m_hasAudio = true;
1012 state->m_hasDVBT = true;
1013 state->m_hasDVBC = true;
1014 state->m_hasSAWSW = true;
1015 state->m_hasGPIO2 = true;
1016 state->m_hasGPIO1 = true;
1017 state->m_hasIRQN = false;
1020 /* typeId = DRX3923K_TYPE_ID */
1021 state->m_hasLNA = false;
1022 state->m_hasOOB = false;
1023 state->m_hasATV = true;
1024 state->m_hasAudio = true;
1025 state->m_hasDVBT = true;
1026 state->m_hasDVBC = true;
1027 state->m_hasSAWSW = true;
1028 state->m_hasGPIO2 = true;
1029 state->m_hasGPIO1 = true;
1030 state->m_hasIRQN = false;
1033 /* typeId = DRX3925K_TYPE_ID */
1034 state->m_hasLNA = false;
1035 state->m_hasOOB = false;
1036 state->m_hasATV = true;
1037 state->m_hasAudio = true;
1038 state->m_hasDVBT = true;
1039 state->m_hasDVBC = true;
1040 state->m_hasSAWSW = true;
1041 state->m_hasGPIO2 = true;
1042 state->m_hasGPIO1 = true;
1043 state->m_hasIRQN = false;
1046 /* typeId = DRX3926K_TYPE_ID */
1047 state->m_hasLNA = false;
1048 state->m_hasOOB = false;
1049 state->m_hasATV = true;
1050 state->m_hasAudio = false;
1051 state->m_hasDVBT = true;
1052 state->m_hasDVBC = true;
1053 state->m_hasSAWSW = true;
1054 state->m_hasGPIO2 = true;
1055 state->m_hasGPIO1 = true;
1056 state->m_hasIRQN = false;
1059 printk(KERN_ERR "drxk: DeviceID not supported = %02x\n",
1060 ((sioTopJtagidLo >> 12) & 0xFF));
1068 static int HI_Command(struct drxk_state *state, u16 cmd, u16 *pResult)
1076 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
1079 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1083 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1084 ((state->m_HICfgCtrl) &
1085 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1086 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1087 if (powerdown_cmd == false) {
1088 /* Wait until command rdy */
1095 status = read16(state, SIO_HI_RA_RAM_CMD__A,
1097 } while ((status < 0) && (retryCount < DRXK_MAX_RETRIES)
1101 status = read16(state, SIO_HI_RA_RAM_RES__A,
1107 static int HI_CfgCommand(struct drxk_state *state)
1113 mutex_lock(&state->mutex);
1115 status = write16(state, SIO_HI_RA_RAM_PAR_6__A, state->m_HICfgTimeout);
1118 status = write16(state, SIO_HI_RA_RAM_PAR_5__A, state->m_HICfgCtrl);
1121 status = write16(state, SIO_HI_RA_RAM_PAR_4__A, state->m_HICfgWakeUpKey);
1124 status = write16(state, SIO_HI_RA_RAM_PAR_3__A, state->m_HICfgBridgeDelay);
1127 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, state->m_HICfgTimingDiv);
1130 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1133 status = HI_Command(state, SIO_HI_RA_RAM_CMD_CONFIG, 0);
1137 state->m_HICfgCtrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1139 mutex_unlock(&state->mutex);
1143 static int InitHI(struct drxk_state *state)
1147 state->m_HICfgWakeUpKey = (state->demod_address << 1);
1148 state->m_HICfgTimeout = 0x96FF;
1149 /* port/bridge/power down ctrl */
1150 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1151 return HI_CfgCommand(state);
1154 static int MPEGTSConfigurePins(struct drxk_state *state, bool mpegEnable)
1157 u16 sioPdrMclkCfg = 0;
1158 u16 sioPdrMdxCfg = 0;
1162 /* stop lock indicator process */
1163 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1167 /* MPEG TS pad configuration */
1168 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
1172 if (mpegEnable == false) {
1173 /* Set MPEG TS pads to inputmode */
1174 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1177 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1180 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1183 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1186 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1189 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1192 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1195 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1198 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1201 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1204 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1207 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1211 /* Enable MPEG output */
1213 ((state->m_TSDataStrength <<
1214 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1215 sioPdrMclkCfg = ((state->m_TSClockkStrength <<
1216 SIO_PDR_MCLK_CFG_DRIVE__B) |
1219 status = write16(state, SIO_PDR_MSTRT_CFG__A, sioPdrMdxCfg);
1222 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000); /* Disable */
1225 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000); /* Disable */
1228 if (state->m_enableParallel == true) {
1229 /* paralel -> enable MD1 to MD7 */
1230 status = write16(state, SIO_PDR_MD1_CFG__A, sioPdrMdxCfg);
1233 status = write16(state, SIO_PDR_MD2_CFG__A, sioPdrMdxCfg);
1236 status = write16(state, SIO_PDR_MD3_CFG__A, sioPdrMdxCfg);
1239 status = write16(state, SIO_PDR_MD4_CFG__A, sioPdrMdxCfg);
1242 status = write16(state, SIO_PDR_MD5_CFG__A, sioPdrMdxCfg);
1245 status = write16(state, SIO_PDR_MD6_CFG__A, sioPdrMdxCfg);
1248 status = write16(state, SIO_PDR_MD7_CFG__A, sioPdrMdxCfg);
1252 sioPdrMdxCfg = ((state->m_TSDataStrength <<
1253 SIO_PDR_MD0_CFG_DRIVE__B)
1255 /* serial -> disable MD1 to MD7 */
1256 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1259 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1262 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1265 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1268 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1271 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1274 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1278 status = write16(state, SIO_PDR_MCLK_CFG__A, sioPdrMclkCfg);
1281 status = write16(state, SIO_PDR_MD0_CFG__A, sioPdrMdxCfg);
1285 /* Enable MB output over MPEG pads and ctl input */
1286 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1289 /* Write nomagic word to enable pdr reg write */
1290 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1297 static int MPEGTSDisable(struct drxk_state *state)
1301 return MPEGTSConfigurePins(state, false);
1304 static int BLChainCmd(struct drxk_state *state,
1305 u16 romOffset, u16 nrOfElements, u32 timeOut)
1313 mutex_lock(&state->mutex);
1315 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1318 status = write16(state, SIO_BL_CHAIN_ADDR__A, romOffset);
1321 status = write16(state, SIO_BL_CHAIN_LEN__A, nrOfElements);
1324 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1327 end = jiffies + msecs_to_jiffies(timeOut);
1331 status = read16(state, SIO_BL_STATUS__A, &blStatus);
1334 } while ((blStatus == 0x1) &&
1335 ((time_is_after_jiffies(end))));
1336 if (blStatus == 0x1) {
1337 printk(KERN_ERR "drxk: SIO not ready\n");
1338 mutex_unlock(&state->mutex);
1342 mutex_unlock(&state->mutex);
1347 static int DownloadMicrocode(struct drxk_state *state,
1348 const u8 pMCImage[], u32 Length)
1350 const u8 *pSrc = pMCImage;
1363 /* down the drain (we don care about MAGIC_WORD) */
1364 Drain = (pSrc[0] << 8) | pSrc[1];
1365 pSrc += sizeof(u16);
1366 offset += sizeof(u16);
1367 nBlocks = (pSrc[0] << 8) | pSrc[1];
1368 pSrc += sizeof(u16);
1369 offset += sizeof(u16);
1371 for (i = 0; i < nBlocks; i += 1) {
1372 Address = (pSrc[0] << 24) | (pSrc[1] << 16) |
1373 (pSrc[2] << 8) | pSrc[3];
1374 pSrc += sizeof(u32);
1375 offset += sizeof(u32);
1377 BlockSize = ((pSrc[0] << 8) | pSrc[1]) * sizeof(u16);
1378 pSrc += sizeof(u16);
1379 offset += sizeof(u16);
1381 Flags = (pSrc[0] << 8) | pSrc[1];
1382 pSrc += sizeof(u16);
1383 offset += sizeof(u16);
1385 BlockCRC = (pSrc[0] << 8) | pSrc[1];
1386 pSrc += sizeof(u16);
1387 offset += sizeof(u16);
1388 status = write_block(state, Address, BlockSize, pSrc);
1392 offset += BlockSize;
1397 static int DVBTEnableOFDMTokenRing(struct drxk_state *state, bool enable)
1401 u16 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1402 u16 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1407 if (enable == false) {
1408 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1409 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1412 status = (read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data));
1414 if (data == desiredStatus) {
1415 /* tokenring already has correct status */
1418 /* Disable/enable dvbt tokenring bridge */
1420 write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desiredCtrl);
1422 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1424 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1427 } while ((data != desiredStatus) && ((time_is_after_jiffies(end))));
1428 if (data != desiredStatus) {
1429 printk(KERN_ERR "drxk: SIO not ready\n");
1435 static int MPEGTSStop(struct drxk_state *state)
1438 u16 fecOcSncMode = 0;
1439 u16 fecOcIprMode = 0;
1444 /* Gracefull shutdown (byte boundaries) */
1445 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1448 fecOcSncMode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1449 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1453 /* Suppress MCLK during absence of data */
1454 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcIprMode);
1457 fecOcIprMode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1458 status = write16(state, FEC_OC_IPR_MODE__A, fecOcIprMode);
1465 static int scu_command(struct drxk_state *state,
1466 u16 cmd, u8 parameterLen,
1467 u16 *parameter, u8 resultLen, u16 *result)
1469 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1470 #error DRXK register mapping no longer compatible with this routine!
1478 if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) ||
1479 ((resultLen > 0) && (result == NULL)))
1482 mutex_lock(&state->mutex);
1484 /* assume that the command register is ready
1485 since it is checked afterwards */
1489 for (ii = parameterLen - 1; ii >= 0; ii -= 1) {
1490 buffer[cnt++] = (parameter[ii] & 0xFF);
1491 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1493 buffer[cnt++] = (cmd & 0xFF);
1494 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1496 write_block(state, SCU_RAM_PARAM_0__A -
1497 (parameterLen - 1), cnt, buffer);
1498 /* Wait until SCU has processed command */
1499 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1502 status = read16(state, SCU_RAM_COMMAND__A, &curCmd);
1505 } while (!(curCmd == DRX_SCU_READY)
1506 && (time_is_after_jiffies(end)));
1507 if (curCmd != DRX_SCU_READY) {
1508 printk(KERN_ERR "drxk: SCU not ready\n");
1509 mutex_unlock(&state->mutex);
1513 if ((resultLen > 0) && (result != NULL)) {
1517 for (ii = resultLen - 1; ii >= 0; ii -= 1) {
1518 status = read16(state, SCU_RAM_PARAM_0__A - ii, &result[ii]);
1523 /* Check if an error was reported by SCU */
1524 err = (s16) result[0];
1526 /* check a few fixed error codes */
1527 if (err == SCU_RESULT_UNKSTD) {
1528 printk(KERN_ERR "drxk: SCU_RESULT_UNKSTD\n");
1529 mutex_unlock(&state->mutex);
1531 } else if (err == SCU_RESULT_UNKCMD) {
1532 printk(KERN_ERR "drxk: SCU_RESULT_UNKCMD\n");
1533 mutex_unlock(&state->mutex);
1536 /* here it is assumed that negative means error,
1537 and positive no error */
1539 printk(KERN_ERR "drxk: %s ERROR\n", __func__);
1540 mutex_unlock(&state->mutex);
1545 mutex_unlock(&state->mutex);
1547 printk(KERN_ERR "drxk: %s: status = %d\n", __func__, status);
1552 static int SetIqmAf(struct drxk_state *state, bool active)
1561 status = read16(state, IQM_AF_STDBY__A, &data);
1565 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1566 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1567 | IQM_AF_STDBY_STDBY_PD_STANDBY
1568 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1569 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1570 } else { /* active */
1572 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1573 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1574 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1575 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1576 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1579 status = write16(state, IQM_AF_STDBY__A, data);
1586 static int CtrlPowerMode(struct drxk_state *state, enum DRXPowerMode *mode)
1589 u16 sioCcPwdMode = 0;
1593 /* Check arguments */
1599 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_NONE;
1601 case DRXK_POWER_DOWN_OFDM:
1602 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1604 case DRXK_POWER_DOWN_CORE:
1605 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1607 case DRXK_POWER_DOWN_PLL:
1608 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_PLL;
1610 case DRX_POWER_DOWN:
1611 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OSC;
1614 /* Unknow sleep mode */
1619 /* If already in requested power mode, do nothing */
1620 if (state->m_currentPowerMode == *mode)
1623 /* For next steps make sure to start from DRX_POWER_UP mode */
1624 if (state->m_currentPowerMode != DRX_POWER_UP) {
1626 status = PowerUpDevice(state);
1629 status = DVBTEnableOFDMTokenRing(state, true);
1635 if (*mode == DRX_POWER_UP) {
1636 /* Restore analog & pin configuartion */
1638 /* Power down to requested mode */
1639 /* Backup some register settings */
1640 /* Set pins with possible pull-ups connected
1641 to them in input mode */
1642 /* Analog power down */
1643 /* ADC power down */
1644 /* Power down device */
1645 /* stop all comm_exec */
1646 /* Stop and power down previous standard */
1648 switch (state->m_OperationMode) {
1650 status = MPEGTSStop(state);
1653 status = PowerDownDVBT(state, false);
1659 status = MPEGTSStop(state);
1662 status = PowerDownQAM(state);
1669 status = DVBTEnableOFDMTokenRing(state, false);
1672 status = write16(state, SIO_CC_PWD_MODE__A, sioCcPwdMode);
1675 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1679 if (*mode != DRXK_POWER_DOWN_OFDM) {
1680 state->m_HICfgCtrl |=
1681 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1682 status = HI_CfgCommand(state);
1688 state->m_currentPowerMode = *mode;
1692 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode)
1694 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
1702 status = read16(state, SCU_COMM_EXEC__A, &data);
1705 if (data == SCU_COMM_EXEC_ACTIVE) {
1706 /* Send OFDM stop command */
1707 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
1710 /* Send OFDM reset command */
1711 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
1716 /* Reset datapath for OFDM, processors first */
1717 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1720 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1723 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1728 status = SetIqmAf(state, false);
1732 /* powerdown to OFDM mode */
1734 status = CtrlPowerMode(state, &powerMode);
1742 static int SetOperationMode(struct drxk_state *state,
1743 enum OperationMode oMode)
1749 Stop and power down previous standard
1750 TODO investigate total power down instead of partial
1751 power down depending on "previous" standard.
1754 /* disable HW lock indicator */
1755 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1759 if (state->m_OperationMode != oMode) {
1760 switch (state->m_OperationMode) {
1761 /* OM_NONE was added for start up */
1765 status = MPEGTSStop(state);
1768 status = PowerDownDVBT(state, true);
1771 state->m_OperationMode = OM_NONE;
1776 case OM_QAM_ITU_A: /* fallthrough */
1778 status = MPEGTSStop(state);
1781 status = PowerDownQAM(state);
1784 state->m_OperationMode = OM_NONE;
1794 Power up new standard
1798 state->m_OperationMode = oMode;
1799 status = SetDVBTStandard(state, oMode);
1806 case OM_QAM_ITU_A: /* fallthrough */
1808 state->m_OperationMode = oMode;
1809 status = SetQAMStandard(state, oMode);
1824 static int Start(struct drxk_state *state, s32 offsetFreq,
1825 s32 IntermediateFrequency)
1832 s32 OffsetkHz = offsetFreq / 1000;
1834 if (state->m_DrxkState != DRXK_STOPPED &&
1835 state->m_DrxkState != DRXK_DTV_STARTED) {
1839 state->m_bMirrorFreqSpect =
1840 (state->param.inversion == INVERSION_ON);
1842 if (IntermediateFrequency < 0) {
1843 state->m_bMirrorFreqSpect =
1844 !state->m_bMirrorFreqSpect;
1845 IntermediateFrequency = -IntermediateFrequency;
1848 switch (state->m_OperationMode) {
1851 IFreqkHz = (IntermediateFrequency / 1000);
1852 status = SetQAM(state, IFreqkHz, OffsetkHz);
1855 state->m_DrxkState = DRXK_DTV_STARTED;
1858 IFreqkHz = (IntermediateFrequency / 1000);
1859 status = MPEGTSStop(state);
1862 status = SetDVBT(state, IFreqkHz, OffsetkHz);
1865 status = DVBTStart(state);
1868 state->m_DrxkState = DRXK_DTV_STARTED;
1877 static int ShutDown(struct drxk_state *state)
1885 static int GetLockStatus(struct drxk_state *state, u32 *pLockStatus,
1892 if (pLockStatus == NULL)
1895 *pLockStatus = NOT_LOCKED;
1897 /* define the SCU command code */
1898 switch (state->m_OperationMode) {
1902 status = GetQAMLockStatus(state, pLockStatus);
1905 status = GetDVBTLockStatus(state, pLockStatus);
1913 static int MPEGTSStart(struct drxk_state *state)
1917 u16 fecOcSncMode = 0;
1920 /* Allow OC to sync again */
1921 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1924 fecOcSncMode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1925 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1928 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1935 static int MPEGTSDtoInit(struct drxk_state *state)
1942 /* Rate integration settings */
1943 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1946 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1949 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1952 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1955 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
1958 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
1961 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
1964 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
1968 /* Additional configuration */
1969 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
1972 status = write16(state, FEC_OC_SNC_LWM__A, 2);
1975 status = write16(state, FEC_OC_SNC_HWM__A, 12);
1982 static int MPEGTSDtoSetup(struct drxk_state *state,
1983 enum OperationMode oMode)
1987 u16 fecOcRegMode = 0; /* FEC_OC_MODE register value */
1988 u16 fecOcRegIprMode = 0; /* FEC_OC_IPR_MODE register value */
1989 u16 fecOcDtoMode = 0; /* FEC_OC_IPR_INVERT register value */
1990 u16 fecOcFctMode = 0; /* FEC_OC_IPR_INVERT register value */
1991 u16 fecOcDtoPeriod = 2; /* FEC_OC_IPR_INVERT register value */
1992 u16 fecOcDtoBurstLen = 188; /* FEC_OC_IPR_INVERT register value */
1993 u32 fecOcRcnCtlRate = 0; /* FEC_OC_IPR_INVERT register value */
1994 u16 fecOcTmdMode = 0;
1995 u16 fecOcTmdIntUpdRate = 0;
1997 bool staticCLK = false;
2002 /* Check insertion of the Reed-Solomon parity bytes */
2003 status = read16(state, FEC_OC_MODE__A, &fecOcRegMode);
2006 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcRegIprMode);
2009 fecOcRegMode &= (~FEC_OC_MODE_PARITY__M);
2010 fecOcRegIprMode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2011 if (state->m_insertRSByte == true) {
2012 /* enable parity symbol forward */
2013 fecOcRegMode |= FEC_OC_MODE_PARITY__M;
2014 /* MVAL disable during parity bytes */
2015 fecOcRegIprMode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2016 /* TS burst length to 204 */
2017 fecOcDtoBurstLen = 204;
2020 /* Check serial or parrallel output */
2021 fecOcRegIprMode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2022 if (state->m_enableParallel == false) {
2023 /* MPEG data output is serial -> set ipr_mode[0] */
2024 fecOcRegIprMode |= FEC_OC_IPR_MODE_SERIAL__M;
2029 maxBitRate = state->m_DVBTBitrate;
2031 fecOcRcnCtlRate = 0xC00000;
2032 staticCLK = state->m_DVBTStaticCLK;
2034 case OM_QAM_ITU_A: /* fallthrough */
2036 fecOcTmdMode = 0x0004;
2037 fecOcRcnCtlRate = 0xD2B4EE; /* good for >63 Mb/s */
2038 maxBitRate = state->m_DVBCBitrate;
2039 staticCLK = state->m_DVBCStaticCLK;
2043 } /* switch (standard) */
2048 /* Configure DTO's */
2052 /* Rational DTO for MCLK source (static MCLK rate),
2053 Dynamic DTO for optimal grouping
2054 (avoid intra-packet gaps),
2055 DTO offset enable to sync TS burst with MSTRT */
2056 fecOcDtoMode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2057 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2058 fecOcFctMode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2059 FEC_OC_FCT_MODE_VIRT_ENA__M);
2061 /* Check user defined bitrate */
2062 bitRate = maxBitRate;
2063 if (bitRate > 75900000UL) { /* max is 75.9 Mb/s */
2064 bitRate = 75900000UL;
2066 /* Rational DTO period:
2067 dto_period = (Fsys / bitrate) - 2
2069 Result should be floored,
2070 to make sure >= requested bitrate
2072 fecOcDtoPeriod = (u16) (((state->m_sysClockFreq)
2074 if (fecOcDtoPeriod <= 2)
2077 fecOcDtoPeriod -= 2;
2078 fecOcTmdIntUpdRate = 8;
2080 /* (commonAttr->staticCLK == false) => dynamic mode */
2081 fecOcDtoMode = FEC_OC_DTO_MODE_DYNAMIC__M;
2082 fecOcFctMode = FEC_OC_FCT_MODE__PRE;
2083 fecOcTmdIntUpdRate = 5;
2086 /* Write appropriate registers with requested configuration */
2087 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fecOcDtoBurstLen);
2090 status = write16(state, FEC_OC_DTO_PERIOD__A, fecOcDtoPeriod);
2093 status = write16(state, FEC_OC_DTO_MODE__A, fecOcDtoMode);
2096 status = write16(state, FEC_OC_FCT_MODE__A, fecOcFctMode);
2099 status = write16(state, FEC_OC_MODE__A, fecOcRegMode);
2102 status = write16(state, FEC_OC_IPR_MODE__A, fecOcRegIprMode);
2106 /* Rate integration settings */
2107 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fecOcRcnCtlRate);
2110 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A, fecOcTmdIntUpdRate);
2113 status = write16(state, FEC_OC_TMD_MODE__A, fecOcTmdMode);
2120 static int MPEGTSConfigurePolarity(struct drxk_state *state)
2123 u16 fecOcRegIprInvert = 0;
2127 /* Data mask for the output data byte */
2128 u16 InvertDataMask =
2129 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2130 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2131 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2132 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2134 /* Control selective inversion of output bits */
2135 fecOcRegIprInvert &= (~(InvertDataMask));
2136 if (state->m_invertDATA == true)
2137 fecOcRegIprInvert |= InvertDataMask;
2138 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2139 if (state->m_invertERR == true)
2140 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MERR__M;
2141 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2142 if (state->m_invertSTR == true)
2143 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MSTRT__M;
2144 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2145 if (state->m_invertVAL == true)
2146 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MVAL__M;
2147 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2148 if (state->m_invertCLK == true)
2149 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MCLK__M;
2150 status = write16(state, FEC_OC_IPR_INVERT__A, fecOcRegIprInvert);
2154 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2156 static int SetAgcRf(struct drxk_state *state,
2157 struct SCfgAgc *pAgcCfg, bool isDTV)
2160 struct SCfgAgc *pIfAgcSettings;
2164 if (pAgcCfg == NULL)
2170 switch (pAgcCfg->ctrlMode) {
2171 case DRXK_AGC_CTRL_AUTO:
2173 /* Enable RF AGC DAC */
2174 status = read16(state, IQM_AF_STDBY__A, &data);
2177 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2178 status = write16(state, IQM_AF_STDBY__A, data);
2182 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2186 /* Enable SCU RF AGC loop */
2187 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2190 if (state->m_RfAgcPol)
2191 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2193 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2194 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2198 /* Set speed (using complementary reduction value) */
2199 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2203 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2204 data |= (~(pAgcCfg->speed <<
2205 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2206 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2208 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2213 pIfAgcSettings = &state->m_dvbtIfAgcCfg;
2214 else if (IsQAM(state))
2215 pIfAgcSettings = &state->m_qamIfAgcCfg;
2217 pIfAgcSettings = &state->m_atvIfAgcCfg;
2218 if (pIfAgcSettings == NULL)
2221 /* Set TOP, only if IF-AGC is in AUTO mode */
2222 if (pIfAgcSettings->ctrlMode == DRXK_AGC_CTRL_AUTO)
2223 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->top);
2227 /* Cut-Off current */
2228 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, pAgcCfg->cutOffCurrent);
2232 /* Max. output level */
2233 status = write16(state, SCU_RAM_AGC_RF_MAX__A, pAgcCfg->maxOutputLevel);
2239 case DRXK_AGC_CTRL_USER:
2240 /* Enable RF AGC DAC */
2241 status = read16(state, IQM_AF_STDBY__A, &data);
2244 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2245 status = write16(state, IQM_AF_STDBY__A, data);
2249 /* Disable SCU RF AGC loop */
2250 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2253 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2254 if (state->m_RfAgcPol)
2255 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2257 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2258 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2262 /* SCU c.o.c. to 0, enabling full control range */
2263 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2267 /* Write value to output pin */
2268 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, pAgcCfg->outputLevel);
2273 case DRXK_AGC_CTRL_OFF:
2274 /* Disable RF AGC DAC */
2275 status = read16(state, IQM_AF_STDBY__A, &data);
2278 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2279 status = write16(state, IQM_AF_STDBY__A, data);
2283 /* Disable SCU RF AGC loop */
2284 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2287 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2288 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2296 } /* switch (agcsettings->ctrlMode) */
2301 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2303 static int SetAgcIf(struct drxk_state *state,
2304 struct SCfgAgc *pAgcCfg, bool isDTV)
2308 struct SCfgAgc *pRfAgcSettings;
2313 switch (pAgcCfg->ctrlMode) {
2314 case DRXK_AGC_CTRL_AUTO:
2316 /* Enable IF AGC DAC */
2317 status = read16(state, IQM_AF_STDBY__A, &data);
2320 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2321 status = write16(state, IQM_AF_STDBY__A, data);
2325 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2329 /* Enable SCU IF AGC loop */
2330 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2333 if (state->m_IfAgcPol)
2334 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2336 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2337 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2341 /* Set speed (using complementary reduction value) */
2342 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2345 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2346 data |= (~(pAgcCfg->speed <<
2347 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2348 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2350 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2355 pRfAgcSettings = &state->m_qamRfAgcCfg;
2357 pRfAgcSettings = &state->m_atvRfAgcCfg;
2358 if (pRfAgcSettings == NULL)
2361 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pRfAgcSettings->top);
2366 case DRXK_AGC_CTRL_USER:
2368 /* Enable IF AGC DAC */
2369 status = read16(state, IQM_AF_STDBY__A, &data);
2372 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2373 status = write16(state, IQM_AF_STDBY__A, data);
2377 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2381 /* Disable SCU IF AGC loop */
2382 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2385 if (state->m_IfAgcPol)
2386 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2388 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2389 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2393 /* Write value to output pin */
2394 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->outputLevel);
2399 case DRXK_AGC_CTRL_OFF:
2401 /* Disable If AGC DAC */
2402 status = read16(state, IQM_AF_STDBY__A, &data);
2405 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2406 status = write16(state, IQM_AF_STDBY__A, data);
2410 /* Disable SCU IF AGC loop */
2411 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2414 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2415 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2419 } /* switch (agcSettingsIf->ctrlMode) */
2421 /* always set the top to support
2422 configurations without if-loop */
2423 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, pAgcCfg->top);
2432 static int ReadIFAgc(struct drxk_state *state, u32 *pValue)
2435 int status = read16(state, IQM_AF_AGC_IF__A, &agcDacLvl);
2443 if (agcDacLvl > DRXK_AGC_DAC_OFFSET)
2444 Level = agcDacLvl - DRXK_AGC_DAC_OFFSET;
2446 *pValue = (14000 - Level) / 4;
2453 static int GetQAMSignalToNoise(struct drxk_state *state,
2454 s32 *pSignalToNoise)
2461 /* MER calculation */
2462 u16 qamSlErrPower = 0; /* accum. error between
2463 raw and sliced symbols */
2464 u32 qamSlSigPower = 0; /* used for MER, depends of
2465 QAM constellation */
2466 u32 qamSlMer = 0; /* QAM MER */
2468 /* get the register value needed for MER */
2469 status = read16(state, QAM_SL_ERR_POWER__A, &qamSlErrPower);
2473 switch (state->param.u.qam.modulation) {
2475 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2478 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2481 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2484 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2488 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2492 if (qamSlErrPower > 0) {
2493 qamSlMer = Log10Times100(qamSlSigPower) -
2494 Log10Times100((u32) qamSlErrPower);
2496 *pSignalToNoise = qamSlMer;
2501 static int GetDVBTSignalToNoise(struct drxk_state *state,
2502 s32 *pSignalToNoise)
2507 u32 EqRegTdSqrErrI = 0;
2508 u32 EqRegTdSqrErrQ = 0;
2509 u16 EqRegTdSqrErrExp = 0;
2510 u16 EqRegTdTpsPwrOfs = 0;
2511 u16 EqRegTdReqSmbCnt = 0;
2518 u16 transmissionParams = 0;
2522 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A, &EqRegTdTpsPwrOfs);
2525 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A, &EqRegTdReqSmbCnt);
2528 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A, &EqRegTdSqrErrExp);
2531 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A, ®Data);
2534 /* Extend SQR_ERR_I operational range */
2535 EqRegTdSqrErrI = (u32) regData;
2536 if ((EqRegTdSqrErrExp > 11) &&
2537 (EqRegTdSqrErrI < 0x00000FFFUL)) {
2538 EqRegTdSqrErrI += 0x00010000UL;
2540 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®Data);
2543 /* Extend SQR_ERR_Q operational range */
2544 EqRegTdSqrErrQ = (u32) regData;
2545 if ((EqRegTdSqrErrExp > 11) &&
2546 (EqRegTdSqrErrQ < 0x00000FFFUL))
2547 EqRegTdSqrErrQ += 0x00010000UL;
2549 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A, &transmissionParams);
2553 /* Check input data for MER */
2555 /* MER calculation (in 0.1 dB) without math.h */
2556 if ((EqRegTdTpsPwrOfs == 0) || (EqRegTdReqSmbCnt == 0))
2558 else if ((EqRegTdSqrErrI + EqRegTdSqrErrQ) == 0) {
2559 /* No error at all, this must be the HW reset value
2560 * Apparently no first measurement yet
2564 SqrErrIQ = (EqRegTdSqrErrI + EqRegTdSqrErrQ) <<
2566 if ((transmissionParams &
2567 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2568 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2573 /* IMER = 100 * log10 (x)
2574 where x = (EqRegTdTpsPwrOfs^2 *
2575 EqRegTdReqSmbCnt * tpsCnt)/SqrErrIQ
2578 where a = 100 * log10 (EqRegTdTpsPwrOfs^2)
2579 b = 100 * log10 (EqRegTdReqSmbCnt * tpsCnt)
2580 c = 100 * log10 (SqrErrIQ)
2583 /* log(x) x = 9bits * 9bits->18 bits */
2584 a = Log10Times100(EqRegTdTpsPwrOfs *
2586 /* log(x) x = 16bits * 7bits->23 bits */
2587 b = Log10Times100(EqRegTdReqSmbCnt * tpsCnt);
2588 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2589 c = Log10Times100(SqrErrIQ);
2592 /* No negative MER, clip to zero */
2598 *pSignalToNoise = iMER;
2604 static int GetSignalToNoise(struct drxk_state *state, s32 *pSignalToNoise)
2608 *pSignalToNoise = 0;
2609 switch (state->m_OperationMode) {
2611 return GetDVBTSignalToNoise(state, pSignalToNoise);
2614 return GetQAMSignalToNoise(state, pSignalToNoise);
2622 static int GetDVBTQuality(struct drxk_state *state, s32 *pQuality)
2624 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2629 static s32 QE_SN[] = {
2635 108, /* 16-QAM 1/2 */
2636 131, /* 16-QAM 2/3 */
2637 146, /* 16-QAM 3/4 */
2638 156, /* 16-QAM 5/6 */
2639 160, /* 16-QAM 7/8 */
2640 165, /* 64-QAM 1/2 */
2641 187, /* 64-QAM 2/3 */
2642 202, /* 64-QAM 3/4 */
2643 216, /* 64-QAM 5/6 */
2644 225, /* 64-QAM 7/8 */
2650 s32 SignalToNoise = 0;
2651 u16 Constellation = 0;
2653 u32 SignalToNoiseRel;
2656 status = GetDVBTSignalToNoise(state, &SignalToNoise);
2659 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A, &Constellation);
2662 Constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2664 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A, &CodeRate);
2667 CodeRate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2669 if (Constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2670 CodeRate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2672 SignalToNoiseRel = SignalToNoise -
2673 QE_SN[Constellation * 5 + CodeRate];
2676 if (SignalToNoiseRel < -70)
2678 else if (SignalToNoiseRel < 30)
2679 *pQuality = ((SignalToNoiseRel + 70) *
2682 *pQuality = BERQuality;
2687 static int GetDVBCQuality(struct drxk_state *state, s32 *pQuality)
2695 u32 SignalToNoise = 0;
2696 u32 BERQuality = 100;
2697 u32 SignalToNoiseRel = 0;
2699 status = GetQAMSignalToNoise(state, &SignalToNoise);
2703 switch (state->param.u.qam.modulation) {
2705 SignalToNoiseRel = SignalToNoise - 200;
2708 SignalToNoiseRel = SignalToNoise - 230;
2709 break; /* Not in NorDig */
2711 SignalToNoiseRel = SignalToNoise - 260;
2714 SignalToNoiseRel = SignalToNoise - 290;
2718 SignalToNoiseRel = SignalToNoise - 320;
2722 if (SignalToNoiseRel < -70)
2724 else if (SignalToNoiseRel < 30)
2725 *pQuality = ((SignalToNoiseRel + 70) *
2728 *pQuality = BERQuality;
2734 static int GetQuality(struct drxk_state *state, s32 *pQuality)
2738 switch (state->m_OperationMode) {
2740 return GetDVBTQuality(state, pQuality);
2742 return GetDVBCQuality(state, pQuality);
2751 /* Free data ram in SIO HI */
2752 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2753 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2755 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2756 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2757 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2758 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2760 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2761 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2762 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2764 static int ConfigureI2CBridge(struct drxk_state *state, bool bEnableBridge)
2770 if (state->m_DrxkState == DRXK_UNINITIALIZED)
2772 if (state->m_DrxkState == DRXK_POWERED_DOWN)
2776 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2779 if (bEnableBridge) {
2780 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2784 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2789 status = HI_Command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, 0);
2796 static int SetPreSaw(struct drxk_state *state,
2797 struct SCfgPreSaw *pPreSawCfg)
2803 if ((pPreSawCfg == NULL)
2804 || (pPreSawCfg->reference > IQM_AF_PDREF__M))
2807 status = write16(state, IQM_AF_PDREF__A, pPreSawCfg->reference);
2811 static int BLDirectCmd(struct drxk_state *state, u32 targetAddr,
2812 u16 romOffset, u16 nrOfElements, u32 timeOut)
2815 u16 offset = (u16) ((targetAddr >> 0) & 0x00FFFF);
2816 u16 blockbank = (u16) ((targetAddr >> 16) & 0x000FFF);
2822 mutex_lock(&state->mutex);
2824 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2827 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2830 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2833 status = write16(state, SIO_BL_SRC_ADDR__A, romOffset);
2836 status = write16(state, SIO_BL_SRC_LEN__A, nrOfElements);
2839 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2843 end = jiffies + msecs_to_jiffies(timeOut);
2845 status = read16(state, SIO_BL_STATUS__A, &blStatus);
2848 } while ((blStatus == 0x1) && time_is_after_jiffies(end));
2849 if (blStatus == 0x1) {
2850 printk(KERN_ERR "drxk: SIO not ready\n");
2851 mutex_unlock(&state->mutex);
2855 mutex_unlock(&state->mutex);
2860 static int ADCSyncMeasurement(struct drxk_state *state, u16 *count)
2868 /* Start measurement */
2869 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2872 status = write16(state, IQM_AF_START_LOCK__A, 1);
2877 status = read16(state, IQM_AF_PHASE0__A, &data);
2881 *count = *count + 1;
2882 status = read16(state, IQM_AF_PHASE1__A, &data);
2886 *count = *count + 1;
2887 status = read16(state, IQM_AF_PHASE2__A, &data);
2891 *count = *count + 1;
2896 static int ADCSynchronization(struct drxk_state *state)
2904 status = ADCSyncMeasurement(state, &count);
2909 /* Try sampling on a diffrent edge */
2912 status = read16(state, IQM_AF_CLKNEG__A, &clkNeg);
2915 if ((clkNeg | IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2916 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2917 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2919 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2921 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2923 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2925 status = write16(state, IQM_AF_CLKNEG__A, clkNeg);
2928 status = ADCSyncMeasurement(state, &count);
2939 static int SetFrequencyShifter(struct drxk_state *state,
2940 u16 intermediateFreqkHz,
2941 s32 tunerFreqOffset, bool isDTV)
2943 bool selectPosImage = false;
2944 u32 rfFreqResidual = tunerFreqOffset;
2945 u32 fmFrequencyShift = 0;
2946 bool tunerMirror = !state->m_bMirrorFreqSpect;
2951 u32 samplingFrequency = (u32) (state->m_sysClockFreq / 3);
2958 Program frequency shifter
2959 No need to account for mirroring on RF
2962 if ((state->m_OperationMode == OM_QAM_ITU_A) ||
2963 (state->m_OperationMode == OM_QAM_ITU_C) ||
2964 (state->m_OperationMode == OM_DVBT))
2965 selectPosImage = true;
2967 selectPosImage = false;
2970 /* tuner doesn't mirror */
2971 ifFreqActual = intermediateFreqkHz +
2972 rfFreqResidual + fmFrequencyShift;
2975 ifFreqActual = intermediateFreqkHz -
2976 rfFreqResidual - fmFrequencyShift;
2977 if (ifFreqActual > samplingFrequency / 2) {
2979 adcFreq = samplingFrequency - ifFreqActual;
2982 /* adc doesn't mirror */
2983 adcFreq = ifFreqActual;
2987 frequencyShift = adcFreq;
2988 imageToSelect = state->m_rfmirror ^ tunerMirror ^
2989 adcFlip ^ selectPosImage;
2990 state->m_IqmFsRateOfs =
2991 Frac28a((frequencyShift), samplingFrequency);
2994 state->m_IqmFsRateOfs = ~state->m_IqmFsRateOfs + 1;
2996 /* Program frequency shifter with tuner offset compensation */
2997 /* frequencyShift += tunerFreqOffset; TODO */
2998 status = write32(state, IQM_FS_RATE_OFS_LO__A,
2999 state->m_IqmFsRateOfs);
3003 static int InitAGC(struct drxk_state *state, bool isDTV)
3006 u16 ingainTgtMin = 0;
3007 u16 ingainTgtMax = 0;
3015 u16 kiInnergainMin = 0;
3016 u16 ifIaccuHiTgt = 0;
3017 u16 ifIaccuHiTgtMin = 0;
3018 u16 ifIaccuHiTgtMax = 0;
3020 u16 fastClpCtrlDelay = 0;
3021 u16 clpCtrlMode = 0;
3027 /* Common settings */
3029 ifIaccuHiTgtMin = 2047;
3034 /* Standard specific settings */
3036 clpDirTo = (u16) -9;
3039 snsDirTo = (u16) -9;
3040 kiInnergainMin = (u16) -1030;
3047 ifIaccuHiTgtMax = 0x2380;
3048 ifIaccuHiTgt = 0x2380;
3049 ingainTgtMin = 0x0511;
3051 ingainTgtMax = 5119;
3053 state->m_qamIfAgcCfg.FastClipCtrlDelay;
3055 ifIaccuHiTgtMax = 0x1200;
3056 ifIaccuHiTgt = 0x1200;
3057 ingainTgtMin = 13424;
3059 ingainTgtMax = 30000;
3061 state->m_dvbtIfAgcCfg.FastClipCtrlDelay;
3063 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, fastClpCtrlDelay);
3067 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clpCtrlMode);
3070 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingainTgt);
3073 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingainTgtMin);
3076 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingainTgtMax);
3079 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, ifIaccuHiTgtMin);
3082 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, ifIaccuHiTgtMax);
3085 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3088 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3091 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3094 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3097 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clpSumMax);
3100 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, snsSumMax);
3104 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, kiInnergainMin);
3107 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, ifIaccuHiTgt);
3110 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clpCyclen);
3114 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3117 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3120 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3124 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3127 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clpSumMin);
3130 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, snsSumMin);
3133 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clpDirTo);
3136 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, snsDirTo);
3139 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3142 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3145 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3148 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3151 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3154 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3157 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3160 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3163 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3166 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3169 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3172 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3175 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3178 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3182 /* Initialize inner-loop KI gain factors */
3183 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3188 data &= ~SCU_RAM_AGC_KI_RF__M;
3189 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3190 data &= ~SCU_RAM_AGC_KI_IF__M;
3191 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3193 status = write16(state, SCU_RAM_AGC_KI__A, data);
3200 static int DVBTQAMGetAccPktErr(struct drxk_state *state, u16 *packetErr)
3206 if (packetErr == NULL) {
3207 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3211 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, packetErr);
3219 static int DVBTScCommand(struct drxk_state *state,
3220 u16 cmd, u16 subcmd,
3221 u16 param0, u16 param1, u16 param2,
3222 u16 param3, u16 param4)
3231 status = read16(state, OFDM_SC_COMM_EXEC__A, &scExec);
3233 /* SC is not running */
3237 /* Wait until sc is ready to receive command */
3241 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3243 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3244 if (retryCnt >= DRXK_MAX_RETRIES)
3246 /* Write sub-command */
3248 /* All commands using sub-cmd */
3249 case OFDM_SC_RA_RAM_CMD_PROC_START:
3250 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3251 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3253 write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3258 } /* switch (cmd->cmd) */
3260 /* Write needed parameters and the command */
3262 /* All commands using 5 parameters */
3263 /* All commands using 4 parameters */
3264 /* All commands using 3 parameters */
3265 /* All commands using 2 parameters */
3266 case OFDM_SC_RA_RAM_CMD_PROC_START:
3267 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3268 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3270 write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3271 /* All commands using 1 parameters */
3272 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3273 case OFDM_SC_RA_RAM_CMD_USER_IO:
3275 write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3276 /* All commands using 0 parameters */
3277 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3278 case OFDM_SC_RA_RAM_CMD_NULL:
3280 status = write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3283 /* Unknown command */
3285 } /* switch (cmd->cmd) */
3287 /* Wait until sc is ready processing command */
3291 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3293 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3294 if (retryCnt >= DRXK_MAX_RETRIES)
3297 /* Check for illegal cmd */
3298 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &errCode);
3299 if (errCode == 0xFFFF) {
3300 /* illegal command */
3304 /* Retreive results parameters from SC */
3306 /* All commands yielding 5 results */
3307 /* All commands yielding 4 results */
3308 /* All commands yielding 3 results */
3309 /* All commands yielding 2 results */
3310 /* All commands yielding 1 result */
3311 case OFDM_SC_RA_RAM_CMD_USER_IO:
3312 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3314 read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3315 /* All commands yielding 0 results */
3316 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3317 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3318 case OFDM_SC_RA_RAM_CMD_PROC_START:
3319 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3320 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3321 case OFDM_SC_RA_RAM_CMD_NULL:
3324 /* Unknown command */
3327 } /* switch (cmd->cmd) */
3331 static int PowerUpDVBT(struct drxk_state *state)
3333 enum DRXPowerMode powerMode = DRX_POWER_UP;
3338 status = CtrlPowerMode(state, &powerMode);
3345 static int DVBTCtrlSetIncEnable(struct drxk_state *state, bool *enabled)
3350 if (*enabled == true)
3351 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3353 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3358 #define DEFAULT_FR_THRES_8K 4000
3359 static int DVBTCtrlSetFrEnable(struct drxk_state *state, bool *enabled)
3365 if (*enabled == true) {
3366 /* write mask to 1 */
3367 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3368 DEFAULT_FR_THRES_8K);
3370 /* write mask to 0 */
3371 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3377 static int DVBTCtrlSetEchoThreshold(struct drxk_state *state,
3378 struct DRXKCfgDvbtEchoThres_t *echoThres)
3385 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3389 switch (echoThres->fftMode) {
3390 case DRX_FFTMODE_2K:
3391 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3393 ((echoThres->threshold <<
3394 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3395 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3397 case DRX_FFTMODE_8K:
3398 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3400 ((echoThres->threshold <<
3401 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3402 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3409 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3417 static int DVBTCtrlSetSqiSpeed(struct drxk_state *state,
3418 enum DRXKCfgDvbtSqiSpeed *speed)
3425 case DRXK_DVBT_SQI_SPEED_FAST:
3426 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3427 case DRXK_DVBT_SQI_SPEED_SLOW:
3432 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3437 /*============================================================================*/
3440 * \brief Activate DVBT specific presets
3441 * \param demod instance of demodulator.
3442 * \return DRXStatus_t.
3444 * Called in DVBTSetStandard
3447 static int DVBTActivatePresets(struct drxk_state *state)
3451 struct DRXKCfgDvbtEchoThres_t echoThres2k = { 0, DRX_FFTMODE_2K };
3452 struct DRXKCfgDvbtEchoThres_t echoThres8k = { 0, DRX_FFTMODE_8K };
3456 bool setincenable = false;
3457 bool setfrenable = true;
3458 status = DVBTCtrlSetIncEnable(state, &setincenable);
3461 status = DVBTCtrlSetFrEnable(state, &setfrenable);
3464 status = DVBTCtrlSetEchoThreshold(state, &echoThres2k);
3467 status = DVBTCtrlSetEchoThreshold(state, &echoThres8k);
3470 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, state->m_dvbtIfAgcCfg.IngainTgtMax);
3478 /*============================================================================*/
3481 * \brief Initialize channelswitch-independent settings for DVBT.
3482 * \param demod instance of demodulator.
3483 * \return DRXStatus_t.
3485 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3486 * the DVB-T taps from the drxk_filters.h are used.
3488 static int SetDVBTStandard(struct drxk_state *state,
3489 enum OperationMode oMode)
3499 /* added antenna switch */
3500 SwitchAntennaToDVBT(state);
3501 /* send OFDM reset command */
3502 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
3506 /* send OFDM setenv command */
3507 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 0, NULL, 1, &cmdResult);
3511 /* reset datapath for OFDM, processors first */
3512 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3515 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3518 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3523 /* synchronize on ofdstate->m_festart */
3524 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3527 /* window size for clipping ADC detection */
3528 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3531 /* window size for for sense pre-SAW detection */
3532 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3535 /* sense threshold for sense pre-SAW detection */
3536 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3539 status = SetIqmAf(state, true);
3543 status = write16(state, IQM_AF_AGC_RF__A, 0);
3547 /* Impulse noise cruncher setup */
3548 status = write16(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3551 status = write16(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3554 status = write16(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3558 status = write16(state, IQM_RC_STRETCH__A, 16);
3561 status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3564 status = write16(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3567 status = write16(state, IQM_CF_SCALE__A, 1600);
3570 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3574 /* virtual clipping threshold for clipping ADC detection */
3575 status = write16(state, IQM_AF_CLP_TH__A, 448);
3578 status = write16(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3582 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3586 status = write16(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3589 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3592 /* enable power measurement interrupt */
3593 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3596 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3600 /* IQM will not be reset from here, sync ADC and update/init AGC */
3601 status = ADCSynchronization(state);
3604 status = SetPreSaw(state, &state->m_dvbtPreSawCfg);
3608 /* Halt SCU to enable safe non-atomic accesses */
3609 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3613 status = SetAgcRf(state, &state->m_dvbtRfAgcCfg, true);
3616 status = SetAgcIf(state, &state->m_dvbtIfAgcCfg, true);
3620 /* Set Noise Estimation notch width and enable DC fix */
3621 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3624 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3625 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3629 /* Activate SCU to enable SCU commands */
3630 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3634 if (!state->m_DRXK_A3_ROM_CODE) {
3635 /* AGCInit() is not done for DVBT, so set agcFastClipCtrlDelay */
3636 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, state->m_dvbtIfAgcCfg.FastClipCtrlDelay);
3642 #ifdef COMPILE_FOR_NONRT
3643 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3646 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3652 status = write16(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3657 #ifdef COMPILE_FOR_NONRT
3658 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3662 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3666 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3670 /* Setup MPEG bus */
3671 status = MPEGTSDtoSetup(state, OM_DVBT);
3674 /* Set DVBT Presets */
3675 status = DVBTActivatePresets(state);
3682 printk(KERN_ERR "drxk: %s status - %08x\n", __func__, status);
3687 /*============================================================================*/
3689 * \brief Start dvbt demodulating for channel.
3690 * \param demod instance of demodulator.
3691 * \return DRXStatus_t.
3693 static int DVBTStart(struct drxk_state *state)
3697 /* DRXKOfdmScCmd_t scCmd; */
3700 /* Start correct processes to get in lock */
3701 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3703 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3704 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0, OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1, 0, 0, 0);
3708 status = MPEGTSStart(state);
3711 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3719 /*============================================================================*/
3722 * \brief Set up dvbt demodulator for channel.
3723 * \param demod instance of demodulator.
3724 * \return DRXStatus_t.
3725 * // original DVBTSetChannel()
3727 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
3728 s32 tunerFreqOffset)
3731 u16 transmissionParams = 0;
3732 u16 operationMode = 0;
3733 u32 iqmRcRateOfs = 0;
3739 /* printk(KERN_DEBUG "drxk: %s IF =%d, TFO = %d\n", __func__, IntermediateFreqkHz, tunerFreqOffset); */
3741 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
3745 /* Halt SCU to enable safe non-atomic accesses */
3746 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3750 /* Stop processors */
3751 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3754 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3758 /* Mandatory fix, always stop CP, required to set spl offset back to
3759 hardware default (is set to 0 by ucode during pilot detection */
3760 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3764 /*== Write channel settings to device =====================================*/
3767 switch (state->param.u.ofdm.transmission_mode) {
3768 case TRANSMISSION_MODE_AUTO:
3770 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3771 /* fall through , try first guess DRX_FFTMODE_8K */
3772 case TRANSMISSION_MODE_8K:
3773 transmissionParams |=
3774 OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3776 case TRANSMISSION_MODE_2K:
3777 transmissionParams |=
3778 OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3783 switch (state->param.u.ofdm.guard_interval) {
3785 case GUARD_INTERVAL_AUTO:
3786 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3787 /* fall through , try first guess DRX_GUARD_1DIV4 */
3788 case GUARD_INTERVAL_1_4:
3789 transmissionParams |=
3790 OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3792 case GUARD_INTERVAL_1_32:
3793 transmissionParams |=
3794 OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3796 case GUARD_INTERVAL_1_16:
3797 transmissionParams |=
3798 OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3800 case GUARD_INTERVAL_1_8:
3801 transmissionParams |=
3802 OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3807 switch (state->param.u.ofdm.hierarchy_information) {
3808 case HIERARCHY_AUTO:
3809 case HIERARCHY_NONE:
3811 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3812 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3813 /* transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3816 transmissionParams |=
3817 OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3820 transmissionParams |=
3821 OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3824 transmissionParams |=
3825 OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3831 switch (state->param.u.ofdm.constellation) {
3834 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3835 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3837 transmissionParams |=
3838 OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3841 transmissionParams |=
3842 OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3845 transmissionParams |=
3846 OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3850 /* No hierachical channels support in BDA */
3851 /* Priority (only for hierarchical channels) */
3852 switch (channel->priority) {
3853 case DRX_PRIORITY_LOW:
3854 transmissionParams |=
3855 OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3856 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3857 OFDM_EC_SB_PRIOR_LO);
3859 case DRX_PRIORITY_HIGH:
3860 transmissionParams |=
3861 OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3862 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3863 OFDM_EC_SB_PRIOR_HI));
3865 case DRX_PRIORITY_UNKNOWN: /* fall through */
3867 return DRX_STS_INVALID_ARG;
3871 /* Set Priorty high */
3872 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3873 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3879 switch (state->param.u.ofdm.code_rate_HP) {
3882 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3883 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3885 transmissionParams |=
3886 OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3889 transmissionParams |=
3890 OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3893 transmissionParams |=
3894 OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3897 transmissionParams |=
3898 OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3901 transmissionParams |=
3902 OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3906 /* SAW filter selection: normaly not necesarry, but if wanted
3907 the application can select a SAW filter via the driver by using UIOs */
3908 /* First determine real bandwidth (Hz) */
3909 /* Also set delay for impulse noise cruncher */
3910 /* Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is changed
3911 by SC for fix for some 8K,1/8 guard but is restored by InitEC and ResetEC
3913 switch (state->param.u.ofdm.bandwidth) {
3914 case BANDWIDTH_AUTO:
3915 case BANDWIDTH_8_MHZ:
3916 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3917 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3052);
3920 /* cochannel protection for PAL 8 MHz */
3921 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 7);
3924 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 7);
3927 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 7);
3930 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3934 case BANDWIDTH_7_MHZ:
3935 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3936 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3491);
3939 /* cochannel protection for PAL 7 MHz */
3940 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 8);
3943 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 8);
3946 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 4);
3949 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3953 case BANDWIDTH_6_MHZ:
3954 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3955 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 4073);
3958 /* cochannel protection for NTSC 6 MHz */
3959 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 19);
3962 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 19);
3965 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 14);
3968 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3976 if (iqmRcRateOfs == 0) {
3977 /* Now compute IQM_RC_RATE_OFS
3978 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
3980 ((SysFreq / BandWidth) * (2^21)) - (2^23)
3982 /* (SysFreq / BandWidth) * (2^28) */
3983 /* assert (MAX(sysClk)/MIN(bandwidth) < 16)
3984 => assert(MAX(sysClk) < 16*MIN(bandwidth))
3985 => assert(109714272 > 48000000) = true so Frac 28 can be used */
3986 iqmRcRateOfs = Frac28a((u32)
3987 ((state->m_sysClockFreq *
3988 1000) / 3), bandwidth);
3989 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
3990 if ((iqmRcRateOfs & 0x7fL) >= 0x40)
3991 iqmRcRateOfs += 0x80L;
3992 iqmRcRateOfs = iqmRcRateOfs >> 7;
3993 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
3994 iqmRcRateOfs = iqmRcRateOfs - (1 << 23);
3998 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
3999 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
4000 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRateOfs);
4004 /* Bandwidth setting done */
4007 status = DVBTSetFrequencyShift(demod, channel, tunerOffset);
4011 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
4015 /*== Start SC, write channel settings to SC ===============================*/
4017 /* Activate SCU to enable SCU commands */
4018 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4022 /* Enable SC after setting all other parameters */
4023 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4026 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4031 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
4035 /* Write SC parameter registers, set all AUTO flags in operation mode */
4036 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4037 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4038 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4039 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4040 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4042 DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4043 0, transmissionParams, param1, 0, 0, 0);
4044 if (!state->m_DRXK_A3_ROM_CODE)
4045 status = DVBTCtrlSetSqiSpeed(state, &state->m_sqiSpeed);
4055 /*============================================================================*/
4058 * \brief Retreive lock status .
4059 * \param demod Pointer to demodulator instance.
4060 * \param lockStat Pointer to lock status structure.
4061 * \return DRXStatus_t.
4064 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus)
4067 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4068 OFDM_SC_RA_RAM_LOCK_FEC__M);
4069 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4070 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4072 u16 ScRaRamLock = 0;
4078 /* Check if SC is running */
4079 status = read16(state, OFDM_SC_COMM_EXEC__A, &ScCommExec);
4080 if (ScCommExec == OFDM_SC_COMM_EXEC_STOP) {
4081 /* SC not active; return DRX_NOT_LOCKED */
4082 *pLockStatus = NOT_LOCKED;
4086 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &ScRaRamLock);
4088 if ((ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask)
4089 *pLockStatus = MPEG_LOCK;
4090 else if ((ScRaRamLock & fec_lock_mask) == fec_lock_mask)
4091 *pLockStatus = FEC_LOCK;
4092 else if ((ScRaRamLock & demod_lock_mask) == demod_lock_mask)
4093 *pLockStatus = DEMOD_LOCK;
4094 else if (ScRaRamLock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4095 *pLockStatus = NEVER_LOCK;
4097 *pLockStatus = NOT_LOCKED;
4102 static int PowerUpQAM(struct drxk_state *state)
4104 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
4109 status = CtrlPowerMode(state, &powerMode);
4119 /** Power Down QAM */
4120 static int PowerDownQAM(struct drxk_state *state)
4128 status = read16(state, SCU_COMM_EXEC__A, &data);
4131 if (data == SCU_COMM_EXEC_ACTIVE) {
4136 /* stop all comstate->m_exec */
4137 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4140 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
4145 status = SetIqmAf(state, false);
4153 /*============================================================================*/
4156 * \brief Setup of the QAM Measurement intervals for signal quality
4157 * \param demod instance of demod.
4158 * \param constellation current constellation.
4159 * \return DRXStatus_t.
4162 * Take into account that for certain settings the errorcounters can overflow.
4163 * The implementation does not check this.
4166 static int SetQAMMeasurement(struct drxk_state *state,
4167 enum EDrxkConstellation constellation,
4170 u32 fecBitsDesired = 0; /* BER accounting period */
4171 u32 fecRsPeriodTotal = 0; /* Total period */
4172 u16 fecRsPrescale = 0; /* ReedSolomon Measurement Prescale */
4173 u16 fecRsPeriod = 0; /* Value for corresponding I2C register */
4181 /* fecBitsDesired = symbolRate [kHz] *
4183 (constellation + 1) *
4187 switch (constellation) {
4188 case DRX_CONSTELLATION_QAM16:
4189 fecBitsDesired = 4 * symbolRate;
4191 case DRX_CONSTELLATION_QAM32:
4192 fecBitsDesired = 5 * symbolRate;
4194 case DRX_CONSTELLATION_QAM64:
4195 fecBitsDesired = 6 * symbolRate;
4197 case DRX_CONSTELLATION_QAM128:
4198 fecBitsDesired = 7 * symbolRate;
4200 case DRX_CONSTELLATION_QAM256:
4201 fecBitsDesired = 8 * symbolRate;
4210 fecBitsDesired /= 1000; /* symbolRate [Hz] -> symbolRate [kHz] */
4211 fecBitsDesired *= 500; /* meas. period [ms] */
4213 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4214 /* fecRsPeriodTotal = fecBitsDesired / 1632 */
4215 fecRsPeriodTotal = (fecBitsDesired / 1632UL) + 1; /* roughly ceil */
4217 /* fecRsPeriodTotal = fecRsPrescale * fecRsPeriod */
4218 fecRsPrescale = 1 + (u16) (fecRsPeriodTotal >> 16);
4219 if (fecRsPrescale == 0) {
4220 /* Divide by zero (though impossible) */
4227 ((u16) fecRsPeriodTotal +
4228 (fecRsPrescale >> 1)) / fecRsPrescale;
4230 /* write corresponding registers */
4231 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fecRsPeriod);
4234 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, fecRsPrescale);
4237 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fecRsPeriod);
4244 printk(KERN_ERR "drxk: %s: status - %08x\n", __func__, status);
4249 static int SetQAM16(struct drxk_state *state)
4255 /* QAM Equalizer Setup */
4257 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4260 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4263 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4266 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4269 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4272 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4275 /* Decision Feedback Equalizer */
4276 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4279 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4282 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4285 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4288 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4291 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4295 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4298 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4301 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4305 /* QAM Slicer Settings */
4306 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM16);
4310 /* QAM Loop Controller Coeficients */
4311 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4314 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4317 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4320 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4323 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4326 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4329 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4332 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4336 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4339 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4342 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4345 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4348 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4351 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4354 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4357 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4360 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4363 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4366 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4369 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4374 /* QAM State Machine (FSM) Thresholds */
4376 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4379 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4382 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4385 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4388 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4391 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4395 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4398 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4401 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4406 /* QAM FSM Tracking Parameters */
4408 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4411 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4414 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4417 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4420 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4423 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4426 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4434 /*============================================================================*/
4437 * \brief QAM32 specific setup
4438 * \param demod instance of demod.
4439 * \return DRXStatus_t.
4441 static int SetQAM32(struct drxk_state *state)
4447 /* QAM Equalizer Setup */
4449 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4452 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4455 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4458 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4461 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4464 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4468 /* Decision Feedback Equalizer */
4469 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4472 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4475 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4478 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4481 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4484 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4488 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4491 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4494 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4498 /* QAM Slicer Settings */
4500 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM32);
4505 /* QAM Loop Controller Coeficients */
4507 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4510 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4513 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4516 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4519 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4522 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4525 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4528 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4532 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4535 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4538 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4541 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4544 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4547 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4550 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4553 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4556 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4559 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4562 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4565 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4570 /* QAM State Machine (FSM) Thresholds */
4572 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4575 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4578 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4581 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4584 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4587 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4591 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4594 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4597 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4602 /* QAM FSM Tracking Parameters */
4604 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4607 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4610 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4613 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4616 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4619 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4622 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4630 /*============================================================================*/
4633 * \brief QAM64 specific setup
4634 * \param demod instance of demod.
4635 * \return DRXStatus_t.
4637 static int SetQAM64(struct drxk_state *state)
4643 /* QAM Equalizer Setup */
4645 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4648 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4651 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4654 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4657 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4660 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4664 /* Decision Feedback Equalizer */
4665 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4668 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4671 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4674 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4677 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4680 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4684 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4687 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4690 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4694 /* QAM Slicer Settings */
4695 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM64);
4700 /* QAM Loop Controller Coeficients */
4702 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4705 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4708 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4711 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4714 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4717 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4720 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4723 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4727 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4730 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4733 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4736 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4739 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4742 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4745 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4748 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4751 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4754 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4757 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4760 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4765 /* QAM State Machine (FSM) Thresholds */
4767 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4770 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4773 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4776 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4779 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4782 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4786 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4789 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4792 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4797 /* QAM FSM Tracking Parameters */
4799 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4802 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4805 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4808 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4811 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4814 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4817 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4825 /*============================================================================*/
4828 * \brief QAM128 specific setup
4829 * \param demod: instance of demod.
4830 * \return DRXStatus_t.
4832 static int SetQAM128(struct drxk_state *state)
4838 /* QAM Equalizer Setup */
4840 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4843 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4846 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4849 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4852 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4855 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4859 /* Decision Feedback Equalizer */
4860 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4863 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4866 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4869 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4872 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4875 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4879 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4882 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4885 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4890 /* QAM Slicer Settings */
4892 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM128);
4897 /* QAM Loop Controller Coeficients */
4899 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4902 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4905 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4908 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4911 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4914 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4917 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4920 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4924 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4927 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4930 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4933 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4936 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4939 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4942 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4945 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4948 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4951 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4954 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4957 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4962 /* QAM State Machine (FSM) Thresholds */
4964 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4967 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4970 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4973 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4976 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
4979 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4983 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4986 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
4990 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
4994 /* QAM FSM Tracking Parameters */
4996 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
4999 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
5002 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
5005 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
5008 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
5011 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5014 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5022 /*============================================================================*/
5025 * \brief QAM256 specific setup
5026 * \param demod: instance of demod.
5027 * \return DRXStatus_t.
5029 static int SetQAM256(struct drxk_state *state)
5035 /* QAM Equalizer Setup */
5037 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5040 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5043 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5046 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5049 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5052 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5056 /* Decision Feedback Equalizer */
5057 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5060 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5063 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5066 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5069 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5072 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5076 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5079 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5082 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5086 /* QAM Slicer Settings */
5088 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM256);
5093 /* QAM Loop Controller Coeficients */
5095 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5098 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5101 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5104 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5107 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5110 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5113 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5116 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5120 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5123 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5126 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5129 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5132 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5135 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5138 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5141 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5144 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5147 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5150 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5153 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5158 /* QAM State Machine (FSM) Thresholds */
5160 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5163 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5166 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5169 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5172 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5175 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5179 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5182 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5185 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5190 /* QAM FSM Tracking Parameters */
5192 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5195 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5198 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5201 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5204 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5207 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5210 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5219 /*============================================================================*/
5221 * \brief Reset QAM block.
5222 * \param demod: instance of demod.
5223 * \param channel: pointer to channel data.
5224 * \return DRXStatus_t.
5226 static int QAMResetQAM(struct drxk_state *state)
5233 /* Stop QAM comstate->m_exec */
5234 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5238 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
5243 /* All done, all OK */
5247 /*============================================================================*/
5250 * \brief Set QAM symbolrate.
5251 * \param demod: instance of demod.
5252 * \param channel: pointer to channel data.
5253 * \return DRXStatus_t.
5255 static int QAMSetSymbolrate(struct drxk_state *state)
5257 u32 adcFrequency = 0;
5266 /* Select & calculate correct IQM rate */
5267 adcFrequency = (state->m_sysClockFreq * 1000) / 3;
5269 /* printk(KERN_DEBUG "drxk: SR %d\n", state->param.u.qam.symbol_rate); */
5270 if (state->param.u.qam.symbol_rate <= 1188750)
5272 else if (state->param.u.qam.symbol_rate <= 2377500)
5274 else if (state->param.u.qam.symbol_rate <= 4755000)
5276 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5281 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5283 symbFreq = state->param.u.qam.symbol_rate * (1 << ratesel);
5284 if (symbFreq == 0) {
5285 /* Divide by zero */
5288 iqmRcRate = (adcFrequency / symbFreq) * (1 << 21) +
5289 (Frac28a((adcFrequency % symbFreq), symbFreq) >> 7) -
5291 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRate);
5294 state->m_iqmRcRate = iqmRcRate;
5296 LcSymbFreq = round (.125 * symbolrate / adcFreq * (1<<15))
5298 symbFreq = state->param.u.qam.symbol_rate;
5299 if (adcFrequency == 0) {
5300 /* Divide by zero */
5303 lcSymbRate = (symbFreq / adcFrequency) * (1 << 12) +
5304 (Frac28a((symbFreq % adcFrequency), adcFrequency) >>
5306 if (lcSymbRate > 511)
5308 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lcSymbRate);
5316 /*============================================================================*/
5319 * \brief Get QAM lock status.
5320 * \param demod: instance of demod.
5321 * \param channel: pointer to channel data.
5322 * \return DRXStatus_t.
5325 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus)
5328 u16 Result[2] = { 0, 0 };
5333 SCU_RAM_COMMAND_STANDARD_QAM |
5334 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5337 printk(KERN_ERR "drxk: %s status = %08x\n", __func__, status);
5339 if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5340 /* 0x0000 NOT LOCKED */
5341 *pLockStatus = NOT_LOCKED;
5342 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5343 /* 0x4000 DEMOD LOCKED */
5344 *pLockStatus = DEMOD_LOCK;
5345 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5346 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5347 *pLockStatus = MPEG_LOCK;
5349 /* 0xC000 NEVER LOCKED */
5350 /* (system will never be able to lock to the signal) */
5351 /* TODO: check this, intermediate & standard specific lock states are not
5352 taken into account here */
5353 *pLockStatus = NEVER_LOCK;
5358 #define QAM_MIRROR__M 0x03
5359 #define QAM_MIRROR_NORMAL 0x00
5360 #define QAM_MIRRORED 0x01
5361 #define QAM_MIRROR_AUTO_ON 0x02
5362 #define QAM_LOCKRANGE__M 0x10
5363 #define QAM_LOCKRANGE_NORMAL 0x10
5365 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
5366 s32 tunerFreqOffset)
5370 u16 setEnvParameters[5];
5371 u16 setParamParameters[4] = { 0, 0, 0, 0 };
5377 STEP 1: reset demodulator
5378 resets FEC DI and FEC RS
5380 resets SCU variables
5382 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5385 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5388 status = QAMResetQAM(state);
5393 STEP 2: configure demodulator
5395 -set params; resets IQM,QAM,FEC HW; initializes some SCU variables
5397 status = QAMSetSymbolrate(state);
5401 /* Env parameters */
5402 setEnvParameters[2] = QAM_TOP_ANNEX_A; /* Annex */
5403 if (state->m_OperationMode == OM_QAM_ITU_C)
5404 setEnvParameters[2] = QAM_TOP_ANNEX_C; /* Annex */
5405 setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
5406 /* check for LOCKRANGE Extented */
5407 /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
5411 switch (state->param.u.qam.modulation) {
5413 state->m_Constellation = DRX_CONSTELLATION_QAM256;
5417 state->m_Constellation = DRX_CONSTELLATION_QAM64;
5420 state->m_Constellation = DRX_CONSTELLATION_QAM16;
5423 state->m_Constellation = DRX_CONSTELLATION_QAM32;
5426 state->m_Constellation = DRX_CONSTELLATION_QAM128;
5435 setParamParameters[0] = state->m_Constellation; /* constellation */
5436 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5438 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 4, setParamParameters, 1, &cmdResult);
5443 /* STEP 3: enable the system in a mode where the ADC provides valid signal
5444 setup constellation independent registers */
5446 status = SetFrequency (channel, tunerFreqOffset));
5450 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
5454 /* Setup BER measurement */
5455 status = SetQAMMeasurement(state, state->m_Constellation, state->param.u. qam.symbol_rate);
5459 /* Reset default values */
5460 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5463 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5467 /* Reset default LC values */
5468 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5471 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5474 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5477 status = write16(state, QAM_LC_MODE__A, 7);
5481 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5484 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5487 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5490 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5493 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5496 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5499 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5502 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5505 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5508 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5511 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5514 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5517 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5520 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5523 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5527 /* Mirroring, QAM-block starting point not inverted */
5528 status = write16(state, QAM_SY_SP_INV__A, QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5532 /* Halt SCU to enable safe non-atomic accesses */
5533 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5537 /* STEP 4: constellation specific setup */
5538 switch (state->param.u.qam.modulation) {
5540 status = SetQAM16(state);
5545 status = SetQAM32(state);
5551 status = SetQAM64(state);
5556 status = SetQAM128(state);
5561 status = SetQAM256(state);
5569 /* Activate SCU to enable SCU commands */
5570 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5575 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5576 /* extAttr->currentChannel.constellation = channel->constellation; */
5577 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5578 status = MPEGTSDtoSetup(state, state->m_OperationMode);
5582 /* Start processes */
5583 status = MPEGTSStart(state);
5586 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5589 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5592 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5596 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5597 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
5601 /* update global DRXK data container */
5602 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5604 /* All done, all OK */
5608 printk(KERN_ERR "drxk: %s %d\n", __func__, status);
5613 static int SetQAMStandard(struct drxk_state *state,
5614 enum OperationMode oMode)
5616 #ifdef DRXK_QAM_TAPS
5617 #define DRXK_QAMA_TAPS_SELECT
5618 #include "drxk_filters.h"
5619 #undef DRXK_QAMA_TAPS_SELECT
5626 /* added antenna switch */
5627 SwitchAntennaToQAM(state);
5629 /* Ensure correct power-up mode */
5630 status = PowerUpQAM(state);
5633 /* Reset QAM block */
5634 status = QAMResetQAM(state);
5640 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5643 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5647 /* Upload IQM Channel Filter settings by
5648 boot loader from ROM table */
5651 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5656 status = BLDirectCmd(state, IQM_CF_TAP_RE0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5659 status = BLDirectCmd(state, IQM_CF_TAP_IM0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5670 status = write16(state, IQM_CF_OUT_ENA__A, (1 << IQM_CF_OUT_ENA_QAM__B));
5673 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5676 status = write16(state, IQM_CF_MIDTAP__A, ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5680 status = write16(state, IQM_RC_STRETCH__A, 21);
5683 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5686 status = write16(state, IQM_AF_CLP_TH__A, 448);
5689 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5692 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5696 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5699 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5702 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5705 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5709 /* IQM Impulse Noise Processing Unit */
5710 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5713 status = write16(state, IQM_CF_DATATH__A, 1000);
5716 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5719 status = write16(state, IQM_CF_DET_LCT__A, 0);
5722 status = write16(state, IQM_CF_WND_LEN__A, 1);
5725 status = write16(state, IQM_CF_PKDTH__A, 1);
5728 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5732 /* turn on IQMAF. Must be done before setAgc**() */
5733 status = SetIqmAf(state, true);
5736 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5740 /* IQM will not be reset from here, sync ADC and update/init AGC */
5741 status = ADCSynchronization(state);
5745 /* Set the FSM step period */
5746 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5750 /* Halt SCU to enable safe non-atomic accesses */
5751 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5755 /* No more resets of the IQM, current standard correctly set =>
5756 now AGCs can be configured. */
5758 status = InitAGC(state, true);
5761 status = SetPreSaw(state, &(state->m_qamPreSawCfg));
5765 /* Configure AGC's */
5766 status = SetAgcRf(state, &(state->m_qamRfAgcCfg), true);
5769 status = SetAgcIf(state, &(state->m_qamIfAgcCfg), true);
5773 /* Activate SCU to enable SCU commands */
5774 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5781 static int WriteGPIO(struct drxk_state *state)
5788 /* stop lock indicator process */
5789 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5793 /* Write magic word to enable pdr reg write */
5794 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5798 if (state->m_hasSAWSW) {
5799 /* write to io pad configuration register - output mode */
5800 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5804 /* use corresponding bit in io data output registar */
5805 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5808 if (state->m_GPIO == 0)
5809 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5811 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5812 /* write back to io data output register */
5813 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5818 /* Write magic word to disable pdr reg write */
5819 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5826 static int SwitchAntennaToQAM(struct drxk_state *state)
5831 if (state->m_AntennaSwitchDVBTDVBC != 0) {
5832 if (state->m_GPIO != state->m_AntennaDVBC) {
5833 state->m_GPIO = state->m_AntennaDVBC;
5834 status = WriteGPIO(state);
5840 static int SwitchAntennaToDVBT(struct drxk_state *state)
5845 if (state->m_AntennaSwitchDVBTDVBC != 0) {
5846 if (state->m_GPIO != state->m_AntennaDVBT) {
5847 state->m_GPIO = state->m_AntennaDVBT;
5848 status = WriteGPIO(state);
5855 static int PowerDownDevice(struct drxk_state *state)
5857 /* Power down to requested mode */
5858 /* Backup some register settings */
5859 /* Set pins with possible pull-ups connected to them in input mode */
5860 /* Analog power down */
5861 /* ADC power down */
5862 /* Power down device */
5867 if (state->m_bPDownOpenBridge) {
5868 /* Open I2C bridge before power down of DRXK */
5869 status = ConfigureI2CBridge(state, true);
5874 status = DVBTEnableOFDMTokenRing(state, false);
5878 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_CLOCK);
5881 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5884 state->m_HICfgCtrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
5885 status = HI_CfgCommand(state);
5896 static int load_microcode(struct drxk_state *state, char *mc_name)
5898 const struct firmware *fw = NULL;
5903 err = request_firmware(&fw, mc_name, state->i2c->dev.parent);
5906 "drxk: Could not load firmware file %s.\n", mc_name);
5908 "drxk: Copy %s to your hotplug directory!\n", mc_name);
5911 err = DownloadMicrocode(state, fw->data, fw->size);
5912 release_firmware(fw);
5916 static int init_drxk(struct drxk_state *state)
5919 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
5923 if ((state->m_DrxkState == DRXK_UNINITIALIZED)) {
5925 status = PowerUpDevice(state);
5928 status = DRXX_Open(state);
5931 /* Soft reset of OFDM-, sys- and osc-clockdomain */
5932 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);
5935 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5938 /* TODO is this needed, if yes how much delay in worst case scenario */
5940 state->m_DRXK_A3_PATCH_CODE = true;
5941 status = GetDeviceCapabilities(state);
5945 /* Bridge delay, uses oscilator clock */
5946 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
5947 /* SDA brdige delay */
5948 state->m_HICfgBridgeDelay =
5949 (u16) ((state->m_oscClockFreq / 1000) *
5950 HI_I2C_BRIDGE_DELAY) / 1000;
5952 if (state->m_HICfgBridgeDelay >
5953 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
5954 state->m_HICfgBridgeDelay =
5955 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
5957 /* SCL bridge delay, same as SDA for now */
5958 state->m_HICfgBridgeDelay +=
5959 state->m_HICfgBridgeDelay <<
5960 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
5962 status = InitHI(state);
5965 /* disable various processes */
5967 if (!(state->m_DRXK_A1_ROM_CODE)
5968 && !(state->m_DRXK_A2_ROM_CODE))
5971 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5976 /* disable MPEG port */
5977 status = MPEGTSDisable(state);
5981 /* Stop AUD and SCU */
5982 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
5985 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
5989 /* enable token-ring bus through OFDM block for possible ucode upload */
5990 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
5994 /* include boot loader section */
5995 status = write16(state, SIO_BL_COMM_EXEC__A, SIO_BL_COMM_EXEC_ACTIVE);
5998 status = BLChainCmd(state, 0, 6, 100);
6003 if (state->m_DRXK_A3_PATCH_CODE)
6004 status = DownloadMicrocode(state, DRXK_A3_microcode, DRXK_A3_microcode_length);
6008 load_microcode(state, "drxk_a3.mc");
6011 if (state->m_DRXK_A2_PATCH_CODE)
6012 status = DownloadMicrocode(state, DRXK_A2_microcode, DRXK_A2_microcode_length);
6016 /* disable token-ring bus through OFDM block for possible ucode upload */
6017 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6021 /* Run SCU for a little while to initialize microcode version numbers */
6022 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6025 status = DRXX_Open(state);
6028 /* added for test */
6031 powerMode = DRXK_POWER_DOWN_OFDM;
6032 status = CtrlPowerMode(state, &powerMode);
6036 /* Stamp driver version number in SCU data RAM in BCD code
6037 Done to enable field application engineers to retreive drxdriver version
6038 via I2C from SCU RAM.
6039 Not using SCU command interface for SCU register access since no
6040 microcode may be present.
6043 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6044 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6045 ((DRXK_VERSION_MAJOR % 10) << 4) +
6046 (DRXK_VERSION_MINOR % 10);
6047 status = write16(state, SCU_RAM_DRIVER_VER_HI__A, driverVersion);
6051 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6052 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6053 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6054 (DRXK_VERSION_PATCH % 10);
6055 status = write16(state, SCU_RAM_DRIVER_VER_LO__A, driverVersion);
6059 printk(KERN_INFO "DRXK driver version %d.%d.%d\n",
6060 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6061 DRXK_VERSION_PATCH);
6063 /* Dirty fix of default values for ROM/PATCH microcode
6064 Dirty because this fix makes it impossible to setup suitable values
6065 before calling DRX_Open. This solution requires changes to RF AGC speed
6066 to be done via the CTRL function after calling DRX_Open */
6068 /* m_dvbtRfAgcCfg.speed = 3; */
6070 /* Reset driver debug flags to 0 */
6071 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6076 NOTE: No more full FEC resets allowed afterwards!! */
6077 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6080 /* MPEGTS functions are still the same */
6081 status = MPEGTSDtoInit(state);
6084 status = MPEGTSStop(state);
6087 status = MPEGTSConfigurePolarity(state);
6090 status = MPEGTSConfigurePins(state, state->m_enableMPEGOutput);
6093 /* added: configure GPIO */
6094 status = WriteGPIO(state);
6098 state->m_DrxkState = DRXK_STOPPED;
6100 if (state->m_bPowerDown) {
6101 status = PowerDownDevice(state);
6104 state->m_DrxkState = DRXK_POWERED_DOWN;
6106 state->m_DrxkState = DRXK_STOPPED;
6113 static void drxk_c_release(struct dvb_frontend *fe)
6115 struct drxk_state *state = fe->demodulator_priv;
6121 static int drxk_c_init(struct dvb_frontend *fe)
6123 struct drxk_state *state = fe->demodulator_priv;
6126 if (mutex_trylock(&state->ctlock) == 0)
6128 SetOperationMode(state, OM_QAM_ITU_A);
6132 static int drxk_c_sleep(struct dvb_frontend *fe)
6134 struct drxk_state *state = fe->demodulator_priv;
6138 mutex_unlock(&state->ctlock);
6142 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6144 struct drxk_state *state = fe->demodulator_priv;
6146 dprintk(1, "%s\n", enable ? "enable" : "disable");
6147 return ConfigureI2CBridge(state, enable ? true : false);
6150 static int drxk_set_parameters(struct dvb_frontend *fe,
6151 struct dvb_frontend_parameters *p)
6153 struct drxk_state *state = fe->demodulator_priv;
6157 if (fe->ops.i2c_gate_ctrl)
6158 fe->ops.i2c_gate_ctrl(fe, 1);
6159 if (fe->ops.tuner_ops.set_params)
6160 fe->ops.tuner_ops.set_params(fe, p);
6161 if (fe->ops.i2c_gate_ctrl)
6162 fe->ops.i2c_gate_ctrl(fe, 0);
6164 fe->ops.tuner_ops.get_frequency(fe, &IF);
6165 Start(state, 0, IF);
6167 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6172 static int drxk_c_get_frontend(struct dvb_frontend *fe,
6173 struct dvb_frontend_parameters *p)
6179 static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6181 struct drxk_state *state = fe->demodulator_priv;
6186 GetLockStatus(state, &stat, 0);
6187 if (stat == MPEG_LOCK)
6189 if (stat == FEC_LOCK)
6191 if (stat == DEMOD_LOCK)
6196 static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber)
6204 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6207 struct drxk_state *state = fe->demodulator_priv;
6211 ReadIFAgc(state, &val);
6212 *strength = val & 0xffff;
6216 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6218 struct drxk_state *state = fe->demodulator_priv;
6222 GetSignalToNoise(state, &snr2);
6223 *snr = snr2 & 0xffff;
6227 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6229 struct drxk_state *state = fe->demodulator_priv;
6233 DVBTQAMGetAccPktErr(state, &err);
6234 *ucblocks = (u32) err;
6238 static int drxk_c_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6242 sets->min_delay_ms = 3000;
6243 sets->max_drift = 0;
6244 sets->step_size = 0;
6248 static void drxk_t_release(struct dvb_frontend *fe)
6251 struct drxk_state *state = fe->demodulator_priv;
6258 static int drxk_t_init(struct dvb_frontend *fe)
6260 struct drxk_state *state = fe->demodulator_priv;
6263 if (mutex_trylock(&state->ctlock) == 0)
6265 SetOperationMode(state, OM_DVBT);
6269 static int drxk_t_sleep(struct dvb_frontend *fe)
6271 struct drxk_state *state = fe->demodulator_priv;
6274 mutex_unlock(&state->ctlock);
6278 static int drxk_t_get_frontend(struct dvb_frontend *fe,
6279 struct dvb_frontend_parameters *p)
6286 static struct dvb_frontend_ops drxk_c_ops = {
6288 .name = "DRXK DVB-C",
6290 .frequency_stepsize = 62500,
6291 .frequency_min = 47000000,
6292 .frequency_max = 862000000,
6293 .symbol_rate_min = 870000,
6294 .symbol_rate_max = 11700000,
6295 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6296 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO},
6297 .release = drxk_c_release,
6298 .init = drxk_c_init,
6299 .sleep = drxk_c_sleep,
6300 .i2c_gate_ctrl = drxk_gate_ctrl,
6302 .set_frontend = drxk_set_parameters,
6303 .get_frontend = drxk_c_get_frontend,
6304 .get_tune_settings = drxk_c_get_tune_settings,
6306 .read_status = drxk_read_status,
6307 .read_ber = drxk_read_ber,
6308 .read_signal_strength = drxk_read_signal_strength,
6309 .read_snr = drxk_read_snr,
6310 .read_ucblocks = drxk_read_ucblocks,
6313 static struct dvb_frontend_ops drxk_t_ops = {
6315 .name = "DRXK DVB-T",
6317 .frequency_min = 47125000,
6318 .frequency_max = 865000000,
6319 .frequency_stepsize = 166667,
6320 .frequency_tolerance = 0,
6321 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
6322 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
6324 FE_CAN_QAM_16 | FE_CAN_QAM_64 |
6326 FE_CAN_TRANSMISSION_MODE_AUTO |
6327 FE_CAN_GUARD_INTERVAL_AUTO |
6328 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_MUTE_TS},
6329 .release = drxk_t_release,
6330 .init = drxk_t_init,
6331 .sleep = drxk_t_sleep,
6332 .i2c_gate_ctrl = drxk_gate_ctrl,
6334 .set_frontend = drxk_set_parameters,
6335 .get_frontend = drxk_t_get_frontend,
6337 .read_status = drxk_read_status,
6338 .read_ber = drxk_read_ber,
6339 .read_signal_strength = drxk_read_signal_strength,
6340 .read_snr = drxk_read_snr,
6341 .read_ucblocks = drxk_read_ucblocks,
6344 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6345 struct i2c_adapter *i2c,
6346 struct dvb_frontend **fe_t)
6348 struct drxk_state *state = NULL;
6349 u8 adr = config->adr;
6352 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6357 state->demod_address = adr;
6359 mutex_init(&state->mutex);
6360 mutex_init(&state->ctlock);
6362 memcpy(&state->c_frontend.ops, &drxk_c_ops,
6363 sizeof(struct dvb_frontend_ops));
6364 memcpy(&state->t_frontend.ops, &drxk_t_ops,
6365 sizeof(struct dvb_frontend_ops));
6366 state->c_frontend.demodulator_priv = state;
6367 state->t_frontend.demodulator_priv = state;
6370 if (init_drxk(state) < 0)
6372 *fe_t = &state->t_frontend;
6373 return &state->c_frontend;
6376 printk(KERN_ERR "drxk: not found\n");
6380 EXPORT_SYMBOL(drxk_attach);
6382 MODULE_DESCRIPTION("DRX-K driver");
6383 MODULE_AUTHOR("Ralph Metzler");
6384 MODULE_LICENSE("GPL");