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;
379 if (state->single_master)
382 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
383 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
384 mm1[1] = ((reg >> 16) & 0xFF);
385 mm1[2] = ((reg >> 24) & 0xFF) | flags;
386 mm1[3] = ((reg >> 7) & 0xFF);
389 mm1[0] = ((reg << 1) & 0xFF);
390 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
393 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
394 if (i2c_read(state->i2c, adr, mm1, len, mm2, 2) < 0)
397 *data = mm2[0] | (mm2[1] << 8);
402 static int read16(struct drxk_state *state, u32 reg, u16 *data)
404 return read16_flags(state, reg, data, 0);
407 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
409 u8 adr = state->demod_address, mm1[4], mm2[4], len;
411 if (state->single_master)
414 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
415 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
416 mm1[1] = ((reg >> 16) & 0xFF);
417 mm1[2] = ((reg >> 24) & 0xFF) | flags;
418 mm1[3] = ((reg >> 7) & 0xFF);
421 mm1[0] = ((reg << 1) & 0xFF);
422 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
425 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
426 if (i2c_read(state->i2c, adr, mm1, len, mm2, 4) < 0)
429 *data = mm2[0] | (mm2[1] << 8) |
430 (mm2[2] << 16) | (mm2[3] << 24);
435 static int read32(struct drxk_state *state, u32 reg, u32 *data)
437 return read32_flags(state, reg, data, 0);
440 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
442 u8 adr = state->demod_address, mm[6], len;
444 if (state->single_master)
446 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
447 mm[0] = (((reg << 1) & 0xFF) | 0x01);
448 mm[1] = ((reg >> 16) & 0xFF);
449 mm[2] = ((reg >> 24) & 0xFF) | flags;
450 mm[3] = ((reg >> 7) & 0xFF);
453 mm[0] = ((reg << 1) & 0xFF);
454 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
457 mm[len] = data & 0xff;
458 mm[len + 1] = (data >> 8) & 0xff;
460 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
461 if (i2c_write(state->i2c, adr, mm, len + 2) < 0)
466 static int write16(struct drxk_state *state, u32 reg, u16 data)
468 return write16_flags(state, reg, data, 0);
471 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
473 u8 adr = state->demod_address, mm[8], len;
475 if (state->single_master)
477 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
478 mm[0] = (((reg << 1) & 0xFF) | 0x01);
479 mm[1] = ((reg >> 16) & 0xFF);
480 mm[2] = ((reg >> 24) & 0xFF) | flags;
481 mm[3] = ((reg >> 7) & 0xFF);
484 mm[0] = ((reg << 1) & 0xFF);
485 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
488 mm[len] = data & 0xff;
489 mm[len + 1] = (data >> 8) & 0xff;
490 mm[len + 2] = (data >> 16) & 0xff;
491 mm[len + 3] = (data >> 24) & 0xff;
492 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
493 if (i2c_write(state->i2c, adr, mm, len + 4) < 0)
498 static int write32(struct drxk_state *state, u32 reg, u32 data)
500 return write32_flags(state, reg, data, 0);
503 static int write_block(struct drxk_state *state, u32 Address,
504 const int BlockSize, const u8 pBlock[])
506 int status = 0, BlkSize = BlockSize;
509 if (state->single_master)
512 while (BlkSize > 0) {
513 int Chunk = BlkSize > state->m_ChunkSize ?
514 state->m_ChunkSize : BlkSize;
515 u8 *AdrBuf = &state->Chunk[0];
518 if (DRXDAP_FASI_LONG_FORMAT(Address) || (Flags != 0)) {
519 AdrBuf[0] = (((Address << 1) & 0xFF) | 0x01);
520 AdrBuf[1] = ((Address >> 16) & 0xFF);
521 AdrBuf[2] = ((Address >> 24) & 0xFF);
522 AdrBuf[3] = ((Address >> 7) & 0xFF);
525 if (Chunk == state->m_ChunkSize)
528 AdrBuf[0] = ((Address << 1) & 0xFF);
529 AdrBuf[1] = (((Address >> 16) & 0x0F) |
530 ((Address >> 18) & 0xF0));
533 memcpy(&state->Chunk[AdrLength], pBlock, Chunk);
534 dprintk(2, "(0x%08x, 0x%02x)\n", Address, Flags);
538 for (i = 0; i < Chunk; i++)
539 printk(KERN_CONT " %02x", pBlock[i]);
540 printk(KERN_CONT "\n");
542 status = i2c_write(state->i2c, state->demod_address,
543 &state->Chunk[0], Chunk + AdrLength);
545 printk(KERN_ERR "drxk: %s: i2c write error at addr 0x%02x\n",
550 Address += (Chunk >> 1);
556 #ifndef DRXK_MAX_RETRIES_POWERUP
557 #define DRXK_MAX_RETRIES_POWERUP 20
560 int PowerUpDevice(struct drxk_state *state)
568 status = i2c_read1(state->i2c, state->demod_address, &data);
572 if (i2c_write(state->i2c,
573 state->demod_address, &data, 1) < 0)
574 printk(KERN_ERR "drxk: powerup failed\n");
577 } while (i2c_read1(state->i2c,
578 state->demod_address, &data) < 0 &&
579 (retryCount < DRXK_MAX_RETRIES_POWERUP));
580 if (retryCount >= DRXK_MAX_RETRIES_POWERUP)
583 /* Make sure all clk domains are active */
584 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
587 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
590 /* Enable pll lock tests */
591 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
594 state->m_currentPowerMode = DRX_POWER_UP;
600 static int init_state(struct drxk_state *state)
602 u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
603 u32 ulVSBIfAgcOutputLevel = 0;
604 u32 ulVSBIfAgcMinLevel = 0;
605 u32 ulVSBIfAgcMaxLevel = 0x7FFF;
606 u32 ulVSBIfAgcSpeed = 3;
608 u32 ulVSBRfAgcMode = DRXK_AGC_CTRL_AUTO;
609 u32 ulVSBRfAgcOutputLevel = 0;
610 u32 ulVSBRfAgcMinLevel = 0;
611 u32 ulVSBRfAgcMaxLevel = 0x7FFF;
612 u32 ulVSBRfAgcSpeed = 3;
613 u32 ulVSBRfAgcTop = 9500;
614 u32 ulVSBRfAgcCutOffCurrent = 4000;
616 u32 ulATVIfAgcMode = DRXK_AGC_CTRL_AUTO;
617 u32 ulATVIfAgcOutputLevel = 0;
618 u32 ulATVIfAgcMinLevel = 0;
619 u32 ulATVIfAgcMaxLevel = 0;
620 u32 ulATVIfAgcSpeed = 3;
622 u32 ulATVRfAgcMode = DRXK_AGC_CTRL_OFF;
623 u32 ulATVRfAgcOutputLevel = 0;
624 u32 ulATVRfAgcMinLevel = 0;
625 u32 ulATVRfAgcMaxLevel = 0;
626 u32 ulATVRfAgcTop = 9500;
627 u32 ulATVRfAgcCutOffCurrent = 4000;
628 u32 ulATVRfAgcSpeed = 3;
630 u32 ulQual83 = DEFAULT_MER_83;
631 u32 ulQual93 = DEFAULT_MER_93;
633 u32 ulDVBTStaticTSClock = 1;
634 u32 ulDVBCStaticTSClock = 1;
636 u32 ulMpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
637 u32 ulDemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
639 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
640 /* io_pad_cfg_mode output mode is drive always */
641 /* io_pad_cfg_drive is set to power 2 (23 mA) */
642 u32 ulGPIOCfg = 0x0113;
644 u32 ulSerialMode = 1;
645 u32 ulInvertTSClock = 0;
646 u32 ulTSDataStrength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
647 u32 ulTSClockkStrength = DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH;
648 u32 ulDVBTBitrate = 50000000;
649 u32 ulDVBCBitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
651 u32 ulInsertRSByte = 0;
656 u32 ulAntennaDVBT = 1;
657 u32 ulAntennaDVBC = 0;
658 u32 ulAntennaSwitchDVBTDVBC = 0;
662 state->m_hasLNA = false;
663 state->m_hasDVBT = false;
664 state->m_hasDVBC = false;
665 state->m_hasATV = false;
666 state->m_hasOOB = false;
667 state->m_hasAudio = false;
669 state->m_ChunkSize = 124;
671 state->m_oscClockFreq = 0;
672 state->m_smartAntInverted = false;
673 state->m_bPDownOpenBridge = false;
675 /* real system clock frequency in kHz */
676 state->m_sysClockFreq = 151875;
677 /* Timing div, 250ns/Psys */
678 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
679 state->m_HICfgTimingDiv = ((state->m_sysClockFreq / 1000) *
680 HI_I2C_DELAY) / 1000;
682 if (state->m_HICfgTimingDiv > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
683 state->m_HICfgTimingDiv = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
684 state->m_HICfgWakeUpKey = (state->demod_address << 1);
685 /* port/bridge/power down ctrl */
686 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
688 state->m_bPowerDown = (ulPowerDown != 0);
690 state->m_DRXK_A1_PATCH_CODE = false;
691 state->m_DRXK_A1_ROM_CODE = false;
692 state->m_DRXK_A2_ROM_CODE = false;
693 state->m_DRXK_A3_ROM_CODE = false;
694 state->m_DRXK_A2_PATCH_CODE = false;
695 state->m_DRXK_A3_PATCH_CODE = false;
697 /* Init AGC and PGA parameters */
699 state->m_vsbIfAgcCfg.ctrlMode = (ulVSBIfAgcMode);
700 state->m_vsbIfAgcCfg.outputLevel = (ulVSBIfAgcOutputLevel);
701 state->m_vsbIfAgcCfg.minOutputLevel = (ulVSBIfAgcMinLevel);
702 state->m_vsbIfAgcCfg.maxOutputLevel = (ulVSBIfAgcMaxLevel);
703 state->m_vsbIfAgcCfg.speed = (ulVSBIfAgcSpeed);
704 state->m_vsbPgaCfg = 140;
707 state->m_vsbRfAgcCfg.ctrlMode = (ulVSBRfAgcMode);
708 state->m_vsbRfAgcCfg.outputLevel = (ulVSBRfAgcOutputLevel);
709 state->m_vsbRfAgcCfg.minOutputLevel = (ulVSBRfAgcMinLevel);
710 state->m_vsbRfAgcCfg.maxOutputLevel = (ulVSBRfAgcMaxLevel);
711 state->m_vsbRfAgcCfg.speed = (ulVSBRfAgcSpeed);
712 state->m_vsbRfAgcCfg.top = (ulVSBRfAgcTop);
713 state->m_vsbRfAgcCfg.cutOffCurrent = (ulVSBRfAgcCutOffCurrent);
714 state->m_vsbPreSawCfg.reference = 0x07;
715 state->m_vsbPreSawCfg.usePreSaw = true;
717 state->m_Quality83percent = DEFAULT_MER_83;
718 state->m_Quality93percent = DEFAULT_MER_93;
719 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
720 state->m_Quality83percent = ulQual83;
721 state->m_Quality93percent = ulQual93;
725 state->m_atvIfAgcCfg.ctrlMode = (ulATVIfAgcMode);
726 state->m_atvIfAgcCfg.outputLevel = (ulATVIfAgcOutputLevel);
727 state->m_atvIfAgcCfg.minOutputLevel = (ulATVIfAgcMinLevel);
728 state->m_atvIfAgcCfg.maxOutputLevel = (ulATVIfAgcMaxLevel);
729 state->m_atvIfAgcCfg.speed = (ulATVIfAgcSpeed);
732 state->m_atvRfAgcCfg.ctrlMode = (ulATVRfAgcMode);
733 state->m_atvRfAgcCfg.outputLevel = (ulATVRfAgcOutputLevel);
734 state->m_atvRfAgcCfg.minOutputLevel = (ulATVRfAgcMinLevel);
735 state->m_atvRfAgcCfg.maxOutputLevel = (ulATVRfAgcMaxLevel);
736 state->m_atvRfAgcCfg.speed = (ulATVRfAgcSpeed);
737 state->m_atvRfAgcCfg.top = (ulATVRfAgcTop);
738 state->m_atvRfAgcCfg.cutOffCurrent = (ulATVRfAgcCutOffCurrent);
739 state->m_atvPreSawCfg.reference = 0x04;
740 state->m_atvPreSawCfg.usePreSaw = true;
744 state->m_dvbtRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
745 state->m_dvbtRfAgcCfg.outputLevel = 0;
746 state->m_dvbtRfAgcCfg.minOutputLevel = 0;
747 state->m_dvbtRfAgcCfg.maxOutputLevel = 0xFFFF;
748 state->m_dvbtRfAgcCfg.top = 0x2100;
749 state->m_dvbtRfAgcCfg.cutOffCurrent = 4000;
750 state->m_dvbtRfAgcCfg.speed = 1;
754 state->m_dvbtIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
755 state->m_dvbtIfAgcCfg.outputLevel = 0;
756 state->m_dvbtIfAgcCfg.minOutputLevel = 0;
757 state->m_dvbtIfAgcCfg.maxOutputLevel = 9000;
758 state->m_dvbtIfAgcCfg.top = 13424;
759 state->m_dvbtIfAgcCfg.cutOffCurrent = 0;
760 state->m_dvbtIfAgcCfg.speed = 3;
761 state->m_dvbtIfAgcCfg.FastClipCtrlDelay = 30;
762 state->m_dvbtIfAgcCfg.IngainTgtMax = 30000;
763 /* state->m_dvbtPgaCfg = 140; */
765 state->m_dvbtPreSawCfg.reference = 4;
766 state->m_dvbtPreSawCfg.usePreSaw = false;
769 state->m_qamRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
770 state->m_qamRfAgcCfg.outputLevel = 0;
771 state->m_qamRfAgcCfg.minOutputLevel = 6023;
772 state->m_qamRfAgcCfg.maxOutputLevel = 27000;
773 state->m_qamRfAgcCfg.top = 0x2380;
774 state->m_qamRfAgcCfg.cutOffCurrent = 4000;
775 state->m_qamRfAgcCfg.speed = 3;
778 state->m_qamIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
779 state->m_qamIfAgcCfg.outputLevel = 0;
780 state->m_qamIfAgcCfg.minOutputLevel = 0;
781 state->m_qamIfAgcCfg.maxOutputLevel = 9000;
782 state->m_qamIfAgcCfg.top = 0x0511;
783 state->m_qamIfAgcCfg.cutOffCurrent = 0;
784 state->m_qamIfAgcCfg.speed = 3;
785 state->m_qamIfAgcCfg.IngainTgtMax = 5119;
786 state->m_qamIfAgcCfg.FastClipCtrlDelay = 50;
788 state->m_qamPgaCfg = 140;
789 state->m_qamPreSawCfg.reference = 4;
790 state->m_qamPreSawCfg.usePreSaw = false;
792 state->m_OperationMode = OM_NONE;
793 state->m_DrxkState = DRXK_UNINITIALIZED;
795 /* MPEG output configuration */
796 state->m_enableMPEGOutput = true; /* If TRUE; enable MPEG ouput */
797 state->m_insertRSByte = false; /* If TRUE; insert RS byte */
798 state->m_enableParallel = true; /* If TRUE;
799 parallel out otherwise serial */
800 state->m_invertDATA = false; /* If TRUE; invert DATA signals */
801 state->m_invertERR = false; /* If TRUE; invert ERR signal */
802 state->m_invertSTR = false; /* If TRUE; invert STR signals */
803 state->m_invertVAL = false; /* If TRUE; invert VAL signals */
804 state->m_invertCLK = (ulInvertTSClock != 0); /* If TRUE; invert CLK signals */
805 state->m_DVBTStaticCLK = (ulDVBTStaticTSClock != 0);
806 state->m_DVBCStaticCLK = (ulDVBCStaticTSClock != 0);
807 /* If TRUE; static MPEG clockrate will be used;
808 otherwise clockrate will adapt to the bitrate of the TS */
810 state->m_DVBTBitrate = ulDVBTBitrate;
811 state->m_DVBCBitrate = ulDVBCBitrate;
813 state->m_TSDataStrength = (ulTSDataStrength & 0x07);
814 state->m_TSClockkStrength = (ulTSClockkStrength & 0x07);
816 /* Maximum bitrate in b/s in case static clockrate is selected */
817 state->m_mpegTsStaticBitrate = 19392658;
818 state->m_disableTEIhandling = false;
821 state->m_insertRSByte = true;
823 state->m_MpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
824 if (ulMpegLockTimeOut < 10000)
825 state->m_MpegLockTimeOut = ulMpegLockTimeOut;
826 state->m_DemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
827 if (ulDemodLockTimeOut < 10000)
828 state->m_DemodLockTimeOut = ulDemodLockTimeOut;
831 state->m_Constellation = DRX_CONSTELLATION_AUTO;
832 state->m_qamInterleaveMode = DRXK_QAM_I12_J17;
833 state->m_fecRsPlen = 204 * 8; /* fecRsPlen annex A */
834 state->m_fecRsPrescale = 1;
836 state->m_sqiSpeed = DRXK_DVBT_SQI_SPEED_MEDIUM;
837 state->m_agcFastClipCtrlDelay = 0;
839 state->m_GPIOCfg = (ulGPIOCfg);
840 state->m_GPIO = (ulGPIO == 0 ? 0 : 1);
842 state->m_AntennaDVBT = (ulAntennaDVBT == 0 ? 0 : 1);
843 state->m_AntennaDVBC = (ulAntennaDVBC == 0 ? 0 : 1);
844 state->m_AntennaSwitchDVBTDVBC =
845 (ulAntennaSwitchDVBTDVBC == 0 ? 0 : 1);
847 state->m_bPowerDown = false;
848 state->m_currentPowerMode = DRX_POWER_DOWN;
850 state->m_enableParallel = (ulSerialMode == 0);
852 state->m_rfmirror = (ulRfMirror == 0);
853 state->m_IfAgcPol = false;
857 static int DRXX_Open(struct drxk_state *state)
866 /* stop lock indicator process */
867 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
870 /* Check device id */
871 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
874 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
877 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
880 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
883 status = write16(state, SIO_TOP_COMM_KEY__A, key);
890 static int GetDeviceCapabilities(struct drxk_state *state)
892 u16 sioPdrOhwCfg = 0;
893 u32 sioTopJtagidLo = 0;
899 /* stop lock indicator process */
900 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
904 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
907 status = read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg);
910 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
914 switch ((sioPdrOhwCfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
916 /* ignore (bypass ?) */
920 state->m_oscClockFreq = 27000;
924 state->m_oscClockFreq = 20250;
928 state->m_oscClockFreq = 20250;
934 Determine device capabilities
937 status = read32(state, SIO_TOP_JTAGID_LO__A, &sioTopJtagidLo);
941 switch ((sioTopJtagidLo >> 29) & 0xF) {
943 state->m_deviceSpin = DRXK_SPIN_A1;
946 state->m_deviceSpin = DRXK_SPIN_A2;
949 state->m_deviceSpin = DRXK_SPIN_A3;
952 state->m_deviceSpin = DRXK_SPIN_UNKNOWN;
956 switch ((sioTopJtagidLo >> 12) & 0xFF) {
958 /* typeId = DRX3913K_TYPE_ID */
959 state->m_hasLNA = false;
960 state->m_hasOOB = false;
961 state->m_hasATV = false;
962 state->m_hasAudio = false;
963 state->m_hasDVBT = true;
964 state->m_hasDVBC = true;
965 state->m_hasSAWSW = true;
966 state->m_hasGPIO2 = false;
967 state->m_hasGPIO1 = false;
968 state->m_hasIRQN = false;
971 /* typeId = DRX3915K_TYPE_ID */
972 state->m_hasLNA = false;
973 state->m_hasOOB = false;
974 state->m_hasATV = true;
975 state->m_hasAudio = false;
976 state->m_hasDVBT = true;
977 state->m_hasDVBC = false;
978 state->m_hasSAWSW = true;
979 state->m_hasGPIO2 = true;
980 state->m_hasGPIO1 = true;
981 state->m_hasIRQN = false;
984 /* typeId = DRX3916K_TYPE_ID */
985 state->m_hasLNA = false;
986 state->m_hasOOB = false;
987 state->m_hasATV = true;
988 state->m_hasAudio = false;
989 state->m_hasDVBT = true;
990 state->m_hasDVBC = false;
991 state->m_hasSAWSW = true;
992 state->m_hasGPIO2 = true;
993 state->m_hasGPIO1 = true;
994 state->m_hasIRQN = false;
997 /* typeId = DRX3918K_TYPE_ID */
998 state->m_hasLNA = false;
999 state->m_hasOOB = false;
1000 state->m_hasATV = true;
1001 state->m_hasAudio = true;
1002 state->m_hasDVBT = true;
1003 state->m_hasDVBC = false;
1004 state->m_hasSAWSW = true;
1005 state->m_hasGPIO2 = true;
1006 state->m_hasGPIO1 = true;
1007 state->m_hasIRQN = false;
1010 /* typeId = DRX3921K_TYPE_ID */
1011 state->m_hasLNA = false;
1012 state->m_hasOOB = false;
1013 state->m_hasATV = true;
1014 state->m_hasAudio = true;
1015 state->m_hasDVBT = true;
1016 state->m_hasDVBC = true;
1017 state->m_hasSAWSW = true;
1018 state->m_hasGPIO2 = true;
1019 state->m_hasGPIO1 = true;
1020 state->m_hasIRQN = false;
1023 /* typeId = DRX3923K_TYPE_ID */
1024 state->m_hasLNA = false;
1025 state->m_hasOOB = false;
1026 state->m_hasATV = true;
1027 state->m_hasAudio = true;
1028 state->m_hasDVBT = true;
1029 state->m_hasDVBC = true;
1030 state->m_hasSAWSW = true;
1031 state->m_hasGPIO2 = true;
1032 state->m_hasGPIO1 = true;
1033 state->m_hasIRQN = false;
1036 /* typeId = DRX3925K_TYPE_ID */
1037 state->m_hasLNA = false;
1038 state->m_hasOOB = false;
1039 state->m_hasATV = true;
1040 state->m_hasAudio = true;
1041 state->m_hasDVBT = true;
1042 state->m_hasDVBC = true;
1043 state->m_hasSAWSW = true;
1044 state->m_hasGPIO2 = true;
1045 state->m_hasGPIO1 = true;
1046 state->m_hasIRQN = false;
1049 /* typeId = DRX3926K_TYPE_ID */
1050 state->m_hasLNA = false;
1051 state->m_hasOOB = false;
1052 state->m_hasATV = true;
1053 state->m_hasAudio = false;
1054 state->m_hasDVBT = true;
1055 state->m_hasDVBC = true;
1056 state->m_hasSAWSW = true;
1057 state->m_hasGPIO2 = true;
1058 state->m_hasGPIO1 = true;
1059 state->m_hasIRQN = false;
1062 printk(KERN_ERR "drxk: DeviceID not supported = %02x\n",
1063 ((sioTopJtagidLo >> 12) & 0xFF));
1071 static int HI_Command(struct drxk_state *state, u16 cmd, u16 *pResult)
1079 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
1082 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1086 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1087 ((state->m_HICfgCtrl) &
1088 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1089 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1090 if (powerdown_cmd == false) {
1091 /* Wait until command rdy */
1098 status = read16(state, SIO_HI_RA_RAM_CMD__A,
1100 } while ((status < 0) && (retryCount < DRXK_MAX_RETRIES)
1104 status = read16(state, SIO_HI_RA_RAM_RES__A,
1110 static int HI_CfgCommand(struct drxk_state *state)
1116 mutex_lock(&state->mutex);
1118 status = write16(state, SIO_HI_RA_RAM_PAR_6__A, state->m_HICfgTimeout);
1121 status = write16(state, SIO_HI_RA_RAM_PAR_5__A, state->m_HICfgCtrl);
1124 status = write16(state, SIO_HI_RA_RAM_PAR_4__A, state->m_HICfgWakeUpKey);
1127 status = write16(state, SIO_HI_RA_RAM_PAR_3__A, state->m_HICfgBridgeDelay);
1130 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, state->m_HICfgTimingDiv);
1133 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1136 status = HI_Command(state, SIO_HI_RA_RAM_CMD_CONFIG, 0);
1140 state->m_HICfgCtrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1142 mutex_unlock(&state->mutex);
1146 static int InitHI(struct drxk_state *state)
1150 state->m_HICfgWakeUpKey = (state->demod_address << 1);
1151 state->m_HICfgTimeout = 0x96FF;
1152 /* port/bridge/power down ctrl */
1153 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1154 return HI_CfgCommand(state);
1157 static int MPEGTSConfigurePins(struct drxk_state *state, bool mpegEnable)
1160 u16 sioPdrMclkCfg = 0;
1161 u16 sioPdrMdxCfg = 0;
1165 /* stop lock indicator process */
1166 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1170 /* MPEG TS pad configuration */
1171 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
1175 if (mpegEnable == false) {
1176 /* Set MPEG TS pads to inputmode */
1177 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1180 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1183 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1186 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1189 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1192 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1195 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1198 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1201 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1204 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1207 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1210 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1214 /* Enable MPEG output */
1216 ((state->m_TSDataStrength <<
1217 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1218 sioPdrMclkCfg = ((state->m_TSClockkStrength <<
1219 SIO_PDR_MCLK_CFG_DRIVE__B) |
1222 status = write16(state, SIO_PDR_MSTRT_CFG__A, sioPdrMdxCfg);
1225 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000); /* Disable */
1228 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000); /* Disable */
1231 if (state->m_enableParallel == true) {
1232 /* paralel -> enable MD1 to MD7 */
1233 status = write16(state, SIO_PDR_MD1_CFG__A, sioPdrMdxCfg);
1236 status = write16(state, SIO_PDR_MD2_CFG__A, sioPdrMdxCfg);
1239 status = write16(state, SIO_PDR_MD3_CFG__A, sioPdrMdxCfg);
1242 status = write16(state, SIO_PDR_MD4_CFG__A, sioPdrMdxCfg);
1245 status = write16(state, SIO_PDR_MD5_CFG__A, sioPdrMdxCfg);
1248 status = write16(state, SIO_PDR_MD6_CFG__A, sioPdrMdxCfg);
1251 status = write16(state, SIO_PDR_MD7_CFG__A, sioPdrMdxCfg);
1255 sioPdrMdxCfg = ((state->m_TSDataStrength <<
1256 SIO_PDR_MD0_CFG_DRIVE__B)
1258 /* serial -> disable MD1 to MD7 */
1259 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1262 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1265 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1268 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1271 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1274 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1277 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1281 status = write16(state, SIO_PDR_MCLK_CFG__A, sioPdrMclkCfg);
1284 status = write16(state, SIO_PDR_MD0_CFG__A, sioPdrMdxCfg);
1288 /* Enable MB output over MPEG pads and ctl input */
1289 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1292 /* Write nomagic word to enable pdr reg write */
1293 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1300 static int MPEGTSDisable(struct drxk_state *state)
1304 return MPEGTSConfigurePins(state, false);
1307 static int BLChainCmd(struct drxk_state *state,
1308 u16 romOffset, u16 nrOfElements, u32 timeOut)
1316 mutex_lock(&state->mutex);
1318 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1321 status = write16(state, SIO_BL_CHAIN_ADDR__A, romOffset);
1324 status = write16(state, SIO_BL_CHAIN_LEN__A, nrOfElements);
1327 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1330 end = jiffies + msecs_to_jiffies(timeOut);
1334 status = read16(state, SIO_BL_STATUS__A, &blStatus);
1337 } while ((blStatus == 0x1) &&
1338 ((time_is_after_jiffies(end))));
1339 if (blStatus == 0x1) {
1340 printk(KERN_ERR "drxk: SIO not ready\n");
1341 mutex_unlock(&state->mutex);
1345 mutex_unlock(&state->mutex);
1350 static int DownloadMicrocode(struct drxk_state *state,
1351 const u8 pMCImage[], u32 Length)
1353 const u8 *pSrc = pMCImage;
1366 /* down the drain (we don care about MAGIC_WORD) */
1367 Drain = (pSrc[0] << 8) | pSrc[1];
1368 pSrc += sizeof(u16);
1369 offset += sizeof(u16);
1370 nBlocks = (pSrc[0] << 8) | pSrc[1];
1371 pSrc += sizeof(u16);
1372 offset += sizeof(u16);
1374 for (i = 0; i < nBlocks; i += 1) {
1375 Address = (pSrc[0] << 24) | (pSrc[1] << 16) |
1376 (pSrc[2] << 8) | pSrc[3];
1377 pSrc += sizeof(u32);
1378 offset += sizeof(u32);
1380 BlockSize = ((pSrc[0] << 8) | pSrc[1]) * sizeof(u16);
1381 pSrc += sizeof(u16);
1382 offset += sizeof(u16);
1384 Flags = (pSrc[0] << 8) | pSrc[1];
1385 pSrc += sizeof(u16);
1386 offset += sizeof(u16);
1388 BlockCRC = (pSrc[0] << 8) | pSrc[1];
1389 pSrc += sizeof(u16);
1390 offset += sizeof(u16);
1392 if (offset + BlockSize > Length) {
1393 printk(KERN_ERR "drxk: Firmware is corrupted.\n");
1397 status = write_block(state, Address, BlockSize, pSrc);
1401 offset += BlockSize;
1406 static int DVBTEnableOFDMTokenRing(struct drxk_state *state, bool enable)
1410 u16 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1411 u16 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1416 if (enable == false) {
1417 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1418 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1421 status = (read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data));
1423 if (data == desiredStatus) {
1424 /* tokenring already has correct status */
1427 /* Disable/enable dvbt tokenring bridge */
1429 write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desiredCtrl);
1431 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1433 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1436 } while ((data != desiredStatus) && ((time_is_after_jiffies(end))));
1437 if (data != desiredStatus) {
1438 printk(KERN_ERR "drxk: SIO not ready\n");
1444 static int MPEGTSStop(struct drxk_state *state)
1447 u16 fecOcSncMode = 0;
1448 u16 fecOcIprMode = 0;
1453 /* Gracefull shutdown (byte boundaries) */
1454 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1457 fecOcSncMode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1458 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1462 /* Suppress MCLK during absence of data */
1463 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcIprMode);
1466 fecOcIprMode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1467 status = write16(state, FEC_OC_IPR_MODE__A, fecOcIprMode);
1474 static int scu_command(struct drxk_state *state,
1475 u16 cmd, u8 parameterLen,
1476 u16 *parameter, u8 resultLen, u16 *result)
1478 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1479 #error DRXK register mapping no longer compatible with this routine!
1487 if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) ||
1488 ((resultLen > 0) && (result == NULL)))
1491 mutex_lock(&state->mutex);
1493 /* assume that the command register is ready
1494 since it is checked afterwards */
1498 for (ii = parameterLen - 1; ii >= 0; ii -= 1) {
1499 buffer[cnt++] = (parameter[ii] & 0xFF);
1500 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1502 buffer[cnt++] = (cmd & 0xFF);
1503 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1505 write_block(state, SCU_RAM_PARAM_0__A -
1506 (parameterLen - 1), cnt, buffer);
1507 /* Wait until SCU has processed command */
1508 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1511 status = read16(state, SCU_RAM_COMMAND__A, &curCmd);
1514 } while (!(curCmd == DRX_SCU_READY)
1515 && (time_is_after_jiffies(end)));
1516 if (curCmd != DRX_SCU_READY) {
1517 printk(KERN_ERR "drxk: SCU not ready\n");
1518 mutex_unlock(&state->mutex);
1522 if ((resultLen > 0) && (result != NULL)) {
1526 for (ii = resultLen - 1; ii >= 0; ii -= 1) {
1527 status = read16(state, SCU_RAM_PARAM_0__A - ii, &result[ii]);
1532 /* Check if an error was reported by SCU */
1533 err = (s16) result[0];
1535 /* check a few fixed error codes */
1536 if (err == SCU_RESULT_UNKSTD) {
1537 printk(KERN_ERR "drxk: SCU_RESULT_UNKSTD\n");
1538 mutex_unlock(&state->mutex);
1540 } else if (err == SCU_RESULT_UNKCMD) {
1541 printk(KERN_ERR "drxk: SCU_RESULT_UNKCMD\n");
1542 mutex_unlock(&state->mutex);
1545 /* here it is assumed that negative means error,
1546 and positive no error */
1548 printk(KERN_ERR "drxk: %s ERROR\n", __func__);
1549 mutex_unlock(&state->mutex);
1554 mutex_unlock(&state->mutex);
1556 printk(KERN_ERR "drxk: %s: status = %d\n", __func__, status);
1561 static int SetIqmAf(struct drxk_state *state, bool active)
1570 status = read16(state, IQM_AF_STDBY__A, &data);
1574 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1575 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1576 | IQM_AF_STDBY_STDBY_PD_STANDBY
1577 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1578 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1579 } else { /* active */
1581 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1582 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1583 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1584 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1585 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1588 status = write16(state, IQM_AF_STDBY__A, data);
1595 static int CtrlPowerMode(struct drxk_state *state, enum DRXPowerMode *mode)
1598 u16 sioCcPwdMode = 0;
1602 /* Check arguments */
1608 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_NONE;
1610 case DRXK_POWER_DOWN_OFDM:
1611 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1613 case DRXK_POWER_DOWN_CORE:
1614 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1616 case DRXK_POWER_DOWN_PLL:
1617 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_PLL;
1619 case DRX_POWER_DOWN:
1620 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OSC;
1623 /* Unknow sleep mode */
1628 /* If already in requested power mode, do nothing */
1629 if (state->m_currentPowerMode == *mode)
1632 /* For next steps make sure to start from DRX_POWER_UP mode */
1633 if (state->m_currentPowerMode != DRX_POWER_UP) {
1635 status = PowerUpDevice(state);
1638 status = DVBTEnableOFDMTokenRing(state, true);
1644 if (*mode == DRX_POWER_UP) {
1645 /* Restore analog & pin configuartion */
1647 /* Power down to requested mode */
1648 /* Backup some register settings */
1649 /* Set pins with possible pull-ups connected
1650 to them in input mode */
1651 /* Analog power down */
1652 /* ADC power down */
1653 /* Power down device */
1654 /* stop all comm_exec */
1655 /* Stop and power down previous standard */
1657 switch (state->m_OperationMode) {
1659 status = MPEGTSStop(state);
1662 status = PowerDownDVBT(state, false);
1668 status = MPEGTSStop(state);
1671 status = PowerDownQAM(state);
1678 status = DVBTEnableOFDMTokenRing(state, false);
1681 status = write16(state, SIO_CC_PWD_MODE__A, sioCcPwdMode);
1684 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1688 if (*mode != DRXK_POWER_DOWN_OFDM) {
1689 state->m_HICfgCtrl |=
1690 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1691 status = HI_CfgCommand(state);
1697 state->m_currentPowerMode = *mode;
1701 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode)
1703 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
1711 status = read16(state, SCU_COMM_EXEC__A, &data);
1714 if (data == SCU_COMM_EXEC_ACTIVE) {
1715 /* Send OFDM stop command */
1716 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
1719 /* Send OFDM reset command */
1720 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
1725 /* Reset datapath for OFDM, processors first */
1726 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1729 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1732 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1737 status = SetIqmAf(state, false);
1741 /* powerdown to OFDM mode */
1743 status = CtrlPowerMode(state, &powerMode);
1751 static int SetOperationMode(struct drxk_state *state,
1752 enum OperationMode oMode)
1758 Stop and power down previous standard
1759 TODO investigate total power down instead of partial
1760 power down depending on "previous" standard.
1763 /* disable HW lock indicator */
1764 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1768 if (state->m_OperationMode != oMode) {
1769 switch (state->m_OperationMode) {
1770 /* OM_NONE was added for start up */
1774 status = MPEGTSStop(state);
1777 status = PowerDownDVBT(state, true);
1780 state->m_OperationMode = OM_NONE;
1785 case OM_QAM_ITU_A: /* fallthrough */
1787 status = MPEGTSStop(state);
1790 status = PowerDownQAM(state);
1793 state->m_OperationMode = OM_NONE;
1803 Power up new standard
1807 state->m_OperationMode = oMode;
1808 status = SetDVBTStandard(state, oMode);
1815 case OM_QAM_ITU_A: /* fallthrough */
1817 state->m_OperationMode = oMode;
1818 status = SetQAMStandard(state, oMode);
1833 static int Start(struct drxk_state *state, s32 offsetFreq,
1834 s32 IntermediateFrequency)
1841 s32 OffsetkHz = offsetFreq / 1000;
1843 if (state->m_DrxkState != DRXK_STOPPED &&
1844 state->m_DrxkState != DRXK_DTV_STARTED) {
1848 state->m_bMirrorFreqSpect =
1849 (state->param.inversion == INVERSION_ON);
1851 if (IntermediateFrequency < 0) {
1852 state->m_bMirrorFreqSpect =
1853 !state->m_bMirrorFreqSpect;
1854 IntermediateFrequency = -IntermediateFrequency;
1857 switch (state->m_OperationMode) {
1860 IFreqkHz = (IntermediateFrequency / 1000);
1861 status = SetQAM(state, IFreqkHz, OffsetkHz);
1864 state->m_DrxkState = DRXK_DTV_STARTED;
1867 IFreqkHz = (IntermediateFrequency / 1000);
1868 status = MPEGTSStop(state);
1871 status = SetDVBT(state, IFreqkHz, OffsetkHz);
1874 status = DVBTStart(state);
1877 state->m_DrxkState = DRXK_DTV_STARTED;
1886 static int ShutDown(struct drxk_state *state)
1894 static int GetLockStatus(struct drxk_state *state, u32 *pLockStatus,
1901 if (pLockStatus == NULL)
1904 *pLockStatus = NOT_LOCKED;
1906 /* define the SCU command code */
1907 switch (state->m_OperationMode) {
1911 status = GetQAMLockStatus(state, pLockStatus);
1914 status = GetDVBTLockStatus(state, pLockStatus);
1922 static int MPEGTSStart(struct drxk_state *state)
1926 u16 fecOcSncMode = 0;
1929 /* Allow OC to sync again */
1930 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1933 fecOcSncMode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1934 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1937 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1944 static int MPEGTSDtoInit(struct drxk_state *state)
1951 /* Rate integration settings */
1952 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1955 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1958 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1961 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1964 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
1967 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
1970 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
1973 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
1977 /* Additional configuration */
1978 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
1981 status = write16(state, FEC_OC_SNC_LWM__A, 2);
1984 status = write16(state, FEC_OC_SNC_HWM__A, 12);
1991 static int MPEGTSDtoSetup(struct drxk_state *state,
1992 enum OperationMode oMode)
1996 u16 fecOcRegMode = 0; /* FEC_OC_MODE register value */
1997 u16 fecOcRegIprMode = 0; /* FEC_OC_IPR_MODE register value */
1998 u16 fecOcDtoMode = 0; /* FEC_OC_IPR_INVERT register value */
1999 u16 fecOcFctMode = 0; /* FEC_OC_IPR_INVERT register value */
2000 u16 fecOcDtoPeriod = 2; /* FEC_OC_IPR_INVERT register value */
2001 u16 fecOcDtoBurstLen = 188; /* FEC_OC_IPR_INVERT register value */
2002 u32 fecOcRcnCtlRate = 0; /* FEC_OC_IPR_INVERT register value */
2003 u16 fecOcTmdMode = 0;
2004 u16 fecOcTmdIntUpdRate = 0;
2006 bool staticCLK = false;
2011 /* Check insertion of the Reed-Solomon parity bytes */
2012 status = read16(state, FEC_OC_MODE__A, &fecOcRegMode);
2015 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcRegIprMode);
2018 fecOcRegMode &= (~FEC_OC_MODE_PARITY__M);
2019 fecOcRegIprMode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2020 if (state->m_insertRSByte == true) {
2021 /* enable parity symbol forward */
2022 fecOcRegMode |= FEC_OC_MODE_PARITY__M;
2023 /* MVAL disable during parity bytes */
2024 fecOcRegIprMode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2025 /* TS burst length to 204 */
2026 fecOcDtoBurstLen = 204;
2029 /* Check serial or parrallel output */
2030 fecOcRegIprMode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2031 if (state->m_enableParallel == false) {
2032 /* MPEG data output is serial -> set ipr_mode[0] */
2033 fecOcRegIprMode |= FEC_OC_IPR_MODE_SERIAL__M;
2038 maxBitRate = state->m_DVBTBitrate;
2040 fecOcRcnCtlRate = 0xC00000;
2041 staticCLK = state->m_DVBTStaticCLK;
2043 case OM_QAM_ITU_A: /* fallthrough */
2045 fecOcTmdMode = 0x0004;
2046 fecOcRcnCtlRate = 0xD2B4EE; /* good for >63 Mb/s */
2047 maxBitRate = state->m_DVBCBitrate;
2048 staticCLK = state->m_DVBCStaticCLK;
2052 } /* switch (standard) */
2057 /* Configure DTO's */
2061 /* Rational DTO for MCLK source (static MCLK rate),
2062 Dynamic DTO for optimal grouping
2063 (avoid intra-packet gaps),
2064 DTO offset enable to sync TS burst with MSTRT */
2065 fecOcDtoMode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2066 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2067 fecOcFctMode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2068 FEC_OC_FCT_MODE_VIRT_ENA__M);
2070 /* Check user defined bitrate */
2071 bitRate = maxBitRate;
2072 if (bitRate > 75900000UL) { /* max is 75.9 Mb/s */
2073 bitRate = 75900000UL;
2075 /* Rational DTO period:
2076 dto_period = (Fsys / bitrate) - 2
2078 Result should be floored,
2079 to make sure >= requested bitrate
2081 fecOcDtoPeriod = (u16) (((state->m_sysClockFreq)
2083 if (fecOcDtoPeriod <= 2)
2086 fecOcDtoPeriod -= 2;
2087 fecOcTmdIntUpdRate = 8;
2089 /* (commonAttr->staticCLK == false) => dynamic mode */
2090 fecOcDtoMode = FEC_OC_DTO_MODE_DYNAMIC__M;
2091 fecOcFctMode = FEC_OC_FCT_MODE__PRE;
2092 fecOcTmdIntUpdRate = 5;
2095 /* Write appropriate registers with requested configuration */
2096 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fecOcDtoBurstLen);
2099 status = write16(state, FEC_OC_DTO_PERIOD__A, fecOcDtoPeriod);
2102 status = write16(state, FEC_OC_DTO_MODE__A, fecOcDtoMode);
2105 status = write16(state, FEC_OC_FCT_MODE__A, fecOcFctMode);
2108 status = write16(state, FEC_OC_MODE__A, fecOcRegMode);
2111 status = write16(state, FEC_OC_IPR_MODE__A, fecOcRegIprMode);
2115 /* Rate integration settings */
2116 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fecOcRcnCtlRate);
2119 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A, fecOcTmdIntUpdRate);
2122 status = write16(state, FEC_OC_TMD_MODE__A, fecOcTmdMode);
2129 static int MPEGTSConfigurePolarity(struct drxk_state *state)
2132 u16 fecOcRegIprInvert = 0;
2136 /* Data mask for the output data byte */
2137 u16 InvertDataMask =
2138 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2139 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2140 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2141 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2143 /* Control selective inversion of output bits */
2144 fecOcRegIprInvert &= (~(InvertDataMask));
2145 if (state->m_invertDATA == true)
2146 fecOcRegIprInvert |= InvertDataMask;
2147 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2148 if (state->m_invertERR == true)
2149 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MERR__M;
2150 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2151 if (state->m_invertSTR == true)
2152 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MSTRT__M;
2153 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2154 if (state->m_invertVAL == true)
2155 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MVAL__M;
2156 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2157 if (state->m_invertCLK == true)
2158 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MCLK__M;
2159 status = write16(state, FEC_OC_IPR_INVERT__A, fecOcRegIprInvert);
2163 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2165 static int SetAgcRf(struct drxk_state *state,
2166 struct SCfgAgc *pAgcCfg, bool isDTV)
2169 struct SCfgAgc *pIfAgcSettings;
2173 if (pAgcCfg == NULL)
2179 switch (pAgcCfg->ctrlMode) {
2180 case DRXK_AGC_CTRL_AUTO:
2182 /* Enable RF AGC DAC */
2183 status = read16(state, IQM_AF_STDBY__A, &data);
2186 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2187 status = write16(state, IQM_AF_STDBY__A, data);
2191 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2195 /* Enable SCU RF AGC loop */
2196 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2199 if (state->m_RfAgcPol)
2200 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2202 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2203 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2207 /* Set speed (using complementary reduction value) */
2208 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2212 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2213 data |= (~(pAgcCfg->speed <<
2214 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2215 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2217 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2222 pIfAgcSettings = &state->m_dvbtIfAgcCfg;
2223 else if (IsQAM(state))
2224 pIfAgcSettings = &state->m_qamIfAgcCfg;
2226 pIfAgcSettings = &state->m_atvIfAgcCfg;
2227 if (pIfAgcSettings == NULL)
2230 /* Set TOP, only if IF-AGC is in AUTO mode */
2231 if (pIfAgcSettings->ctrlMode == DRXK_AGC_CTRL_AUTO)
2232 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->top);
2236 /* Cut-Off current */
2237 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, pAgcCfg->cutOffCurrent);
2241 /* Max. output level */
2242 status = write16(state, SCU_RAM_AGC_RF_MAX__A, pAgcCfg->maxOutputLevel);
2248 case DRXK_AGC_CTRL_USER:
2249 /* Enable RF AGC DAC */
2250 status = read16(state, IQM_AF_STDBY__A, &data);
2253 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2254 status = write16(state, IQM_AF_STDBY__A, data);
2258 /* Disable SCU RF AGC loop */
2259 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2262 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2263 if (state->m_RfAgcPol)
2264 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2266 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2267 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2271 /* SCU c.o.c. to 0, enabling full control range */
2272 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2276 /* Write value to output pin */
2277 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, pAgcCfg->outputLevel);
2282 case DRXK_AGC_CTRL_OFF:
2283 /* Disable RF AGC DAC */
2284 status = read16(state, IQM_AF_STDBY__A, &data);
2287 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2288 status = write16(state, IQM_AF_STDBY__A, data);
2292 /* Disable SCU RF AGC loop */
2293 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2296 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2297 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2305 } /* switch (agcsettings->ctrlMode) */
2310 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2312 static int SetAgcIf(struct drxk_state *state,
2313 struct SCfgAgc *pAgcCfg, bool isDTV)
2317 struct SCfgAgc *pRfAgcSettings;
2322 switch (pAgcCfg->ctrlMode) {
2323 case DRXK_AGC_CTRL_AUTO:
2325 /* Enable IF AGC DAC */
2326 status = read16(state, IQM_AF_STDBY__A, &data);
2329 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2330 status = write16(state, IQM_AF_STDBY__A, data);
2334 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2338 /* Enable SCU IF AGC loop */
2339 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2342 if (state->m_IfAgcPol)
2343 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2345 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2346 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2350 /* Set speed (using complementary reduction value) */
2351 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2354 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2355 data |= (~(pAgcCfg->speed <<
2356 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2357 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2359 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2364 pRfAgcSettings = &state->m_qamRfAgcCfg;
2366 pRfAgcSettings = &state->m_atvRfAgcCfg;
2367 if (pRfAgcSettings == NULL)
2370 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pRfAgcSettings->top);
2375 case DRXK_AGC_CTRL_USER:
2377 /* Enable IF AGC DAC */
2378 status = read16(state, IQM_AF_STDBY__A, &data);
2381 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2382 status = write16(state, IQM_AF_STDBY__A, data);
2386 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2390 /* Disable SCU IF AGC loop */
2391 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2394 if (state->m_IfAgcPol)
2395 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2397 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2398 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2402 /* Write value to output pin */
2403 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->outputLevel);
2408 case DRXK_AGC_CTRL_OFF:
2410 /* Disable If AGC DAC */
2411 status = read16(state, IQM_AF_STDBY__A, &data);
2414 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2415 status = write16(state, IQM_AF_STDBY__A, data);
2419 /* Disable SCU IF AGC loop */
2420 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2423 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2424 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2428 } /* switch (agcSettingsIf->ctrlMode) */
2430 /* always set the top to support
2431 configurations without if-loop */
2432 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, pAgcCfg->top);
2441 static int ReadIFAgc(struct drxk_state *state, u32 *pValue)
2444 int status = read16(state, IQM_AF_AGC_IF__A, &agcDacLvl);
2452 if (agcDacLvl > DRXK_AGC_DAC_OFFSET)
2453 Level = agcDacLvl - DRXK_AGC_DAC_OFFSET;
2455 *pValue = (14000 - Level) / 4;
2462 static int GetQAMSignalToNoise(struct drxk_state *state,
2463 s32 *pSignalToNoise)
2470 /* MER calculation */
2471 u16 qamSlErrPower = 0; /* accum. error between
2472 raw and sliced symbols */
2473 u32 qamSlSigPower = 0; /* used for MER, depends of
2474 QAM constellation */
2475 u32 qamSlMer = 0; /* QAM MER */
2477 /* get the register value needed for MER */
2478 status = read16(state, QAM_SL_ERR_POWER__A, &qamSlErrPower);
2482 switch (state->param.u.qam.modulation) {
2484 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2487 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2490 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2493 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2497 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2501 if (qamSlErrPower > 0) {
2502 qamSlMer = Log10Times100(qamSlSigPower) -
2503 Log10Times100((u32) qamSlErrPower);
2505 *pSignalToNoise = qamSlMer;
2510 static int GetDVBTSignalToNoise(struct drxk_state *state,
2511 s32 *pSignalToNoise)
2516 u32 EqRegTdSqrErrI = 0;
2517 u32 EqRegTdSqrErrQ = 0;
2518 u16 EqRegTdSqrErrExp = 0;
2519 u16 EqRegTdTpsPwrOfs = 0;
2520 u16 EqRegTdReqSmbCnt = 0;
2527 u16 transmissionParams = 0;
2531 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A, &EqRegTdTpsPwrOfs);
2534 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A, &EqRegTdReqSmbCnt);
2537 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A, &EqRegTdSqrErrExp);
2540 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A, ®Data);
2543 /* Extend SQR_ERR_I operational range */
2544 EqRegTdSqrErrI = (u32) regData;
2545 if ((EqRegTdSqrErrExp > 11) &&
2546 (EqRegTdSqrErrI < 0x00000FFFUL)) {
2547 EqRegTdSqrErrI += 0x00010000UL;
2549 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®Data);
2552 /* Extend SQR_ERR_Q operational range */
2553 EqRegTdSqrErrQ = (u32) regData;
2554 if ((EqRegTdSqrErrExp > 11) &&
2555 (EqRegTdSqrErrQ < 0x00000FFFUL))
2556 EqRegTdSqrErrQ += 0x00010000UL;
2558 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A, &transmissionParams);
2562 /* Check input data for MER */
2564 /* MER calculation (in 0.1 dB) without math.h */
2565 if ((EqRegTdTpsPwrOfs == 0) || (EqRegTdReqSmbCnt == 0))
2567 else if ((EqRegTdSqrErrI + EqRegTdSqrErrQ) == 0) {
2568 /* No error at all, this must be the HW reset value
2569 * Apparently no first measurement yet
2573 SqrErrIQ = (EqRegTdSqrErrI + EqRegTdSqrErrQ) <<
2575 if ((transmissionParams &
2576 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2577 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2582 /* IMER = 100 * log10 (x)
2583 where x = (EqRegTdTpsPwrOfs^2 *
2584 EqRegTdReqSmbCnt * tpsCnt)/SqrErrIQ
2587 where a = 100 * log10 (EqRegTdTpsPwrOfs^2)
2588 b = 100 * log10 (EqRegTdReqSmbCnt * tpsCnt)
2589 c = 100 * log10 (SqrErrIQ)
2592 /* log(x) x = 9bits * 9bits->18 bits */
2593 a = Log10Times100(EqRegTdTpsPwrOfs *
2595 /* log(x) x = 16bits * 7bits->23 bits */
2596 b = Log10Times100(EqRegTdReqSmbCnt * tpsCnt);
2597 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2598 c = Log10Times100(SqrErrIQ);
2601 /* No negative MER, clip to zero */
2607 *pSignalToNoise = iMER;
2613 static int GetSignalToNoise(struct drxk_state *state, s32 *pSignalToNoise)
2617 *pSignalToNoise = 0;
2618 switch (state->m_OperationMode) {
2620 return GetDVBTSignalToNoise(state, pSignalToNoise);
2623 return GetQAMSignalToNoise(state, pSignalToNoise);
2631 static int GetDVBTQuality(struct drxk_state *state, s32 *pQuality)
2633 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2638 static s32 QE_SN[] = {
2644 108, /* 16-QAM 1/2 */
2645 131, /* 16-QAM 2/3 */
2646 146, /* 16-QAM 3/4 */
2647 156, /* 16-QAM 5/6 */
2648 160, /* 16-QAM 7/8 */
2649 165, /* 64-QAM 1/2 */
2650 187, /* 64-QAM 2/3 */
2651 202, /* 64-QAM 3/4 */
2652 216, /* 64-QAM 5/6 */
2653 225, /* 64-QAM 7/8 */
2659 s32 SignalToNoise = 0;
2660 u16 Constellation = 0;
2662 u32 SignalToNoiseRel;
2665 status = GetDVBTSignalToNoise(state, &SignalToNoise);
2668 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A, &Constellation);
2671 Constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2673 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A, &CodeRate);
2676 CodeRate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2678 if (Constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2679 CodeRate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2681 SignalToNoiseRel = SignalToNoise -
2682 QE_SN[Constellation * 5 + CodeRate];
2685 if (SignalToNoiseRel < -70)
2687 else if (SignalToNoiseRel < 30)
2688 *pQuality = ((SignalToNoiseRel + 70) *
2691 *pQuality = BERQuality;
2696 static int GetDVBCQuality(struct drxk_state *state, s32 *pQuality)
2704 u32 SignalToNoise = 0;
2705 u32 BERQuality = 100;
2706 u32 SignalToNoiseRel = 0;
2708 status = GetQAMSignalToNoise(state, &SignalToNoise);
2712 switch (state->param.u.qam.modulation) {
2714 SignalToNoiseRel = SignalToNoise - 200;
2717 SignalToNoiseRel = SignalToNoise - 230;
2718 break; /* Not in NorDig */
2720 SignalToNoiseRel = SignalToNoise - 260;
2723 SignalToNoiseRel = SignalToNoise - 290;
2727 SignalToNoiseRel = SignalToNoise - 320;
2731 if (SignalToNoiseRel < -70)
2733 else if (SignalToNoiseRel < 30)
2734 *pQuality = ((SignalToNoiseRel + 70) *
2737 *pQuality = BERQuality;
2743 static int GetQuality(struct drxk_state *state, s32 *pQuality)
2747 switch (state->m_OperationMode) {
2749 return GetDVBTQuality(state, pQuality);
2751 return GetDVBCQuality(state, pQuality);
2760 /* Free data ram in SIO HI */
2761 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2762 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2764 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2765 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2766 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2767 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2769 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2770 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2771 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2773 static int ConfigureI2CBridge(struct drxk_state *state, bool bEnableBridge)
2779 if (state->m_DrxkState == DRXK_UNINITIALIZED)
2781 if (state->m_DrxkState == DRXK_POWERED_DOWN)
2785 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2788 if (bEnableBridge) {
2789 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2793 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2798 status = HI_Command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, 0);
2805 static int SetPreSaw(struct drxk_state *state,
2806 struct SCfgPreSaw *pPreSawCfg)
2812 if ((pPreSawCfg == NULL)
2813 || (pPreSawCfg->reference > IQM_AF_PDREF__M))
2816 status = write16(state, IQM_AF_PDREF__A, pPreSawCfg->reference);
2820 static int BLDirectCmd(struct drxk_state *state, u32 targetAddr,
2821 u16 romOffset, u16 nrOfElements, u32 timeOut)
2824 u16 offset = (u16) ((targetAddr >> 0) & 0x00FFFF);
2825 u16 blockbank = (u16) ((targetAddr >> 16) & 0x000FFF);
2831 mutex_lock(&state->mutex);
2833 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2836 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2839 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2842 status = write16(state, SIO_BL_SRC_ADDR__A, romOffset);
2845 status = write16(state, SIO_BL_SRC_LEN__A, nrOfElements);
2848 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2852 end = jiffies + msecs_to_jiffies(timeOut);
2854 status = read16(state, SIO_BL_STATUS__A, &blStatus);
2857 } while ((blStatus == 0x1) && time_is_after_jiffies(end));
2858 if (blStatus == 0x1) {
2859 printk(KERN_ERR "drxk: SIO not ready\n");
2860 mutex_unlock(&state->mutex);
2864 mutex_unlock(&state->mutex);
2869 static int ADCSyncMeasurement(struct drxk_state *state, u16 *count)
2877 /* Start measurement */
2878 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2881 status = write16(state, IQM_AF_START_LOCK__A, 1);
2886 status = read16(state, IQM_AF_PHASE0__A, &data);
2890 *count = *count + 1;
2891 status = read16(state, IQM_AF_PHASE1__A, &data);
2895 *count = *count + 1;
2896 status = read16(state, IQM_AF_PHASE2__A, &data);
2900 *count = *count + 1;
2905 static int ADCSynchronization(struct drxk_state *state)
2913 status = ADCSyncMeasurement(state, &count);
2918 /* Try sampling on a diffrent edge */
2921 status = read16(state, IQM_AF_CLKNEG__A, &clkNeg);
2924 if ((clkNeg | IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2925 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2926 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2928 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2930 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2932 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2934 status = write16(state, IQM_AF_CLKNEG__A, clkNeg);
2937 status = ADCSyncMeasurement(state, &count);
2948 static int SetFrequencyShifter(struct drxk_state *state,
2949 u16 intermediateFreqkHz,
2950 s32 tunerFreqOffset, bool isDTV)
2952 bool selectPosImage = false;
2953 u32 rfFreqResidual = tunerFreqOffset;
2954 u32 fmFrequencyShift = 0;
2955 bool tunerMirror = !state->m_bMirrorFreqSpect;
2960 u32 samplingFrequency = (u32) (state->m_sysClockFreq / 3);
2967 Program frequency shifter
2968 No need to account for mirroring on RF
2971 if ((state->m_OperationMode == OM_QAM_ITU_A) ||
2972 (state->m_OperationMode == OM_QAM_ITU_C) ||
2973 (state->m_OperationMode == OM_DVBT))
2974 selectPosImage = true;
2976 selectPosImage = false;
2979 /* tuner doesn't mirror */
2980 ifFreqActual = intermediateFreqkHz +
2981 rfFreqResidual + fmFrequencyShift;
2984 ifFreqActual = intermediateFreqkHz -
2985 rfFreqResidual - fmFrequencyShift;
2986 if (ifFreqActual > samplingFrequency / 2) {
2988 adcFreq = samplingFrequency - ifFreqActual;
2991 /* adc doesn't mirror */
2992 adcFreq = ifFreqActual;
2996 frequencyShift = adcFreq;
2997 imageToSelect = state->m_rfmirror ^ tunerMirror ^
2998 adcFlip ^ selectPosImage;
2999 state->m_IqmFsRateOfs =
3000 Frac28a((frequencyShift), samplingFrequency);
3003 state->m_IqmFsRateOfs = ~state->m_IqmFsRateOfs + 1;
3005 /* Program frequency shifter with tuner offset compensation */
3006 /* frequencyShift += tunerFreqOffset; TODO */
3007 status = write32(state, IQM_FS_RATE_OFS_LO__A,
3008 state->m_IqmFsRateOfs);
3012 static int InitAGC(struct drxk_state *state, bool isDTV)
3015 u16 ingainTgtMin = 0;
3016 u16 ingainTgtMax = 0;
3024 u16 kiInnergainMin = 0;
3025 u16 ifIaccuHiTgt = 0;
3026 u16 ifIaccuHiTgtMin = 0;
3027 u16 ifIaccuHiTgtMax = 0;
3029 u16 fastClpCtrlDelay = 0;
3030 u16 clpCtrlMode = 0;
3036 /* Common settings */
3038 ifIaccuHiTgtMin = 2047;
3043 /* Standard specific settings */
3045 clpDirTo = (u16) -9;
3048 snsDirTo = (u16) -9;
3049 kiInnergainMin = (u16) -1030;
3056 ifIaccuHiTgtMax = 0x2380;
3057 ifIaccuHiTgt = 0x2380;
3058 ingainTgtMin = 0x0511;
3060 ingainTgtMax = 5119;
3062 state->m_qamIfAgcCfg.FastClipCtrlDelay;
3064 ifIaccuHiTgtMax = 0x1200;
3065 ifIaccuHiTgt = 0x1200;
3066 ingainTgtMin = 13424;
3068 ingainTgtMax = 30000;
3070 state->m_dvbtIfAgcCfg.FastClipCtrlDelay;
3072 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, fastClpCtrlDelay);
3076 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clpCtrlMode);
3079 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingainTgt);
3082 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingainTgtMin);
3085 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingainTgtMax);
3088 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, ifIaccuHiTgtMin);
3091 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, ifIaccuHiTgtMax);
3094 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3097 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3100 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3103 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3106 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clpSumMax);
3109 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, snsSumMax);
3113 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, kiInnergainMin);
3116 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, ifIaccuHiTgt);
3119 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clpCyclen);
3123 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3126 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3129 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3133 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3136 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clpSumMin);
3139 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, snsSumMin);
3142 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clpDirTo);
3145 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, snsDirTo);
3148 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3151 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3154 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3157 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3160 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3163 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3166 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3169 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3172 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3175 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3178 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3181 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3184 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3187 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3191 /* Initialize inner-loop KI gain factors */
3192 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3197 data &= ~SCU_RAM_AGC_KI_RF__M;
3198 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3199 data &= ~SCU_RAM_AGC_KI_IF__M;
3200 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3202 status = write16(state, SCU_RAM_AGC_KI__A, data);
3209 static int DVBTQAMGetAccPktErr(struct drxk_state *state, u16 *packetErr)
3215 if (packetErr == NULL) {
3216 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3220 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, packetErr);
3228 static int DVBTScCommand(struct drxk_state *state,
3229 u16 cmd, u16 subcmd,
3230 u16 param0, u16 param1, u16 param2,
3231 u16 param3, u16 param4)
3240 status = read16(state, OFDM_SC_COMM_EXEC__A, &scExec);
3242 /* SC is not running */
3246 /* Wait until sc is ready to receive command */
3250 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3252 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3253 if (retryCnt >= DRXK_MAX_RETRIES)
3255 /* Write sub-command */
3257 /* All commands using sub-cmd */
3258 case OFDM_SC_RA_RAM_CMD_PROC_START:
3259 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3260 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3262 write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3267 } /* switch (cmd->cmd) */
3269 /* Write needed parameters and the command */
3271 /* All commands using 5 parameters */
3272 /* All commands using 4 parameters */
3273 /* All commands using 3 parameters */
3274 /* All commands using 2 parameters */
3275 case OFDM_SC_RA_RAM_CMD_PROC_START:
3276 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3277 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3279 write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3280 /* All commands using 1 parameters */
3281 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3282 case OFDM_SC_RA_RAM_CMD_USER_IO:
3284 write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3285 /* All commands using 0 parameters */
3286 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3287 case OFDM_SC_RA_RAM_CMD_NULL:
3289 status = write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3292 /* Unknown command */
3294 } /* switch (cmd->cmd) */
3296 /* Wait until sc is ready processing command */
3300 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3302 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3303 if (retryCnt >= DRXK_MAX_RETRIES)
3306 /* Check for illegal cmd */
3307 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &errCode);
3308 if (errCode == 0xFFFF) {
3309 /* illegal command */
3313 /* Retreive results parameters from SC */
3315 /* All commands yielding 5 results */
3316 /* All commands yielding 4 results */
3317 /* All commands yielding 3 results */
3318 /* All commands yielding 2 results */
3319 /* All commands yielding 1 result */
3320 case OFDM_SC_RA_RAM_CMD_USER_IO:
3321 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3323 read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3324 /* All commands yielding 0 results */
3325 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3326 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3327 case OFDM_SC_RA_RAM_CMD_PROC_START:
3328 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3329 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3330 case OFDM_SC_RA_RAM_CMD_NULL:
3333 /* Unknown command */
3336 } /* switch (cmd->cmd) */
3340 static int PowerUpDVBT(struct drxk_state *state)
3342 enum DRXPowerMode powerMode = DRX_POWER_UP;
3347 status = CtrlPowerMode(state, &powerMode);
3354 static int DVBTCtrlSetIncEnable(struct drxk_state *state, bool *enabled)
3359 if (*enabled == true)
3360 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3362 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3367 #define DEFAULT_FR_THRES_8K 4000
3368 static int DVBTCtrlSetFrEnable(struct drxk_state *state, bool *enabled)
3374 if (*enabled == true) {
3375 /* write mask to 1 */
3376 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3377 DEFAULT_FR_THRES_8K);
3379 /* write mask to 0 */
3380 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3386 static int DVBTCtrlSetEchoThreshold(struct drxk_state *state,
3387 struct DRXKCfgDvbtEchoThres_t *echoThres)
3394 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3398 switch (echoThres->fftMode) {
3399 case DRX_FFTMODE_2K:
3400 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3402 ((echoThres->threshold <<
3403 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3404 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3406 case DRX_FFTMODE_8K:
3407 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3409 ((echoThres->threshold <<
3410 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3411 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3418 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3426 static int DVBTCtrlSetSqiSpeed(struct drxk_state *state,
3427 enum DRXKCfgDvbtSqiSpeed *speed)
3434 case DRXK_DVBT_SQI_SPEED_FAST:
3435 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3436 case DRXK_DVBT_SQI_SPEED_SLOW:
3441 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3446 /*============================================================================*/
3449 * \brief Activate DVBT specific presets
3450 * \param demod instance of demodulator.
3451 * \return DRXStatus_t.
3453 * Called in DVBTSetStandard
3456 static int DVBTActivatePresets(struct drxk_state *state)
3460 struct DRXKCfgDvbtEchoThres_t echoThres2k = { 0, DRX_FFTMODE_2K };
3461 struct DRXKCfgDvbtEchoThres_t echoThres8k = { 0, DRX_FFTMODE_8K };
3465 bool setincenable = false;
3466 bool setfrenable = true;
3467 status = DVBTCtrlSetIncEnable(state, &setincenable);
3470 status = DVBTCtrlSetFrEnable(state, &setfrenable);
3473 status = DVBTCtrlSetEchoThreshold(state, &echoThres2k);
3476 status = DVBTCtrlSetEchoThreshold(state, &echoThres8k);
3479 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, state->m_dvbtIfAgcCfg.IngainTgtMax);
3487 /*============================================================================*/
3490 * \brief Initialize channelswitch-independent settings for DVBT.
3491 * \param demod instance of demodulator.
3492 * \return DRXStatus_t.
3494 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3495 * the DVB-T taps from the drxk_filters.h are used.
3497 static int SetDVBTStandard(struct drxk_state *state,
3498 enum OperationMode oMode)
3508 /* added antenna switch */
3509 SwitchAntennaToDVBT(state);
3510 /* send OFDM reset command */
3511 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
3515 /* send OFDM setenv command */
3516 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 0, NULL, 1, &cmdResult);
3520 /* reset datapath for OFDM, processors first */
3521 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3524 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3527 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3532 /* synchronize on ofdstate->m_festart */
3533 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3536 /* window size for clipping ADC detection */
3537 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3540 /* window size for for sense pre-SAW detection */
3541 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3544 /* sense threshold for sense pre-SAW detection */
3545 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3548 status = SetIqmAf(state, true);
3552 status = write16(state, IQM_AF_AGC_RF__A, 0);
3556 /* Impulse noise cruncher setup */
3557 status = write16(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3560 status = write16(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3563 status = write16(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3567 status = write16(state, IQM_RC_STRETCH__A, 16);
3570 status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3573 status = write16(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3576 status = write16(state, IQM_CF_SCALE__A, 1600);
3579 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3583 /* virtual clipping threshold for clipping ADC detection */
3584 status = write16(state, IQM_AF_CLP_TH__A, 448);
3587 status = write16(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3591 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3595 status = write16(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3598 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3601 /* enable power measurement interrupt */
3602 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3605 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3609 /* IQM will not be reset from here, sync ADC and update/init AGC */
3610 status = ADCSynchronization(state);
3613 status = SetPreSaw(state, &state->m_dvbtPreSawCfg);
3617 /* Halt SCU to enable safe non-atomic accesses */
3618 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3622 status = SetAgcRf(state, &state->m_dvbtRfAgcCfg, true);
3625 status = SetAgcIf(state, &state->m_dvbtIfAgcCfg, true);
3629 /* Set Noise Estimation notch width and enable DC fix */
3630 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3633 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3634 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3638 /* Activate SCU to enable SCU commands */
3639 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3643 if (!state->m_DRXK_A3_ROM_CODE) {
3644 /* AGCInit() is not done for DVBT, so set agcFastClipCtrlDelay */
3645 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, state->m_dvbtIfAgcCfg.FastClipCtrlDelay);
3651 #ifdef COMPILE_FOR_NONRT
3652 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3655 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3661 status = write16(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3666 #ifdef COMPILE_FOR_NONRT
3667 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3671 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3675 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3679 /* Setup MPEG bus */
3680 status = MPEGTSDtoSetup(state, OM_DVBT);
3683 /* Set DVBT Presets */
3684 status = DVBTActivatePresets(state);
3691 printk(KERN_ERR "drxk: %s status - %08x\n", __func__, status);
3696 /*============================================================================*/
3698 * \brief Start dvbt demodulating for channel.
3699 * \param demod instance of demodulator.
3700 * \return DRXStatus_t.
3702 static int DVBTStart(struct drxk_state *state)
3706 /* DRXKOfdmScCmd_t scCmd; */
3709 /* Start correct processes to get in lock */
3710 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3712 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3713 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0, OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1, 0, 0, 0);
3717 status = MPEGTSStart(state);
3720 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3728 /*============================================================================*/
3731 * \brief Set up dvbt demodulator for channel.
3732 * \param demod instance of demodulator.
3733 * \return DRXStatus_t.
3734 * // original DVBTSetChannel()
3736 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
3737 s32 tunerFreqOffset)
3740 u16 transmissionParams = 0;
3741 u16 operationMode = 0;
3742 u32 iqmRcRateOfs = 0;
3748 /* printk(KERN_DEBUG "drxk: %s IF =%d, TFO = %d\n", __func__, IntermediateFreqkHz, tunerFreqOffset); */
3750 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
3754 /* Halt SCU to enable safe non-atomic accesses */
3755 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3759 /* Stop processors */
3760 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3763 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3767 /* Mandatory fix, always stop CP, required to set spl offset back to
3768 hardware default (is set to 0 by ucode during pilot detection */
3769 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3773 /*== Write channel settings to device =====================================*/
3776 switch (state->param.u.ofdm.transmission_mode) {
3777 case TRANSMISSION_MODE_AUTO:
3779 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3780 /* fall through , try first guess DRX_FFTMODE_8K */
3781 case TRANSMISSION_MODE_8K:
3782 transmissionParams |=
3783 OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3785 case TRANSMISSION_MODE_2K:
3786 transmissionParams |=
3787 OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3792 switch (state->param.u.ofdm.guard_interval) {
3794 case GUARD_INTERVAL_AUTO:
3795 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3796 /* fall through , try first guess DRX_GUARD_1DIV4 */
3797 case GUARD_INTERVAL_1_4:
3798 transmissionParams |=
3799 OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3801 case GUARD_INTERVAL_1_32:
3802 transmissionParams |=
3803 OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3805 case GUARD_INTERVAL_1_16:
3806 transmissionParams |=
3807 OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3809 case GUARD_INTERVAL_1_8:
3810 transmissionParams |=
3811 OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3816 switch (state->param.u.ofdm.hierarchy_information) {
3817 case HIERARCHY_AUTO:
3818 case HIERARCHY_NONE:
3820 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3821 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3822 /* transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3825 transmissionParams |=
3826 OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3829 transmissionParams |=
3830 OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3833 transmissionParams |=
3834 OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3840 switch (state->param.u.ofdm.constellation) {
3843 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3844 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3846 transmissionParams |=
3847 OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3850 transmissionParams |=
3851 OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3854 transmissionParams |=
3855 OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3859 /* No hierachical channels support in BDA */
3860 /* Priority (only for hierarchical channels) */
3861 switch (channel->priority) {
3862 case DRX_PRIORITY_LOW:
3863 transmissionParams |=
3864 OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3865 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3866 OFDM_EC_SB_PRIOR_LO);
3868 case DRX_PRIORITY_HIGH:
3869 transmissionParams |=
3870 OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3871 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3872 OFDM_EC_SB_PRIOR_HI));
3874 case DRX_PRIORITY_UNKNOWN: /* fall through */
3876 return DRX_STS_INVALID_ARG;
3880 /* Set Priorty high */
3881 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3882 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3888 switch (state->param.u.ofdm.code_rate_HP) {
3891 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3892 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3894 transmissionParams |=
3895 OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3898 transmissionParams |=
3899 OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3902 transmissionParams |=
3903 OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3906 transmissionParams |=
3907 OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3910 transmissionParams |=
3911 OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3915 /* SAW filter selection: normaly not necesarry, but if wanted
3916 the application can select a SAW filter via the driver by using UIOs */
3917 /* First determine real bandwidth (Hz) */
3918 /* Also set delay for impulse noise cruncher */
3919 /* Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is changed
3920 by SC for fix for some 8K,1/8 guard but is restored by InitEC and ResetEC
3922 switch (state->param.u.ofdm.bandwidth) {
3923 case BANDWIDTH_AUTO:
3924 case BANDWIDTH_8_MHZ:
3925 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3926 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3052);
3929 /* cochannel protection for PAL 8 MHz */
3930 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 7);
3933 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 7);
3936 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 7);
3939 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3943 case BANDWIDTH_7_MHZ:
3944 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3945 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3491);
3948 /* cochannel protection for PAL 7 MHz */
3949 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 8);
3952 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 8);
3955 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 4);
3958 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3962 case BANDWIDTH_6_MHZ:
3963 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3964 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 4073);
3967 /* cochannel protection for NTSC 6 MHz */
3968 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 19);
3971 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 19);
3974 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 14);
3977 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3985 if (iqmRcRateOfs == 0) {
3986 /* Now compute IQM_RC_RATE_OFS
3987 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
3989 ((SysFreq / BandWidth) * (2^21)) - (2^23)
3991 /* (SysFreq / BandWidth) * (2^28) */
3992 /* assert (MAX(sysClk)/MIN(bandwidth) < 16)
3993 => assert(MAX(sysClk) < 16*MIN(bandwidth))
3994 => assert(109714272 > 48000000) = true so Frac 28 can be used */
3995 iqmRcRateOfs = Frac28a((u32)
3996 ((state->m_sysClockFreq *
3997 1000) / 3), bandwidth);
3998 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
3999 if ((iqmRcRateOfs & 0x7fL) >= 0x40)
4000 iqmRcRateOfs += 0x80L;
4001 iqmRcRateOfs = iqmRcRateOfs >> 7;
4002 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
4003 iqmRcRateOfs = iqmRcRateOfs - (1 << 23);
4007 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
4008 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
4009 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRateOfs);
4013 /* Bandwidth setting done */
4016 status = DVBTSetFrequencyShift(demod, channel, tunerOffset);
4020 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
4024 /*== Start SC, write channel settings to SC ===============================*/
4026 /* Activate SCU to enable SCU commands */
4027 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4031 /* Enable SC after setting all other parameters */
4032 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4035 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4040 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
4044 /* Write SC parameter registers, set all AUTO flags in operation mode */
4045 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4046 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4047 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4048 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4049 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4051 DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4052 0, transmissionParams, param1, 0, 0, 0);
4053 if (!state->m_DRXK_A3_ROM_CODE)
4054 status = DVBTCtrlSetSqiSpeed(state, &state->m_sqiSpeed);
4064 /*============================================================================*/
4067 * \brief Retreive lock status .
4068 * \param demod Pointer to demodulator instance.
4069 * \param lockStat Pointer to lock status structure.
4070 * \return DRXStatus_t.
4073 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus)
4076 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4077 OFDM_SC_RA_RAM_LOCK_FEC__M);
4078 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4079 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4081 u16 ScRaRamLock = 0;
4087 /* Check if SC is running */
4088 status = read16(state, OFDM_SC_COMM_EXEC__A, &ScCommExec);
4089 if (ScCommExec == OFDM_SC_COMM_EXEC_STOP) {
4090 /* SC not active; return DRX_NOT_LOCKED */
4091 *pLockStatus = NOT_LOCKED;
4095 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &ScRaRamLock);
4097 if ((ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask)
4098 *pLockStatus = MPEG_LOCK;
4099 else if ((ScRaRamLock & fec_lock_mask) == fec_lock_mask)
4100 *pLockStatus = FEC_LOCK;
4101 else if ((ScRaRamLock & demod_lock_mask) == demod_lock_mask)
4102 *pLockStatus = DEMOD_LOCK;
4103 else if (ScRaRamLock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4104 *pLockStatus = NEVER_LOCK;
4106 *pLockStatus = NOT_LOCKED;
4111 static int PowerUpQAM(struct drxk_state *state)
4113 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
4118 status = CtrlPowerMode(state, &powerMode);
4128 /** Power Down QAM */
4129 static int PowerDownQAM(struct drxk_state *state)
4137 status = read16(state, SCU_COMM_EXEC__A, &data);
4140 if (data == SCU_COMM_EXEC_ACTIVE) {
4145 /* stop all comstate->m_exec */
4146 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4149 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
4154 status = SetIqmAf(state, false);
4162 /*============================================================================*/
4165 * \brief Setup of the QAM Measurement intervals for signal quality
4166 * \param demod instance of demod.
4167 * \param constellation current constellation.
4168 * \return DRXStatus_t.
4171 * Take into account that for certain settings the errorcounters can overflow.
4172 * The implementation does not check this.
4175 static int SetQAMMeasurement(struct drxk_state *state,
4176 enum EDrxkConstellation constellation,
4179 u32 fecBitsDesired = 0; /* BER accounting period */
4180 u32 fecRsPeriodTotal = 0; /* Total period */
4181 u16 fecRsPrescale = 0; /* ReedSolomon Measurement Prescale */
4182 u16 fecRsPeriod = 0; /* Value for corresponding I2C register */
4190 /* fecBitsDesired = symbolRate [kHz] *
4192 (constellation + 1) *
4196 switch (constellation) {
4197 case DRX_CONSTELLATION_QAM16:
4198 fecBitsDesired = 4 * symbolRate;
4200 case DRX_CONSTELLATION_QAM32:
4201 fecBitsDesired = 5 * symbolRate;
4203 case DRX_CONSTELLATION_QAM64:
4204 fecBitsDesired = 6 * symbolRate;
4206 case DRX_CONSTELLATION_QAM128:
4207 fecBitsDesired = 7 * symbolRate;
4209 case DRX_CONSTELLATION_QAM256:
4210 fecBitsDesired = 8 * symbolRate;
4219 fecBitsDesired /= 1000; /* symbolRate [Hz] -> symbolRate [kHz] */
4220 fecBitsDesired *= 500; /* meas. period [ms] */
4222 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4223 /* fecRsPeriodTotal = fecBitsDesired / 1632 */
4224 fecRsPeriodTotal = (fecBitsDesired / 1632UL) + 1; /* roughly ceil */
4226 /* fecRsPeriodTotal = fecRsPrescale * fecRsPeriod */
4227 fecRsPrescale = 1 + (u16) (fecRsPeriodTotal >> 16);
4228 if (fecRsPrescale == 0) {
4229 /* Divide by zero (though impossible) */
4236 ((u16) fecRsPeriodTotal +
4237 (fecRsPrescale >> 1)) / fecRsPrescale;
4239 /* write corresponding registers */
4240 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fecRsPeriod);
4243 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, fecRsPrescale);
4246 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fecRsPeriod);
4253 printk(KERN_ERR "drxk: %s: status - %08x\n", __func__, status);
4258 static int SetQAM16(struct drxk_state *state)
4264 /* QAM Equalizer Setup */
4266 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4269 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4272 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4275 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4278 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4281 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4284 /* Decision Feedback Equalizer */
4285 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4288 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4291 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4294 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4297 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4300 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4304 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4307 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4310 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4314 /* QAM Slicer Settings */
4315 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM16);
4319 /* QAM Loop Controller Coeficients */
4320 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4323 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4326 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4329 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4332 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4335 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4338 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4341 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4345 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4348 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4351 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4354 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4357 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4360 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4363 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4366 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4369 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4372 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4375 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4378 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4383 /* QAM State Machine (FSM) Thresholds */
4385 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4388 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4391 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4394 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4397 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4400 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4404 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4407 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4410 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4415 /* QAM FSM Tracking Parameters */
4417 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4420 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4423 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4426 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4429 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4432 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4435 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4443 /*============================================================================*/
4446 * \brief QAM32 specific setup
4447 * \param demod instance of demod.
4448 * \return DRXStatus_t.
4450 static int SetQAM32(struct drxk_state *state)
4456 /* QAM Equalizer Setup */
4458 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4461 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4464 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4467 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4470 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4473 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4477 /* Decision Feedback Equalizer */
4478 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4481 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4484 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4487 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4490 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4493 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4497 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4500 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4503 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4507 /* QAM Slicer Settings */
4509 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM32);
4514 /* QAM Loop Controller Coeficients */
4516 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4519 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4522 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4525 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4528 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4531 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4534 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4537 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4541 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4544 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4547 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4550 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4553 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4556 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4559 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4562 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4565 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4568 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4571 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4574 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4579 /* QAM State Machine (FSM) Thresholds */
4581 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4584 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4587 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4590 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4593 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4596 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4600 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4603 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4606 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4611 /* QAM FSM Tracking Parameters */
4613 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4616 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4619 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4622 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4625 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4628 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4631 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4639 /*============================================================================*/
4642 * \brief QAM64 specific setup
4643 * \param demod instance of demod.
4644 * \return DRXStatus_t.
4646 static int SetQAM64(struct drxk_state *state)
4652 /* QAM Equalizer Setup */
4654 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4657 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4660 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4663 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4666 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4669 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4673 /* Decision Feedback Equalizer */
4674 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4677 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4680 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4683 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4686 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4689 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4693 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4696 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4699 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4703 /* QAM Slicer Settings */
4704 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM64);
4709 /* QAM Loop Controller Coeficients */
4711 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4714 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4717 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4720 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4723 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4726 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4729 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4732 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4736 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4739 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4742 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4745 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4748 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4751 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4754 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4757 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4760 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4763 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4766 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4769 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4774 /* QAM State Machine (FSM) Thresholds */
4776 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4779 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4782 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4785 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4788 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4791 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4795 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4798 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4801 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4806 /* QAM FSM Tracking Parameters */
4808 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4811 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4814 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4817 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4820 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4823 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4826 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4834 /*============================================================================*/
4837 * \brief QAM128 specific setup
4838 * \param demod: instance of demod.
4839 * \return DRXStatus_t.
4841 static int SetQAM128(struct drxk_state *state)
4847 /* QAM Equalizer Setup */
4849 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4852 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4855 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4858 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4861 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4864 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4868 /* Decision Feedback Equalizer */
4869 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4872 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4875 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4878 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4881 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4884 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4888 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4891 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4894 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4899 /* QAM Slicer Settings */
4901 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM128);
4906 /* QAM Loop Controller Coeficients */
4908 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4911 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4914 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4917 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4920 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4923 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4926 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4929 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4933 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4936 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4939 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4942 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4945 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4948 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4951 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4954 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4957 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4960 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4963 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4966 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4971 /* QAM State Machine (FSM) Thresholds */
4973 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4976 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4979 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4982 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4985 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
4988 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4992 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4995 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
4999 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5003 /* QAM FSM Tracking Parameters */
5005 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5008 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
5011 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
5014 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
5017 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
5020 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5023 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5031 /*============================================================================*/
5034 * \brief QAM256 specific setup
5035 * \param demod: instance of demod.
5036 * \return DRXStatus_t.
5038 static int SetQAM256(struct drxk_state *state)
5044 /* QAM Equalizer Setup */
5046 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5049 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5052 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5055 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5058 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5061 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5065 /* Decision Feedback Equalizer */
5066 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5069 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5072 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5075 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5078 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5081 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5085 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5088 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5091 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5095 /* QAM Slicer Settings */
5097 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM256);
5102 /* QAM Loop Controller Coeficients */
5104 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5107 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5110 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5113 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5116 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5119 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5122 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5125 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5129 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5132 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5135 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5138 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5141 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5144 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5147 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5150 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5153 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5156 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5159 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5162 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5167 /* QAM State Machine (FSM) Thresholds */
5169 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5172 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5175 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5178 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5181 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5184 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5188 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5191 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5194 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5199 /* QAM FSM Tracking Parameters */
5201 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5204 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5207 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5210 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5213 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5216 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5219 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5228 /*============================================================================*/
5230 * \brief Reset QAM block.
5231 * \param demod: instance of demod.
5232 * \param channel: pointer to channel data.
5233 * \return DRXStatus_t.
5235 static int QAMResetQAM(struct drxk_state *state)
5242 /* Stop QAM comstate->m_exec */
5243 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5247 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
5252 /* All done, all OK */
5256 /*============================================================================*/
5259 * \brief Set QAM symbolrate.
5260 * \param demod: instance of demod.
5261 * \param channel: pointer to channel data.
5262 * \return DRXStatus_t.
5264 static int QAMSetSymbolrate(struct drxk_state *state)
5266 u32 adcFrequency = 0;
5275 /* Select & calculate correct IQM rate */
5276 adcFrequency = (state->m_sysClockFreq * 1000) / 3;
5278 /* printk(KERN_DEBUG "drxk: SR %d\n", state->param.u.qam.symbol_rate); */
5279 if (state->param.u.qam.symbol_rate <= 1188750)
5281 else if (state->param.u.qam.symbol_rate <= 2377500)
5283 else if (state->param.u.qam.symbol_rate <= 4755000)
5285 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5290 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5292 symbFreq = state->param.u.qam.symbol_rate * (1 << ratesel);
5293 if (symbFreq == 0) {
5294 /* Divide by zero */
5297 iqmRcRate = (adcFrequency / symbFreq) * (1 << 21) +
5298 (Frac28a((adcFrequency % symbFreq), symbFreq) >> 7) -
5300 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRate);
5303 state->m_iqmRcRate = iqmRcRate;
5305 LcSymbFreq = round (.125 * symbolrate / adcFreq * (1<<15))
5307 symbFreq = state->param.u.qam.symbol_rate;
5308 if (adcFrequency == 0) {
5309 /* Divide by zero */
5312 lcSymbRate = (symbFreq / adcFrequency) * (1 << 12) +
5313 (Frac28a((symbFreq % adcFrequency), adcFrequency) >>
5315 if (lcSymbRate > 511)
5317 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lcSymbRate);
5325 /*============================================================================*/
5328 * \brief Get QAM lock status.
5329 * \param demod: instance of demod.
5330 * \param channel: pointer to channel data.
5331 * \return DRXStatus_t.
5334 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus)
5337 u16 Result[2] = { 0, 0 };
5342 SCU_RAM_COMMAND_STANDARD_QAM |
5343 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5346 printk(KERN_ERR "drxk: %s status = %08x\n", __func__, status);
5348 if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5349 /* 0x0000 NOT LOCKED */
5350 *pLockStatus = NOT_LOCKED;
5351 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5352 /* 0x4000 DEMOD LOCKED */
5353 *pLockStatus = DEMOD_LOCK;
5354 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5355 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5356 *pLockStatus = MPEG_LOCK;
5358 /* 0xC000 NEVER LOCKED */
5359 /* (system will never be able to lock to the signal) */
5360 /* TODO: check this, intermediate & standard specific lock states are not
5361 taken into account here */
5362 *pLockStatus = NEVER_LOCK;
5367 #define QAM_MIRROR__M 0x03
5368 #define QAM_MIRROR_NORMAL 0x00
5369 #define QAM_MIRRORED 0x01
5370 #define QAM_MIRROR_AUTO_ON 0x02
5371 #define QAM_LOCKRANGE__M 0x10
5372 #define QAM_LOCKRANGE_NORMAL 0x10
5374 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
5375 s32 tunerFreqOffset)
5379 u16 setEnvParameters[5];
5380 u16 setParamParameters[4] = { 0, 0, 0, 0 };
5386 STEP 1: reset demodulator
5387 resets FEC DI and FEC RS
5389 resets SCU variables
5391 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5394 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5397 status = QAMResetQAM(state);
5402 STEP 2: configure demodulator
5404 -set params; resets IQM,QAM,FEC HW; initializes some SCU variables
5406 status = QAMSetSymbolrate(state);
5410 /* Env parameters */
5411 setEnvParameters[2] = QAM_TOP_ANNEX_A; /* Annex */
5412 if (state->m_OperationMode == OM_QAM_ITU_C)
5413 setEnvParameters[2] = QAM_TOP_ANNEX_C; /* Annex */
5414 setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
5415 /* check for LOCKRANGE Extented */
5416 /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
5420 switch (state->param.u.qam.modulation) {
5422 state->m_Constellation = DRX_CONSTELLATION_QAM256;
5426 state->m_Constellation = DRX_CONSTELLATION_QAM64;
5429 state->m_Constellation = DRX_CONSTELLATION_QAM16;
5432 state->m_Constellation = DRX_CONSTELLATION_QAM32;
5435 state->m_Constellation = DRX_CONSTELLATION_QAM128;
5444 setParamParameters[0] = state->m_Constellation; /* constellation */
5445 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5447 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 4, setParamParameters, 1, &cmdResult);
5452 /* STEP 3: enable the system in a mode where the ADC provides valid signal
5453 setup constellation independent registers */
5455 status = SetFrequency (channel, tunerFreqOffset));
5459 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
5463 /* Setup BER measurement */
5464 status = SetQAMMeasurement(state, state->m_Constellation, state->param.u. qam.symbol_rate);
5468 /* Reset default values */
5469 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5472 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5476 /* Reset default LC values */
5477 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5480 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5483 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5486 status = write16(state, QAM_LC_MODE__A, 7);
5490 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5493 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5496 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5499 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5502 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5505 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5508 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5511 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5514 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5517 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5520 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5523 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5526 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5529 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5532 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5536 /* Mirroring, QAM-block starting point not inverted */
5537 status = write16(state, QAM_SY_SP_INV__A, QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5541 /* Halt SCU to enable safe non-atomic accesses */
5542 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5546 /* STEP 4: constellation specific setup */
5547 switch (state->param.u.qam.modulation) {
5549 status = SetQAM16(state);
5554 status = SetQAM32(state);
5560 status = SetQAM64(state);
5565 status = SetQAM128(state);
5570 status = SetQAM256(state);
5578 /* Activate SCU to enable SCU commands */
5579 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5584 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5585 /* extAttr->currentChannel.constellation = channel->constellation; */
5586 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5587 status = MPEGTSDtoSetup(state, state->m_OperationMode);
5591 /* Start processes */
5592 status = MPEGTSStart(state);
5595 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5598 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5601 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5605 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5606 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
5610 /* update global DRXK data container */
5611 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5613 /* All done, all OK */
5617 printk(KERN_ERR "drxk: %s %d\n", __func__, status);
5622 static int SetQAMStandard(struct drxk_state *state,
5623 enum OperationMode oMode)
5625 #ifdef DRXK_QAM_TAPS
5626 #define DRXK_QAMA_TAPS_SELECT
5627 #include "drxk_filters.h"
5628 #undef DRXK_QAMA_TAPS_SELECT
5635 /* added antenna switch */
5636 SwitchAntennaToQAM(state);
5638 /* Ensure correct power-up mode */
5639 status = PowerUpQAM(state);
5642 /* Reset QAM block */
5643 status = QAMResetQAM(state);
5649 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5652 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5656 /* Upload IQM Channel Filter settings by
5657 boot loader from ROM table */
5660 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5665 status = BLDirectCmd(state, IQM_CF_TAP_RE0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5668 status = BLDirectCmd(state, IQM_CF_TAP_IM0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5679 status = write16(state, IQM_CF_OUT_ENA__A, (1 << IQM_CF_OUT_ENA_QAM__B));
5682 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5685 status = write16(state, IQM_CF_MIDTAP__A, ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5689 status = write16(state, IQM_RC_STRETCH__A, 21);
5692 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5695 status = write16(state, IQM_AF_CLP_TH__A, 448);
5698 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5701 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5705 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5708 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5711 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5714 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5718 /* IQM Impulse Noise Processing Unit */
5719 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5722 status = write16(state, IQM_CF_DATATH__A, 1000);
5725 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5728 status = write16(state, IQM_CF_DET_LCT__A, 0);
5731 status = write16(state, IQM_CF_WND_LEN__A, 1);
5734 status = write16(state, IQM_CF_PKDTH__A, 1);
5737 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5741 /* turn on IQMAF. Must be done before setAgc**() */
5742 status = SetIqmAf(state, true);
5745 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5749 /* IQM will not be reset from here, sync ADC and update/init AGC */
5750 status = ADCSynchronization(state);
5754 /* Set the FSM step period */
5755 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5759 /* Halt SCU to enable safe non-atomic accesses */
5760 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5764 /* No more resets of the IQM, current standard correctly set =>
5765 now AGCs can be configured. */
5767 status = InitAGC(state, true);
5770 status = SetPreSaw(state, &(state->m_qamPreSawCfg));
5774 /* Configure AGC's */
5775 status = SetAgcRf(state, &(state->m_qamRfAgcCfg), true);
5778 status = SetAgcIf(state, &(state->m_qamIfAgcCfg), true);
5782 /* Activate SCU to enable SCU commands */
5783 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5790 static int WriteGPIO(struct drxk_state *state)
5797 /* stop lock indicator process */
5798 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5802 /* Write magic word to enable pdr reg write */
5803 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5807 if (state->m_hasSAWSW) {
5808 /* write to io pad configuration register - output mode */
5809 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5813 /* use corresponding bit in io data output registar */
5814 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5817 if (state->m_GPIO == 0)
5818 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5820 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5821 /* write back to io data output register */
5822 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5827 /* Write magic word to disable pdr reg write */
5828 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5835 static int SwitchAntennaToQAM(struct drxk_state *state)
5840 if (state->m_AntennaSwitchDVBTDVBC != 0) {
5841 if (state->m_GPIO != state->m_AntennaDVBC) {
5842 state->m_GPIO = state->m_AntennaDVBC;
5843 status = WriteGPIO(state);
5849 static int SwitchAntennaToDVBT(struct drxk_state *state)
5854 if (state->m_AntennaSwitchDVBTDVBC != 0) {
5855 if (state->m_GPIO != state->m_AntennaDVBT) {
5856 state->m_GPIO = state->m_AntennaDVBT;
5857 status = WriteGPIO(state);
5864 static int PowerDownDevice(struct drxk_state *state)
5866 /* Power down to requested mode */
5867 /* Backup some register settings */
5868 /* Set pins with possible pull-ups connected to them in input mode */
5869 /* Analog power down */
5870 /* ADC power down */
5871 /* Power down device */
5876 if (state->m_bPDownOpenBridge) {
5877 /* Open I2C bridge before power down of DRXK */
5878 status = ConfigureI2CBridge(state, true);
5883 status = DVBTEnableOFDMTokenRing(state, false);
5887 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_CLOCK);
5890 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5893 state->m_HICfgCtrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
5894 status = HI_CfgCommand(state);
5905 static int load_microcode(struct drxk_state *state, char *mc_name)
5907 const struct firmware *fw = NULL;
5912 err = request_firmware(&fw, mc_name, state->i2c->dev.parent);
5915 "drxk: Could not load firmware file %s.\n", mc_name);
5917 "drxk: Copy %s to your hotplug directory!\n", mc_name);
5920 err = DownloadMicrocode(state, fw->data, fw->size);
5921 release_firmware(fw);
5925 static int init_drxk(struct drxk_state *state)
5928 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
5932 if ((state->m_DrxkState == DRXK_UNINITIALIZED)) {
5934 status = PowerUpDevice(state);
5937 status = DRXX_Open(state);
5940 /* Soft reset of OFDM-, sys- and osc-clockdomain */
5941 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);
5944 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5947 /* TODO is this needed, if yes how much delay in worst case scenario */
5949 state->m_DRXK_A3_PATCH_CODE = true;
5950 status = GetDeviceCapabilities(state);
5954 /* Bridge delay, uses oscilator clock */
5955 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
5956 /* SDA brdige delay */
5957 state->m_HICfgBridgeDelay =
5958 (u16) ((state->m_oscClockFreq / 1000) *
5959 HI_I2C_BRIDGE_DELAY) / 1000;
5961 if (state->m_HICfgBridgeDelay >
5962 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
5963 state->m_HICfgBridgeDelay =
5964 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
5966 /* SCL bridge delay, same as SDA for now */
5967 state->m_HICfgBridgeDelay +=
5968 state->m_HICfgBridgeDelay <<
5969 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
5971 status = InitHI(state);
5974 /* disable various processes */
5976 if (!(state->m_DRXK_A1_ROM_CODE)
5977 && !(state->m_DRXK_A2_ROM_CODE))
5980 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5985 /* disable MPEG port */
5986 status = MPEGTSDisable(state);
5990 /* Stop AUD and SCU */
5991 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
5994 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
5998 /* enable token-ring bus through OFDM block for possible ucode upload */
5999 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6003 /* include boot loader section */
6004 status = write16(state, SIO_BL_COMM_EXEC__A, SIO_BL_COMM_EXEC_ACTIVE);
6007 status = BLChainCmd(state, 0, 6, 100);
6012 if (state->m_DRXK_A3_PATCH_CODE)
6013 status = DownloadMicrocode(state, DRXK_A3_microcode, DRXK_A3_microcode_length);
6017 load_microcode(state, "drxk_a3.mc");
6020 if (state->m_DRXK_A2_PATCH_CODE)
6021 status = DownloadMicrocode(state, DRXK_A2_microcode, DRXK_A2_microcode_length);
6025 /* disable token-ring bus through OFDM block for possible ucode upload */
6026 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6030 /* Run SCU for a little while to initialize microcode version numbers */
6031 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6034 status = DRXX_Open(state);
6037 /* added for test */
6040 powerMode = DRXK_POWER_DOWN_OFDM;
6041 status = CtrlPowerMode(state, &powerMode);
6045 /* Stamp driver version number in SCU data RAM in BCD code
6046 Done to enable field application engineers to retreive drxdriver version
6047 via I2C from SCU RAM.
6048 Not using SCU command interface for SCU register access since no
6049 microcode may be present.
6052 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6053 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6054 ((DRXK_VERSION_MAJOR % 10) << 4) +
6055 (DRXK_VERSION_MINOR % 10);
6056 status = write16(state, SCU_RAM_DRIVER_VER_HI__A, driverVersion);
6060 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6061 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6062 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6063 (DRXK_VERSION_PATCH % 10);
6064 status = write16(state, SCU_RAM_DRIVER_VER_LO__A, driverVersion);
6068 printk(KERN_INFO "DRXK driver version %d.%d.%d\n",
6069 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6070 DRXK_VERSION_PATCH);
6072 /* Dirty fix of default values for ROM/PATCH microcode
6073 Dirty because this fix makes it impossible to setup suitable values
6074 before calling DRX_Open. This solution requires changes to RF AGC speed
6075 to be done via the CTRL function after calling DRX_Open */
6077 /* m_dvbtRfAgcCfg.speed = 3; */
6079 /* Reset driver debug flags to 0 */
6080 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6085 NOTE: No more full FEC resets allowed afterwards!! */
6086 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6089 /* MPEGTS functions are still the same */
6090 status = MPEGTSDtoInit(state);
6093 status = MPEGTSStop(state);
6096 status = MPEGTSConfigurePolarity(state);
6099 status = MPEGTSConfigurePins(state, state->m_enableMPEGOutput);
6102 /* added: configure GPIO */
6103 status = WriteGPIO(state);
6107 state->m_DrxkState = DRXK_STOPPED;
6109 if (state->m_bPowerDown) {
6110 status = PowerDownDevice(state);
6113 state->m_DrxkState = DRXK_POWERED_DOWN;
6115 state->m_DrxkState = DRXK_STOPPED;
6122 static void drxk_c_release(struct dvb_frontend *fe)
6124 struct drxk_state *state = fe->demodulator_priv;
6130 static int drxk_c_init(struct dvb_frontend *fe)
6132 struct drxk_state *state = fe->demodulator_priv;
6135 if (mutex_trylock(&state->ctlock) == 0)
6137 SetOperationMode(state, OM_QAM_ITU_A);
6141 static int drxk_c_sleep(struct dvb_frontend *fe)
6143 struct drxk_state *state = fe->demodulator_priv;
6147 mutex_unlock(&state->ctlock);
6151 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6153 struct drxk_state *state = fe->demodulator_priv;
6155 dprintk(1, "%s\n", enable ? "enable" : "disable");
6156 return ConfigureI2CBridge(state, enable ? true : false);
6159 static int drxk_set_parameters(struct dvb_frontend *fe,
6160 struct dvb_frontend_parameters *p)
6162 struct drxk_state *state = fe->demodulator_priv;
6166 if (fe->ops.i2c_gate_ctrl)
6167 fe->ops.i2c_gate_ctrl(fe, 1);
6168 if (fe->ops.tuner_ops.set_params)
6169 fe->ops.tuner_ops.set_params(fe, p);
6170 if (fe->ops.i2c_gate_ctrl)
6171 fe->ops.i2c_gate_ctrl(fe, 0);
6173 fe->ops.tuner_ops.get_frequency(fe, &IF);
6174 Start(state, 0, IF);
6176 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6181 static int drxk_c_get_frontend(struct dvb_frontend *fe,
6182 struct dvb_frontend_parameters *p)
6188 static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6190 struct drxk_state *state = fe->demodulator_priv;
6195 GetLockStatus(state, &stat, 0);
6196 if (stat == MPEG_LOCK)
6198 if (stat == FEC_LOCK)
6200 if (stat == DEMOD_LOCK)
6205 static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber)
6213 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6216 struct drxk_state *state = fe->demodulator_priv;
6220 ReadIFAgc(state, &val);
6221 *strength = val & 0xffff;
6225 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6227 struct drxk_state *state = fe->demodulator_priv;
6231 GetSignalToNoise(state, &snr2);
6232 *snr = snr2 & 0xffff;
6236 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6238 struct drxk_state *state = fe->demodulator_priv;
6242 DVBTQAMGetAccPktErr(state, &err);
6243 *ucblocks = (u32) err;
6247 static int drxk_c_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6251 sets->min_delay_ms = 3000;
6252 sets->max_drift = 0;
6253 sets->step_size = 0;
6257 static void drxk_t_release(struct dvb_frontend *fe)
6260 struct drxk_state *state = fe->demodulator_priv;
6267 static int drxk_t_init(struct dvb_frontend *fe)
6269 struct drxk_state *state = fe->demodulator_priv;
6272 if (mutex_trylock(&state->ctlock) == 0)
6274 SetOperationMode(state, OM_DVBT);
6278 static int drxk_t_sleep(struct dvb_frontend *fe)
6280 struct drxk_state *state = fe->demodulator_priv;
6283 mutex_unlock(&state->ctlock);
6287 static int drxk_t_get_frontend(struct dvb_frontend *fe,
6288 struct dvb_frontend_parameters *p)
6295 static struct dvb_frontend_ops drxk_c_ops = {
6297 .name = "DRXK DVB-C",
6299 .frequency_stepsize = 62500,
6300 .frequency_min = 47000000,
6301 .frequency_max = 862000000,
6302 .symbol_rate_min = 870000,
6303 .symbol_rate_max = 11700000,
6304 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6305 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO},
6306 .release = drxk_c_release,
6307 .init = drxk_c_init,
6308 .sleep = drxk_c_sleep,
6309 .i2c_gate_ctrl = drxk_gate_ctrl,
6311 .set_frontend = drxk_set_parameters,
6312 .get_frontend = drxk_c_get_frontend,
6313 .get_tune_settings = drxk_c_get_tune_settings,
6315 .read_status = drxk_read_status,
6316 .read_ber = drxk_read_ber,
6317 .read_signal_strength = drxk_read_signal_strength,
6318 .read_snr = drxk_read_snr,
6319 .read_ucblocks = drxk_read_ucblocks,
6322 static struct dvb_frontend_ops drxk_t_ops = {
6324 .name = "DRXK DVB-T",
6326 .frequency_min = 47125000,
6327 .frequency_max = 865000000,
6328 .frequency_stepsize = 166667,
6329 .frequency_tolerance = 0,
6330 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
6331 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
6333 FE_CAN_QAM_16 | FE_CAN_QAM_64 |
6335 FE_CAN_TRANSMISSION_MODE_AUTO |
6336 FE_CAN_GUARD_INTERVAL_AUTO |
6337 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_MUTE_TS},
6338 .release = drxk_t_release,
6339 .init = drxk_t_init,
6340 .sleep = drxk_t_sleep,
6341 .i2c_gate_ctrl = drxk_gate_ctrl,
6343 .set_frontend = drxk_set_parameters,
6344 .get_frontend = drxk_t_get_frontend,
6346 .read_status = drxk_read_status,
6347 .read_ber = drxk_read_ber,
6348 .read_signal_strength = drxk_read_signal_strength,
6349 .read_snr = drxk_read_snr,
6350 .read_ucblocks = drxk_read_ucblocks,
6353 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6354 struct i2c_adapter *i2c,
6355 struct dvb_frontend **fe_t)
6357 struct drxk_state *state = NULL;
6358 u8 adr = config->adr;
6361 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6366 state->demod_address = adr;
6367 state->single_master = config->single_master;
6369 mutex_init(&state->mutex);
6370 mutex_init(&state->ctlock);
6372 memcpy(&state->c_frontend.ops, &drxk_c_ops,
6373 sizeof(struct dvb_frontend_ops));
6374 memcpy(&state->t_frontend.ops, &drxk_t_ops,
6375 sizeof(struct dvb_frontend_ops));
6376 state->c_frontend.demodulator_priv = state;
6377 state->t_frontend.demodulator_priv = state;
6380 if (init_drxk(state) < 0)
6382 *fe_t = &state->t_frontend;
6383 return &state->c_frontend;
6386 printk(KERN_ERR "drxk: not found\n");
6390 EXPORT_SYMBOL(drxk_attach);
6392 MODULE_DESCRIPTION("DRX-K driver");
6393 MODULE_AUTHOR("Ralph Metzler");
6394 MODULE_LICENSE("GPL");