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 inline u32 MulDiv32(u32 a, u32 b, u32 c)
180 tmp64 = (u64) a * (u64) b;
186 inline u32 Frac28a(u32 a, u32 c)
192 R0 = (a % c) << 4; /* 32-28 == 4 shifts possible at max */
193 Q1 = a / c; /* integer part, only the 4 least significant bits
194 will be visible in the result */
196 /* division using radix 16, 7 nibbles in the result */
197 for (i = 0; i < 7; i++) {
198 Q1 = (Q1 << 4) | (R0 / c);
208 static u32 Log10Times100(u32 x)
210 static const u8 scale = 15;
211 static const u8 indexWidth = 5;
218 log2lut[n] = (1<<scale) * 200 * log2(1.0 + ((1.0/(1<<INDEXWIDTH)) * n))
219 0 <= n < ((1<<INDEXWIDTH)+1)
222 static const u32 log2lut[] = {
224 290941, /* 290941.300628 */
225 573196, /* 573196.476418 */
226 847269, /* 847269.179851 */
227 1113620, /* 1113620.489452 */
228 1372674, /* 1372673.576986 */
229 1624818, /* 1624817.752104 */
230 1870412, /* 1870411.981536 */
231 2109788, /* 2109787.962654 */
232 2343253, /* 2343252.817465 */
233 2571091, /* 2571091.461923 */
234 2793569, /* 2793568.696416 */
235 3010931, /* 3010931.055901 */
236 3223408, /* 3223408.452106 */
237 3431216, /* 3431215.635215 */
238 3634553, /* 3634553.498355 */
239 3833610, /* 3833610.244726 */
240 4028562, /* 4028562.434393 */
241 4219576, /* 4219575.925308 */
242 4406807, /* 4406806.721144 */
243 4590402, /* 4590401.736809 */
244 4770499, /* 4770499.491025 */
245 4947231, /* 4947230.734179 */
246 5120719, /* 5120719.018555 */
247 5291081, /* 5291081.217197 */
248 5458428, /* 5458427.996830 */
249 5622864, /* 5622864.249668 */
250 5784489, /* 5784489.488298 */
251 5943398, /* 5943398.207380 */
252 6099680, /* 6099680.215452 */
253 6253421, /* 6253420.939751 */
254 6404702, /* 6404701.706649 */
255 6553600, /* 6553600.000000 */
262 /* Scale x (normalize) */
263 /* computing y in log(x/y) = log(x) - log(y) */
264 if ((x & ((0xffffffff) << (scale + 1))) == 0) {
265 for (k = scale; k > 0; k--) {
266 if (x & (((u32) 1) << scale))
271 for (k = scale; k < 31; k++) {
272 if ((x & (((u32) (-1)) << (scale + 1))) == 0)
278 Now x has binary point between bit[scale] and bit[scale-1]
279 and 1.0 <= x < 2.0 */
281 /* correction for divison: log(x) = log(x/y)+log(y) */
282 y = k * ((((u32) 1) << scale) * 200);
284 /* remove integer part */
285 x &= ((((u32) 1) << scale) - 1);
287 i = (u8) (x >> (scale - indexWidth));
288 /* compute delta (x - a) */
289 d = x & ((((u32) 1) << (scale - indexWidth)) - 1);
290 /* compute log, multiplication (d* (..)) must be within range ! */
292 ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - indexWidth));
293 /* Conver to log10() */
294 y /= 108853; /* (log2(10) << scale) */
302 /****************************************************************************/
303 /* I2C **********************************************************************/
304 /****************************************************************************/
306 static int i2c_read1(struct i2c_adapter *adapter, u8 adr, u8 *val)
308 struct i2c_msg msgs[1] = { {.addr = adr, .flags = I2C_M_RD,
309 .buf = val, .len = 1}
311 return (i2c_transfer(adapter, msgs, 1) == 1) ? 0 : -1;
314 static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
316 struct i2c_msg msg = {
317 .addr = adr, .flags = 0, .buf = data, .len = len };
319 if (i2c_transfer(adap, &msg, 1) != 1) {
320 printk(KERN_ERR "drxk: i2c write error at addr 0x%02x\n", adr);
326 static int i2c_read(struct i2c_adapter *adap,
327 u8 adr, u8 *msg, int len, u8 *answ, int alen)
329 struct i2c_msg msgs[2] = { {.addr = adr, .flags = 0,
330 .buf = msg, .len = len},
331 {.addr = adr, .flags = I2C_M_RD,
332 .buf = answ, .len = alen}
334 if (i2c_transfer(adap, msgs, 2) != 2) {
335 printk(KERN_ERR "drxk: i2c read error at addr 0x%02x\n", adr);
341 static int Read16(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
343 u8 adr = state->demod_address, mm1[4], mm2[2], len;
347 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
348 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
349 mm1[1] = ((reg >> 16) & 0xFF);
350 mm1[2] = ((reg >> 24) & 0xFF) | flags;
351 mm1[3] = ((reg >> 7) & 0xFF);
354 mm1[0] = ((reg << 1) & 0xFF);
355 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
358 if (i2c_read(state->i2c, adr, mm1, len, mm2, 2) < 0)
361 *data = mm2[0] | (mm2[1] << 8);
365 static int Read16_0(struct drxk_state *state, u32 reg, u16 *data)
367 return Read16(state, reg, data, 0);
370 static int Read32(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
372 u8 adr = state->demod_address, mm1[4], mm2[4], len;
376 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
377 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
378 mm1[1] = ((reg >> 16) & 0xFF);
379 mm1[2] = ((reg >> 24) & 0xFF) | flags;
380 mm1[3] = ((reg >> 7) & 0xFF);
383 mm1[0] = ((reg << 1) & 0xFF);
384 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
387 if (i2c_read(state->i2c, adr, mm1, len, mm2, 4) < 0)
390 *data = mm2[0] | (mm2[1] << 8) |
391 (mm2[2] << 16) | (mm2[3] << 24);
395 static int Write16(struct drxk_state *state, u32 reg, u16 data, u8 flags)
397 u8 adr = state->demod_address, mm[6], len;
401 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
402 mm[0] = (((reg << 1) & 0xFF) | 0x01);
403 mm[1] = ((reg >> 16) & 0xFF);
404 mm[2] = ((reg >> 24) & 0xFF) | flags;
405 mm[3] = ((reg >> 7) & 0xFF);
408 mm[0] = ((reg << 1) & 0xFF);
409 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
412 mm[len] = data & 0xff;
413 mm[len + 1] = (data >> 8) & 0xff;
414 if (i2c_write(state->i2c, adr, mm, len + 2) < 0)
419 static int Write16_0(struct drxk_state *state, u32 reg, u16 data)
421 return Write16(state, reg, data, 0);
424 static int Write32(struct drxk_state *state, u32 reg, u32 data, u8 flags)
426 u8 adr = state->demod_address, mm[8], len;
430 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
431 mm[0] = (((reg << 1) & 0xFF) | 0x01);
432 mm[1] = ((reg >> 16) & 0xFF);
433 mm[2] = ((reg >> 24) & 0xFF) | flags;
434 mm[3] = ((reg >> 7) & 0xFF);
437 mm[0] = ((reg << 1) & 0xFF);
438 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
441 mm[len] = data & 0xff;
442 mm[len + 1] = (data >> 8) & 0xff;
443 mm[len + 2] = (data >> 16) & 0xff;
444 mm[len + 3] = (data >> 24) & 0xff;
445 if (i2c_write(state->i2c, adr, mm, len + 4) < 0)
450 static int WriteBlock(struct drxk_state *state, u32 Address,
451 const int BlockSize, const u8 pBlock[], u8 Flags)
453 int status = 0, BlkSize = BlockSize;
457 while (BlkSize > 0) {
458 int Chunk = BlkSize > state->m_ChunkSize ?
459 state->m_ChunkSize : BlkSize;
460 u8 *AdrBuf = &state->Chunk[0];
463 if (DRXDAP_FASI_LONG_FORMAT(Address) || (Flags != 0)) {
464 AdrBuf[0] = (((Address << 1) & 0xFF) | 0x01);
465 AdrBuf[1] = ((Address >> 16) & 0xFF);
466 AdrBuf[2] = ((Address >> 24) & 0xFF);
467 AdrBuf[3] = ((Address >> 7) & 0xFF);
470 if (Chunk == state->m_ChunkSize)
473 AdrBuf[0] = ((Address << 1) & 0xFF);
474 AdrBuf[1] = (((Address >> 16) & 0x0F) |
475 ((Address >> 18) & 0xF0));
478 memcpy(&state->Chunk[AdrLength], pBlock, Chunk);
479 status = i2c_write(state->i2c, state->demod_address,
480 &state->Chunk[0], Chunk + AdrLength);
482 printk(KERN_ERR "drxk: %s: i2c write error at addr 0x%02x\n",
487 Address += (Chunk >> 1);
493 #ifndef DRXK_MAX_RETRIES_POWERUP
494 #define DRXK_MAX_RETRIES_POWERUP 20
497 int PowerUpDevice(struct drxk_state *state)
503 status = i2c_read1(state->i2c, state->demod_address, &data);
507 if (i2c_write(state->i2c,
508 state->demod_address, &data, 1) < 0)
509 printk(KERN_ERR "drxk: powerup failed\n");
512 } while (i2c_read1(state->i2c,
513 state->demod_address, &data) < 0 &&
514 (retryCount < DRXK_MAX_RETRIES_POWERUP));
515 if (retryCount >= DRXK_MAX_RETRIES_POWERUP)
518 /* Make sure all clk domains are active */
519 status = Write16_0(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
522 status = Write16_0(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
525 /* Enable pll lock tests */
526 status = Write16_0(state, SIO_CC_PLL_LOCK__A, 1);
529 state->m_currentPowerMode = DRX_POWER_UP;
535 static int init_state(struct drxk_state *state)
537 u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
538 u32 ulVSBIfAgcOutputLevel = 0;
539 u32 ulVSBIfAgcMinLevel = 0;
540 u32 ulVSBIfAgcMaxLevel = 0x7FFF;
541 u32 ulVSBIfAgcSpeed = 3;
543 u32 ulVSBRfAgcMode = DRXK_AGC_CTRL_AUTO;
544 u32 ulVSBRfAgcOutputLevel = 0;
545 u32 ulVSBRfAgcMinLevel = 0;
546 u32 ulVSBRfAgcMaxLevel = 0x7FFF;
547 u32 ulVSBRfAgcSpeed = 3;
548 u32 ulVSBRfAgcTop = 9500;
549 u32 ulVSBRfAgcCutOffCurrent = 4000;
551 u32 ulATVIfAgcMode = DRXK_AGC_CTRL_AUTO;
552 u32 ulATVIfAgcOutputLevel = 0;
553 u32 ulATVIfAgcMinLevel = 0;
554 u32 ulATVIfAgcMaxLevel = 0;
555 u32 ulATVIfAgcSpeed = 3;
557 u32 ulATVRfAgcMode = DRXK_AGC_CTRL_OFF;
558 u32 ulATVRfAgcOutputLevel = 0;
559 u32 ulATVRfAgcMinLevel = 0;
560 u32 ulATVRfAgcMaxLevel = 0;
561 u32 ulATVRfAgcTop = 9500;
562 u32 ulATVRfAgcCutOffCurrent = 4000;
563 u32 ulATVRfAgcSpeed = 3;
565 u32 ulQual83 = DEFAULT_MER_83;
566 u32 ulQual93 = DEFAULT_MER_93;
568 u32 ulDVBTStaticTSClock = 1;
569 u32 ulDVBCStaticTSClock = 1;
571 u32 ulMpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
572 u32 ulDemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
574 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
575 /* io_pad_cfg_mode output mode is drive always */
576 /* io_pad_cfg_drive is set to power 2 (23 mA) */
577 u32 ulGPIOCfg = 0x0113;
579 u32 ulSerialMode = 1;
580 u32 ulInvertTSClock = 0;
581 u32 ulTSDataStrength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
582 u32 ulTSClockkStrength = DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH;
583 u32 ulDVBTBitrate = 50000000;
584 u32 ulDVBCBitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
586 u32 ulInsertRSByte = 0;
591 u32 ulAntennaDVBT = 1;
592 u32 ulAntennaDVBC = 0;
593 u32 ulAntennaSwitchDVBTDVBC = 0;
595 state->m_hasLNA = false;
596 state->m_hasDVBT = false;
597 state->m_hasDVBC = false;
598 state->m_hasATV = false;
599 state->m_hasOOB = false;
600 state->m_hasAudio = false;
602 state->m_ChunkSize = 124;
604 state->m_oscClockFreq = 0;
605 state->m_smartAntInverted = false;
606 state->m_bPDownOpenBridge = false;
608 /* real system clock frequency in kHz */
609 state->m_sysClockFreq = 151875;
610 /* Timing div, 250ns/Psys */
611 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
612 state->m_HICfgTimingDiv = ((state->m_sysClockFreq / 1000) *
613 HI_I2C_DELAY) / 1000;
615 if (state->m_HICfgTimingDiv > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
616 state->m_HICfgTimingDiv = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
617 state->m_HICfgWakeUpKey = (state->demod_address << 1);
618 /* port/bridge/power down ctrl */
619 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
621 state->m_bPowerDown = (ulPowerDown != 0);
623 state->m_DRXK_A1_PATCH_CODE = false;
624 state->m_DRXK_A1_ROM_CODE = false;
625 state->m_DRXK_A2_ROM_CODE = false;
626 state->m_DRXK_A3_ROM_CODE = false;
627 state->m_DRXK_A2_PATCH_CODE = false;
628 state->m_DRXK_A3_PATCH_CODE = false;
630 /* Init AGC and PGA parameters */
632 state->m_vsbIfAgcCfg.ctrlMode = (ulVSBIfAgcMode);
633 state->m_vsbIfAgcCfg.outputLevel = (ulVSBIfAgcOutputLevel);
634 state->m_vsbIfAgcCfg.minOutputLevel = (ulVSBIfAgcMinLevel);
635 state->m_vsbIfAgcCfg.maxOutputLevel = (ulVSBIfAgcMaxLevel);
636 state->m_vsbIfAgcCfg.speed = (ulVSBIfAgcSpeed);
637 state->m_vsbPgaCfg = 140;
640 state->m_vsbRfAgcCfg.ctrlMode = (ulVSBRfAgcMode);
641 state->m_vsbRfAgcCfg.outputLevel = (ulVSBRfAgcOutputLevel);
642 state->m_vsbRfAgcCfg.minOutputLevel = (ulVSBRfAgcMinLevel);
643 state->m_vsbRfAgcCfg.maxOutputLevel = (ulVSBRfAgcMaxLevel);
644 state->m_vsbRfAgcCfg.speed = (ulVSBRfAgcSpeed);
645 state->m_vsbRfAgcCfg.top = (ulVSBRfAgcTop);
646 state->m_vsbRfAgcCfg.cutOffCurrent = (ulVSBRfAgcCutOffCurrent);
647 state->m_vsbPreSawCfg.reference = 0x07;
648 state->m_vsbPreSawCfg.usePreSaw = true;
650 state->m_Quality83percent = DEFAULT_MER_83;
651 state->m_Quality93percent = DEFAULT_MER_93;
652 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
653 state->m_Quality83percent = ulQual83;
654 state->m_Quality93percent = ulQual93;
658 state->m_atvIfAgcCfg.ctrlMode = (ulATVIfAgcMode);
659 state->m_atvIfAgcCfg.outputLevel = (ulATVIfAgcOutputLevel);
660 state->m_atvIfAgcCfg.minOutputLevel = (ulATVIfAgcMinLevel);
661 state->m_atvIfAgcCfg.maxOutputLevel = (ulATVIfAgcMaxLevel);
662 state->m_atvIfAgcCfg.speed = (ulATVIfAgcSpeed);
665 state->m_atvRfAgcCfg.ctrlMode = (ulATVRfAgcMode);
666 state->m_atvRfAgcCfg.outputLevel = (ulATVRfAgcOutputLevel);
667 state->m_atvRfAgcCfg.minOutputLevel = (ulATVRfAgcMinLevel);
668 state->m_atvRfAgcCfg.maxOutputLevel = (ulATVRfAgcMaxLevel);
669 state->m_atvRfAgcCfg.speed = (ulATVRfAgcSpeed);
670 state->m_atvRfAgcCfg.top = (ulATVRfAgcTop);
671 state->m_atvRfAgcCfg.cutOffCurrent = (ulATVRfAgcCutOffCurrent);
672 state->m_atvPreSawCfg.reference = 0x04;
673 state->m_atvPreSawCfg.usePreSaw = true;
677 state->m_dvbtRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
678 state->m_dvbtRfAgcCfg.outputLevel = 0;
679 state->m_dvbtRfAgcCfg.minOutputLevel = 0;
680 state->m_dvbtRfAgcCfg.maxOutputLevel = 0xFFFF;
681 state->m_dvbtRfAgcCfg.top = 0x2100;
682 state->m_dvbtRfAgcCfg.cutOffCurrent = 4000;
683 state->m_dvbtRfAgcCfg.speed = 1;
687 state->m_dvbtIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
688 state->m_dvbtIfAgcCfg.outputLevel = 0;
689 state->m_dvbtIfAgcCfg.minOutputLevel = 0;
690 state->m_dvbtIfAgcCfg.maxOutputLevel = 9000;
691 state->m_dvbtIfAgcCfg.top = 13424;
692 state->m_dvbtIfAgcCfg.cutOffCurrent = 0;
693 state->m_dvbtIfAgcCfg.speed = 3;
694 state->m_dvbtIfAgcCfg.FastClipCtrlDelay = 30;
695 state->m_dvbtIfAgcCfg.IngainTgtMax = 30000;
696 /* state->m_dvbtPgaCfg = 140; */
698 state->m_dvbtPreSawCfg.reference = 4;
699 state->m_dvbtPreSawCfg.usePreSaw = false;
702 state->m_qamRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
703 state->m_qamRfAgcCfg.outputLevel = 0;
704 state->m_qamRfAgcCfg.minOutputLevel = 6023;
705 state->m_qamRfAgcCfg.maxOutputLevel = 27000;
706 state->m_qamRfAgcCfg.top = 0x2380;
707 state->m_qamRfAgcCfg.cutOffCurrent = 4000;
708 state->m_qamRfAgcCfg.speed = 3;
711 state->m_qamIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
712 state->m_qamIfAgcCfg.outputLevel = 0;
713 state->m_qamIfAgcCfg.minOutputLevel = 0;
714 state->m_qamIfAgcCfg.maxOutputLevel = 9000;
715 state->m_qamIfAgcCfg.top = 0x0511;
716 state->m_qamIfAgcCfg.cutOffCurrent = 0;
717 state->m_qamIfAgcCfg.speed = 3;
718 state->m_qamIfAgcCfg.IngainTgtMax = 5119;
719 state->m_qamIfAgcCfg.FastClipCtrlDelay = 50;
721 state->m_qamPgaCfg = 140;
722 state->m_qamPreSawCfg.reference = 4;
723 state->m_qamPreSawCfg.usePreSaw = false;
725 state->m_OperationMode = OM_NONE;
726 state->m_DrxkState = DRXK_UNINITIALIZED;
728 /* MPEG output configuration */
729 state->m_enableMPEGOutput = true; /* If TRUE; enable MPEG ouput */
730 state->m_insertRSByte = false; /* If TRUE; insert RS byte */
731 state->m_enableParallel = true; /* If TRUE;
732 parallel out otherwise serial */
733 state->m_invertDATA = false; /* If TRUE; invert DATA signals */
734 state->m_invertERR = false; /* If TRUE; invert ERR signal */
735 state->m_invertSTR = false; /* If TRUE; invert STR signals */
736 state->m_invertVAL = false; /* If TRUE; invert VAL signals */
737 state->m_invertCLK = (ulInvertTSClock != 0); /* If TRUE; invert CLK signals */
738 state->m_DVBTStaticCLK = (ulDVBTStaticTSClock != 0);
739 state->m_DVBCStaticCLK = (ulDVBCStaticTSClock != 0);
740 /* If TRUE; static MPEG clockrate will be used;
741 otherwise clockrate will adapt to the bitrate of the TS */
743 state->m_DVBTBitrate = ulDVBTBitrate;
744 state->m_DVBCBitrate = ulDVBCBitrate;
746 state->m_TSDataStrength = (ulTSDataStrength & 0x07);
747 state->m_TSClockkStrength = (ulTSClockkStrength & 0x07);
749 /* Maximum bitrate in b/s in case static clockrate is selected */
750 state->m_mpegTsStaticBitrate = 19392658;
751 state->m_disableTEIhandling = false;
754 state->m_insertRSByte = true;
756 state->m_MpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
757 if (ulMpegLockTimeOut < 10000)
758 state->m_MpegLockTimeOut = ulMpegLockTimeOut;
759 state->m_DemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
760 if (ulDemodLockTimeOut < 10000)
761 state->m_DemodLockTimeOut = ulDemodLockTimeOut;
764 state->m_Constellation = DRX_CONSTELLATION_AUTO;
765 state->m_qamInterleaveMode = DRXK_QAM_I12_J17;
766 state->m_fecRsPlen = 204 * 8; /* fecRsPlen annex A */
767 state->m_fecRsPrescale = 1;
769 state->m_sqiSpeed = DRXK_DVBT_SQI_SPEED_MEDIUM;
770 state->m_agcFastClipCtrlDelay = 0;
772 state->m_GPIOCfg = (ulGPIOCfg);
773 state->m_GPIO = (ulGPIO == 0 ? 0 : 1);
775 state->m_AntennaDVBT = (ulAntennaDVBT == 0 ? 0 : 1);
776 state->m_AntennaDVBC = (ulAntennaDVBC == 0 ? 0 : 1);
777 state->m_AntennaSwitchDVBTDVBC =
778 (ulAntennaSwitchDVBTDVBC == 0 ? 0 : 1);
780 state->m_bPowerDown = false;
781 state->m_currentPowerMode = DRX_POWER_DOWN;
783 state->m_enableParallel = (ulSerialMode == 0);
785 state->m_rfmirror = (ulRfMirror == 0);
786 state->m_IfAgcPol = false;
790 static int DRXX_Open(struct drxk_state *state)
798 /* stop lock indicator process */
799 status = Write16_0(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
802 /* Check device id */
803 status = Read16(state, SIO_TOP_COMM_KEY__A, &key, 0);
806 status = Write16_0(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
809 status = Read32(state, SIO_TOP_JTAGID_LO__A, &jtag, 0);
812 status = Read16(state, SIO_PDR_UIO_IN_HI__A, &bid, 0);
815 status = Write16_0(state, SIO_TOP_COMM_KEY__A, key);
822 static int GetDeviceCapabilities(struct drxk_state *state)
824 u16 sioPdrOhwCfg = 0;
825 u32 sioTopJtagidLo = 0;
830 /* stop lock indicator process */
831 status = Write16_0(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
835 status = Write16_0(state, SIO_TOP_COMM_KEY__A, 0xFABA);
838 status = Read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg, 0);
841 status = Write16_0(state, SIO_TOP_COMM_KEY__A, 0x0000);
845 switch ((sioPdrOhwCfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
847 /* ignore (bypass ?) */
851 state->m_oscClockFreq = 27000;
855 state->m_oscClockFreq = 20250;
859 state->m_oscClockFreq = 20250;
865 Determine device capabilities
868 status = Read32(state, SIO_TOP_JTAGID_LO__A, &sioTopJtagidLo, 0);
872 switch ((sioTopJtagidLo >> 29) & 0xF) {
874 state->m_deviceSpin = DRXK_SPIN_A1;
877 state->m_deviceSpin = DRXK_SPIN_A2;
880 state->m_deviceSpin = DRXK_SPIN_A3;
883 state->m_deviceSpin = DRXK_SPIN_UNKNOWN;
887 switch ((sioTopJtagidLo >> 12) & 0xFF) {
889 /* typeId = DRX3913K_TYPE_ID */
890 state->m_hasLNA = false;
891 state->m_hasOOB = false;
892 state->m_hasATV = false;
893 state->m_hasAudio = false;
894 state->m_hasDVBT = true;
895 state->m_hasDVBC = true;
896 state->m_hasSAWSW = true;
897 state->m_hasGPIO2 = false;
898 state->m_hasGPIO1 = false;
899 state->m_hasIRQN = false;
902 /* typeId = DRX3915K_TYPE_ID */
903 state->m_hasLNA = false;
904 state->m_hasOOB = false;
905 state->m_hasATV = true;
906 state->m_hasAudio = false;
907 state->m_hasDVBT = true;
908 state->m_hasDVBC = false;
909 state->m_hasSAWSW = true;
910 state->m_hasGPIO2 = true;
911 state->m_hasGPIO1 = true;
912 state->m_hasIRQN = false;
915 /* typeId = DRX3916K_TYPE_ID */
916 state->m_hasLNA = false;
917 state->m_hasOOB = false;
918 state->m_hasATV = true;
919 state->m_hasAudio = false;
920 state->m_hasDVBT = true;
921 state->m_hasDVBC = false;
922 state->m_hasSAWSW = true;
923 state->m_hasGPIO2 = true;
924 state->m_hasGPIO1 = true;
925 state->m_hasIRQN = false;
928 /* typeId = DRX3918K_TYPE_ID */
929 state->m_hasLNA = false;
930 state->m_hasOOB = false;
931 state->m_hasATV = true;
932 state->m_hasAudio = true;
933 state->m_hasDVBT = true;
934 state->m_hasDVBC = false;
935 state->m_hasSAWSW = true;
936 state->m_hasGPIO2 = true;
937 state->m_hasGPIO1 = true;
938 state->m_hasIRQN = false;
941 /* typeId = DRX3921K_TYPE_ID */
942 state->m_hasLNA = false;
943 state->m_hasOOB = false;
944 state->m_hasATV = true;
945 state->m_hasAudio = true;
946 state->m_hasDVBT = true;
947 state->m_hasDVBC = true;
948 state->m_hasSAWSW = true;
949 state->m_hasGPIO2 = true;
950 state->m_hasGPIO1 = true;
951 state->m_hasIRQN = false;
954 /* typeId = DRX3923K_TYPE_ID */
955 state->m_hasLNA = false;
956 state->m_hasOOB = false;
957 state->m_hasATV = true;
958 state->m_hasAudio = true;
959 state->m_hasDVBT = true;
960 state->m_hasDVBC = true;
961 state->m_hasSAWSW = true;
962 state->m_hasGPIO2 = true;
963 state->m_hasGPIO1 = true;
964 state->m_hasIRQN = false;
967 /* typeId = DRX3925K_TYPE_ID */
968 state->m_hasLNA = false;
969 state->m_hasOOB = false;
970 state->m_hasATV = true;
971 state->m_hasAudio = true;
972 state->m_hasDVBT = true;
973 state->m_hasDVBC = true;
974 state->m_hasSAWSW = true;
975 state->m_hasGPIO2 = true;
976 state->m_hasGPIO1 = true;
977 state->m_hasIRQN = false;
980 /* typeId = DRX3926K_TYPE_ID */
981 state->m_hasLNA = false;
982 state->m_hasOOB = false;
983 state->m_hasATV = true;
984 state->m_hasAudio = false;
985 state->m_hasDVBT = true;
986 state->m_hasDVBC = true;
987 state->m_hasSAWSW = true;
988 state->m_hasGPIO2 = true;
989 state->m_hasGPIO1 = true;
990 state->m_hasIRQN = false;
993 printk(KERN_ERR "drxk: DeviceID not supported = %02x\n",
994 ((sioTopJtagidLo >> 12) & 0xFF));
1002 static int HI_Command(struct drxk_state *state, u16 cmd, u16 *pResult)
1008 status = Write16_0(state, SIO_HI_RA_RAM_CMD__A, cmd);
1011 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1015 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1016 ((state->m_HICfgCtrl) &
1017 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1018 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1019 if (powerdown_cmd == false) {
1020 /* Wait until command rdy */
1027 status = Read16(state, SIO_HI_RA_RAM_CMD__A,
1029 } while ((status < 0) && (retryCount < DRXK_MAX_RETRIES)
1033 status = Read16(state, SIO_HI_RA_RAM_RES__A,
1039 static int HI_CfgCommand(struct drxk_state *state)
1043 mutex_lock(&state->mutex);
1045 status = Write16_0(state, SIO_HI_RA_RAM_PAR_6__A, state->m_HICfgTimeout);
1048 status = Write16_0(state, SIO_HI_RA_RAM_PAR_5__A, state->m_HICfgCtrl);
1051 status = Write16_0(state, SIO_HI_RA_RAM_PAR_4__A, state->m_HICfgWakeUpKey);
1054 status = Write16_0(state, SIO_HI_RA_RAM_PAR_3__A, state->m_HICfgBridgeDelay);
1057 status = Write16_0(state, SIO_HI_RA_RAM_PAR_2__A, state->m_HICfgTimingDiv);
1060 status = Write16_0(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1063 status = HI_Command(state, SIO_HI_RA_RAM_CMD_CONFIG, 0);
1067 state->m_HICfgCtrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1069 mutex_unlock(&state->mutex);
1073 static int InitHI(struct drxk_state *state)
1075 state->m_HICfgWakeUpKey = (state->demod_address << 1);
1076 state->m_HICfgTimeout = 0x96FF;
1077 /* port/bridge/power down ctrl */
1078 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1079 return HI_CfgCommand(state);
1082 static int MPEGTSConfigurePins(struct drxk_state *state, bool mpegEnable)
1085 u16 sioPdrMclkCfg = 0;
1086 u16 sioPdrMdxCfg = 0;
1089 /* stop lock indicator process */
1090 status = Write16_0(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1094 /* MPEG TS pad configuration */
1095 status = Write16_0(state, SIO_TOP_COMM_KEY__A, 0xFABA);
1099 if (mpegEnable == false) {
1100 /* Set MPEG TS pads to inputmode */
1101 status = Write16_0(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1104 status = Write16_0(state, SIO_PDR_MERR_CFG__A, 0x0000);
1107 status = Write16_0(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1110 status = Write16_0(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1113 status = Write16_0(state, SIO_PDR_MD0_CFG__A, 0x0000);
1116 status = Write16_0(state, SIO_PDR_MD1_CFG__A, 0x0000);
1119 status = Write16_0(state, SIO_PDR_MD2_CFG__A, 0x0000);
1122 status = Write16_0(state, SIO_PDR_MD3_CFG__A, 0x0000);
1125 status = Write16_0(state, SIO_PDR_MD4_CFG__A, 0x0000);
1128 status = Write16_0(state, SIO_PDR_MD5_CFG__A, 0x0000);
1131 status = Write16_0(state, SIO_PDR_MD6_CFG__A, 0x0000);
1134 status = Write16_0(state, SIO_PDR_MD7_CFG__A, 0x0000);
1138 /* Enable MPEG output */
1140 ((state->m_TSDataStrength <<
1141 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1142 sioPdrMclkCfg = ((state->m_TSClockkStrength <<
1143 SIO_PDR_MCLK_CFG_DRIVE__B) |
1146 status = Write16_0(state, SIO_PDR_MSTRT_CFG__A, sioPdrMdxCfg);
1149 status = Write16_0(state, SIO_PDR_MERR_CFG__A, 0x0000); /* Disable */
1152 status = Write16_0(state, SIO_PDR_MVAL_CFG__A, 0x0000); /* Disable */
1155 if (state->m_enableParallel == true) {
1156 /* paralel -> enable MD1 to MD7 */
1157 status = Write16_0(state, SIO_PDR_MD1_CFG__A, sioPdrMdxCfg);
1160 status = Write16_0(state, SIO_PDR_MD2_CFG__A, sioPdrMdxCfg);
1163 status = Write16_0(state, SIO_PDR_MD3_CFG__A, sioPdrMdxCfg);
1166 status = Write16_0(state, SIO_PDR_MD4_CFG__A, sioPdrMdxCfg);
1169 status = Write16_0(state, SIO_PDR_MD5_CFG__A, sioPdrMdxCfg);
1172 status = Write16_0(state, SIO_PDR_MD6_CFG__A, sioPdrMdxCfg);
1175 status = Write16_0(state, SIO_PDR_MD7_CFG__A, sioPdrMdxCfg);
1179 sioPdrMdxCfg = ((state->m_TSDataStrength <<
1180 SIO_PDR_MD0_CFG_DRIVE__B)
1182 /* serial -> disable MD1 to MD7 */
1183 status = Write16_0(state, SIO_PDR_MD1_CFG__A, 0x0000);
1186 status = Write16_0(state, SIO_PDR_MD2_CFG__A, 0x0000);
1189 status = Write16_0(state, SIO_PDR_MD3_CFG__A, 0x0000);
1192 status = Write16_0(state, SIO_PDR_MD4_CFG__A, 0x0000);
1195 status = Write16_0(state, SIO_PDR_MD5_CFG__A, 0x0000);
1198 status = Write16_0(state, SIO_PDR_MD6_CFG__A, 0x0000);
1201 status = Write16_0(state, SIO_PDR_MD7_CFG__A, 0x0000);
1205 status = Write16_0(state, SIO_PDR_MCLK_CFG__A, sioPdrMclkCfg);
1208 status = Write16_0(state, SIO_PDR_MD0_CFG__A, sioPdrMdxCfg);
1212 /* Enable MB output over MPEG pads and ctl input */
1213 status = Write16_0(state, SIO_PDR_MON_CFG__A, 0x0000);
1216 /* Write nomagic word to enable pdr reg write */
1217 status = Write16_0(state, SIO_TOP_COMM_KEY__A, 0x0000);
1224 static int MPEGTSDisable(struct drxk_state *state)
1226 return MPEGTSConfigurePins(state, false);
1229 static int BLChainCmd(struct drxk_state *state,
1230 u16 romOffset, u16 nrOfElements, u32 timeOut)
1236 mutex_lock(&state->mutex);
1238 status = Write16_0(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1241 status = Write16_0(state, SIO_BL_CHAIN_ADDR__A, romOffset);
1244 status = Write16_0(state, SIO_BL_CHAIN_LEN__A, nrOfElements);
1247 status = Write16_0(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1250 end = jiffies + msecs_to_jiffies(timeOut);
1254 status = Read16(state, SIO_BL_STATUS__A, &blStatus, 0);
1257 } while ((blStatus == 0x1) &&
1258 ((time_is_after_jiffies(end))));
1259 if (blStatus == 0x1) {
1260 printk(KERN_ERR "drxk: SIO not ready\n");
1261 mutex_unlock(&state->mutex);
1265 mutex_unlock(&state->mutex);
1270 static int DownloadMicrocode(struct drxk_state *state,
1271 const u8 pMCImage[], u32 Length)
1273 const u8 *pSrc = pMCImage;
1284 /* down the drain (we don care about MAGIC_WORD) */
1285 Drain = (pSrc[0] << 8) | pSrc[1];
1286 pSrc += sizeof(u16);
1287 offset += sizeof(u16);
1288 nBlocks = (pSrc[0] << 8) | pSrc[1];
1289 pSrc += sizeof(u16);
1290 offset += sizeof(u16);
1292 for (i = 0; i < nBlocks; i += 1) {
1293 Address = (pSrc[0] << 24) | (pSrc[1] << 16) |
1294 (pSrc[2] << 8) | pSrc[3];
1295 pSrc += sizeof(u32);
1296 offset += sizeof(u32);
1298 BlockSize = ((pSrc[0] << 8) | pSrc[1]) * sizeof(u16);
1299 pSrc += sizeof(u16);
1300 offset += sizeof(u16);
1302 Flags = (pSrc[0] << 8) | pSrc[1];
1303 pSrc += sizeof(u16);
1304 offset += sizeof(u16);
1306 BlockCRC = (pSrc[0] << 8) | pSrc[1];
1307 pSrc += sizeof(u16);
1308 offset += sizeof(u16);
1309 status = WriteBlock(state, Address, BlockSize, pSrc, 0);
1313 offset += BlockSize;
1318 static int DVBTEnableOFDMTokenRing(struct drxk_state *state, bool enable)
1322 u16 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1323 u16 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1326 if (enable == false) {
1327 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1328 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1331 status = (Read16_0(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data));
1333 if (data == desiredStatus) {
1334 /* tokenring already has correct status */
1337 /* Disable/enable dvbt tokenring bridge */
1339 Write16_0(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desiredCtrl);
1341 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1343 status = Read16_0(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1346 } while ((data != desiredStatus) && ((time_is_after_jiffies(end))));
1347 if (data != desiredStatus) {
1348 printk(KERN_ERR "drxk: SIO not ready\n");
1354 static int MPEGTSStop(struct drxk_state *state)
1357 u16 fecOcSncMode = 0;
1358 u16 fecOcIprMode = 0;
1361 /* Gracefull shutdown (byte boundaries) */
1362 status = Read16_0(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1365 fecOcSncMode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1366 status = Write16_0(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1370 /* Suppress MCLK during absence of data */
1371 status = Read16_0(state, FEC_OC_IPR_MODE__A, &fecOcIprMode);
1374 fecOcIprMode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1375 status = Write16_0(state, FEC_OC_IPR_MODE__A, fecOcIprMode);
1382 static int scu_command(struct drxk_state *state,
1383 u16 cmd, u8 parameterLen,
1384 u16 *parameter, u8 resultLen, u16 *result)
1386 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1387 #error DRXK register mapping no longer compatible with this routine!
1393 if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) ||
1394 ((resultLen > 0) && (result == NULL)))
1397 mutex_lock(&state->mutex);
1399 /* assume that the command register is ready
1400 since it is checked afterwards */
1404 for (ii = parameterLen - 1; ii >= 0; ii -= 1) {
1405 buffer[cnt++] = (parameter[ii] & 0xFF);
1406 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1408 buffer[cnt++] = (cmd & 0xFF);
1409 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1411 WriteBlock(state, SCU_RAM_PARAM_0__A -
1412 (parameterLen - 1), cnt, buffer, 0x00);
1413 /* Wait until SCU has processed command */
1414 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1417 status = Read16_0(state, SCU_RAM_COMMAND__A, &curCmd);
1420 } while (!(curCmd == DRX_SCU_READY)
1421 && (time_is_after_jiffies(end)));
1422 if (curCmd != DRX_SCU_READY) {
1423 printk(KERN_ERR "drxk: SCU not ready\n");
1424 mutex_unlock(&state->mutex);
1428 if ((resultLen > 0) && (result != NULL)) {
1432 for (ii = resultLen - 1; ii >= 0; ii -= 1) {
1433 status = Read16_0(state, SCU_RAM_PARAM_0__A - ii, &result[ii]);
1438 /* Check if an error was reported by SCU */
1439 err = (s16) result[0];
1441 /* check a few fixed error codes */
1442 if (err == SCU_RESULT_UNKSTD) {
1443 printk(KERN_ERR "drxk: SCU_RESULT_UNKSTD\n");
1444 mutex_unlock(&state->mutex);
1446 } else if (err == SCU_RESULT_UNKCMD) {
1447 printk(KERN_ERR "drxk: SCU_RESULT_UNKCMD\n");
1448 mutex_unlock(&state->mutex);
1451 /* here it is assumed that negative means error,
1452 and positive no error */
1454 printk(KERN_ERR "drxk: %s ERROR\n", __func__);
1455 mutex_unlock(&state->mutex);
1460 mutex_unlock(&state->mutex);
1462 printk(KERN_ERR "drxk: %s: status = %d\n", __func__, status);
1467 static int SetIqmAf(struct drxk_state *state, bool active)
1474 status = Read16_0(state, IQM_AF_STDBY__A, &data);
1478 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1479 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1480 | IQM_AF_STDBY_STDBY_PD_STANDBY
1481 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1482 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1483 } else { /* active */
1485 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1486 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1487 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1488 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1489 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1492 status = Write16_0(state, IQM_AF_STDBY__A, data);
1499 static int CtrlPowerMode(struct drxk_state *state, enum DRXPowerMode *mode)
1502 u16 sioCcPwdMode = 0;
1504 /* Check arguments */
1510 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_NONE;
1512 case DRXK_POWER_DOWN_OFDM:
1513 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1515 case DRXK_POWER_DOWN_CORE:
1516 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1518 case DRXK_POWER_DOWN_PLL:
1519 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_PLL;
1521 case DRX_POWER_DOWN:
1522 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OSC;
1525 /* Unknow sleep mode */
1530 /* If already in requested power mode, do nothing */
1531 if (state->m_currentPowerMode == *mode)
1534 /* For next steps make sure to start from DRX_POWER_UP mode */
1535 if (state->m_currentPowerMode != DRX_POWER_UP) {
1537 status = PowerUpDevice(state);
1540 status = DVBTEnableOFDMTokenRing(state, true);
1546 if (*mode == DRX_POWER_UP) {
1547 /* Restore analog & pin configuartion */
1549 /* Power down to requested mode */
1550 /* Backup some register settings */
1551 /* Set pins with possible pull-ups connected
1552 to them in input mode */
1553 /* Analog power down */
1554 /* ADC power down */
1555 /* Power down device */
1556 /* stop all comm_exec */
1557 /* Stop and power down previous standard */
1559 switch (state->m_OperationMode) {
1561 status = MPEGTSStop(state);
1564 status = PowerDownDVBT(state, false);
1570 status = MPEGTSStop(state);
1573 status = PowerDownQAM(state);
1580 status = DVBTEnableOFDMTokenRing(state, false);
1583 status = Write16_0(state, SIO_CC_PWD_MODE__A, sioCcPwdMode);
1586 status = Write16_0(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1590 if (*mode != DRXK_POWER_DOWN_OFDM) {
1591 state->m_HICfgCtrl |=
1592 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1593 status = HI_CfgCommand(state);
1599 state->m_currentPowerMode = *mode;
1603 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode)
1605 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
1611 status = Read16_0(state, SCU_COMM_EXEC__A, &data);
1614 if (data == SCU_COMM_EXEC_ACTIVE) {
1615 /* Send OFDM stop command */
1616 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
1619 /* Send OFDM reset command */
1620 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
1625 /* Reset datapath for OFDM, processors first */
1626 status = Write16_0(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1629 status = Write16_0(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1632 status = Write16_0(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1637 status = SetIqmAf(state, false);
1641 /* powerdown to OFDM mode */
1643 status = CtrlPowerMode(state, &powerMode);
1651 static int SetOperationMode(struct drxk_state *state,
1652 enum OperationMode oMode)
1657 Stop and power down previous standard
1658 TODO investigate total power down instead of partial
1659 power down depending on "previous" standard.
1662 /* disable HW lock indicator */
1663 status = Write16_0(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1667 if (state->m_OperationMode != oMode) {
1668 switch (state->m_OperationMode) {
1669 /* OM_NONE was added for start up */
1673 status = MPEGTSStop(state);
1676 status = PowerDownDVBT(state, true);
1679 state->m_OperationMode = OM_NONE;
1684 case OM_QAM_ITU_A: /* fallthrough */
1686 status = MPEGTSStop(state);
1689 status = PowerDownQAM(state);
1692 state->m_OperationMode = OM_NONE;
1702 Power up new standard
1706 state->m_OperationMode = oMode;
1707 status = SetDVBTStandard(state, oMode);
1714 case OM_QAM_ITU_A: /* fallthrough */
1716 state->m_OperationMode = oMode;
1717 status = SetQAMStandard(state, oMode);
1732 static int Start(struct drxk_state *state, s32 offsetFreq,
1733 s32 IntermediateFrequency)
1739 s32 OffsetkHz = offsetFreq / 1000;
1741 if (state->m_DrxkState != DRXK_STOPPED &&
1742 state->m_DrxkState != DRXK_DTV_STARTED) {
1746 state->m_bMirrorFreqSpect =
1747 (state->param.inversion == INVERSION_ON);
1749 if (IntermediateFrequency < 0) {
1750 state->m_bMirrorFreqSpect =
1751 !state->m_bMirrorFreqSpect;
1752 IntermediateFrequency = -IntermediateFrequency;
1755 switch (state->m_OperationMode) {
1758 IFreqkHz = (IntermediateFrequency / 1000);
1759 status = SetQAM(state, IFreqkHz, OffsetkHz);
1762 state->m_DrxkState = DRXK_DTV_STARTED;
1765 IFreqkHz = (IntermediateFrequency / 1000);
1766 status = MPEGTSStop(state);
1769 status = SetDVBT(state, IFreqkHz, OffsetkHz);
1772 status = DVBTStart(state);
1775 state->m_DrxkState = DRXK_DTV_STARTED;
1784 static int ShutDown(struct drxk_state *state)
1790 static int GetLockStatus(struct drxk_state *state, u32 *pLockStatus,
1795 if (pLockStatus == NULL)
1798 *pLockStatus = NOT_LOCKED;
1800 /* define the SCU command code */
1801 switch (state->m_OperationMode) {
1805 status = GetQAMLockStatus(state, pLockStatus);
1808 status = GetDVBTLockStatus(state, pLockStatus);
1816 static int MPEGTSStart(struct drxk_state *state)
1820 u16 fecOcSncMode = 0;
1823 /* Allow OC to sync again */
1824 status = Read16_0(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1827 fecOcSncMode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1828 status = Write16_0(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1831 status = Write16_0(state, FEC_OC_SNC_UNLOCK__A, 1);
1838 static int MPEGTSDtoInit(struct drxk_state *state)
1843 /* Rate integration settings */
1844 status = Write16_0(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1847 status = Write16_0(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1850 status = Write16_0(state, FEC_OC_RCN_GAIN__A, 0x000A);
1853 status = Write16_0(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1856 status = Write16_0(state, FEC_OC_AVR_PARM_B__A, 0x0006);
1859 status = Write16_0(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
1862 status = Write16_0(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
1865 status = Write16_0(state, FEC_OC_TMD_COUNT__A, 0x03F4);
1869 /* Additional configuration */
1870 status = Write16_0(state, FEC_OC_OCR_INVERT__A, 0);
1873 status = Write16_0(state, FEC_OC_SNC_LWM__A, 2);
1876 status = Write16_0(state, FEC_OC_SNC_HWM__A, 12);
1883 static int MPEGTSDtoSetup(struct drxk_state *state,
1884 enum OperationMode oMode)
1888 u16 fecOcRegMode = 0; /* FEC_OC_MODE register value */
1889 u16 fecOcRegIprMode = 0; /* FEC_OC_IPR_MODE register value */
1890 u16 fecOcDtoMode = 0; /* FEC_OC_IPR_INVERT register value */
1891 u16 fecOcFctMode = 0; /* FEC_OC_IPR_INVERT register value */
1892 u16 fecOcDtoPeriod = 2; /* FEC_OC_IPR_INVERT register value */
1893 u16 fecOcDtoBurstLen = 188; /* FEC_OC_IPR_INVERT register value */
1894 u32 fecOcRcnCtlRate = 0; /* FEC_OC_IPR_INVERT register value */
1895 u16 fecOcTmdMode = 0;
1896 u16 fecOcTmdIntUpdRate = 0;
1898 bool staticCLK = false;
1901 /* Check insertion of the Reed-Solomon parity bytes */
1902 status = Read16_0(state, FEC_OC_MODE__A, &fecOcRegMode);
1905 status = Read16_0(state, FEC_OC_IPR_MODE__A, &fecOcRegIprMode);
1908 fecOcRegMode &= (~FEC_OC_MODE_PARITY__M);
1909 fecOcRegIprMode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
1910 if (state->m_insertRSByte == true) {
1911 /* enable parity symbol forward */
1912 fecOcRegMode |= FEC_OC_MODE_PARITY__M;
1913 /* MVAL disable during parity bytes */
1914 fecOcRegIprMode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
1915 /* TS burst length to 204 */
1916 fecOcDtoBurstLen = 204;
1919 /* Check serial or parrallel output */
1920 fecOcRegIprMode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
1921 if (state->m_enableParallel == false) {
1922 /* MPEG data output is serial -> set ipr_mode[0] */
1923 fecOcRegIprMode |= FEC_OC_IPR_MODE_SERIAL__M;
1928 maxBitRate = state->m_DVBTBitrate;
1930 fecOcRcnCtlRate = 0xC00000;
1931 staticCLK = state->m_DVBTStaticCLK;
1933 case OM_QAM_ITU_A: /* fallthrough */
1935 fecOcTmdMode = 0x0004;
1936 fecOcRcnCtlRate = 0xD2B4EE; /* good for >63 Mb/s */
1937 maxBitRate = state->m_DVBCBitrate;
1938 staticCLK = state->m_DVBCStaticCLK;
1942 } /* switch (standard) */
1947 /* Configure DTO's */
1951 /* Rational DTO for MCLK source (static MCLK rate),
1952 Dynamic DTO for optimal grouping
1953 (avoid intra-packet gaps),
1954 DTO offset enable to sync TS burst with MSTRT */
1955 fecOcDtoMode = (FEC_OC_DTO_MODE_DYNAMIC__M |
1956 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
1957 fecOcFctMode = (FEC_OC_FCT_MODE_RAT_ENA__M |
1958 FEC_OC_FCT_MODE_VIRT_ENA__M);
1960 /* Check user defined bitrate */
1961 bitRate = maxBitRate;
1962 if (bitRate > 75900000UL) { /* max is 75.9 Mb/s */
1963 bitRate = 75900000UL;
1965 /* Rational DTO period:
1966 dto_period = (Fsys / bitrate) - 2
1968 Result should be floored,
1969 to make sure >= requested bitrate
1971 fecOcDtoPeriod = (u16) (((state->m_sysClockFreq)
1973 if (fecOcDtoPeriod <= 2)
1976 fecOcDtoPeriod -= 2;
1977 fecOcTmdIntUpdRate = 8;
1979 /* (commonAttr->staticCLK == false) => dynamic mode */
1980 fecOcDtoMode = FEC_OC_DTO_MODE_DYNAMIC__M;
1981 fecOcFctMode = FEC_OC_FCT_MODE__PRE;
1982 fecOcTmdIntUpdRate = 5;
1985 /* Write appropriate registers with requested configuration */
1986 status = Write16_0(state, FEC_OC_DTO_BURST_LEN__A, fecOcDtoBurstLen);
1989 status = Write16_0(state, FEC_OC_DTO_PERIOD__A, fecOcDtoPeriod);
1992 status = Write16_0(state, FEC_OC_DTO_MODE__A, fecOcDtoMode);
1995 status = Write16_0(state, FEC_OC_FCT_MODE__A, fecOcFctMode);
1998 status = Write16_0(state, FEC_OC_MODE__A, fecOcRegMode);
2001 status = Write16_0(state, FEC_OC_IPR_MODE__A, fecOcRegIprMode);
2005 /* Rate integration settings */
2006 status = Write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fecOcRcnCtlRate, 0);
2009 status = Write16_0(state, FEC_OC_TMD_INT_UPD_RATE__A, fecOcTmdIntUpdRate);
2012 status = Write16_0(state, FEC_OC_TMD_MODE__A, fecOcTmdMode);
2019 static int MPEGTSConfigurePolarity(struct drxk_state *state)
2022 u16 fecOcRegIprInvert = 0;
2024 /* Data mask for the output data byte */
2025 u16 InvertDataMask =
2026 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2027 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2028 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2029 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2031 /* Control selective inversion of output bits */
2032 fecOcRegIprInvert &= (~(InvertDataMask));
2033 if (state->m_invertDATA == true)
2034 fecOcRegIprInvert |= InvertDataMask;
2035 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2036 if (state->m_invertERR == true)
2037 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MERR__M;
2038 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2039 if (state->m_invertSTR == true)
2040 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MSTRT__M;
2041 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2042 if (state->m_invertVAL == true)
2043 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MVAL__M;
2044 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2045 if (state->m_invertCLK == true)
2046 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MCLK__M;
2047 status = Write16_0(state, FEC_OC_IPR_INVERT__A, fecOcRegIprInvert);
2051 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2053 static int SetAgcRf(struct drxk_state *state,
2054 struct SCfgAgc *pAgcCfg, bool isDTV)
2057 struct SCfgAgc *pIfAgcSettings;
2059 if (pAgcCfg == NULL)
2065 switch (pAgcCfg->ctrlMode) {
2066 case DRXK_AGC_CTRL_AUTO:
2068 /* Enable RF AGC DAC */
2069 status = Read16_0(state, IQM_AF_STDBY__A, &data);
2072 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2073 status = Write16_0(state, IQM_AF_STDBY__A, data);
2077 status = Read16(state, SCU_RAM_AGC_CONFIG__A, &data, 0);
2081 /* Enable SCU RF AGC loop */
2082 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2085 if (state->m_RfAgcPol)
2086 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2088 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2089 status = Write16_0(state, SCU_RAM_AGC_CONFIG__A, data);
2093 /* Set speed (using complementary reduction value) */
2094 status = Read16(state, SCU_RAM_AGC_KI_RED__A, &data, 0);
2098 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2099 data |= (~(pAgcCfg->speed <<
2100 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2101 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2103 status = Write16_0(state, SCU_RAM_AGC_KI_RED__A, data);
2108 pIfAgcSettings = &state->m_dvbtIfAgcCfg;
2109 else if (IsQAM(state))
2110 pIfAgcSettings = &state->m_qamIfAgcCfg;
2112 pIfAgcSettings = &state->m_atvIfAgcCfg;
2113 if (pIfAgcSettings == NULL)
2116 /* Set TOP, only if IF-AGC is in AUTO mode */
2117 if (pIfAgcSettings->ctrlMode == DRXK_AGC_CTRL_AUTO)
2118 status = Write16_0(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->top);
2122 /* Cut-Off current */
2123 status = Write16_0(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, pAgcCfg->cutOffCurrent);
2127 /* Max. output level */
2128 status = Write16_0(state, SCU_RAM_AGC_RF_MAX__A, pAgcCfg->maxOutputLevel);
2134 case DRXK_AGC_CTRL_USER:
2135 /* Enable RF AGC DAC */
2136 status = Read16_0(state, IQM_AF_STDBY__A, &data);
2139 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2140 status = Write16_0(state, IQM_AF_STDBY__A, data);
2144 /* Disable SCU RF AGC loop */
2145 status = Read16_0(state, SCU_RAM_AGC_CONFIG__A, &data);
2148 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2149 if (state->m_RfAgcPol)
2150 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2152 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2153 status = Write16_0(state, SCU_RAM_AGC_CONFIG__A, data);
2157 /* SCU c.o.c. to 0, enabling full control range */
2158 status = Write16_0(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2162 /* Write value to output pin */
2163 status = Write16_0(state, SCU_RAM_AGC_RF_IACCU_HI__A, pAgcCfg->outputLevel);
2168 case DRXK_AGC_CTRL_OFF:
2169 /* Disable RF AGC DAC */
2170 status = Read16_0(state, IQM_AF_STDBY__A, &data);
2173 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2174 status = Write16_0(state, IQM_AF_STDBY__A, data);
2178 /* Disable SCU RF AGC loop */
2179 status = Read16_0(state, SCU_RAM_AGC_CONFIG__A, &data);
2182 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2183 status = Write16_0(state, SCU_RAM_AGC_CONFIG__A, data);
2191 } /* switch (agcsettings->ctrlMode) */
2196 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2198 static int SetAgcIf(struct drxk_state *state,
2199 struct SCfgAgc *pAgcCfg, bool isDTV)
2203 struct SCfgAgc *pRfAgcSettings;
2206 switch (pAgcCfg->ctrlMode) {
2207 case DRXK_AGC_CTRL_AUTO:
2209 /* Enable IF AGC DAC */
2210 status = Read16_0(state, IQM_AF_STDBY__A, &data);
2213 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2214 status = Write16_0(state, IQM_AF_STDBY__A, data);
2218 status = Read16_0(state, SCU_RAM_AGC_CONFIG__A, &data);
2222 /* Enable SCU IF AGC loop */
2223 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2226 if (state->m_IfAgcPol)
2227 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2229 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2230 status = Write16_0(state, SCU_RAM_AGC_CONFIG__A, data);
2234 /* Set speed (using complementary reduction value) */
2235 status = Read16_0(state, SCU_RAM_AGC_KI_RED__A, &data);
2238 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2239 data |= (~(pAgcCfg->speed <<
2240 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2241 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2243 status = Write16_0(state, SCU_RAM_AGC_KI_RED__A, data);
2248 pRfAgcSettings = &state->m_qamRfAgcCfg;
2250 pRfAgcSettings = &state->m_atvRfAgcCfg;
2251 if (pRfAgcSettings == NULL)
2254 status = Write16_0(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pRfAgcSettings->top);
2259 case DRXK_AGC_CTRL_USER:
2261 /* Enable IF AGC DAC */
2262 status = Read16_0(state, IQM_AF_STDBY__A, &data);
2265 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2266 status = Write16_0(state, IQM_AF_STDBY__A, data);
2270 status = Read16_0(state, SCU_RAM_AGC_CONFIG__A, &data);
2274 /* Disable SCU IF AGC loop */
2275 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2278 if (state->m_IfAgcPol)
2279 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2281 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2282 status = Write16_0(state, SCU_RAM_AGC_CONFIG__A, data);
2286 /* Write value to output pin */
2287 status = Write16_0(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->outputLevel);
2292 case DRXK_AGC_CTRL_OFF:
2294 /* Disable If AGC DAC */
2295 status = Read16_0(state, IQM_AF_STDBY__A, &data);
2298 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2299 status = Write16_0(state, IQM_AF_STDBY__A, data);
2303 /* Disable SCU IF AGC loop */
2304 status = Read16_0(state, SCU_RAM_AGC_CONFIG__A, &data);
2307 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2308 status = Write16_0(state, SCU_RAM_AGC_CONFIG__A, data);
2312 } /* switch (agcSettingsIf->ctrlMode) */
2314 /* always set the top to support
2315 configurations without if-loop */
2316 status = Write16_0(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, pAgcCfg->top);
2325 static int ReadIFAgc(struct drxk_state *state, u32 *pValue)
2328 int status = Read16_0(state, IQM_AF_AGC_IF__A, &agcDacLvl);
2334 if (agcDacLvl > DRXK_AGC_DAC_OFFSET)
2335 Level = agcDacLvl - DRXK_AGC_DAC_OFFSET;
2337 *pValue = (14000 - Level) / 4;
2344 static int GetQAMSignalToNoise(struct drxk_state *state,
2345 s32 *pSignalToNoise)
2350 /* MER calculation */
2351 u16 qamSlErrPower = 0; /* accum. error between
2352 raw and sliced symbols */
2353 u32 qamSlSigPower = 0; /* used for MER, depends of
2354 QAM constellation */
2355 u32 qamSlMer = 0; /* QAM MER */
2357 /* get the register value needed for MER */
2358 status = Read16_0(state, QAM_SL_ERR_POWER__A, &qamSlErrPower);
2362 switch (state->param.u.qam.modulation) {
2364 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2367 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2370 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2373 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2377 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2381 if (qamSlErrPower > 0) {
2382 qamSlMer = Log10Times100(qamSlSigPower) -
2383 Log10Times100((u32) qamSlErrPower);
2385 *pSignalToNoise = qamSlMer;
2390 static int GetDVBTSignalToNoise(struct drxk_state *state,
2391 s32 *pSignalToNoise)
2396 u32 EqRegTdSqrErrI = 0;
2397 u32 EqRegTdSqrErrQ = 0;
2398 u16 EqRegTdSqrErrExp = 0;
2399 u16 EqRegTdTpsPwrOfs = 0;
2400 u16 EqRegTdReqSmbCnt = 0;
2407 u16 transmissionParams = 0;
2410 status = Read16_0(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A, &EqRegTdTpsPwrOfs);
2413 status = Read16_0(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A, &EqRegTdReqSmbCnt);
2416 status = Read16_0(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A, &EqRegTdSqrErrExp);
2419 status = Read16_0(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A, ®Data);
2422 /* Extend SQR_ERR_I operational range */
2423 EqRegTdSqrErrI = (u32) regData;
2424 if ((EqRegTdSqrErrExp > 11) &&
2425 (EqRegTdSqrErrI < 0x00000FFFUL)) {
2426 EqRegTdSqrErrI += 0x00010000UL;
2428 status = Read16_0(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®Data);
2431 /* Extend SQR_ERR_Q operational range */
2432 EqRegTdSqrErrQ = (u32) regData;
2433 if ((EqRegTdSqrErrExp > 11) &&
2434 (EqRegTdSqrErrQ < 0x00000FFFUL))
2435 EqRegTdSqrErrQ += 0x00010000UL;
2437 status = Read16_0(state, OFDM_SC_RA_RAM_OP_PARAM__A, &transmissionParams);
2441 /* Check input data for MER */
2443 /* MER calculation (in 0.1 dB) without math.h */
2444 if ((EqRegTdTpsPwrOfs == 0) || (EqRegTdReqSmbCnt == 0))
2446 else if ((EqRegTdSqrErrI + EqRegTdSqrErrQ) == 0) {
2447 /* No error at all, this must be the HW reset value
2448 * Apparently no first measurement yet
2452 SqrErrIQ = (EqRegTdSqrErrI + EqRegTdSqrErrQ) <<
2454 if ((transmissionParams &
2455 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2456 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2461 /* IMER = 100 * log10 (x)
2462 where x = (EqRegTdTpsPwrOfs^2 *
2463 EqRegTdReqSmbCnt * tpsCnt)/SqrErrIQ
2466 where a = 100 * log10 (EqRegTdTpsPwrOfs^2)
2467 b = 100 * log10 (EqRegTdReqSmbCnt * tpsCnt)
2468 c = 100 * log10 (SqrErrIQ)
2471 /* log(x) x = 9bits * 9bits->18 bits */
2472 a = Log10Times100(EqRegTdTpsPwrOfs *
2474 /* log(x) x = 16bits * 7bits->23 bits */
2475 b = Log10Times100(EqRegTdReqSmbCnt * tpsCnt);
2476 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2477 c = Log10Times100(SqrErrIQ);
2480 /* No negative MER, clip to zero */
2486 *pSignalToNoise = iMER;
2492 static int GetSignalToNoise(struct drxk_state *state, s32 *pSignalToNoise)
2494 *pSignalToNoise = 0;
2495 switch (state->m_OperationMode) {
2497 return GetDVBTSignalToNoise(state, pSignalToNoise);
2500 return GetQAMSignalToNoise(state, pSignalToNoise);
2508 static int GetDVBTQuality(struct drxk_state *state, s32 *pQuality)
2510 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2513 static s32 QE_SN[] = {
2519 108, /* 16-QAM 1/2 */
2520 131, /* 16-QAM 2/3 */
2521 146, /* 16-QAM 3/4 */
2522 156, /* 16-QAM 5/6 */
2523 160, /* 16-QAM 7/8 */
2524 165, /* 64-QAM 1/2 */
2525 187, /* 64-QAM 2/3 */
2526 202, /* 64-QAM 3/4 */
2527 216, /* 64-QAM 5/6 */
2528 225, /* 64-QAM 7/8 */
2534 s32 SignalToNoise = 0;
2535 u16 Constellation = 0;
2537 u32 SignalToNoiseRel;
2540 status = GetDVBTSignalToNoise(state, &SignalToNoise);
2543 status = Read16_0(state, OFDM_EQ_TOP_TD_TPS_CONST__A, &Constellation);
2546 Constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2548 status = Read16_0(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A, &CodeRate);
2551 CodeRate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2553 if (Constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2554 CodeRate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2556 SignalToNoiseRel = SignalToNoise -
2557 QE_SN[Constellation * 5 + CodeRate];
2560 if (SignalToNoiseRel < -70)
2562 else if (SignalToNoiseRel < 30)
2563 *pQuality = ((SignalToNoiseRel + 70) *
2566 *pQuality = BERQuality;
2571 static int GetDVBCQuality(struct drxk_state *state, s32 *pQuality)
2577 u32 SignalToNoise = 0;
2578 u32 BERQuality = 100;
2579 u32 SignalToNoiseRel = 0;
2581 status = GetQAMSignalToNoise(state, &SignalToNoise);
2585 switch (state->param.u.qam.modulation) {
2587 SignalToNoiseRel = SignalToNoise - 200;
2590 SignalToNoiseRel = SignalToNoise - 230;
2591 break; /* Not in NorDig */
2593 SignalToNoiseRel = SignalToNoise - 260;
2596 SignalToNoiseRel = SignalToNoise - 290;
2600 SignalToNoiseRel = SignalToNoise - 320;
2604 if (SignalToNoiseRel < -70)
2606 else if (SignalToNoiseRel < 30)
2607 *pQuality = ((SignalToNoiseRel + 70) *
2610 *pQuality = BERQuality;
2616 static int GetQuality(struct drxk_state *state, s32 *pQuality)
2618 switch (state->m_OperationMode) {
2620 return GetDVBTQuality(state, pQuality);
2622 return GetDVBCQuality(state, pQuality);
2631 /* Free data ram in SIO HI */
2632 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2633 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2635 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2636 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2637 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2638 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2640 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2641 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2642 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2644 static int ConfigureI2CBridge(struct drxk_state *state, bool bEnableBridge)
2648 if (state->m_DrxkState == DRXK_UNINITIALIZED)
2650 if (state->m_DrxkState == DRXK_POWERED_DOWN)
2654 status = Write16_0(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2657 if (bEnableBridge) {
2658 status = Write16_0(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2662 status = Write16_0(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2667 status = HI_Command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, 0);
2674 static int SetPreSaw(struct drxk_state *state,
2675 struct SCfgPreSaw *pPreSawCfg)
2679 if ((pPreSawCfg == NULL)
2680 || (pPreSawCfg->reference > IQM_AF_PDREF__M))
2683 status = Write16_0(state, IQM_AF_PDREF__A, pPreSawCfg->reference);
2687 static int BLDirectCmd(struct drxk_state *state, u32 targetAddr,
2688 u16 romOffset, u16 nrOfElements, u32 timeOut)
2691 u16 offset = (u16) ((targetAddr >> 0) & 0x00FFFF);
2692 u16 blockbank = (u16) ((targetAddr >> 16) & 0x000FFF);
2696 mutex_lock(&state->mutex);
2698 status = Write16_0(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2701 status = Write16_0(state, SIO_BL_TGT_HDR__A, blockbank);
2704 status = Write16_0(state, SIO_BL_TGT_ADDR__A, offset);
2707 status = Write16_0(state, SIO_BL_SRC_ADDR__A, romOffset);
2710 status = Write16_0(state, SIO_BL_SRC_LEN__A, nrOfElements);
2713 status = Write16_0(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2717 end = jiffies + msecs_to_jiffies(timeOut);
2719 status = Read16_0(state, SIO_BL_STATUS__A, &blStatus);
2722 } while ((blStatus == 0x1) && time_is_after_jiffies(end));
2723 if (blStatus == 0x1) {
2724 printk(KERN_ERR "drxk: SIO not ready\n");
2725 mutex_unlock(&state->mutex);
2729 mutex_unlock(&state->mutex);
2734 static int ADCSyncMeasurement(struct drxk_state *state, u16 *count)
2740 /* Start measurement */
2741 status = Write16_0(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2744 status = Write16_0(state, IQM_AF_START_LOCK__A, 1);
2749 status = Read16_0(state, IQM_AF_PHASE0__A, &data);
2753 *count = *count + 1;
2754 status = Read16_0(state, IQM_AF_PHASE1__A, &data);
2758 *count = *count + 1;
2759 status = Read16_0(state, IQM_AF_PHASE2__A, &data);
2763 *count = *count + 1;
2768 static int ADCSynchronization(struct drxk_state *state)
2774 status = ADCSyncMeasurement(state, &count);
2779 /* Try sampling on a diffrent edge */
2782 status = Read16_0(state, IQM_AF_CLKNEG__A, &clkNeg);
2785 if ((clkNeg | IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2786 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2787 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2789 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2791 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2793 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2795 status = Write16_0(state, IQM_AF_CLKNEG__A, clkNeg);
2798 status = ADCSyncMeasurement(state, &count);
2809 static int SetFrequencyShifter(struct drxk_state *state,
2810 u16 intermediateFreqkHz,
2811 s32 tunerFreqOffset, bool isDTV)
2813 bool selectPosImage = false;
2814 u32 rfFreqResidual = tunerFreqOffset;
2815 u32 fmFrequencyShift = 0;
2816 bool tunerMirror = !state->m_bMirrorFreqSpect;
2821 u32 samplingFrequency = (u32) (state->m_sysClockFreq / 3);
2826 Program frequency shifter
2827 No need to account for mirroring on RF
2830 if ((state->m_OperationMode == OM_QAM_ITU_A) ||
2831 (state->m_OperationMode == OM_QAM_ITU_C) ||
2832 (state->m_OperationMode == OM_DVBT))
2833 selectPosImage = true;
2835 selectPosImage = false;
2838 /* tuner doesn't mirror */
2839 ifFreqActual = intermediateFreqkHz +
2840 rfFreqResidual + fmFrequencyShift;
2843 ifFreqActual = intermediateFreqkHz -
2844 rfFreqResidual - fmFrequencyShift;
2845 if (ifFreqActual > samplingFrequency / 2) {
2847 adcFreq = samplingFrequency - ifFreqActual;
2850 /* adc doesn't mirror */
2851 adcFreq = ifFreqActual;
2855 frequencyShift = adcFreq;
2856 imageToSelect = state->m_rfmirror ^ tunerMirror ^
2857 adcFlip ^ selectPosImage;
2858 state->m_IqmFsRateOfs =
2859 Frac28a((frequencyShift), samplingFrequency);
2862 state->m_IqmFsRateOfs = ~state->m_IqmFsRateOfs + 1;
2864 /* Program frequency shifter with tuner offset compensation */
2865 /* frequencyShift += tunerFreqOffset; TODO */
2866 status = Write32(state, IQM_FS_RATE_OFS_LO__A,
2867 state->m_IqmFsRateOfs, 0);
2871 static int InitAGC(struct drxk_state *state, bool isDTV)
2874 u16 ingainTgtMin = 0;
2875 u16 ingainTgtMax = 0;
2883 u16 kiInnergainMin = 0;
2884 u16 ifIaccuHiTgt = 0;
2885 u16 ifIaccuHiTgtMin = 0;
2886 u16 ifIaccuHiTgtMax = 0;
2888 u16 fastClpCtrlDelay = 0;
2889 u16 clpCtrlMode = 0;
2893 /* Common settings */
2895 ifIaccuHiTgtMin = 2047;
2900 /* Standard specific settings */
2902 clpDirTo = (u16) -9;
2905 snsDirTo = (u16) -9;
2906 kiInnergainMin = (u16) -1030;
2913 ifIaccuHiTgtMax = 0x2380;
2914 ifIaccuHiTgt = 0x2380;
2915 ingainTgtMin = 0x0511;
2917 ingainTgtMax = 5119;
2919 state->m_qamIfAgcCfg.FastClipCtrlDelay;
2921 ifIaccuHiTgtMax = 0x1200;
2922 ifIaccuHiTgt = 0x1200;
2923 ingainTgtMin = 13424;
2925 ingainTgtMax = 30000;
2927 state->m_dvbtIfAgcCfg.FastClipCtrlDelay;
2929 status = Write16_0(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, fastClpCtrlDelay);
2933 status = Write16_0(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clpCtrlMode);
2936 status = Write16_0(state, SCU_RAM_AGC_INGAIN_TGT__A, ingainTgt);
2939 status = Write16_0(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingainTgtMin);
2942 status = Write16_0(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingainTgtMax);
2945 status = Write16_0(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, ifIaccuHiTgtMin);
2948 status = Write16_0(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, ifIaccuHiTgtMax);
2951 status = Write16_0(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
2954 status = Write16_0(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
2957 status = Write16_0(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
2960 status = Write16_0(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
2963 status = Write16_0(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clpSumMax);
2966 status = Write16_0(state, SCU_RAM_AGC_SNS_SUM_MAX__A, snsSumMax);
2970 status = Write16_0(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, kiInnergainMin);
2973 status = Write16_0(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, ifIaccuHiTgt);
2976 status = Write16_0(state, SCU_RAM_AGC_CLP_CYCLEN__A, clpCyclen);
2980 status = Write16_0(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
2983 status = Write16_0(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
2986 status = Write16_0(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
2990 status = Write16_0(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
2993 status = Write16_0(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clpSumMin);
2996 status = Write16_0(state, SCU_RAM_AGC_SNS_SUM_MIN__A, snsSumMin);
2999 status = Write16_0(state, SCU_RAM_AGC_CLP_DIR_TO__A, clpDirTo);
3002 status = Write16_0(state, SCU_RAM_AGC_SNS_DIR_TO__A, snsDirTo);
3005 status = Write16_0(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3008 status = Write16_0(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3011 status = Write16_0(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3014 status = Write16_0(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3017 status = Write16_0(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3020 status = Write16_0(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3023 status = Write16_0(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3026 status = Write16_0(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3029 status = Write16_0(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3032 status = Write16_0(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3035 status = Write16_0(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3038 status = Write16_0(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3041 status = Write16_0(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3044 status = Write16_0(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3048 /* Initialize inner-loop KI gain factors */
3049 status = Read16_0(state, SCU_RAM_AGC_KI__A, &data);
3054 data &= ~SCU_RAM_AGC_KI_RF__M;
3055 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3056 data &= ~SCU_RAM_AGC_KI_IF__M;
3057 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3059 status = Write16_0(state, SCU_RAM_AGC_KI__A, data);
3066 static int DVBTQAMGetAccPktErr(struct drxk_state *state, u16 *packetErr)
3071 if (packetErr == NULL) {
3072 status = Write16_0(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3076 status = Read16_0(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, packetErr);
3084 static int DVBTScCommand(struct drxk_state *state,
3085 u16 cmd, u16 subcmd,
3086 u16 param0, u16 param1, u16 param2,
3087 u16 param3, u16 param4)
3095 status = Read16_0(state, OFDM_SC_COMM_EXEC__A, &scExec);
3097 /* SC is not running */
3101 /* Wait until sc is ready to receive command */
3105 status = Read16_0(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3107 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3108 if (retryCnt >= DRXK_MAX_RETRIES)
3110 /* Write sub-command */
3112 /* All commands using sub-cmd */
3113 case OFDM_SC_RA_RAM_CMD_PROC_START:
3114 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3115 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3117 Write16_0(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3122 } /* switch (cmd->cmd) */
3124 /* Write needed parameters and the command */
3126 /* All commands using 5 parameters */
3127 /* All commands using 4 parameters */
3128 /* All commands using 3 parameters */
3129 /* All commands using 2 parameters */
3130 case OFDM_SC_RA_RAM_CMD_PROC_START:
3131 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3132 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3134 Write16_0(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3135 /* All commands using 1 parameters */
3136 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3137 case OFDM_SC_RA_RAM_CMD_USER_IO:
3139 Write16_0(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3140 /* All commands using 0 parameters */
3141 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3142 case OFDM_SC_RA_RAM_CMD_NULL:
3144 status = Write16_0(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3147 /* Unknown command */
3149 } /* switch (cmd->cmd) */
3151 /* Wait until sc is ready processing command */
3155 status = Read16_0(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3157 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3158 if (retryCnt >= DRXK_MAX_RETRIES)
3161 /* Check for illegal cmd */
3162 status = Read16_0(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &errCode);
3163 if (errCode == 0xFFFF) {
3164 /* illegal command */
3168 /* Retreive results parameters from SC */
3170 /* All commands yielding 5 results */
3171 /* All commands yielding 4 results */
3172 /* All commands yielding 3 results */
3173 /* All commands yielding 2 results */
3174 /* All commands yielding 1 result */
3175 case OFDM_SC_RA_RAM_CMD_USER_IO:
3176 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3178 Read16_0(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3179 /* All commands yielding 0 results */
3180 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3181 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3182 case OFDM_SC_RA_RAM_CMD_PROC_START:
3183 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3184 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3185 case OFDM_SC_RA_RAM_CMD_NULL:
3188 /* Unknown command */
3191 } /* switch (cmd->cmd) */
3195 static int PowerUpDVBT(struct drxk_state *state)
3197 enum DRXPowerMode powerMode = DRX_POWER_UP;
3201 status = CtrlPowerMode(state, &powerMode);
3208 static int DVBTCtrlSetIncEnable(struct drxk_state *state, bool *enabled)
3212 if (*enabled == true)
3213 status = Write16_0(state, IQM_CF_BYPASSDET__A, 0);
3215 status = Write16_0(state, IQM_CF_BYPASSDET__A, 1);
3220 #define DEFAULT_FR_THRES_8K 4000
3221 static int DVBTCtrlSetFrEnable(struct drxk_state *state, bool *enabled)
3226 if (*enabled == true) {
3227 /* write mask to 1 */
3228 status = Write16_0(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3229 DEFAULT_FR_THRES_8K);
3231 /* write mask to 0 */
3232 status = Write16_0(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3238 static int DVBTCtrlSetEchoThreshold(struct drxk_state *state,
3239 struct DRXKCfgDvbtEchoThres_t *echoThres)
3245 status = Read16_0(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3249 switch (echoThres->fftMode) {
3250 case DRX_FFTMODE_2K:
3251 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3253 ((echoThres->threshold <<
3254 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3255 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3257 case DRX_FFTMODE_8K:
3258 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3260 ((echoThres->threshold <<
3261 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3262 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3269 status = Write16_0(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3277 static int DVBTCtrlSetSqiSpeed(struct drxk_state *state,
3278 enum DRXKCfgDvbtSqiSpeed *speed)
3283 case DRXK_DVBT_SQI_SPEED_FAST:
3284 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3285 case DRXK_DVBT_SQI_SPEED_SLOW:
3290 status = Write16_0(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3295 /*============================================================================*/
3298 * \brief Activate DVBT specific presets
3299 * \param demod instance of demodulator.
3300 * \return DRXStatus_t.
3302 * Called in DVBTSetStandard
3305 static int DVBTActivatePresets(struct drxk_state *state)
3309 struct DRXKCfgDvbtEchoThres_t echoThres2k = { 0, DRX_FFTMODE_2K };
3310 struct DRXKCfgDvbtEchoThres_t echoThres8k = { 0, DRX_FFTMODE_8K };
3313 bool setincenable = false;
3314 bool setfrenable = true;
3315 status = DVBTCtrlSetIncEnable(state, &setincenable);
3318 status = DVBTCtrlSetFrEnable(state, &setfrenable);
3321 status = DVBTCtrlSetEchoThreshold(state, &echoThres2k);
3324 status = DVBTCtrlSetEchoThreshold(state, &echoThres8k);
3327 status = Write16_0(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, state->m_dvbtIfAgcCfg.IngainTgtMax);
3335 /*============================================================================*/
3338 * \brief Initialize channelswitch-independent settings for DVBT.
3339 * \param demod instance of demodulator.
3340 * \return DRXStatus_t.
3342 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3343 * the DVB-T taps from the drxk_filters.h are used.
3345 static int SetDVBTStandard(struct drxk_state *state,
3346 enum OperationMode oMode)
3355 /* added antenna switch */
3356 SwitchAntennaToDVBT(state);
3357 /* send OFDM reset command */
3358 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
3362 /* send OFDM setenv command */
3363 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 0, NULL, 1, &cmdResult);
3367 /* reset datapath for OFDM, processors first */
3368 status = Write16_0(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3371 status = Write16_0(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3374 status = Write16_0(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3379 /* synchronize on ofdstate->m_festart */
3380 status = Write16_0(state, IQM_AF_UPD_SEL__A, 1);
3383 /* window size for clipping ADC detection */
3384 status = Write16_0(state, IQM_AF_CLP_LEN__A, 0);
3387 /* window size for for sense pre-SAW detection */
3388 status = Write16_0(state, IQM_AF_SNS_LEN__A, 0);
3391 /* sense threshold for sense pre-SAW detection */
3392 status = Write16_0(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3395 status = SetIqmAf(state, true);
3399 status = Write16_0(state, IQM_AF_AGC_RF__A, 0);
3403 /* Impulse noise cruncher setup */
3404 status = Write16_0(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3407 status = Write16_0(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3410 status = Write16_0(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3414 status = Write16_0(state, IQM_RC_STRETCH__A, 16);
3417 status = Write16_0(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3420 status = Write16_0(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3423 status = Write16_0(state, IQM_CF_SCALE__A, 1600);
3426 status = Write16_0(state, IQM_CF_SCALE_SH__A, 0);
3430 /* virtual clipping threshold for clipping ADC detection */
3431 status = Write16_0(state, IQM_AF_CLP_TH__A, 448);
3434 status = Write16_0(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3438 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3442 status = Write16_0(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3445 status = Write16_0(state, IQM_CF_POW_MEAS_LEN__A, 2);
3448 /* enable power measurement interrupt */
3449 status = Write16_0(state, IQM_CF_COMM_INT_MSK__A, 1);
3452 status = Write16_0(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3456 /* IQM will not be reset from here, sync ADC and update/init AGC */
3457 status = ADCSynchronization(state);
3460 status = SetPreSaw(state, &state->m_dvbtPreSawCfg);
3464 /* Halt SCU to enable safe non-atomic accesses */
3465 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3469 status = SetAgcRf(state, &state->m_dvbtRfAgcCfg, true);
3472 status = SetAgcIf(state, &state->m_dvbtIfAgcCfg, true);
3476 /* Set Noise Estimation notch width and enable DC fix */
3477 status = Read16_0(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3480 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3481 status = Write16_0(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3485 /* Activate SCU to enable SCU commands */
3486 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3490 if (!state->m_DRXK_A3_ROM_CODE) {
3491 /* AGCInit() is not done for DVBT, so set agcFastClipCtrlDelay */
3492 status = Write16_0(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, state->m_dvbtIfAgcCfg.FastClipCtrlDelay);
3498 #ifdef COMPILE_FOR_NONRT
3499 status = Write16_0(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3502 status = Write16_0(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3508 status = Write16_0(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3513 #ifdef COMPILE_FOR_NONRT
3514 status = Write16_0(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3518 status = Write16_0(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3522 status = Write16_0(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3526 /* Setup MPEG bus */
3527 status = MPEGTSDtoSetup(state, OM_DVBT);
3530 /* Set DVBT Presets */
3531 status = DVBTActivatePresets(state);
3538 printk(KERN_ERR "drxk: %s status - %08x\n", __func__, status);
3543 /*============================================================================*/
3545 * \brief Start dvbt demodulating for channel.
3546 * \param demod instance of demodulator.
3547 * \return DRXStatus_t.
3549 static int DVBTStart(struct drxk_state *state)
3553 /* DRXKOfdmScCmd_t scCmd; */
3555 /* Start correct processes to get in lock */
3556 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3558 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3559 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0, OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1, 0, 0, 0);
3563 status = MPEGTSStart(state);
3566 status = Write16_0(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3574 /*============================================================================*/
3577 * \brief Set up dvbt demodulator for channel.
3578 * \param demod instance of demodulator.
3579 * \return DRXStatus_t.
3580 * // original DVBTSetChannel()
3582 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
3583 s32 tunerFreqOffset)
3586 u16 transmissionParams = 0;
3587 u16 operationMode = 0;
3588 u32 iqmRcRateOfs = 0;
3593 /* printk(KERN_DEBUG "drxk: %s IF =%d, TFO = %d\n", __func__, IntermediateFreqkHz, tunerFreqOffset); */
3595 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
3599 /* Halt SCU to enable safe non-atomic accesses */
3600 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3604 /* Stop processors */
3605 status = Write16_0(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3608 status = Write16_0(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3612 /* Mandatory fix, always stop CP, required to set spl offset back to
3613 hardware default (is set to 0 by ucode during pilot detection */
3614 status = Write16_0(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3618 /*== Write channel settings to device =====================================*/
3621 switch (state->param.u.ofdm.transmission_mode) {
3622 case TRANSMISSION_MODE_AUTO:
3624 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3625 /* fall through , try first guess DRX_FFTMODE_8K */
3626 case TRANSMISSION_MODE_8K:
3627 transmissionParams |=
3628 OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3630 case TRANSMISSION_MODE_2K:
3631 transmissionParams |=
3632 OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3637 switch (state->param.u.ofdm.guard_interval) {
3639 case GUARD_INTERVAL_AUTO:
3640 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3641 /* fall through , try first guess DRX_GUARD_1DIV4 */
3642 case GUARD_INTERVAL_1_4:
3643 transmissionParams |=
3644 OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3646 case GUARD_INTERVAL_1_32:
3647 transmissionParams |=
3648 OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3650 case GUARD_INTERVAL_1_16:
3651 transmissionParams |=
3652 OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3654 case GUARD_INTERVAL_1_8:
3655 transmissionParams |=
3656 OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3661 switch (state->param.u.ofdm.hierarchy_information) {
3662 case HIERARCHY_AUTO:
3663 case HIERARCHY_NONE:
3665 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3666 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3667 /* transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3670 transmissionParams |=
3671 OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3674 transmissionParams |=
3675 OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3678 transmissionParams |=
3679 OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3685 switch (state->param.u.ofdm.constellation) {
3688 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3689 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3691 transmissionParams |=
3692 OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3695 transmissionParams |=
3696 OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3699 transmissionParams |=
3700 OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3704 /* No hierachical channels support in BDA */
3705 /* Priority (only for hierarchical channels) */
3706 switch (channel->priority) {
3707 case DRX_PRIORITY_LOW:
3708 transmissionParams |=
3709 OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3710 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3711 OFDM_EC_SB_PRIOR_LO);
3713 case DRX_PRIORITY_HIGH:
3714 transmissionParams |=
3715 OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3716 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3717 OFDM_EC_SB_PRIOR_HI));
3719 case DRX_PRIORITY_UNKNOWN: /* fall through */
3721 return DRX_STS_INVALID_ARG;
3725 /* Set Priorty high */
3726 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3727 status = Write16_0(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3733 switch (state->param.u.ofdm.code_rate_HP) {
3736 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3737 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3739 transmissionParams |=
3740 OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3743 transmissionParams |=
3744 OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3747 transmissionParams |=
3748 OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3751 transmissionParams |=
3752 OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3755 transmissionParams |=
3756 OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3760 /* SAW filter selection: normaly not necesarry, but if wanted
3761 the application can select a SAW filter via the driver by using UIOs */
3762 /* First determine real bandwidth (Hz) */
3763 /* Also set delay for impulse noise cruncher */
3764 /* Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is changed
3765 by SC for fix for some 8K,1/8 guard but is restored by InitEC and ResetEC
3767 switch (state->param.u.ofdm.bandwidth) {
3768 case BANDWIDTH_AUTO:
3769 case BANDWIDTH_8_MHZ:
3770 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3771 status = Write16_0(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3052);
3774 /* cochannel protection for PAL 8 MHz */
3775 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 7);
3778 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 7);
3781 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 7);
3784 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3788 case BANDWIDTH_7_MHZ:
3789 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3790 status = Write16_0(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3491);
3793 /* cochannel protection for PAL 7 MHz */
3794 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 8);
3797 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 8);
3800 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 4);
3803 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3807 case BANDWIDTH_6_MHZ:
3808 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3809 status = Write16_0(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 4073);
3812 /* cochannel protection for NTSC 6 MHz */
3813 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 19);
3816 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 19);
3819 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 14);
3822 status = Write16_0(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3830 if (iqmRcRateOfs == 0) {
3831 /* Now compute IQM_RC_RATE_OFS
3832 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
3834 ((SysFreq / BandWidth) * (2^21)) - (2^23)
3836 /* (SysFreq / BandWidth) * (2^28) */
3837 /* assert (MAX(sysClk)/MIN(bandwidth) < 16)
3838 => assert(MAX(sysClk) < 16*MIN(bandwidth))
3839 => assert(109714272 > 48000000) = true so Frac 28 can be used */
3840 iqmRcRateOfs = Frac28a((u32)
3841 ((state->m_sysClockFreq *
3842 1000) / 3), bandwidth);
3843 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
3844 if ((iqmRcRateOfs & 0x7fL) >= 0x40)
3845 iqmRcRateOfs += 0x80L;
3846 iqmRcRateOfs = iqmRcRateOfs >> 7;
3847 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
3848 iqmRcRateOfs = iqmRcRateOfs - (1 << 23);
3852 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
3853 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
3854 status = Write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRateOfs, 0);
3858 /* Bandwidth setting done */
3861 status = DVBTSetFrequencyShift(demod, channel, tunerOffset);
3865 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
3869 /*== Start SC, write channel settings to SC ===============================*/
3871 /* Activate SCU to enable SCU commands */
3872 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3876 /* Enable SC after setting all other parameters */
3877 status = Write16_0(state, OFDM_SC_COMM_STATE__A, 0);
3880 status = Write16_0(state, OFDM_SC_COMM_EXEC__A, 1);
3885 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
3889 /* Write SC parameter registers, set all AUTO flags in operation mode */
3890 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
3891 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
3892 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
3893 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
3894 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
3896 DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
3897 0, transmissionParams, param1, 0, 0, 0);
3898 if (!state->m_DRXK_A3_ROM_CODE)
3899 status = DVBTCtrlSetSqiSpeed(state, &state->m_sqiSpeed);
3909 /*============================================================================*/
3912 * \brief Retreive lock status .
3913 * \param demod Pointer to demodulator instance.
3914 * \param lockStat Pointer to lock status structure.
3915 * \return DRXStatus_t.
3918 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus)
3921 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
3922 OFDM_SC_RA_RAM_LOCK_FEC__M);
3923 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
3924 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
3926 u16 ScRaRamLock = 0;
3930 /* Check if SC is running */
3931 status = Read16_0(state, OFDM_SC_COMM_EXEC__A, &ScCommExec);
3932 if (ScCommExec == OFDM_SC_COMM_EXEC_STOP) {
3933 /* SC not active; return DRX_NOT_LOCKED */
3934 *pLockStatus = NOT_LOCKED;
3938 status = Read16_0(state, OFDM_SC_RA_RAM_LOCK__A, &ScRaRamLock);
3940 if ((ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask)
3941 *pLockStatus = MPEG_LOCK;
3942 else if ((ScRaRamLock & fec_lock_mask) == fec_lock_mask)
3943 *pLockStatus = FEC_LOCK;
3944 else if ((ScRaRamLock & demod_lock_mask) == demod_lock_mask)
3945 *pLockStatus = DEMOD_LOCK;
3946 else if (ScRaRamLock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
3947 *pLockStatus = NEVER_LOCK;
3949 *pLockStatus = NOT_LOCKED;
3954 static int PowerUpQAM(struct drxk_state *state)
3956 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
3960 status = CtrlPowerMode(state, &powerMode);
3970 /** Power Down QAM */
3971 static int PowerDownQAM(struct drxk_state *state)
3978 status = Read16_0(state, SCU_COMM_EXEC__A, &data);
3981 if (data == SCU_COMM_EXEC_ACTIVE) {
3986 /* stop all comstate->m_exec */
3987 status = Write16_0(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
3990 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
3995 status = SetIqmAf(state, false);
4003 /*============================================================================*/
4006 * \brief Setup of the QAM Measurement intervals for signal quality
4007 * \param demod instance of demod.
4008 * \param constellation current constellation.
4009 * \return DRXStatus_t.
4012 * Take into account that for certain settings the errorcounters can overflow.
4013 * The implementation does not check this.
4016 static int SetQAMMeasurement(struct drxk_state *state,
4017 enum EDrxkConstellation constellation,
4020 u32 fecBitsDesired = 0; /* BER accounting period */
4021 u32 fecRsPeriodTotal = 0; /* Total period */
4022 u16 fecRsPrescale = 0; /* ReedSolomon Measurement Prescale */
4023 u16 fecRsPeriod = 0; /* Value for corresponding I2C register */
4030 /* fecBitsDesired = symbolRate [kHz] *
4032 (constellation + 1) *
4036 switch (constellation) {
4037 case DRX_CONSTELLATION_QAM16:
4038 fecBitsDesired = 4 * symbolRate;
4040 case DRX_CONSTELLATION_QAM32:
4041 fecBitsDesired = 5 * symbolRate;
4043 case DRX_CONSTELLATION_QAM64:
4044 fecBitsDesired = 6 * symbolRate;
4046 case DRX_CONSTELLATION_QAM128:
4047 fecBitsDesired = 7 * symbolRate;
4049 case DRX_CONSTELLATION_QAM256:
4050 fecBitsDesired = 8 * symbolRate;
4059 fecBitsDesired /= 1000; /* symbolRate [Hz] -> symbolRate [kHz] */
4060 fecBitsDesired *= 500; /* meas. period [ms] */
4062 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4063 /* fecRsPeriodTotal = fecBitsDesired / 1632 */
4064 fecRsPeriodTotal = (fecBitsDesired / 1632UL) + 1; /* roughly ceil */
4066 /* fecRsPeriodTotal = fecRsPrescale * fecRsPeriod */
4067 fecRsPrescale = 1 + (u16) (fecRsPeriodTotal >> 16);
4068 if (fecRsPrescale == 0) {
4069 /* Divide by zero (though impossible) */
4076 ((u16) fecRsPeriodTotal +
4077 (fecRsPrescale >> 1)) / fecRsPrescale;
4079 /* write corresponding registers */
4080 status = Write16_0(state, FEC_RS_MEASUREMENT_PERIOD__A, fecRsPeriod);
4083 status = Write16_0(state, FEC_RS_MEASUREMENT_PRESCALE__A, fecRsPrescale);
4086 status = Write16_0(state, FEC_OC_SNC_FAIL_PERIOD__A, fecRsPeriod);
4093 printk(KERN_ERR "drxk: %s: status - %08x\n", __func__, status);
4098 static int SetQAM16(struct drxk_state *state)
4103 /* QAM Equalizer Setup */
4105 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4108 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4111 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4114 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4117 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4120 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4123 /* Decision Feedback Equalizer */
4124 status = Write16_0(state, QAM_DQ_QUAL_FUN0__A, 2);
4127 status = Write16_0(state, QAM_DQ_QUAL_FUN1__A, 2);
4130 status = Write16_0(state, QAM_DQ_QUAL_FUN2__A, 2);
4133 status = Write16_0(state, QAM_DQ_QUAL_FUN3__A, 2);
4136 status = Write16_0(state, QAM_DQ_QUAL_FUN4__A, 2);
4139 status = Write16_0(state, QAM_DQ_QUAL_FUN5__A, 0);
4143 status = Write16_0(state, QAM_SY_SYNC_HWM__A, 5);
4146 status = Write16_0(state, QAM_SY_SYNC_AWM__A, 4);
4149 status = Write16_0(state, QAM_SY_SYNC_LWM__A, 3);
4153 /* QAM Slicer Settings */
4154 status = Write16_0(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM16);
4158 /* QAM Loop Controller Coeficients */
4159 status = Write16_0(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4162 status = Write16_0(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4165 status = Write16_0(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4168 status = Write16_0(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4171 status = Write16_0(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4174 status = Write16_0(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4177 status = Write16_0(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4180 status = Write16_0(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4184 status = Write16_0(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4187 status = Write16_0(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4190 status = Write16_0(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4193 status = Write16_0(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4196 status = Write16_0(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4199 status = Write16_0(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4202 status = Write16_0(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4205 status = Write16_0(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4208 status = Write16_0(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4211 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4214 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4217 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4222 /* QAM State Machine (FSM) Thresholds */
4224 status = Write16_0(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4227 status = Write16_0(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4230 status = Write16_0(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4233 status = Write16_0(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4236 status = Write16_0(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4239 status = Write16_0(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4243 status = Write16_0(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4246 status = Write16_0(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4249 status = Write16_0(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4254 /* QAM FSM Tracking Parameters */
4256 status = Write16_0(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4259 status = Write16_0(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4262 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4265 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4268 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4271 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4274 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4282 /*============================================================================*/
4285 * \brief QAM32 specific setup
4286 * \param demod instance of demod.
4287 * \return DRXStatus_t.
4289 static int SetQAM32(struct drxk_state *state)
4294 /* QAM Equalizer Setup */
4296 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4299 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4302 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4305 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4308 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4311 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4315 /* Decision Feedback Equalizer */
4316 status = Write16_0(state, QAM_DQ_QUAL_FUN0__A, 3);
4319 status = Write16_0(state, QAM_DQ_QUAL_FUN1__A, 3);
4322 status = Write16_0(state, QAM_DQ_QUAL_FUN2__A, 3);
4325 status = Write16_0(state, QAM_DQ_QUAL_FUN3__A, 3);
4328 status = Write16_0(state, QAM_DQ_QUAL_FUN4__A, 3);
4331 status = Write16_0(state, QAM_DQ_QUAL_FUN5__A, 0);
4335 status = Write16_0(state, QAM_SY_SYNC_HWM__A, 6);
4338 status = Write16_0(state, QAM_SY_SYNC_AWM__A, 5);
4341 status = Write16_0(state, QAM_SY_SYNC_LWM__A, 3);
4345 /* QAM Slicer Settings */
4347 status = Write16_0(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM32);
4352 /* QAM Loop Controller Coeficients */
4354 status = Write16_0(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4357 status = Write16_0(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4360 status = Write16_0(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4363 status = Write16_0(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4366 status = Write16_0(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4369 status = Write16_0(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4372 status = Write16_0(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4375 status = Write16_0(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4379 status = Write16_0(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4382 status = Write16_0(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4385 status = Write16_0(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4388 status = Write16_0(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4391 status = Write16_0(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4394 status = Write16_0(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4397 status = Write16_0(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4400 status = Write16_0(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4403 status = Write16_0(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4406 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4409 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4412 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4417 /* QAM State Machine (FSM) Thresholds */
4419 status = Write16_0(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4422 status = Write16_0(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4425 status = Write16_0(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4428 status = Write16_0(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4431 status = Write16_0(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4434 status = Write16_0(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4438 status = Write16_0(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4441 status = Write16_0(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4444 status = Write16_0(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4449 /* QAM FSM Tracking Parameters */
4451 status = Write16_0(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4454 status = Write16_0(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4457 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4460 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4463 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4466 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4469 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4477 /*============================================================================*/
4480 * \brief QAM64 specific setup
4481 * \param demod instance of demod.
4482 * \return DRXStatus_t.
4484 static int SetQAM64(struct drxk_state *state)
4489 /* QAM Equalizer Setup */
4491 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4494 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4497 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4500 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4503 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4506 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4510 /* Decision Feedback Equalizer */
4511 status = Write16_0(state, QAM_DQ_QUAL_FUN0__A, 4);
4514 status = Write16_0(state, QAM_DQ_QUAL_FUN1__A, 4);
4517 status = Write16_0(state, QAM_DQ_QUAL_FUN2__A, 4);
4520 status = Write16_0(state, QAM_DQ_QUAL_FUN3__A, 4);
4523 status = Write16_0(state, QAM_DQ_QUAL_FUN4__A, 3);
4526 status = Write16_0(state, QAM_DQ_QUAL_FUN5__A, 0);
4530 status = Write16_0(state, QAM_SY_SYNC_HWM__A, 5);
4533 status = Write16_0(state, QAM_SY_SYNC_AWM__A, 4);
4536 status = Write16_0(state, QAM_SY_SYNC_LWM__A, 3);
4540 /* QAM Slicer Settings */
4541 status = Write16_0(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM64);
4546 /* QAM Loop Controller Coeficients */
4548 status = Write16_0(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4551 status = Write16_0(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4554 status = Write16_0(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4557 status = Write16_0(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4560 status = Write16_0(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4563 status = Write16_0(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4566 status = Write16_0(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4569 status = Write16_0(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4573 status = Write16_0(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4576 status = Write16_0(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4579 status = Write16_0(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4582 status = Write16_0(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4585 status = Write16_0(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4588 status = Write16_0(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4591 status = Write16_0(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4594 status = Write16_0(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4597 status = Write16_0(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4600 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4603 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4606 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4611 /* QAM State Machine (FSM) Thresholds */
4613 status = Write16_0(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4616 status = Write16_0(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4619 status = Write16_0(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4622 status = Write16_0(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4625 status = Write16_0(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4628 status = Write16_0(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4632 status = Write16_0(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4635 status = Write16_0(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4638 status = Write16_0(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4643 /* QAM FSM Tracking Parameters */
4645 status = Write16_0(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4648 status = Write16_0(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4651 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4654 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4657 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4660 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4663 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4671 /*============================================================================*/
4674 * \brief QAM128 specific setup
4675 * \param demod: instance of demod.
4676 * \return DRXStatus_t.
4678 static int SetQAM128(struct drxk_state *state)
4683 /* QAM Equalizer Setup */
4685 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4688 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4691 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4694 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4697 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4700 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4704 /* Decision Feedback Equalizer */
4705 status = Write16_0(state, QAM_DQ_QUAL_FUN0__A, 6);
4708 status = Write16_0(state, QAM_DQ_QUAL_FUN1__A, 6);
4711 status = Write16_0(state, QAM_DQ_QUAL_FUN2__A, 6);
4714 status = Write16_0(state, QAM_DQ_QUAL_FUN3__A, 6);
4717 status = Write16_0(state, QAM_DQ_QUAL_FUN4__A, 5);
4720 status = Write16_0(state, QAM_DQ_QUAL_FUN5__A, 0);
4724 status = Write16_0(state, QAM_SY_SYNC_HWM__A, 6);
4727 status = Write16_0(state, QAM_SY_SYNC_AWM__A, 5);
4730 status = Write16_0(state, QAM_SY_SYNC_LWM__A, 3);
4735 /* QAM Slicer Settings */
4737 status = Write16_0(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM128);
4742 /* QAM Loop Controller Coeficients */
4744 status = Write16_0(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4747 status = Write16_0(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4750 status = Write16_0(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4753 status = Write16_0(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4756 status = Write16_0(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4759 status = Write16_0(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4762 status = Write16_0(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4765 status = Write16_0(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4769 status = Write16_0(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4772 status = Write16_0(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4775 status = Write16_0(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4778 status = Write16_0(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4781 status = Write16_0(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4784 status = Write16_0(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4787 status = Write16_0(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4790 status = Write16_0(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4793 status = Write16_0(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4796 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4799 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4802 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4807 /* QAM State Machine (FSM) Thresholds */
4809 status = Write16_0(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4812 status = Write16_0(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4815 status = Write16_0(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4818 status = Write16_0(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4821 status = Write16_0(state, SCU_RAM_QAM_FSM_QTH__A, 140);
4824 status = Write16_0(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4828 status = Write16_0(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4831 status = Write16_0(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
4835 status = Write16_0(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
4839 /* QAM FSM Tracking Parameters */
4841 status = Write16_0(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
4844 status = Write16_0(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
4847 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
4850 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
4853 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
4856 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
4859 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
4867 /*============================================================================*/
4870 * \brief QAM256 specific setup
4871 * \param demod: instance of demod.
4872 * \return DRXStatus_t.
4874 static int SetQAM256(struct drxk_state *state)
4879 /* QAM Equalizer Setup */
4881 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
4884 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
4887 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
4890 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
4893 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
4896 status = Write16_0(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
4900 /* Decision Feedback Equalizer */
4901 status = Write16_0(state, QAM_DQ_QUAL_FUN0__A, 8);
4904 status = Write16_0(state, QAM_DQ_QUAL_FUN1__A, 8);
4907 status = Write16_0(state, QAM_DQ_QUAL_FUN2__A, 8);
4910 status = Write16_0(state, QAM_DQ_QUAL_FUN3__A, 8);
4913 status = Write16_0(state, QAM_DQ_QUAL_FUN4__A, 6);
4916 status = Write16_0(state, QAM_DQ_QUAL_FUN5__A, 0);
4920 status = Write16_0(state, QAM_SY_SYNC_HWM__A, 5);
4923 status = Write16_0(state, QAM_SY_SYNC_AWM__A, 4);
4926 status = Write16_0(state, QAM_SY_SYNC_LWM__A, 3);
4930 /* QAM Slicer Settings */
4932 status = Write16_0(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM256);
4937 /* QAM Loop Controller Coeficients */
4939 status = Write16_0(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4942 status = Write16_0(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4945 status = Write16_0(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4948 status = Write16_0(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4951 status = Write16_0(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4954 status = Write16_0(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4957 status = Write16_0(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4960 status = Write16_0(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4964 status = Write16_0(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4967 status = Write16_0(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
4970 status = Write16_0(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
4973 status = Write16_0(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4976 status = Write16_0(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
4979 status = Write16_0(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
4982 status = Write16_0(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4985 status = Write16_0(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4988 status = Write16_0(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4991 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4994 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4997 status = Write16_0(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5002 /* QAM State Machine (FSM) Thresholds */
5004 status = Write16_0(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5007 status = Write16_0(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5010 status = Write16_0(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5013 status = Write16_0(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5016 status = Write16_0(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5019 status = Write16_0(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5023 status = Write16_0(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5026 status = Write16_0(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5029 status = Write16_0(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5034 /* QAM FSM Tracking Parameters */
5036 status = Write16_0(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5039 status = Write16_0(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5042 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5045 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5048 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5051 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5054 status = Write16_0(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5063 /*============================================================================*/
5065 * \brief Reset QAM block.
5066 * \param demod: instance of demod.
5067 * \param channel: pointer to channel data.
5068 * \return DRXStatus_t.
5070 static int QAMResetQAM(struct drxk_state *state)
5076 /* Stop QAM comstate->m_exec */
5077 status = Write16_0(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5081 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
5086 /* All done, all OK */
5090 /*============================================================================*/
5093 * \brief Set QAM symbolrate.
5094 * \param demod: instance of demod.
5095 * \param channel: pointer to channel data.
5096 * \return DRXStatus_t.
5098 static int QAMSetSymbolrate(struct drxk_state *state)
5100 u32 adcFrequency = 0;
5108 /* Select & calculate correct IQM rate */
5109 adcFrequency = (state->m_sysClockFreq * 1000) / 3;
5111 /* printk(KERN_DEBUG "drxk: SR %d\n", state->param.u.qam.symbol_rate); */
5112 if (state->param.u.qam.symbol_rate <= 1188750)
5114 else if (state->param.u.qam.symbol_rate <= 2377500)
5116 else if (state->param.u.qam.symbol_rate <= 4755000)
5118 status = Write16_0(state, IQM_FD_RATESEL__A, ratesel);
5123 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5125 symbFreq = state->param.u.qam.symbol_rate * (1 << ratesel);
5126 if (symbFreq == 0) {
5127 /* Divide by zero */
5130 iqmRcRate = (adcFrequency / symbFreq) * (1 << 21) +
5131 (Frac28a((adcFrequency % symbFreq), symbFreq) >> 7) -
5133 status = Write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRate, 0);
5136 state->m_iqmRcRate = iqmRcRate;
5138 LcSymbFreq = round (.125 * symbolrate / adcFreq * (1<<15))
5140 symbFreq = state->param.u.qam.symbol_rate;
5141 if (adcFrequency == 0) {
5142 /* Divide by zero */
5145 lcSymbRate = (symbFreq / adcFrequency) * (1 << 12) +
5146 (Frac28a((symbFreq % adcFrequency), adcFrequency) >>
5148 if (lcSymbRate > 511)
5150 status = Write16_0(state, QAM_LC_SYMBOL_FREQ__A, (u16) lcSymbRate);
5158 /*============================================================================*/
5161 * \brief Get QAM lock status.
5162 * \param demod: instance of demod.
5163 * \param channel: pointer to channel data.
5164 * \return DRXStatus_t.
5167 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus)
5170 u16 Result[2] = { 0, 0 };
5174 SCU_RAM_COMMAND_STANDARD_QAM |
5175 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5178 printk(KERN_ERR "drxk: %s status = %08x\n", __func__, status);
5180 if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5181 /* 0x0000 NOT LOCKED */
5182 *pLockStatus = NOT_LOCKED;
5183 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5184 /* 0x4000 DEMOD LOCKED */
5185 *pLockStatus = DEMOD_LOCK;
5186 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5187 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5188 *pLockStatus = MPEG_LOCK;
5190 /* 0xC000 NEVER LOCKED */
5191 /* (system will never be able to lock to the signal) */
5192 /* TODO: check this, intermediate & standard specific lock states are not
5193 taken into account here */
5194 *pLockStatus = NEVER_LOCK;
5199 #define QAM_MIRROR__M 0x03
5200 #define QAM_MIRROR_NORMAL 0x00
5201 #define QAM_MIRRORED 0x01
5202 #define QAM_MIRROR_AUTO_ON 0x02
5203 #define QAM_LOCKRANGE__M 0x10
5204 #define QAM_LOCKRANGE_NORMAL 0x10
5206 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
5207 s32 tunerFreqOffset)
5211 u16 setEnvParameters[5];
5212 u16 setParamParameters[4] = { 0, 0, 0, 0 };
5217 STEP 1: reset demodulator
5218 resets FEC DI and FEC RS
5220 resets SCU variables
5222 status = Write16_0(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5225 status = Write16_0(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5228 status = QAMResetQAM(state);
5233 STEP 2: configure demodulator
5235 -set params; resets IQM,QAM,FEC HW; initializes some SCU variables
5237 status = QAMSetSymbolrate(state);
5241 /* Env parameters */
5242 setEnvParameters[2] = QAM_TOP_ANNEX_A; /* Annex */
5243 if (state->m_OperationMode == OM_QAM_ITU_C)
5244 setEnvParameters[2] = QAM_TOP_ANNEX_C; /* Annex */
5245 setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
5246 /* check for LOCKRANGE Extented */
5247 /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
5251 switch (state->param.u.qam.modulation) {
5253 state->m_Constellation = DRX_CONSTELLATION_QAM256;
5257 state->m_Constellation = DRX_CONSTELLATION_QAM64;
5260 state->m_Constellation = DRX_CONSTELLATION_QAM16;
5263 state->m_Constellation = DRX_CONSTELLATION_QAM32;
5266 state->m_Constellation = DRX_CONSTELLATION_QAM128;
5275 setParamParameters[0] = state->m_Constellation; /* constellation */
5276 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5278 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 4, setParamParameters, 1, &cmdResult);
5283 /* STEP 3: enable the system in a mode where the ADC provides valid signal
5284 setup constellation independent registers */
5286 status = SetFrequency (channel, tunerFreqOffset));
5290 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
5294 /* Setup BER measurement */
5295 status = SetQAMMeasurement(state, state->m_Constellation, state->param.u. qam.symbol_rate);
5299 /* Reset default values */
5300 status = Write16_0(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5303 status = Write16_0(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5307 /* Reset default LC values */
5308 status = Write16_0(state, QAM_LC_RATE_LIMIT__A, 3);
5311 status = Write16_0(state, QAM_LC_LPF_FACTORP__A, 4);
5314 status = Write16_0(state, QAM_LC_LPF_FACTORI__A, 4);
5317 status = Write16_0(state, QAM_LC_MODE__A, 7);
5321 status = Write16_0(state, QAM_LC_QUAL_TAB0__A, 1);
5324 status = Write16_0(state, QAM_LC_QUAL_TAB1__A, 1);
5327 status = Write16_0(state, QAM_LC_QUAL_TAB2__A, 1);
5330 status = Write16_0(state, QAM_LC_QUAL_TAB3__A, 1);
5333 status = Write16_0(state, QAM_LC_QUAL_TAB4__A, 2);
5336 status = Write16_0(state, QAM_LC_QUAL_TAB5__A, 2);
5339 status = Write16_0(state, QAM_LC_QUAL_TAB6__A, 2);
5342 status = Write16_0(state, QAM_LC_QUAL_TAB8__A, 2);
5345 status = Write16_0(state, QAM_LC_QUAL_TAB9__A, 2);
5348 status = Write16_0(state, QAM_LC_QUAL_TAB10__A, 2);
5351 status = Write16_0(state, QAM_LC_QUAL_TAB12__A, 2);
5354 status = Write16_0(state, QAM_LC_QUAL_TAB15__A, 3);
5357 status = Write16_0(state, QAM_LC_QUAL_TAB16__A, 3);
5360 status = Write16_0(state, QAM_LC_QUAL_TAB20__A, 4);
5363 status = Write16_0(state, QAM_LC_QUAL_TAB25__A, 4);
5367 /* Mirroring, QAM-block starting point not inverted */
5368 status = Write16_0(state, QAM_SY_SP_INV__A, QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5372 /* Halt SCU to enable safe non-atomic accesses */
5373 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5377 /* STEP 4: constellation specific setup */
5378 switch (state->param.u.qam.modulation) {
5380 status = SetQAM16(state);
5385 status = SetQAM32(state);
5391 status = SetQAM64(state);
5396 status = SetQAM128(state);
5401 status = SetQAM256(state);
5409 /* Activate SCU to enable SCU commands */
5410 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5415 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5416 /* extAttr->currentChannel.constellation = channel->constellation; */
5417 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5418 status = MPEGTSDtoSetup(state, state->m_OperationMode);
5422 /* Start processes */
5423 status = MPEGTSStart(state);
5426 status = Write16_0(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5429 status = Write16_0(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5432 status = Write16_0(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5436 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5437 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
5441 /* update global DRXK data container */
5442 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5444 /* All done, all OK */
5448 printk(KERN_ERR "drxk: %s %d\n", __func__, status);
5453 static int SetQAMStandard(struct drxk_state *state,
5454 enum OperationMode oMode)
5456 #ifdef DRXK_QAM_TAPS
5457 #define DRXK_QAMA_TAPS_SELECT
5458 #include "drxk_filters.h"
5459 #undef DRXK_QAMA_TAPS_SELECT
5465 /* added antenna switch */
5466 SwitchAntennaToQAM(state);
5468 /* Ensure correct power-up mode */
5469 status = PowerUpQAM(state);
5472 /* Reset QAM block */
5473 status = QAMResetQAM(state);
5479 status = Write16_0(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5482 status = Write16_0(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5486 /* Upload IQM Channel Filter settings by
5487 boot loader from ROM table */
5490 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5495 status = BLDirectCmd(state, IQM_CF_TAP_RE0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5498 status = BLDirectCmd(state, IQM_CF_TAP_IM0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5509 status = Write16_0(state, IQM_CF_OUT_ENA__A, (1 << IQM_CF_OUT_ENA_QAM__B));
5512 status = Write16_0(state, IQM_CF_SYMMETRIC__A, 0);
5515 status = Write16_0(state, IQM_CF_MIDTAP__A, ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5519 status = Write16_0(state, IQM_RC_STRETCH__A, 21);
5522 status = Write16_0(state, IQM_AF_CLP_LEN__A, 0);
5525 status = Write16_0(state, IQM_AF_CLP_TH__A, 448);
5528 status = Write16_0(state, IQM_AF_SNS_LEN__A, 0);
5531 status = Write16_0(state, IQM_CF_POW_MEAS_LEN__A, 0);
5535 status = Write16_0(state, IQM_FS_ADJ_SEL__A, 1);
5538 status = Write16_0(state, IQM_RC_ADJ_SEL__A, 1);
5541 status = Write16_0(state, IQM_CF_ADJ_SEL__A, 1);
5544 status = Write16_0(state, IQM_AF_UPD_SEL__A, 0);
5548 /* IQM Impulse Noise Processing Unit */
5549 status = Write16_0(state, IQM_CF_CLP_VAL__A, 500);
5552 status = Write16_0(state, IQM_CF_DATATH__A, 1000);
5555 status = Write16_0(state, IQM_CF_BYPASSDET__A, 1);
5558 status = Write16_0(state, IQM_CF_DET_LCT__A, 0);
5561 status = Write16_0(state, IQM_CF_WND_LEN__A, 1);
5564 status = Write16_0(state, IQM_CF_PKDTH__A, 1);
5567 status = Write16_0(state, IQM_AF_INC_BYPASS__A, 1);
5571 /* turn on IQMAF. Must be done before setAgc**() */
5572 status = SetIqmAf(state, true);
5575 status = Write16_0(state, IQM_AF_START_LOCK__A, 0x01);
5579 /* IQM will not be reset from here, sync ADC and update/init AGC */
5580 status = ADCSynchronization(state);
5584 /* Set the FSM step period */
5585 status = Write16_0(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5589 /* Halt SCU to enable safe non-atomic accesses */
5590 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5594 /* No more resets of the IQM, current standard correctly set =>
5595 now AGCs can be configured. */
5597 status = InitAGC(state, true);
5600 status = SetPreSaw(state, &(state->m_qamPreSawCfg));
5604 /* Configure AGC's */
5605 status = SetAgcRf(state, &(state->m_qamRfAgcCfg), true);
5608 status = SetAgcIf(state, &(state->m_qamIfAgcCfg), true);
5612 /* Activate SCU to enable SCU commands */
5613 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5620 static int WriteGPIO(struct drxk_state *state)
5626 /* stop lock indicator process */
5627 status = Write16_0(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5631 /* Write magic word to enable pdr reg write */
5632 status = Write16_0(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5636 if (state->m_hasSAWSW) {
5637 /* write to io pad configuration register - output mode */
5638 status = Write16_0(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5642 /* use corresponding bit in io data output registar */
5643 status = Read16_0(state, SIO_PDR_UIO_OUT_LO__A, &value);
5646 if (state->m_GPIO == 0)
5647 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5649 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5650 /* write back to io data output register */
5651 status = Write16_0(state, SIO_PDR_UIO_OUT_LO__A, value);
5656 /* Write magic word to disable pdr reg write */
5657 status = Write16_0(state, SIO_TOP_COMM_KEY__A, 0x0000);
5664 static int SwitchAntennaToQAM(struct drxk_state *state)
5668 if (state->m_AntennaSwitchDVBTDVBC != 0) {
5669 if (state->m_GPIO != state->m_AntennaDVBC) {
5670 state->m_GPIO = state->m_AntennaDVBC;
5671 status = WriteGPIO(state);
5677 static int SwitchAntennaToDVBT(struct drxk_state *state)
5681 if (state->m_AntennaSwitchDVBTDVBC != 0) {
5682 if (state->m_GPIO != state->m_AntennaDVBT) {
5683 state->m_GPIO = state->m_AntennaDVBT;
5684 status = WriteGPIO(state);
5691 static int PowerDownDevice(struct drxk_state *state)
5693 /* Power down to requested mode */
5694 /* Backup some register settings */
5695 /* Set pins with possible pull-ups connected to them in input mode */
5696 /* Analog power down */
5697 /* ADC power down */
5698 /* Power down device */
5701 if (state->m_bPDownOpenBridge) {
5702 /* Open I2C bridge before power down of DRXK */
5703 status = ConfigureI2CBridge(state, true);
5708 status = DVBTEnableOFDMTokenRing(state, false);
5712 status = Write16_0(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_CLOCK);
5715 status = Write16_0(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5718 state->m_HICfgCtrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
5719 status = HI_CfgCommand(state);
5730 static int load_microcode(struct drxk_state *state, char *mc_name)
5732 const struct firmware *fw = NULL;
5735 err = request_firmware(&fw, mc_name, state->i2c->dev.parent);
5738 "drxk: Could not load firmware file %s.\n", mc_name);
5740 "drxk: Copy %s to your hotplug directory!\n", mc_name);
5743 err = DownloadMicrocode(state, fw->data, fw->size);
5744 release_firmware(fw);
5748 static int init_drxk(struct drxk_state *state)
5751 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
5754 if ((state->m_DrxkState == DRXK_UNINITIALIZED)) {
5756 status = PowerUpDevice(state);
5759 status = DRXX_Open(state);
5762 /* Soft reset of OFDM-, sys- and osc-clockdomain */
5763 status = Write16_0(state, SIO_CC_SOFT_RST__A, SIO_CC_SOFT_RST_OFDM__M | SIO_CC_SOFT_RST_SYS__M | SIO_CC_SOFT_RST_OSC__M);
5766 status = Write16_0(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5769 /* TODO is this needed, if yes how much delay in worst case scenario */
5771 state->m_DRXK_A3_PATCH_CODE = true;
5772 status = GetDeviceCapabilities(state);
5776 /* Bridge delay, uses oscilator clock */
5777 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
5778 /* SDA brdige delay */
5779 state->m_HICfgBridgeDelay =
5780 (u16) ((state->m_oscClockFreq / 1000) *
5781 HI_I2C_BRIDGE_DELAY) / 1000;
5783 if (state->m_HICfgBridgeDelay >
5784 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
5785 state->m_HICfgBridgeDelay =
5786 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
5788 /* SCL bridge delay, same as SDA for now */
5789 state->m_HICfgBridgeDelay +=
5790 state->m_HICfgBridgeDelay <<
5791 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
5793 status = InitHI(state);
5796 /* disable various processes */
5798 if (!(state->m_DRXK_A1_ROM_CODE)
5799 && !(state->m_DRXK_A2_ROM_CODE))
5802 status = Write16_0(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5807 /* disable MPEG port */
5808 status = MPEGTSDisable(state);
5812 /* Stop AUD and SCU */
5813 status = Write16_0(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
5816 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
5820 /* enable token-ring bus through OFDM block for possible ucode upload */
5821 status = Write16_0(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
5825 /* include boot loader section */
5826 status = Write16_0(state, SIO_BL_COMM_EXEC__A, SIO_BL_COMM_EXEC_ACTIVE);
5829 status = BLChainCmd(state, 0, 6, 100);
5834 if (state->m_DRXK_A3_PATCH_CODE)
5835 status = DownloadMicrocode(state, DRXK_A3_microcode, DRXK_A3_microcode_length);
5839 load_microcode(state, "drxk_a3.mc");
5842 if (state->m_DRXK_A2_PATCH_CODE)
5843 status = DownloadMicrocode(state, DRXK_A2_microcode, DRXK_A2_microcode_length);
5847 /* disable token-ring bus through OFDM block for possible ucode upload */
5848 status = Write16_0(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
5852 /* Run SCU for a little while to initialize microcode version numbers */
5853 status = Write16_0(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5856 status = DRXX_Open(state);
5859 /* added for test */
5862 powerMode = DRXK_POWER_DOWN_OFDM;
5863 status = CtrlPowerMode(state, &powerMode);
5867 /* Stamp driver version number in SCU data RAM in BCD code
5868 Done to enable field application engineers to retreive drxdriver version
5869 via I2C from SCU RAM.
5870 Not using SCU command interface for SCU register access since no
5871 microcode may be present.
5874 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
5875 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
5876 ((DRXK_VERSION_MAJOR % 10) << 4) +
5877 (DRXK_VERSION_MINOR % 10);
5878 status = Write16_0(state, SCU_RAM_DRIVER_VER_HI__A, driverVersion);
5882 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
5883 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
5884 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
5885 (DRXK_VERSION_PATCH % 10);
5886 status = Write16_0(state, SCU_RAM_DRIVER_VER_LO__A, driverVersion);
5890 printk(KERN_INFO "DRXK driver version %d.%d.%d\n",
5891 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
5892 DRXK_VERSION_PATCH);
5894 /* Dirty fix of default values for ROM/PATCH microcode
5895 Dirty because this fix makes it impossible to setup suitable values
5896 before calling DRX_Open. This solution requires changes to RF AGC speed
5897 to be done via the CTRL function after calling DRX_Open */
5899 /* m_dvbtRfAgcCfg.speed = 3; */
5901 /* Reset driver debug flags to 0 */
5902 status = Write16_0(state, SCU_RAM_DRIVER_DEBUG__A, 0);
5907 NOTE: No more full FEC resets allowed afterwards!! */
5908 status = Write16_0(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
5911 /* MPEGTS functions are still the same */
5912 status = MPEGTSDtoInit(state);
5915 status = MPEGTSStop(state);
5918 status = MPEGTSConfigurePolarity(state);
5921 status = MPEGTSConfigurePins(state, state->m_enableMPEGOutput);
5924 /* added: configure GPIO */
5925 status = WriteGPIO(state);
5929 state->m_DrxkState = DRXK_STOPPED;
5931 if (state->m_bPowerDown) {
5932 status = PowerDownDevice(state);
5935 state->m_DrxkState = DRXK_POWERED_DOWN;
5937 state->m_DrxkState = DRXK_STOPPED;
5944 static void drxk_c_release(struct dvb_frontend *fe)
5946 struct drxk_state *state = fe->demodulator_priv;
5951 static int drxk_c_init(struct dvb_frontend *fe)
5953 struct drxk_state *state = fe->demodulator_priv;
5955 if (mutex_trylock(&state->ctlock) == 0)
5957 SetOperationMode(state, OM_QAM_ITU_A);
5961 static int drxk_c_sleep(struct dvb_frontend *fe)
5963 struct drxk_state *state = fe->demodulator_priv;
5966 mutex_unlock(&state->ctlock);
5970 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
5972 struct drxk_state *state = fe->demodulator_priv;
5974 /* printk(KERN_DEBUG "drxk: drxk_gate %d\n", enable); */
5975 return ConfigureI2CBridge(state, enable ? true : false);
5978 static int drxk_set_parameters(struct dvb_frontend *fe,
5979 struct dvb_frontend_parameters *p)
5981 struct drxk_state *state = fe->demodulator_priv;
5984 if (fe->ops.i2c_gate_ctrl)
5985 fe->ops.i2c_gate_ctrl(fe, 1);
5986 if (fe->ops.tuner_ops.set_params)
5987 fe->ops.tuner_ops.set_params(fe, p);
5988 if (fe->ops.i2c_gate_ctrl)
5989 fe->ops.i2c_gate_ctrl(fe, 0);
5991 fe->ops.tuner_ops.get_frequency(fe, &IF);
5992 Start(state, 0, IF);
5994 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
5999 static int drxk_c_get_frontend(struct dvb_frontend *fe,
6000 struct dvb_frontend_parameters *p)
6005 static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6007 struct drxk_state *state = fe->demodulator_priv;
6011 GetLockStatus(state, &stat, 0);
6012 if (stat == MPEG_LOCK)
6014 if (stat == FEC_LOCK)
6016 if (stat == DEMOD_LOCK)
6021 static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber)
6027 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6030 struct drxk_state *state = fe->demodulator_priv;
6033 ReadIFAgc(state, &val);
6034 *strength = val & 0xffff;
6038 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6040 struct drxk_state *state = fe->demodulator_priv;
6043 GetSignalToNoise(state, &snr2);
6044 *snr = snr2 & 0xffff;
6048 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6050 struct drxk_state *state = fe->demodulator_priv;
6053 DVBTQAMGetAccPktErr(state, &err);
6054 *ucblocks = (u32) err;
6058 static int drxk_c_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6061 sets->min_delay_ms = 3000;
6062 sets->max_drift = 0;
6063 sets->step_size = 0;
6067 static void drxk_t_release(struct dvb_frontend *fe)
6070 struct drxk_state *state = fe->demodulator_priv;
6072 printk(KERN_DEBUG "drxk: %s\n", __func__);
6077 static int drxk_t_init(struct dvb_frontend *fe)
6079 struct drxk_state *state = fe->demodulator_priv;
6080 if (mutex_trylock(&state->ctlock) == 0)
6082 SetOperationMode(state, OM_DVBT);
6086 static int drxk_t_sleep(struct dvb_frontend *fe)
6088 struct drxk_state *state = fe->demodulator_priv;
6089 mutex_unlock(&state->ctlock);
6093 static int drxk_t_get_frontend(struct dvb_frontend *fe,
6094 struct dvb_frontend_parameters *p)
6099 static struct dvb_frontend_ops drxk_c_ops = {
6101 .name = "DRXK DVB-C",
6103 .frequency_stepsize = 62500,
6104 .frequency_min = 47000000,
6105 .frequency_max = 862000000,
6106 .symbol_rate_min = 870000,
6107 .symbol_rate_max = 11700000,
6108 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6109 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO},
6110 .release = drxk_c_release,
6111 .init = drxk_c_init,
6112 .sleep = drxk_c_sleep,
6113 .i2c_gate_ctrl = drxk_gate_ctrl,
6115 .set_frontend = drxk_set_parameters,
6116 .get_frontend = drxk_c_get_frontend,
6117 .get_tune_settings = drxk_c_get_tune_settings,
6119 .read_status = drxk_read_status,
6120 .read_ber = drxk_read_ber,
6121 .read_signal_strength = drxk_read_signal_strength,
6122 .read_snr = drxk_read_snr,
6123 .read_ucblocks = drxk_read_ucblocks,
6126 static struct dvb_frontend_ops drxk_t_ops = {
6128 .name = "DRXK DVB-T",
6130 .frequency_min = 47125000,
6131 .frequency_max = 865000000,
6132 .frequency_stepsize = 166667,
6133 .frequency_tolerance = 0,
6134 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
6135 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
6137 FE_CAN_QAM_16 | FE_CAN_QAM_64 |
6139 FE_CAN_TRANSMISSION_MODE_AUTO |
6140 FE_CAN_GUARD_INTERVAL_AUTO |
6141 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_MUTE_TS},
6142 .release = drxk_t_release,
6143 .init = drxk_t_init,
6144 .sleep = drxk_t_sleep,
6145 .i2c_gate_ctrl = drxk_gate_ctrl,
6147 .set_frontend = drxk_set_parameters,
6148 .get_frontend = drxk_t_get_frontend,
6150 .read_status = drxk_read_status,
6151 .read_ber = drxk_read_ber,
6152 .read_signal_strength = drxk_read_signal_strength,
6153 .read_snr = drxk_read_snr,
6154 .read_ucblocks = drxk_read_ucblocks,
6157 struct dvb_frontend *drxk_attach(struct i2c_adapter *i2c, u8 adr,
6158 struct dvb_frontend **fe_t)
6160 struct drxk_state *state = NULL;
6162 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6167 state->demod_address = adr;
6169 mutex_init(&state->mutex);
6170 mutex_init(&state->ctlock);
6172 memcpy(&state->c_frontend.ops, &drxk_c_ops,
6173 sizeof(struct dvb_frontend_ops));
6174 memcpy(&state->t_frontend.ops, &drxk_t_ops,
6175 sizeof(struct dvb_frontend_ops));
6176 state->c_frontend.demodulator_priv = state;
6177 state->t_frontend.demodulator_priv = state;
6180 if (init_drxk(state) < 0)
6182 *fe_t = &state->t_frontend;
6183 return &state->c_frontend;
6186 printk(KERN_ERR "drxk: not found\n");
6190 EXPORT_SYMBOL(drxk_attach);
6192 MODULE_DESCRIPTION("DRX-K driver");
6193 MODULE_AUTHOR("Ralph Metzler");
6194 MODULE_LICENSE("GPL");