2 * drxk_hard: DRX-K DVB-C/T demodulator driver
4 * Copyright (C) 2010-2011 Digital Devices GmbH
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 only, as published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/init.h>
28 #include <linux/delay.h>
29 #include <linux/firmware.h>
30 #include <linux/i2c.h>
31 #include <linux/version.h>
32 #include <asm/div64.h>
34 #include "dvb_frontend.h"
36 #include "drxk_hard.h"
38 static int PowerDownDVBT(struct drxk_state
*state
, bool setPowerMode
);
39 static int PowerDownQAM(struct drxk_state
*state
);
40 static int SetDVBTStandard(struct drxk_state
*state
,
41 enum OperationMode oMode
);
42 static int SetQAMStandard(struct drxk_state
*state
,
43 enum OperationMode oMode
);
44 static int SetQAM(struct drxk_state
*state
, u16 IntermediateFreqkHz
,
46 static int SetDVBTStandard(struct drxk_state
*state
,
47 enum OperationMode oMode
);
48 static int DVBTStart(struct drxk_state
*state
);
49 static int SetDVBT(struct drxk_state
*state
, u16 IntermediateFreqkHz
,
51 static int GetQAMLockStatus(struct drxk_state
*state
, u32
*pLockStatus
);
52 static int GetDVBTLockStatus(struct drxk_state
*state
, u32
*pLockStatus
);
53 static int SwitchAntennaToQAM(struct drxk_state
*state
);
54 static int SwitchAntennaToDVBT(struct drxk_state
*state
);
56 static bool IsDVBT(struct drxk_state
*state
)
58 return state
->m_OperationMode
== OM_DVBT
;
61 static bool IsQAM(struct drxk_state
*state
)
63 return state
->m_OperationMode
== OM_QAM_ITU_A
||
64 state
->m_OperationMode
== OM_QAM_ITU_B
||
65 state
->m_OperationMode
== OM_QAM_ITU_C
;
68 bool IsA1WithPatchCode(struct drxk_state
*state
)
70 return state
->m_DRXK_A1_PATCH_CODE
;
73 bool IsA1WithRomCode(struct drxk_state
*state
)
75 return state
->m_DRXK_A1_ROM_CODE
;
80 #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
81 #define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0)
83 #define DEFAULT_MER_83 165
84 #define DEFAULT_MER_93 250
86 #ifndef DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
87 #define DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH (0x02)
90 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
91 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
94 #ifndef DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH
95 #define DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH (0x06)
98 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
99 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
101 #ifndef DRXK_KI_RAGC_ATV
102 #define DRXK_KI_RAGC_ATV 4
104 #ifndef DRXK_KI_IAGC_ATV
105 #define DRXK_KI_IAGC_ATV 6
107 #ifndef DRXK_KI_DAGC_ATV
108 #define DRXK_KI_DAGC_ATV 7
111 #ifndef DRXK_KI_RAGC_QAM
112 #define DRXK_KI_RAGC_QAM 3
114 #ifndef DRXK_KI_IAGC_QAM
115 #define DRXK_KI_IAGC_QAM 4
117 #ifndef DRXK_KI_DAGC_QAM
118 #define DRXK_KI_DAGC_QAM 7
120 #ifndef DRXK_KI_RAGC_DVBT
121 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
123 #ifndef DRXK_KI_IAGC_DVBT
124 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
126 #ifndef DRXK_KI_DAGC_DVBT
127 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
130 #ifndef DRXK_AGC_DAC_OFFSET
131 #define DRXK_AGC_DAC_OFFSET (0x800)
134 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
135 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
138 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
139 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
142 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
143 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
146 #ifndef DRXK_QAM_SYMBOLRATE_MAX
147 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
150 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT 56
151 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A 64
152 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C 0x5FE0
153 #define DRXK_BL_ROM_OFFSET_TAPS_BG 24
154 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP 32
155 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC 40
156 #define DRXK_BL_ROM_OFFSET_TAPS_FM 48
157 #define DRXK_BL_ROM_OFFSET_UCODE 0
159 #define DRXK_BLC_TIMEOUT 100
161 #define DRXK_BLCC_NR_ELEMENTS_TAPS 2
162 #define DRXK_BLCC_NR_ELEMENTS_UCODE 6
164 #define DRXK_BLDC_NR_ELEMENTS_TAPS 28
166 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
167 #define DRXK_OFDM_NE_NOTCH_WIDTH (4)
170 #define DRXK_QAM_SL_SIG_POWER_QAM16 (40960)
171 #define DRXK_QAM_SL_SIG_POWER_QAM32 (20480)
172 #define DRXK_QAM_SL_SIG_POWER_QAM64 (43008)
173 #define DRXK_QAM_SL_SIG_POWER_QAM128 (20992)
174 #define DRXK_QAM_SL_SIG_POWER_QAM256 (43520)
176 static unsigned int debug
;
177 module_param(debug
, int, 0644);
178 MODULE_PARM_DESC(debug
, "enable debug messages");
180 #define dprintk(level, fmt, arg...) do { \
181 if (debug >= level) \
182 printk(KERN_DEBUG "drxk: %s" fmt, __func__, ## arg); \
186 static inline u32
MulDiv32(u32 a
, u32 b
, u32 c
)
190 tmp64
= (u64
) a
* (u64
) b
;
196 inline u32
Frac28a(u32 a
, u32 c
)
202 R0
= (a
% c
) << 4; /* 32-28 == 4 shifts possible at max */
203 Q1
= a
/ c
; /* integer part, only the 4 least significant bits
204 will be visible in the result */
206 /* division using radix 16, 7 nibbles in the result */
207 for (i
= 0; i
< 7; i
++) {
208 Q1
= (Q1
<< 4) | (R0
/ c
);
218 static u32
Log10Times100(u32 x
)
220 static const u8 scale
= 15;
221 static const u8 indexWidth
= 5;
228 log2lut[n] = (1<<scale) * 200 * log2(1.0 + ((1.0/(1<<INDEXWIDTH)) * n))
229 0 <= n < ((1<<INDEXWIDTH)+1)
232 static const u32 log2lut
[] = {
234 290941, /* 290941.300628 */
235 573196, /* 573196.476418 */
236 847269, /* 847269.179851 */
237 1113620, /* 1113620.489452 */
238 1372674, /* 1372673.576986 */
239 1624818, /* 1624817.752104 */
240 1870412, /* 1870411.981536 */
241 2109788, /* 2109787.962654 */
242 2343253, /* 2343252.817465 */
243 2571091, /* 2571091.461923 */
244 2793569, /* 2793568.696416 */
245 3010931, /* 3010931.055901 */
246 3223408, /* 3223408.452106 */
247 3431216, /* 3431215.635215 */
248 3634553, /* 3634553.498355 */
249 3833610, /* 3833610.244726 */
250 4028562, /* 4028562.434393 */
251 4219576, /* 4219575.925308 */
252 4406807, /* 4406806.721144 */
253 4590402, /* 4590401.736809 */
254 4770499, /* 4770499.491025 */
255 4947231, /* 4947230.734179 */
256 5120719, /* 5120719.018555 */
257 5291081, /* 5291081.217197 */
258 5458428, /* 5458427.996830 */
259 5622864, /* 5622864.249668 */
260 5784489, /* 5784489.488298 */
261 5943398, /* 5943398.207380 */
262 6099680, /* 6099680.215452 */
263 6253421, /* 6253420.939751 */
264 6404702, /* 6404701.706649 */
265 6553600, /* 6553600.000000 */
272 /* Scale x (normalize) */
273 /* computing y in log(x/y) = log(x) - log(y) */
274 if ((x
& ((0xffffffff) << (scale
+ 1))) == 0) {
275 for (k
= scale
; k
> 0; k
--) {
276 if (x
& (((u32
) 1) << scale
))
281 for (k
= scale
; k
< 31; k
++) {
282 if ((x
& (((u32
) (-1)) << (scale
+ 1))) == 0)
288 Now x has binary point between bit[scale] and bit[scale-1]
289 and 1.0 <= x < 2.0 */
291 /* correction for divison: log(x) = log(x/y)+log(y) */
292 y
= k
* ((((u32
) 1) << scale
) * 200);
294 /* remove integer part */
295 x
&= ((((u32
) 1) << scale
) - 1);
297 i
= (u8
) (x
>> (scale
- indexWidth
));
298 /* compute delta (x - a) */
299 d
= x
& ((((u32
) 1) << (scale
- indexWidth
)) - 1);
300 /* compute log, multiplication (d* (..)) must be within range ! */
302 ((d
* (log2lut
[i
+ 1] - log2lut
[i
])) >> (scale
- indexWidth
));
303 /* Conver to log10() */
304 y
/= 108853; /* (log2(10) << scale) */
312 /****************************************************************************/
313 /* I2C **********************************************************************/
314 /****************************************************************************/
316 static int i2c_read1(struct i2c_adapter
*adapter
, u8 adr
, u8
*val
)
318 struct i2c_msg msgs
[1] = { {.addr
= adr
, .flags
= I2C_M_RD
,
319 .buf
= val
, .len
= 1}
322 return i2c_transfer(adapter
, msgs
, 1);
325 static int i2c_write(struct i2c_adapter
*adap
, u8 adr
, u8
*data
, int len
)
328 struct i2c_msg msg
= {
329 .addr
= adr
, .flags
= 0, .buf
= data
, .len
= len
};
334 for (i
= 0; i
< len
; i
++)
335 printk(KERN_CONT
" %02x", data
[i
]);
336 printk(KERN_CONT
"\n");
338 status
= i2c_transfer(adap
, &msg
, 1);
339 if (status
>= 0 && status
!= 1)
343 printk(KERN_ERR
"drxk: i2c write error at addr 0x%02x\n", adr
);
348 static int i2c_read(struct i2c_adapter
*adap
,
349 u8 adr
, u8
*msg
, int len
, u8
*answ
, int alen
)
352 struct i2c_msg msgs
[2] = {
353 {.addr
= adr
, .flags
= 0,
354 .buf
= msg
, .len
= len
},
355 {.addr
= adr
, .flags
= I2C_M_RD
,
356 .buf
= answ
, .len
= alen
}
359 status
= i2c_transfer(adap
, msgs
, 2);
362 printk(KERN_CONT
": ERROR!\n");
366 printk(KERN_ERR
"drxk: i2c read error at addr 0x%02x\n", adr
);
371 dprintk(2, ": read from");
372 for (i
= 0; i
< len
; i
++)
373 printk(KERN_CONT
" %02x", msg
[i
]);
374 printk(KERN_CONT
", value = ");
375 for (i
= 0; i
< alen
; i
++)
376 printk(KERN_CONT
" %02x", answ
[i
]);
377 printk(KERN_CONT
"\n");
382 static int read16_flags(struct drxk_state
*state
, u32 reg
, u16
*data
, u8 flags
)
385 u8 adr
= state
->demod_address
, mm1
[4], mm2
[2], len
;
387 if (state
->single_master
)
390 if (DRXDAP_FASI_LONG_FORMAT(reg
) || (flags
!= 0)) {
391 mm1
[0] = (((reg
<< 1) & 0xFF) | 0x01);
392 mm1
[1] = ((reg
>> 16) & 0xFF);
393 mm1
[2] = ((reg
>> 24) & 0xFF) | flags
;
394 mm1
[3] = ((reg
>> 7) & 0xFF);
397 mm1
[0] = ((reg
<< 1) & 0xFF);
398 mm1
[1] = (((reg
>> 16) & 0x0F) | ((reg
>> 18) & 0xF0));
401 dprintk(2, "(0x%08x, 0x%02x)\n", reg
, flags
);
402 status
= i2c_read(state
->i2c
, adr
, mm1
, len
, mm2
, 2);
406 *data
= mm2
[0] | (mm2
[1] << 8);
411 static int read16(struct drxk_state
*state
, u32 reg
, u16
*data
)
413 return read16_flags(state
, reg
, data
, 0);
416 static int read32_flags(struct drxk_state
*state
, u32 reg
, u32
*data
, u8 flags
)
419 u8 adr
= state
->demod_address
, mm1
[4], mm2
[4], len
;
421 if (state
->single_master
)
424 if (DRXDAP_FASI_LONG_FORMAT(reg
) || (flags
!= 0)) {
425 mm1
[0] = (((reg
<< 1) & 0xFF) | 0x01);
426 mm1
[1] = ((reg
>> 16) & 0xFF);
427 mm1
[2] = ((reg
>> 24) & 0xFF) | flags
;
428 mm1
[3] = ((reg
>> 7) & 0xFF);
431 mm1
[0] = ((reg
<< 1) & 0xFF);
432 mm1
[1] = (((reg
>> 16) & 0x0F) | ((reg
>> 18) & 0xF0));
435 dprintk(2, "(0x%08x, 0x%02x)\n", reg
, flags
);
436 status
= i2c_read(state
->i2c
, adr
, mm1
, len
, mm2
, 4);
440 *data
= mm2
[0] | (mm2
[1] << 8) |
441 (mm2
[2] << 16) | (mm2
[3] << 24);
446 static int read32(struct drxk_state
*state
, u32 reg
, u32
*data
)
448 return read32_flags(state
, reg
, data
, 0);
451 static int write16_flags(struct drxk_state
*state
, u32 reg
, u16 data
, u8 flags
)
453 u8 adr
= state
->demod_address
, mm
[6], len
;
455 if (state
->single_master
)
457 if (DRXDAP_FASI_LONG_FORMAT(reg
) || (flags
!= 0)) {
458 mm
[0] = (((reg
<< 1) & 0xFF) | 0x01);
459 mm
[1] = ((reg
>> 16) & 0xFF);
460 mm
[2] = ((reg
>> 24) & 0xFF) | flags
;
461 mm
[3] = ((reg
>> 7) & 0xFF);
464 mm
[0] = ((reg
<< 1) & 0xFF);
465 mm
[1] = (((reg
>> 16) & 0x0F) | ((reg
>> 18) & 0xF0));
468 mm
[len
] = data
& 0xff;
469 mm
[len
+ 1] = (data
>> 8) & 0xff;
471 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg
, data
, flags
);
472 return i2c_write(state
->i2c
, adr
, mm
, len
+ 2);
475 static int write16(struct drxk_state
*state
, u32 reg
, u16 data
)
477 return write16_flags(state
, reg
, data
, 0);
480 static int write32_flags(struct drxk_state
*state
, u32 reg
, u32 data
, u8 flags
)
482 u8 adr
= state
->demod_address
, mm
[8], len
;
484 if (state
->single_master
)
486 if (DRXDAP_FASI_LONG_FORMAT(reg
) || (flags
!= 0)) {
487 mm
[0] = (((reg
<< 1) & 0xFF) | 0x01);
488 mm
[1] = ((reg
>> 16) & 0xFF);
489 mm
[2] = ((reg
>> 24) & 0xFF) | flags
;
490 mm
[3] = ((reg
>> 7) & 0xFF);
493 mm
[0] = ((reg
<< 1) & 0xFF);
494 mm
[1] = (((reg
>> 16) & 0x0F) | ((reg
>> 18) & 0xF0));
497 mm
[len
] = data
& 0xff;
498 mm
[len
+ 1] = (data
>> 8) & 0xff;
499 mm
[len
+ 2] = (data
>> 16) & 0xff;
500 mm
[len
+ 3] = (data
>> 24) & 0xff;
501 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg
, data
, flags
);
503 return i2c_write(state
->i2c
, adr
, mm
, len
+ 4);
506 static int write32(struct drxk_state
*state
, u32 reg
, u32 data
)
508 return write32_flags(state
, reg
, data
, 0);
511 static int write_block(struct drxk_state
*state
, u32 Address
,
512 const int BlockSize
, const u8 pBlock
[])
514 int status
= 0, BlkSize
= BlockSize
;
517 if (state
->single_master
)
520 while (BlkSize
> 0) {
521 int Chunk
= BlkSize
> state
->m_ChunkSize
?
522 state
->m_ChunkSize
: BlkSize
;
523 u8
*AdrBuf
= &state
->Chunk
[0];
526 if (DRXDAP_FASI_LONG_FORMAT(Address
) || (Flags
!= 0)) {
527 AdrBuf
[0] = (((Address
<< 1) & 0xFF) | 0x01);
528 AdrBuf
[1] = ((Address
>> 16) & 0xFF);
529 AdrBuf
[2] = ((Address
>> 24) & 0xFF);
530 AdrBuf
[3] = ((Address
>> 7) & 0xFF);
533 if (Chunk
== state
->m_ChunkSize
)
536 AdrBuf
[0] = ((Address
<< 1) & 0xFF);
537 AdrBuf
[1] = (((Address
>> 16) & 0x0F) |
538 ((Address
>> 18) & 0xF0));
541 memcpy(&state
->Chunk
[AdrLength
], pBlock
, Chunk
);
542 dprintk(2, "(0x%08x, 0x%02x)\n", Address
, Flags
);
546 for (i
= 0; i
< Chunk
; i
++)
547 printk(KERN_CONT
" %02x", pBlock
[i
]);
548 printk(KERN_CONT
"\n");
550 status
= i2c_write(state
->i2c
, state
->demod_address
,
551 &state
->Chunk
[0], Chunk
+ AdrLength
);
553 printk(KERN_ERR
"drxk: %s: i2c write error at addr 0x%02x\n",
558 Address
+= (Chunk
>> 1);
564 #ifndef DRXK_MAX_RETRIES_POWERUP
565 #define DRXK_MAX_RETRIES_POWERUP 20
568 int PowerUpDevice(struct drxk_state
*state
)
576 status
= i2c_read1(state
->i2c
, state
->demod_address
, &data
);
580 status
= i2c_write(state
->i2c
, state
->demod_address
,
586 status
= i2c_read1(state
->i2c
, state
->demod_address
,
588 } while (status
< 0 &&
589 (retryCount
< DRXK_MAX_RETRIES_POWERUP
));
590 if (status
< 0 && retryCount
>= DRXK_MAX_RETRIES_POWERUP
)
594 /* Make sure all clk domains are active */
595 status
= write16(state
, SIO_CC_PWD_MODE__A
, SIO_CC_PWD_MODE_LEVEL_NONE
);
598 status
= write16(state
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
);
601 /* Enable pll lock tests */
602 status
= write16(state
, SIO_CC_PLL_LOCK__A
, 1);
606 state
->m_currentPowerMode
= DRX_POWER_UP
;
610 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
616 static int init_state(struct drxk_state
*state
)
619 * FIXME: most (all?) of the values bellow should be moved into
620 * struct drxk_config, as they are probably board-specific
622 u32 ulVSBIfAgcMode
= DRXK_AGC_CTRL_AUTO
;
623 u32 ulVSBIfAgcOutputLevel
= 0;
624 u32 ulVSBIfAgcMinLevel
= 0;
625 u32 ulVSBIfAgcMaxLevel
= 0x7FFF;
626 u32 ulVSBIfAgcSpeed
= 3;
628 u32 ulVSBRfAgcMode
= DRXK_AGC_CTRL_AUTO
;
629 u32 ulVSBRfAgcOutputLevel
= 0;
630 u32 ulVSBRfAgcMinLevel
= 0;
631 u32 ulVSBRfAgcMaxLevel
= 0x7FFF;
632 u32 ulVSBRfAgcSpeed
= 3;
633 u32 ulVSBRfAgcTop
= 9500;
634 u32 ulVSBRfAgcCutOffCurrent
= 4000;
636 u32 ulATVIfAgcMode
= DRXK_AGC_CTRL_AUTO
;
637 u32 ulATVIfAgcOutputLevel
= 0;
638 u32 ulATVIfAgcMinLevel
= 0;
639 u32 ulATVIfAgcMaxLevel
= 0;
640 u32 ulATVIfAgcSpeed
= 3;
642 u32 ulATVRfAgcMode
= DRXK_AGC_CTRL_OFF
;
643 u32 ulATVRfAgcOutputLevel
= 0;
644 u32 ulATVRfAgcMinLevel
= 0;
645 u32 ulATVRfAgcMaxLevel
= 0;
646 u32 ulATVRfAgcTop
= 9500;
647 u32 ulATVRfAgcCutOffCurrent
= 4000;
648 u32 ulATVRfAgcSpeed
= 3;
650 u32 ulQual83
= DEFAULT_MER_83
;
651 u32 ulQual93
= DEFAULT_MER_93
;
653 u32 ulDVBTStaticTSClock
= 1;
654 u32 ulDVBCStaticTSClock
= 1;
656 u32 ulMpegLockTimeOut
= DEFAULT_DRXK_MPEG_LOCK_TIMEOUT
;
657 u32 ulDemodLockTimeOut
= DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT
;
659 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
660 /* io_pad_cfg_mode output mode is drive always */
661 /* io_pad_cfg_drive is set to power 2 (23 mA) */
662 u32 ulGPIOCfg
= 0x0113;
663 u32 ulInvertTSClock
= 0;
664 u32 ulTSDataStrength
= DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
;
665 u32 ulTSClockkStrength
= DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH
;
666 u32 ulDVBTBitrate
= 50000000;
667 u32 ulDVBCBitrate
= DRXK_QAM_SYMBOLRATE_MAX
* 8;
669 u32 ulInsertRSByte
= 0;
676 state
->m_hasLNA
= false;
677 state
->m_hasDVBT
= false;
678 state
->m_hasDVBC
= false;
679 state
->m_hasATV
= false;
680 state
->m_hasOOB
= false;
681 state
->m_hasAudio
= false;
683 if (!state
->m_ChunkSize
)
684 state
->m_ChunkSize
= 124;
686 state
->m_oscClockFreq
= 0;
687 state
->m_smartAntInverted
= false;
688 state
->m_bPDownOpenBridge
= false;
690 /* real system clock frequency in kHz */
691 state
->m_sysClockFreq
= 151875;
692 /* Timing div, 250ns/Psys */
693 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
694 state
->m_HICfgTimingDiv
= ((state
->m_sysClockFreq
/ 1000) *
695 HI_I2C_DELAY
) / 1000;
697 if (state
->m_HICfgTimingDiv
> SIO_HI_RA_RAM_PAR_2_CFG_DIV__M
)
698 state
->m_HICfgTimingDiv
= SIO_HI_RA_RAM_PAR_2_CFG_DIV__M
;
699 state
->m_HICfgWakeUpKey
= (state
->demod_address
<< 1);
700 /* port/bridge/power down ctrl */
701 state
->m_HICfgCtrl
= SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE
;
703 state
->m_bPowerDown
= (ulPowerDown
!= 0);
705 state
->m_DRXK_A1_PATCH_CODE
= false;
706 state
->m_DRXK_A1_ROM_CODE
= false;
707 state
->m_DRXK_A2_ROM_CODE
= false;
708 state
->m_DRXK_A3_ROM_CODE
= false;
709 state
->m_DRXK_A2_PATCH_CODE
= false;
710 state
->m_DRXK_A3_PATCH_CODE
= false;
712 /* Init AGC and PGA parameters */
714 state
->m_vsbIfAgcCfg
.ctrlMode
= (ulVSBIfAgcMode
);
715 state
->m_vsbIfAgcCfg
.outputLevel
= (ulVSBIfAgcOutputLevel
);
716 state
->m_vsbIfAgcCfg
.minOutputLevel
= (ulVSBIfAgcMinLevel
);
717 state
->m_vsbIfAgcCfg
.maxOutputLevel
= (ulVSBIfAgcMaxLevel
);
718 state
->m_vsbIfAgcCfg
.speed
= (ulVSBIfAgcSpeed
);
719 state
->m_vsbPgaCfg
= 140;
722 state
->m_vsbRfAgcCfg
.ctrlMode
= (ulVSBRfAgcMode
);
723 state
->m_vsbRfAgcCfg
.outputLevel
= (ulVSBRfAgcOutputLevel
);
724 state
->m_vsbRfAgcCfg
.minOutputLevel
= (ulVSBRfAgcMinLevel
);
725 state
->m_vsbRfAgcCfg
.maxOutputLevel
= (ulVSBRfAgcMaxLevel
);
726 state
->m_vsbRfAgcCfg
.speed
= (ulVSBRfAgcSpeed
);
727 state
->m_vsbRfAgcCfg
.top
= (ulVSBRfAgcTop
);
728 state
->m_vsbRfAgcCfg
.cutOffCurrent
= (ulVSBRfAgcCutOffCurrent
);
729 state
->m_vsbPreSawCfg
.reference
= 0x07;
730 state
->m_vsbPreSawCfg
.usePreSaw
= true;
732 state
->m_Quality83percent
= DEFAULT_MER_83
;
733 state
->m_Quality93percent
= DEFAULT_MER_93
;
734 if (ulQual93
<= 500 && ulQual83
< ulQual93
) {
735 state
->m_Quality83percent
= ulQual83
;
736 state
->m_Quality93percent
= ulQual93
;
740 state
->m_atvIfAgcCfg
.ctrlMode
= (ulATVIfAgcMode
);
741 state
->m_atvIfAgcCfg
.outputLevel
= (ulATVIfAgcOutputLevel
);
742 state
->m_atvIfAgcCfg
.minOutputLevel
= (ulATVIfAgcMinLevel
);
743 state
->m_atvIfAgcCfg
.maxOutputLevel
= (ulATVIfAgcMaxLevel
);
744 state
->m_atvIfAgcCfg
.speed
= (ulATVIfAgcSpeed
);
747 state
->m_atvRfAgcCfg
.ctrlMode
= (ulATVRfAgcMode
);
748 state
->m_atvRfAgcCfg
.outputLevel
= (ulATVRfAgcOutputLevel
);
749 state
->m_atvRfAgcCfg
.minOutputLevel
= (ulATVRfAgcMinLevel
);
750 state
->m_atvRfAgcCfg
.maxOutputLevel
= (ulATVRfAgcMaxLevel
);
751 state
->m_atvRfAgcCfg
.speed
= (ulATVRfAgcSpeed
);
752 state
->m_atvRfAgcCfg
.top
= (ulATVRfAgcTop
);
753 state
->m_atvRfAgcCfg
.cutOffCurrent
= (ulATVRfAgcCutOffCurrent
);
754 state
->m_atvPreSawCfg
.reference
= 0x04;
755 state
->m_atvPreSawCfg
.usePreSaw
= true;
759 state
->m_dvbtRfAgcCfg
.ctrlMode
= DRXK_AGC_CTRL_OFF
;
760 state
->m_dvbtRfAgcCfg
.outputLevel
= 0;
761 state
->m_dvbtRfAgcCfg
.minOutputLevel
= 0;
762 state
->m_dvbtRfAgcCfg
.maxOutputLevel
= 0xFFFF;
763 state
->m_dvbtRfAgcCfg
.top
= 0x2100;
764 state
->m_dvbtRfAgcCfg
.cutOffCurrent
= 4000;
765 state
->m_dvbtRfAgcCfg
.speed
= 1;
769 state
->m_dvbtIfAgcCfg
.ctrlMode
= DRXK_AGC_CTRL_AUTO
;
770 state
->m_dvbtIfAgcCfg
.outputLevel
= 0;
771 state
->m_dvbtIfAgcCfg
.minOutputLevel
= 0;
772 state
->m_dvbtIfAgcCfg
.maxOutputLevel
= 9000;
773 state
->m_dvbtIfAgcCfg
.top
= 13424;
774 state
->m_dvbtIfAgcCfg
.cutOffCurrent
= 0;
775 state
->m_dvbtIfAgcCfg
.speed
= 3;
776 state
->m_dvbtIfAgcCfg
.FastClipCtrlDelay
= 30;
777 state
->m_dvbtIfAgcCfg
.IngainTgtMax
= 30000;
778 /* state->m_dvbtPgaCfg = 140; */
780 state
->m_dvbtPreSawCfg
.reference
= 4;
781 state
->m_dvbtPreSawCfg
.usePreSaw
= false;
784 state
->m_qamRfAgcCfg
.ctrlMode
= DRXK_AGC_CTRL_OFF
;
785 state
->m_qamRfAgcCfg
.outputLevel
= 0;
786 state
->m_qamRfAgcCfg
.minOutputLevel
= 6023;
787 state
->m_qamRfAgcCfg
.maxOutputLevel
= 27000;
788 state
->m_qamRfAgcCfg
.top
= 0x2380;
789 state
->m_qamRfAgcCfg
.cutOffCurrent
= 4000;
790 state
->m_qamRfAgcCfg
.speed
= 3;
793 state
->m_qamIfAgcCfg
.ctrlMode
= DRXK_AGC_CTRL_AUTO
;
794 state
->m_qamIfAgcCfg
.outputLevel
= 0;
795 state
->m_qamIfAgcCfg
.minOutputLevel
= 0;
796 state
->m_qamIfAgcCfg
.maxOutputLevel
= 9000;
797 state
->m_qamIfAgcCfg
.top
= 0x0511;
798 state
->m_qamIfAgcCfg
.cutOffCurrent
= 0;
799 state
->m_qamIfAgcCfg
.speed
= 3;
800 state
->m_qamIfAgcCfg
.IngainTgtMax
= 5119;
801 state
->m_qamIfAgcCfg
.FastClipCtrlDelay
= 50;
803 state
->m_qamPgaCfg
= 140;
804 state
->m_qamPreSawCfg
.reference
= 4;
805 state
->m_qamPreSawCfg
.usePreSaw
= false;
807 state
->m_OperationMode
= OM_NONE
;
808 state
->m_DrxkState
= DRXK_UNINITIALIZED
;
810 /* MPEG output configuration */
811 state
->m_enableMPEGOutput
= true; /* If TRUE; enable MPEG ouput */
812 state
->m_insertRSByte
= false; /* If TRUE; insert RS byte */
813 state
->m_invertDATA
= false; /* If TRUE; invert DATA signals */
814 state
->m_invertERR
= false; /* If TRUE; invert ERR signal */
815 state
->m_invertSTR
= false; /* If TRUE; invert STR signals */
816 state
->m_invertVAL
= false; /* If TRUE; invert VAL signals */
817 state
->m_invertCLK
= (ulInvertTSClock
!= 0); /* If TRUE; invert CLK signals */
818 state
->m_DVBTStaticCLK
= (ulDVBTStaticTSClock
!= 0);
819 state
->m_DVBCStaticCLK
= (ulDVBCStaticTSClock
!= 0);
820 /* If TRUE; static MPEG clockrate will be used;
821 otherwise clockrate will adapt to the bitrate of the TS */
823 state
->m_DVBTBitrate
= ulDVBTBitrate
;
824 state
->m_DVBCBitrate
= ulDVBCBitrate
;
826 state
->m_TSDataStrength
= (ulTSDataStrength
& 0x07);
827 state
->m_TSClockkStrength
= (ulTSClockkStrength
& 0x07);
829 /* Maximum bitrate in b/s in case static clockrate is selected */
830 state
->m_mpegTsStaticBitrate
= 19392658;
831 state
->m_disableTEIhandling
= false;
834 state
->m_insertRSByte
= true;
836 state
->m_MpegLockTimeOut
= DEFAULT_DRXK_MPEG_LOCK_TIMEOUT
;
837 if (ulMpegLockTimeOut
< 10000)
838 state
->m_MpegLockTimeOut
= ulMpegLockTimeOut
;
839 state
->m_DemodLockTimeOut
= DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT
;
840 if (ulDemodLockTimeOut
< 10000)
841 state
->m_DemodLockTimeOut
= ulDemodLockTimeOut
;
844 state
->m_Constellation
= DRX_CONSTELLATION_AUTO
;
845 state
->m_qamInterleaveMode
= DRXK_QAM_I12_J17
;
846 state
->m_fecRsPlen
= 204 * 8; /* fecRsPlen annex A */
847 state
->m_fecRsPrescale
= 1;
849 state
->m_sqiSpeed
= DRXK_DVBT_SQI_SPEED_MEDIUM
;
850 state
->m_agcFastClipCtrlDelay
= 0;
852 state
->m_GPIOCfg
= (ulGPIOCfg
);
854 state
->m_bPowerDown
= false;
855 state
->m_currentPowerMode
= DRX_POWER_DOWN
;
857 state
->m_rfmirror
= (ulRfMirror
== 0);
858 state
->m_IfAgcPol
= false;
862 static int DRXX_Open(struct drxk_state
*state
)
870 /* stop lock indicator process */
871 status
= write16(state
, SCU_RAM_GPIO__A
, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
874 /* Check device id */
875 status
= read16(state
, SIO_TOP_COMM_KEY__A
, &key
);
878 status
= write16(state
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
);
881 status
= read32(state
, SIO_TOP_JTAGID_LO__A
, &jtag
);
884 status
= read16(state
, SIO_PDR_UIO_IN_HI__A
, &bid
);
887 status
= write16(state
, SIO_TOP_COMM_KEY__A
, key
);
890 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
894 static int GetDeviceCapabilities(struct drxk_state
*state
)
896 u16 sioPdrOhwCfg
= 0;
897 u32 sioTopJtagidLo
= 0;
899 const char *spin
= "";
904 /* stop lock indicator process */
905 status
= write16(state
, SCU_RAM_GPIO__A
, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
908 status
= write16(state
, SIO_TOP_COMM_KEY__A
, 0xFABA);
911 status
= read16(state
, SIO_PDR_OHW_CFG__A
, &sioPdrOhwCfg
);
914 status
= write16(state
, SIO_TOP_COMM_KEY__A
, 0x0000);
918 switch ((sioPdrOhwCfg
& SIO_PDR_OHW_CFG_FREF_SEL__M
)) {
920 /* ignore (bypass ?) */
924 state
->m_oscClockFreq
= 27000;
928 state
->m_oscClockFreq
= 20250;
932 state
->m_oscClockFreq
= 20250;
935 printk(KERN_ERR
"drxk: Clock Frequency is unkonwn\n");
939 Determine device capabilities
942 status
= read32(state
, SIO_TOP_JTAGID_LO__A
, &sioTopJtagidLo
);
946 printk(KERN_ERR
"drxk: status = 0x%08x\n", sioTopJtagidLo
);
949 switch ((sioTopJtagidLo
>> 29) & 0xF) {
951 state
->m_deviceSpin
= DRXK_SPIN_A1
;
955 state
->m_deviceSpin
= DRXK_SPIN_A2
;
959 state
->m_deviceSpin
= DRXK_SPIN_A3
;
963 state
->m_deviceSpin
= DRXK_SPIN_UNKNOWN
;
965 printk(KERN_ERR
"drxk: Spin %d unknown\n",
966 (sioTopJtagidLo
>> 29) & 0xF);
969 switch ((sioTopJtagidLo
>> 12) & 0xFF) {
971 /* typeId = DRX3913K_TYPE_ID */
972 state
->m_hasLNA
= false;
973 state
->m_hasOOB
= false;
974 state
->m_hasATV
= false;
975 state
->m_hasAudio
= false;
976 state
->m_hasDVBT
= true;
977 state
->m_hasDVBC
= true;
978 state
->m_hasSAWSW
= true;
979 state
->m_hasGPIO2
= false;
980 state
->m_hasGPIO1
= false;
981 state
->m_hasIRQN
= false;
984 /* typeId = DRX3915K_TYPE_ID */
985 state
->m_hasLNA
= false;
986 state
->m_hasOOB
= false;
987 state
->m_hasATV
= true;
988 state
->m_hasAudio
= false;
989 state
->m_hasDVBT
= true;
990 state
->m_hasDVBC
= false;
991 state
->m_hasSAWSW
= true;
992 state
->m_hasGPIO2
= true;
993 state
->m_hasGPIO1
= true;
994 state
->m_hasIRQN
= false;
997 /* typeId = DRX3916K_TYPE_ID */
998 state
->m_hasLNA
= false;
999 state
->m_hasOOB
= false;
1000 state
->m_hasATV
= true;
1001 state
->m_hasAudio
= false;
1002 state
->m_hasDVBT
= true;
1003 state
->m_hasDVBC
= false;
1004 state
->m_hasSAWSW
= true;
1005 state
->m_hasGPIO2
= true;
1006 state
->m_hasGPIO1
= true;
1007 state
->m_hasIRQN
= false;
1010 /* typeId = DRX3918K_TYPE_ID */
1011 state
->m_hasLNA
= false;
1012 state
->m_hasOOB
= false;
1013 state
->m_hasATV
= true;
1014 state
->m_hasAudio
= true;
1015 state
->m_hasDVBT
= true;
1016 state
->m_hasDVBC
= false;
1017 state
->m_hasSAWSW
= true;
1018 state
->m_hasGPIO2
= true;
1019 state
->m_hasGPIO1
= true;
1020 state
->m_hasIRQN
= false;
1023 /* typeId = DRX3921K_TYPE_ID */
1024 state
->m_hasLNA
= false;
1025 state
->m_hasOOB
= false;
1026 state
->m_hasATV
= true;
1027 state
->m_hasAudio
= true;
1028 state
->m_hasDVBT
= true;
1029 state
->m_hasDVBC
= true;
1030 state
->m_hasSAWSW
= true;
1031 state
->m_hasGPIO2
= true;
1032 state
->m_hasGPIO1
= true;
1033 state
->m_hasIRQN
= false;
1036 /* typeId = DRX3923K_TYPE_ID */
1037 state
->m_hasLNA
= false;
1038 state
->m_hasOOB
= false;
1039 state
->m_hasATV
= true;
1040 state
->m_hasAudio
= true;
1041 state
->m_hasDVBT
= true;
1042 state
->m_hasDVBC
= true;
1043 state
->m_hasSAWSW
= true;
1044 state
->m_hasGPIO2
= true;
1045 state
->m_hasGPIO1
= true;
1046 state
->m_hasIRQN
= false;
1049 /* typeId = DRX3925K_TYPE_ID */
1050 state
->m_hasLNA
= false;
1051 state
->m_hasOOB
= false;
1052 state
->m_hasATV
= true;
1053 state
->m_hasAudio
= true;
1054 state
->m_hasDVBT
= true;
1055 state
->m_hasDVBC
= true;
1056 state
->m_hasSAWSW
= true;
1057 state
->m_hasGPIO2
= true;
1058 state
->m_hasGPIO1
= true;
1059 state
->m_hasIRQN
= false;
1062 /* typeId = DRX3926K_TYPE_ID */
1063 state
->m_hasLNA
= false;
1064 state
->m_hasOOB
= false;
1065 state
->m_hasATV
= true;
1066 state
->m_hasAudio
= false;
1067 state
->m_hasDVBT
= true;
1068 state
->m_hasDVBC
= true;
1069 state
->m_hasSAWSW
= true;
1070 state
->m_hasGPIO2
= true;
1071 state
->m_hasGPIO1
= true;
1072 state
->m_hasIRQN
= false;
1075 printk(KERN_ERR
"drxk: DeviceID 0x%02x not supported\n",
1076 ((sioTopJtagidLo
>> 12) & 0xFF));
1082 "drxk: detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
1083 ((sioTopJtagidLo
>> 12) & 0xFF), spin
,
1084 state
->m_oscClockFreq
/ 1000,
1085 state
->m_oscClockFreq
% 1000);
1089 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1095 static int HI_Command(struct drxk_state
*state
, u16 cmd
, u16
*pResult
)
1103 status
= write16(state
, SIO_HI_RA_RAM_CMD__A
, cmd
);
1106 if (cmd
== SIO_HI_RA_RAM_CMD_RESET
)
1110 (bool) ((cmd
== SIO_HI_RA_RAM_CMD_CONFIG
) &&
1111 ((state
->m_HICfgCtrl
) &
1112 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M
) ==
1113 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
);
1114 if (powerdown_cmd
== false) {
1115 /* Wait until command rdy */
1122 status
= read16(state
, SIO_HI_RA_RAM_CMD__A
,
1124 } while ((status
< 0) && (retryCount
< DRXK_MAX_RETRIES
)
1128 status
= read16(state
, SIO_HI_RA_RAM_RES__A
, pResult
);
1132 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1137 static int HI_CfgCommand(struct drxk_state
*state
)
1143 mutex_lock(&state
->mutex
);
1145 status
= write16(state
, SIO_HI_RA_RAM_PAR_6__A
, state
->m_HICfgTimeout
);
1148 status
= write16(state
, SIO_HI_RA_RAM_PAR_5__A
, state
->m_HICfgCtrl
);
1151 status
= write16(state
, SIO_HI_RA_RAM_PAR_4__A
, state
->m_HICfgWakeUpKey
);
1154 status
= write16(state
, SIO_HI_RA_RAM_PAR_3__A
, state
->m_HICfgBridgeDelay
);
1157 status
= write16(state
, SIO_HI_RA_RAM_PAR_2__A
, state
->m_HICfgTimingDiv
);
1160 status
= write16(state
, SIO_HI_RA_RAM_PAR_1__A
, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY
);
1163 status
= HI_Command(state
, SIO_HI_RA_RAM_CMD_CONFIG
, 0);
1167 state
->m_HICfgCtrl
&= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
;
1169 mutex_unlock(&state
->mutex
);
1171 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1175 static int InitHI(struct drxk_state
*state
)
1179 state
->m_HICfgWakeUpKey
= (state
->demod_address
<< 1);
1180 state
->m_HICfgTimeout
= 0x96FF;
1181 /* port/bridge/power down ctrl */
1182 state
->m_HICfgCtrl
= SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE
;
1184 return HI_CfgCommand(state
);
1187 static int MPEGTSConfigurePins(struct drxk_state
*state
, bool mpegEnable
)
1190 u16 sioPdrMclkCfg
= 0;
1191 u16 sioPdrMdxCfg
= 0;
1193 dprintk(1, ": mpeg %s, %s mode\n",
1194 mpegEnable
? "enable" : "disable",
1195 state
->m_enableParallel
? "parallel" : "serial");
1197 /* stop lock indicator process */
1198 status
= write16(state
, SCU_RAM_GPIO__A
, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
1202 /* MPEG TS pad configuration */
1203 status
= write16(state
, SIO_TOP_COMM_KEY__A
, 0xFABA);
1207 if (mpegEnable
== false) {
1208 /* Set MPEG TS pads to inputmode */
1209 status
= write16(state
, SIO_PDR_MSTRT_CFG__A
, 0x0000);
1212 status
= write16(state
, SIO_PDR_MERR_CFG__A
, 0x0000);
1215 status
= write16(state
, SIO_PDR_MCLK_CFG__A
, 0x0000);
1218 status
= write16(state
, SIO_PDR_MVAL_CFG__A
, 0x0000);
1221 status
= write16(state
, SIO_PDR_MD0_CFG__A
, 0x0000);
1224 status
= write16(state
, SIO_PDR_MD1_CFG__A
, 0x0000);
1227 status
= write16(state
, SIO_PDR_MD2_CFG__A
, 0x0000);
1230 status
= write16(state
, SIO_PDR_MD3_CFG__A
, 0x0000);
1233 status
= write16(state
, SIO_PDR_MD4_CFG__A
, 0x0000);
1236 status
= write16(state
, SIO_PDR_MD5_CFG__A
, 0x0000);
1239 status
= write16(state
, SIO_PDR_MD6_CFG__A
, 0x0000);
1242 status
= write16(state
, SIO_PDR_MD7_CFG__A
, 0x0000);
1246 /* Enable MPEG output */
1248 ((state
->m_TSDataStrength
<<
1249 SIO_PDR_MD0_CFG_DRIVE__B
) | 0x0003);
1250 sioPdrMclkCfg
= ((state
->m_TSClockkStrength
<<
1251 SIO_PDR_MCLK_CFG_DRIVE__B
) |
1254 status
= write16(state
, SIO_PDR_MSTRT_CFG__A
, sioPdrMdxCfg
);
1257 status
= write16(state
, SIO_PDR_MERR_CFG__A
, 0x0000); /* Disable */
1260 status
= write16(state
, SIO_PDR_MVAL_CFG__A
, 0x0000); /* Disable */
1263 if (state
->m_enableParallel
== true) {
1264 /* paralel -> enable MD1 to MD7 */
1265 status
= write16(state
, SIO_PDR_MD1_CFG__A
, sioPdrMdxCfg
);
1268 status
= write16(state
, SIO_PDR_MD2_CFG__A
, sioPdrMdxCfg
);
1271 status
= write16(state
, SIO_PDR_MD3_CFG__A
, sioPdrMdxCfg
);
1274 status
= write16(state
, SIO_PDR_MD4_CFG__A
, sioPdrMdxCfg
);
1277 status
= write16(state
, SIO_PDR_MD5_CFG__A
, sioPdrMdxCfg
);
1280 status
= write16(state
, SIO_PDR_MD6_CFG__A
, sioPdrMdxCfg
);
1283 status
= write16(state
, SIO_PDR_MD7_CFG__A
, sioPdrMdxCfg
);
1287 sioPdrMdxCfg
= ((state
->m_TSDataStrength
<<
1288 SIO_PDR_MD0_CFG_DRIVE__B
)
1290 /* serial -> disable MD1 to MD7 */
1291 status
= write16(state
, SIO_PDR_MD1_CFG__A
, 0x0000);
1294 status
= write16(state
, SIO_PDR_MD2_CFG__A
, 0x0000);
1297 status
= write16(state
, SIO_PDR_MD3_CFG__A
, 0x0000);
1300 status
= write16(state
, SIO_PDR_MD4_CFG__A
, 0x0000);
1303 status
= write16(state
, SIO_PDR_MD5_CFG__A
, 0x0000);
1306 status
= write16(state
, SIO_PDR_MD6_CFG__A
, 0x0000);
1309 status
= write16(state
, SIO_PDR_MD7_CFG__A
, 0x0000);
1313 status
= write16(state
, SIO_PDR_MCLK_CFG__A
, sioPdrMclkCfg
);
1316 status
= write16(state
, SIO_PDR_MD0_CFG__A
, sioPdrMdxCfg
);
1320 /* Enable MB output over MPEG pads and ctl input */
1321 status
= write16(state
, SIO_PDR_MON_CFG__A
, 0x0000);
1324 /* Write nomagic word to enable pdr reg write */
1325 status
= write16(state
, SIO_TOP_COMM_KEY__A
, 0x0000);
1328 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1332 static int MPEGTSDisable(struct drxk_state
*state
)
1336 return MPEGTSConfigurePins(state
, false);
1339 static int BLChainCmd(struct drxk_state
*state
,
1340 u16 romOffset
, u16 nrOfElements
, u32 timeOut
)
1347 mutex_lock(&state
->mutex
);
1348 status
= write16(state
, SIO_BL_MODE__A
, SIO_BL_MODE_CHAIN
);
1351 status
= write16(state
, SIO_BL_CHAIN_ADDR__A
, romOffset
);
1354 status
= write16(state
, SIO_BL_CHAIN_LEN__A
, nrOfElements
);
1357 status
= write16(state
, SIO_BL_ENABLE__A
, SIO_BL_ENABLE_ON
);
1361 end
= jiffies
+ msecs_to_jiffies(timeOut
);
1364 status
= read16(state
, SIO_BL_STATUS__A
, &blStatus
);
1367 } while ((blStatus
== 0x1) &&
1368 ((time_is_after_jiffies(end
))));
1370 if (blStatus
== 0x1) {
1371 printk(KERN_ERR
"drxk: SIO not ready\n");
1377 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1379 mutex_unlock(&state
->mutex
);
1384 static int DownloadMicrocode(struct drxk_state
*state
,
1385 const u8 pMCImage
[], u32 Length
)
1387 const u8
*pSrc
= pMCImage
;
1400 /* down the drain (we don care about MAGIC_WORD) */
1401 Drain
= (pSrc
[0] << 8) | pSrc
[1];
1402 pSrc
+= sizeof(u16
);
1403 offset
+= sizeof(u16
);
1404 nBlocks
= (pSrc
[0] << 8) | pSrc
[1];
1405 pSrc
+= sizeof(u16
);
1406 offset
+= sizeof(u16
);
1408 for (i
= 0; i
< nBlocks
; i
+= 1) {
1409 Address
= (pSrc
[0] << 24) | (pSrc
[1] << 16) |
1410 (pSrc
[2] << 8) | pSrc
[3];
1411 pSrc
+= sizeof(u32
);
1412 offset
+= sizeof(u32
);
1414 BlockSize
= ((pSrc
[0] << 8) | pSrc
[1]) * sizeof(u16
);
1415 pSrc
+= sizeof(u16
);
1416 offset
+= sizeof(u16
);
1418 Flags
= (pSrc
[0] << 8) | pSrc
[1];
1419 pSrc
+= sizeof(u16
);
1420 offset
+= sizeof(u16
);
1422 BlockCRC
= (pSrc
[0] << 8) | pSrc
[1];
1423 pSrc
+= sizeof(u16
);
1424 offset
+= sizeof(u16
);
1426 if (offset
+ BlockSize
> Length
) {
1427 printk(KERN_ERR
"drxk: Firmware is corrupted.\n");
1431 status
= write_block(state
, Address
, BlockSize
, pSrc
);
1433 printk(KERN_ERR
"drxk: Error %d while loading firmware\n", status
);
1437 offset
+= BlockSize
;
1442 static int DVBTEnableOFDMTokenRing(struct drxk_state
*state
, bool enable
)
1446 u16 desiredCtrl
= SIO_OFDM_SH_OFDM_RING_ENABLE_ON
;
1447 u16 desiredStatus
= SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED
;
1452 if (enable
== false) {
1453 desiredCtrl
= SIO_OFDM_SH_OFDM_RING_ENABLE_OFF
;
1454 desiredStatus
= SIO_OFDM_SH_OFDM_RING_STATUS_DOWN
;
1457 status
= read16(state
, SIO_OFDM_SH_OFDM_RING_STATUS__A
, &data
);
1458 if (status
>= 0 && data
== desiredStatus
) {
1459 /* tokenring already has correct status */
1462 /* Disable/enable dvbt tokenring bridge */
1463 status
= write16(state
, SIO_OFDM_SH_OFDM_RING_ENABLE__A
, desiredCtrl
);
1465 end
= jiffies
+ msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT
);
1467 status
= read16(state
, SIO_OFDM_SH_OFDM_RING_STATUS__A
, &data
);
1468 if ((status
>= 0 && data
== desiredStatus
) || time_is_after_jiffies(end
))
1472 if (data
!= desiredStatus
) {
1473 printk(KERN_ERR
"drxk: SIO not ready\n");
1479 static int MPEGTSStop(struct drxk_state
*state
)
1482 u16 fecOcSncMode
= 0;
1483 u16 fecOcIprMode
= 0;
1487 /* Gracefull shutdown (byte boundaries) */
1488 status
= read16(state
, FEC_OC_SNC_MODE__A
, &fecOcSncMode
);
1491 fecOcSncMode
|= FEC_OC_SNC_MODE_SHUTDOWN__M
;
1492 status
= write16(state
, FEC_OC_SNC_MODE__A
, fecOcSncMode
);
1496 /* Suppress MCLK during absence of data */
1497 status
= read16(state
, FEC_OC_IPR_MODE__A
, &fecOcIprMode
);
1500 fecOcIprMode
|= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M
;
1501 status
= write16(state
, FEC_OC_IPR_MODE__A
, fecOcIprMode
);
1505 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1510 static int scu_command(struct drxk_state
*state
,
1511 u16 cmd
, u8 parameterLen
,
1512 u16
*parameter
, u8 resultLen
, u16
*result
)
1514 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1515 #error DRXK register mapping no longer compatible with this routine!
1518 int status
= -EINVAL
;
1527 if ((cmd
== 0) || ((parameterLen
> 0) && (parameter
== NULL
)) ||
1528 ((resultLen
> 0) && (result
== NULL
))) {
1529 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1533 mutex_lock(&state
->mutex
);
1535 /* assume that the command register is ready
1536 since it is checked afterwards */
1537 for (ii
= parameterLen
- 1; ii
>= 0; ii
-= 1) {
1538 buffer
[cnt
++] = (parameter
[ii
] & 0xFF);
1539 buffer
[cnt
++] = ((parameter
[ii
] >> 8) & 0xFF);
1541 buffer
[cnt
++] = (cmd
& 0xFF);
1542 buffer
[cnt
++] = ((cmd
>> 8) & 0xFF);
1544 write_block(state
, SCU_RAM_PARAM_0__A
-
1545 (parameterLen
- 1), cnt
, buffer
);
1546 /* Wait until SCU has processed command */
1547 end
= jiffies
+ msecs_to_jiffies(DRXK_MAX_WAITTIME
);
1550 status
= read16(state
, SCU_RAM_COMMAND__A
, &curCmd
);
1553 } while (!(curCmd
== DRX_SCU_READY
) && (time_is_after_jiffies(end
)));
1554 if (curCmd
!= DRX_SCU_READY
) {
1555 printk(KERN_ERR
"drxk: SCU not ready\n");
1560 if ((resultLen
> 0) && (result
!= NULL
)) {
1564 for (ii
= resultLen
- 1; ii
>= 0; ii
-= 1) {
1565 status
= read16(state
, SCU_RAM_PARAM_0__A
- ii
, &result
[ii
]);
1570 /* Check if an error was reported by SCU */
1571 err
= (s16
)result
[0];
1575 /* check for the known error codes */
1577 case SCU_RESULT_UNKCMD
:
1578 p
= "SCU_RESULT_UNKCMD";
1580 case SCU_RESULT_UNKSTD
:
1581 p
= "SCU_RESULT_UNKSTD";
1583 case SCU_RESULT_SIZE
:
1584 p
= "SCU_RESULT_SIZE";
1586 case SCU_RESULT_INVPAR
:
1587 p
= "SCU_RESULT_INVPAR";
1589 default: /* Other negative values are errors */
1590 sprintf(errname
, "ERROR: %d\n", err
);
1593 printk(KERN_ERR
"drxk: %s while sending cmd 0x%04x with params:", p
, cmd
);
1594 print_hex_dump_bytes("drxk: ", DUMP_PREFIX_NONE
, buffer
, cnt
);
1601 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1603 mutex_unlock(&state
->mutex
);
1607 static int SetIqmAf(struct drxk_state
*state
, bool active
)
1615 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
1620 data
|= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1621 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1622 | IQM_AF_STDBY_STDBY_PD_STANDBY
1623 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1624 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
);
1626 data
&= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY
)
1627 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY
)
1628 & (~IQM_AF_STDBY_STDBY_PD_STANDBY
)
1629 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
)
1630 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
)
1633 status
= write16(state
, IQM_AF_STDBY__A
, data
);
1637 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1641 static int CtrlPowerMode(struct drxk_state
*state
, enum DRXPowerMode
*mode
)
1644 u16 sioCcPwdMode
= 0;
1648 /* Check arguments */
1654 sioCcPwdMode
= SIO_CC_PWD_MODE_LEVEL_NONE
;
1656 case DRXK_POWER_DOWN_OFDM
:
1657 sioCcPwdMode
= SIO_CC_PWD_MODE_LEVEL_OFDM
;
1659 case DRXK_POWER_DOWN_CORE
:
1660 sioCcPwdMode
= SIO_CC_PWD_MODE_LEVEL_CLOCK
;
1662 case DRXK_POWER_DOWN_PLL
:
1663 sioCcPwdMode
= SIO_CC_PWD_MODE_LEVEL_PLL
;
1665 case DRX_POWER_DOWN
:
1666 sioCcPwdMode
= SIO_CC_PWD_MODE_LEVEL_OSC
;
1669 /* Unknow sleep mode */
1673 /* If already in requested power mode, do nothing */
1674 if (state
->m_currentPowerMode
== *mode
)
1677 /* For next steps make sure to start from DRX_POWER_UP mode */
1678 if (state
->m_currentPowerMode
!= DRX_POWER_UP
) {
1679 status
= PowerUpDevice(state
);
1682 status
= DVBTEnableOFDMTokenRing(state
, true);
1687 if (*mode
== DRX_POWER_UP
) {
1688 /* Restore analog & pin configuartion */
1690 /* Power down to requested mode */
1691 /* Backup some register settings */
1692 /* Set pins with possible pull-ups connected
1693 to them in input mode */
1694 /* Analog power down */
1695 /* ADC power down */
1696 /* Power down device */
1697 /* stop all comm_exec */
1698 /* Stop and power down previous standard */
1699 switch (state
->m_OperationMode
) {
1701 status
= MPEGTSStop(state
);
1704 status
= PowerDownDVBT(state
, false);
1710 status
= MPEGTSStop(state
);
1713 status
= PowerDownQAM(state
);
1720 status
= DVBTEnableOFDMTokenRing(state
, false);
1723 status
= write16(state
, SIO_CC_PWD_MODE__A
, sioCcPwdMode
);
1726 status
= write16(state
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
);
1730 if (*mode
!= DRXK_POWER_DOWN_OFDM
) {
1731 state
->m_HICfgCtrl
|=
1732 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
;
1733 status
= HI_CfgCommand(state
);
1738 state
->m_currentPowerMode
= *mode
;
1742 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1747 static int PowerDownDVBT(struct drxk_state
*state
, bool setPowerMode
)
1749 enum DRXPowerMode powerMode
= DRXK_POWER_DOWN_OFDM
;
1756 status
= read16(state
, SCU_COMM_EXEC__A
, &data
);
1759 if (data
== SCU_COMM_EXEC_ACTIVE
) {
1760 /* Send OFDM stop command */
1761 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
| SCU_RAM_COMMAND_CMD_DEMOD_STOP
, 0, NULL
, 1, &cmdResult
);
1764 /* Send OFDM reset command */
1765 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
| SCU_RAM_COMMAND_CMD_DEMOD_RESET
, 0, NULL
, 1, &cmdResult
);
1770 /* Reset datapath for OFDM, processors first */
1771 status
= write16(state
, OFDM_SC_COMM_EXEC__A
, OFDM_SC_COMM_EXEC_STOP
);
1774 status
= write16(state
, OFDM_LC_COMM_EXEC__A
, OFDM_LC_COMM_EXEC_STOP
);
1777 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_STOP
);
1782 status
= SetIqmAf(state
, false);
1786 /* powerdown to OFDM mode */
1788 status
= CtrlPowerMode(state
, &powerMode
);
1794 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1798 static int SetOperationMode(struct drxk_state
*state
,
1799 enum OperationMode oMode
)
1805 Stop and power down previous standard
1806 TODO investigate total power down instead of partial
1807 power down depending on "previous" standard.
1810 /* disable HW lock indicator */
1811 status
= write16(state
, SCU_RAM_GPIO__A
, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
1815 /* Device is already at the required mode */
1816 if (state
->m_OperationMode
== oMode
)
1819 switch (state
->m_OperationMode
) {
1820 /* OM_NONE was added for start up */
1824 status
= MPEGTSStop(state
);
1827 status
= PowerDownDVBT(state
, true);
1830 state
->m_OperationMode
= OM_NONE
;
1832 case OM_QAM_ITU_A
: /* fallthrough */
1834 status
= MPEGTSStop(state
);
1837 status
= PowerDownQAM(state
);
1840 state
->m_OperationMode
= OM_NONE
;
1849 Power up new standard
1853 dprintk(1, ": DVB-T\n");
1854 state
->m_OperationMode
= oMode
;
1855 status
= SetDVBTStandard(state
, oMode
);
1859 case OM_QAM_ITU_A
: /* fallthrough */
1861 dprintk(1, ": DVB-C Annex %c\n",
1862 (state
->m_OperationMode
== OM_QAM_ITU_A
) ? 'A' : 'C');
1863 state
->m_OperationMode
= oMode
;
1864 status
= SetQAMStandard(state
, oMode
);
1874 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1878 static int Start(struct drxk_state
*state
, s32 offsetFreq
,
1879 s32 IntermediateFrequency
)
1881 int status
= -EINVAL
;
1884 s32 OffsetkHz
= offsetFreq
/ 1000;
1887 if (state
->m_DrxkState
!= DRXK_STOPPED
&&
1888 state
->m_DrxkState
!= DRXK_DTV_STARTED
)
1891 state
->m_bMirrorFreqSpect
= (state
->props
.inversion
== INVERSION_ON
);
1893 if (IntermediateFrequency
< 0) {
1894 state
->m_bMirrorFreqSpect
= !state
->m_bMirrorFreqSpect
;
1895 IntermediateFrequency
= -IntermediateFrequency
;
1898 switch (state
->m_OperationMode
) {
1901 IFreqkHz
= (IntermediateFrequency
/ 1000);
1902 status
= SetQAM(state
, IFreqkHz
, OffsetkHz
);
1905 state
->m_DrxkState
= DRXK_DTV_STARTED
;
1908 IFreqkHz
= (IntermediateFrequency
/ 1000);
1909 status
= MPEGTSStop(state
);
1912 status
= SetDVBT(state
, IFreqkHz
, OffsetkHz
);
1915 status
= DVBTStart(state
);
1918 state
->m_DrxkState
= DRXK_DTV_STARTED
;
1925 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1929 static int ShutDown(struct drxk_state
*state
)
1937 static int GetLockStatus(struct drxk_state
*state
, u32
*pLockStatus
,
1940 int status
= -EINVAL
;
1944 if (pLockStatus
== NULL
)
1947 *pLockStatus
= NOT_LOCKED
;
1949 /* define the SCU command code */
1950 switch (state
->m_OperationMode
) {
1954 status
= GetQAMLockStatus(state
, pLockStatus
);
1957 status
= GetDVBTLockStatus(state
, pLockStatus
);
1964 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1968 static int MPEGTSStart(struct drxk_state
*state
)
1972 u16 fecOcSncMode
= 0;
1974 /* Allow OC to sync again */
1975 status
= read16(state
, FEC_OC_SNC_MODE__A
, &fecOcSncMode
);
1978 fecOcSncMode
&= ~FEC_OC_SNC_MODE_SHUTDOWN__M
;
1979 status
= write16(state
, FEC_OC_SNC_MODE__A
, fecOcSncMode
);
1982 status
= write16(state
, FEC_OC_SNC_UNLOCK__A
, 1);
1985 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
1989 static int MPEGTSDtoInit(struct drxk_state
*state
)
1995 /* Rate integration settings */
1996 status
= write16(state
, FEC_OC_RCN_CTL_STEP_LO__A
, 0x0000);
1999 status
= write16(state
, FEC_OC_RCN_CTL_STEP_HI__A
, 0x000C);
2002 status
= write16(state
, FEC_OC_RCN_GAIN__A
, 0x000A);
2005 status
= write16(state
, FEC_OC_AVR_PARM_A__A
, 0x0008);
2008 status
= write16(state
, FEC_OC_AVR_PARM_B__A
, 0x0006);
2011 status
= write16(state
, FEC_OC_TMD_HI_MARGIN__A
, 0x0680);
2014 status
= write16(state
, FEC_OC_TMD_LO_MARGIN__A
, 0x0080);
2017 status
= write16(state
, FEC_OC_TMD_COUNT__A
, 0x03F4);
2021 /* Additional configuration */
2022 status
= write16(state
, FEC_OC_OCR_INVERT__A
, 0);
2025 status
= write16(state
, FEC_OC_SNC_LWM__A
, 2);
2028 status
= write16(state
, FEC_OC_SNC_HWM__A
, 12);
2031 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2036 static int MPEGTSDtoSetup(struct drxk_state
*state
,
2037 enum OperationMode oMode
)
2041 u16 fecOcRegMode
= 0; /* FEC_OC_MODE register value */
2042 u16 fecOcRegIprMode
= 0; /* FEC_OC_IPR_MODE register value */
2043 u16 fecOcDtoMode
= 0; /* FEC_OC_IPR_INVERT register value */
2044 u16 fecOcFctMode
= 0; /* FEC_OC_IPR_INVERT register value */
2045 u16 fecOcDtoPeriod
= 2; /* FEC_OC_IPR_INVERT register value */
2046 u16 fecOcDtoBurstLen
= 188; /* FEC_OC_IPR_INVERT register value */
2047 u32 fecOcRcnCtlRate
= 0; /* FEC_OC_IPR_INVERT register value */
2048 u16 fecOcTmdMode
= 0;
2049 u16 fecOcTmdIntUpdRate
= 0;
2051 bool staticCLK
= false;
2055 /* Check insertion of the Reed-Solomon parity bytes */
2056 status
= read16(state
, FEC_OC_MODE__A
, &fecOcRegMode
);
2059 status
= read16(state
, FEC_OC_IPR_MODE__A
, &fecOcRegIprMode
);
2062 fecOcRegMode
&= (~FEC_OC_MODE_PARITY__M
);
2063 fecOcRegIprMode
&= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M
);
2064 if (state
->m_insertRSByte
== true) {
2065 /* enable parity symbol forward */
2066 fecOcRegMode
|= FEC_OC_MODE_PARITY__M
;
2067 /* MVAL disable during parity bytes */
2068 fecOcRegIprMode
|= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M
;
2069 /* TS burst length to 204 */
2070 fecOcDtoBurstLen
= 204;
2073 /* Check serial or parrallel output */
2074 fecOcRegIprMode
&= (~(FEC_OC_IPR_MODE_SERIAL__M
));
2075 if (state
->m_enableParallel
== false) {
2076 /* MPEG data output is serial -> set ipr_mode[0] */
2077 fecOcRegIprMode
|= FEC_OC_IPR_MODE_SERIAL__M
;
2082 maxBitRate
= state
->m_DVBTBitrate
;
2084 fecOcRcnCtlRate
= 0xC00000;
2085 staticCLK
= state
->m_DVBTStaticCLK
;
2087 case OM_QAM_ITU_A
: /* fallthrough */
2089 fecOcTmdMode
= 0x0004;
2090 fecOcRcnCtlRate
= 0xD2B4EE; /* good for >63 Mb/s */
2091 maxBitRate
= state
->m_DVBCBitrate
;
2092 staticCLK
= state
->m_DVBCStaticCLK
;
2096 } /* switch (standard) */
2100 /* Configure DTO's */
2104 /* Rational DTO for MCLK source (static MCLK rate),
2105 Dynamic DTO for optimal grouping
2106 (avoid intra-packet gaps),
2107 DTO offset enable to sync TS burst with MSTRT */
2108 fecOcDtoMode
= (FEC_OC_DTO_MODE_DYNAMIC__M
|
2109 FEC_OC_DTO_MODE_OFFSET_ENABLE__M
);
2110 fecOcFctMode
= (FEC_OC_FCT_MODE_RAT_ENA__M
|
2111 FEC_OC_FCT_MODE_VIRT_ENA__M
);
2113 /* Check user defined bitrate */
2114 bitRate
= maxBitRate
;
2115 if (bitRate
> 75900000UL) { /* max is 75.9 Mb/s */
2116 bitRate
= 75900000UL;
2118 /* Rational DTO period:
2119 dto_period = (Fsys / bitrate) - 2
2121 Result should be floored,
2122 to make sure >= requested bitrate
2124 fecOcDtoPeriod
= (u16
) (((state
->m_sysClockFreq
)
2126 if (fecOcDtoPeriod
<= 2)
2129 fecOcDtoPeriod
-= 2;
2130 fecOcTmdIntUpdRate
= 8;
2132 /* (commonAttr->staticCLK == false) => dynamic mode */
2133 fecOcDtoMode
= FEC_OC_DTO_MODE_DYNAMIC__M
;
2134 fecOcFctMode
= FEC_OC_FCT_MODE__PRE
;
2135 fecOcTmdIntUpdRate
= 5;
2138 /* Write appropriate registers with requested configuration */
2139 status
= write16(state
, FEC_OC_DTO_BURST_LEN__A
, fecOcDtoBurstLen
);
2142 status
= write16(state
, FEC_OC_DTO_PERIOD__A
, fecOcDtoPeriod
);
2145 status
= write16(state
, FEC_OC_DTO_MODE__A
, fecOcDtoMode
);
2148 status
= write16(state
, FEC_OC_FCT_MODE__A
, fecOcFctMode
);
2151 status
= write16(state
, FEC_OC_MODE__A
, fecOcRegMode
);
2154 status
= write16(state
, FEC_OC_IPR_MODE__A
, fecOcRegIprMode
);
2158 /* Rate integration settings */
2159 status
= write32(state
, FEC_OC_RCN_CTL_RATE_LO__A
, fecOcRcnCtlRate
);
2162 status
= write16(state
, FEC_OC_TMD_INT_UPD_RATE__A
, fecOcTmdIntUpdRate
);
2165 status
= write16(state
, FEC_OC_TMD_MODE__A
, fecOcTmdMode
);
2168 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2172 static int MPEGTSConfigurePolarity(struct drxk_state
*state
)
2174 u16 fecOcRegIprInvert
= 0;
2176 /* Data mask for the output data byte */
2177 u16 InvertDataMask
=
2178 FEC_OC_IPR_INVERT_MD7__M
| FEC_OC_IPR_INVERT_MD6__M
|
2179 FEC_OC_IPR_INVERT_MD5__M
| FEC_OC_IPR_INVERT_MD4__M
|
2180 FEC_OC_IPR_INVERT_MD3__M
| FEC_OC_IPR_INVERT_MD2__M
|
2181 FEC_OC_IPR_INVERT_MD1__M
| FEC_OC_IPR_INVERT_MD0__M
;
2185 /* Control selective inversion of output bits */
2186 fecOcRegIprInvert
&= (~(InvertDataMask
));
2187 if (state
->m_invertDATA
== true)
2188 fecOcRegIprInvert
|= InvertDataMask
;
2189 fecOcRegIprInvert
&= (~(FEC_OC_IPR_INVERT_MERR__M
));
2190 if (state
->m_invertERR
== true)
2191 fecOcRegIprInvert
|= FEC_OC_IPR_INVERT_MERR__M
;
2192 fecOcRegIprInvert
&= (~(FEC_OC_IPR_INVERT_MSTRT__M
));
2193 if (state
->m_invertSTR
== true)
2194 fecOcRegIprInvert
|= FEC_OC_IPR_INVERT_MSTRT__M
;
2195 fecOcRegIprInvert
&= (~(FEC_OC_IPR_INVERT_MVAL__M
));
2196 if (state
->m_invertVAL
== true)
2197 fecOcRegIprInvert
|= FEC_OC_IPR_INVERT_MVAL__M
;
2198 fecOcRegIprInvert
&= (~(FEC_OC_IPR_INVERT_MCLK__M
));
2199 if (state
->m_invertCLK
== true)
2200 fecOcRegIprInvert
|= FEC_OC_IPR_INVERT_MCLK__M
;
2202 return write16(state
, FEC_OC_IPR_INVERT__A
, fecOcRegIprInvert
);
2205 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2207 static int SetAgcRf(struct drxk_state
*state
,
2208 struct SCfgAgc
*pAgcCfg
, bool isDTV
)
2210 int status
= -EINVAL
;
2212 struct SCfgAgc
*pIfAgcSettings
;
2216 if (pAgcCfg
== NULL
)
2219 switch (pAgcCfg
->ctrlMode
) {
2220 case DRXK_AGC_CTRL_AUTO
:
2221 /* Enable RF AGC DAC */
2222 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2225 data
&= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
;
2226 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2229 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2233 /* Enable SCU RF AGC loop */
2234 data
&= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M
;
2237 if (state
->m_RfAgcPol
)
2238 data
|= SCU_RAM_AGC_CONFIG_INV_RF_POL__M
;
2240 data
&= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M
;
2241 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2245 /* Set speed (using complementary reduction value) */
2246 status
= read16(state
, SCU_RAM_AGC_KI_RED__A
, &data
);
2250 data
&= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M
;
2251 data
|= (~(pAgcCfg
->speed
<<
2252 SCU_RAM_AGC_KI_RED_RAGC_RED__B
)
2253 & SCU_RAM_AGC_KI_RED_RAGC_RED__M
);
2255 status
= write16(state
, SCU_RAM_AGC_KI_RED__A
, data
);
2260 pIfAgcSettings
= &state
->m_dvbtIfAgcCfg
;
2261 else if (IsQAM(state
))
2262 pIfAgcSettings
= &state
->m_qamIfAgcCfg
;
2264 pIfAgcSettings
= &state
->m_atvIfAgcCfg
;
2265 if (pIfAgcSettings
== NULL
) {
2270 /* Set TOP, only if IF-AGC is in AUTO mode */
2271 if (pIfAgcSettings
->ctrlMode
== DRXK_AGC_CTRL_AUTO
)
2272 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, pAgcCfg
->top
);
2276 /* Cut-Off current */
2277 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_HI_CO__A
, pAgcCfg
->cutOffCurrent
);
2281 /* Max. output level */
2282 status
= write16(state
, SCU_RAM_AGC_RF_MAX__A
, pAgcCfg
->maxOutputLevel
);
2288 case DRXK_AGC_CTRL_USER
:
2289 /* Enable RF AGC DAC */
2290 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2293 data
&= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
;
2294 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2298 /* Disable SCU RF AGC loop */
2299 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2302 data
|= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M
;
2303 if (state
->m_RfAgcPol
)
2304 data
|= SCU_RAM_AGC_CONFIG_INV_RF_POL__M
;
2306 data
&= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M
;
2307 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2311 /* SCU c.o.c. to 0, enabling full control range */
2312 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_HI_CO__A
, 0);
2316 /* Write value to output pin */
2317 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_HI__A
, pAgcCfg
->outputLevel
);
2322 case DRXK_AGC_CTRL_OFF
:
2323 /* Disable RF AGC DAC */
2324 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2327 data
|= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY
;
2328 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2332 /* Disable SCU RF AGC loop */
2333 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2336 data
|= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M
;
2337 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2348 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2352 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2354 static int SetAgcIf(struct drxk_state
*state
,
2355 struct SCfgAgc
*pAgcCfg
, bool isDTV
)
2359 struct SCfgAgc
*pRfAgcSettings
;
2363 switch (pAgcCfg
->ctrlMode
) {
2364 case DRXK_AGC_CTRL_AUTO
:
2366 /* Enable IF AGC DAC */
2367 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2370 data
&= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
;
2371 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2375 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2379 /* Enable SCU IF AGC loop */
2380 data
&= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M
;
2383 if (state
->m_IfAgcPol
)
2384 data
|= SCU_RAM_AGC_CONFIG_INV_IF_POL__M
;
2386 data
&= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M
;
2387 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2391 /* Set speed (using complementary reduction value) */
2392 status
= read16(state
, SCU_RAM_AGC_KI_RED__A
, &data
);
2395 data
&= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M
;
2396 data
|= (~(pAgcCfg
->speed
<<
2397 SCU_RAM_AGC_KI_RED_IAGC_RED__B
)
2398 & SCU_RAM_AGC_KI_RED_IAGC_RED__M
);
2400 status
= write16(state
, SCU_RAM_AGC_KI_RED__A
, data
);
2405 pRfAgcSettings
= &state
->m_qamRfAgcCfg
;
2407 pRfAgcSettings
= &state
->m_atvRfAgcCfg
;
2408 if (pRfAgcSettings
== NULL
)
2411 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, pRfAgcSettings
->top
);
2416 case DRXK_AGC_CTRL_USER
:
2418 /* Enable IF AGC DAC */
2419 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2422 data
&= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
;
2423 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2427 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2431 /* Disable SCU IF AGC loop */
2432 data
|= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M
;
2435 if (state
->m_IfAgcPol
)
2436 data
|= SCU_RAM_AGC_CONFIG_INV_IF_POL__M
;
2438 data
&= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M
;
2439 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2443 /* Write value to output pin */
2444 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, pAgcCfg
->outputLevel
);
2449 case DRXK_AGC_CTRL_OFF
:
2451 /* Disable If AGC DAC */
2452 status
= read16(state
, IQM_AF_STDBY__A
, &data
);
2455 data
|= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
;
2456 status
= write16(state
, IQM_AF_STDBY__A
, data
);
2460 /* Disable SCU IF AGC loop */
2461 status
= read16(state
, SCU_RAM_AGC_CONFIG__A
, &data
);
2464 data
|= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M
;
2465 status
= write16(state
, SCU_RAM_AGC_CONFIG__A
, data
);
2469 } /* switch (agcSettingsIf->ctrlMode) */
2471 /* always set the top to support
2472 configurations without if-loop */
2473 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
, pAgcCfg
->top
);
2476 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2480 static int ReadIFAgc(struct drxk_state
*state
, u32
*pValue
)
2488 status
= read16(state
, IQM_AF_AGC_IF__A
, &agcDacLvl
);
2490 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2496 if (agcDacLvl
> DRXK_AGC_DAC_OFFSET
)
2497 Level
= agcDacLvl
- DRXK_AGC_DAC_OFFSET
;
2499 *pValue
= (14000 - Level
) / 4;
2506 static int GetQAMSignalToNoise(struct drxk_state
*state
,
2507 s32
*pSignalToNoise
)
2510 u16 qamSlErrPower
= 0; /* accum. error between
2511 raw and sliced symbols */
2512 u32 qamSlSigPower
= 0; /* used for MER, depends of
2514 u32 qamSlMer
= 0; /* QAM MER */
2518 /* MER calculation */
2520 /* get the register value needed for MER */
2521 status
= read16(state
, QAM_SL_ERR_POWER__A
, &qamSlErrPower
);
2523 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2527 switch (state
->props
.modulation
) {
2529 qamSlSigPower
= DRXK_QAM_SL_SIG_POWER_QAM16
<< 2;
2532 qamSlSigPower
= DRXK_QAM_SL_SIG_POWER_QAM32
<< 2;
2535 qamSlSigPower
= DRXK_QAM_SL_SIG_POWER_QAM64
<< 2;
2538 qamSlSigPower
= DRXK_QAM_SL_SIG_POWER_QAM128
<< 2;
2542 qamSlSigPower
= DRXK_QAM_SL_SIG_POWER_QAM256
<< 2;
2546 if (qamSlErrPower
> 0) {
2547 qamSlMer
= Log10Times100(qamSlSigPower
) -
2548 Log10Times100((u32
) qamSlErrPower
);
2550 *pSignalToNoise
= qamSlMer
;
2555 static int GetDVBTSignalToNoise(struct drxk_state
*state
,
2556 s32
*pSignalToNoise
)
2560 u32 EqRegTdSqrErrI
= 0;
2561 u32 EqRegTdSqrErrQ
= 0;
2562 u16 EqRegTdSqrErrExp
= 0;
2563 u16 EqRegTdTpsPwrOfs
= 0;
2564 u16 EqRegTdReqSmbCnt
= 0;
2571 u16 transmissionParams
= 0;
2575 status
= read16(state
, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A
, &EqRegTdTpsPwrOfs
);
2578 status
= read16(state
, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A
, &EqRegTdReqSmbCnt
);
2581 status
= read16(state
, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A
, &EqRegTdSqrErrExp
);
2584 status
= read16(state
, OFDM_EQ_TOP_TD_SQR_ERR_I__A
, ®Data
);
2587 /* Extend SQR_ERR_I operational range */
2588 EqRegTdSqrErrI
= (u32
) regData
;
2589 if ((EqRegTdSqrErrExp
> 11) &&
2590 (EqRegTdSqrErrI
< 0x00000FFFUL
)) {
2591 EqRegTdSqrErrI
+= 0x00010000UL
;
2593 status
= read16(state
, OFDM_EQ_TOP_TD_SQR_ERR_Q__A
, ®Data
);
2596 /* Extend SQR_ERR_Q operational range */
2597 EqRegTdSqrErrQ
= (u32
) regData
;
2598 if ((EqRegTdSqrErrExp
> 11) &&
2599 (EqRegTdSqrErrQ
< 0x00000FFFUL
))
2600 EqRegTdSqrErrQ
+= 0x00010000UL
;
2602 status
= read16(state
, OFDM_SC_RA_RAM_OP_PARAM__A
, &transmissionParams
);
2606 /* Check input data for MER */
2608 /* MER calculation (in 0.1 dB) without math.h */
2609 if ((EqRegTdTpsPwrOfs
== 0) || (EqRegTdReqSmbCnt
== 0))
2611 else if ((EqRegTdSqrErrI
+ EqRegTdSqrErrQ
) == 0) {
2612 /* No error at all, this must be the HW reset value
2613 * Apparently no first measurement yet
2617 SqrErrIQ
= (EqRegTdSqrErrI
+ EqRegTdSqrErrQ
) <<
2619 if ((transmissionParams
&
2620 OFDM_SC_RA_RAM_OP_PARAM_MODE__M
)
2621 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K
)
2626 /* IMER = 100 * log10 (x)
2627 where x = (EqRegTdTpsPwrOfs^2 *
2628 EqRegTdReqSmbCnt * tpsCnt)/SqrErrIQ
2631 where a = 100 * log10 (EqRegTdTpsPwrOfs^2)
2632 b = 100 * log10 (EqRegTdReqSmbCnt * tpsCnt)
2633 c = 100 * log10 (SqrErrIQ)
2636 /* log(x) x = 9bits * 9bits->18 bits */
2637 a
= Log10Times100(EqRegTdTpsPwrOfs
*
2639 /* log(x) x = 16bits * 7bits->23 bits */
2640 b
= Log10Times100(EqRegTdReqSmbCnt
* tpsCnt
);
2641 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2642 c
= Log10Times100(SqrErrIQ
);
2645 /* No negative MER, clip to zero */
2651 *pSignalToNoise
= iMER
;
2655 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2659 static int GetSignalToNoise(struct drxk_state
*state
, s32
*pSignalToNoise
)
2663 *pSignalToNoise
= 0;
2664 switch (state
->m_OperationMode
) {
2666 return GetDVBTSignalToNoise(state
, pSignalToNoise
);
2669 return GetQAMSignalToNoise(state
, pSignalToNoise
);
2677 static int GetDVBTQuality(struct drxk_state
*state
, s32
*pQuality
)
2679 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2684 static s32 QE_SN
[] = {
2690 108, /* 16-QAM 1/2 */
2691 131, /* 16-QAM 2/3 */
2692 146, /* 16-QAM 3/4 */
2693 156, /* 16-QAM 5/6 */
2694 160, /* 16-QAM 7/8 */
2695 165, /* 64-QAM 1/2 */
2696 187, /* 64-QAM 2/3 */
2697 202, /* 64-QAM 3/4 */
2698 216, /* 64-QAM 5/6 */
2699 225, /* 64-QAM 7/8 */
2705 s32 SignalToNoise
= 0;
2706 u16 Constellation
= 0;
2708 u32 SignalToNoiseRel
;
2711 status
= GetDVBTSignalToNoise(state
, &SignalToNoise
);
2714 status
= read16(state
, OFDM_EQ_TOP_TD_TPS_CONST__A
, &Constellation
);
2717 Constellation
&= OFDM_EQ_TOP_TD_TPS_CONST__M
;
2719 status
= read16(state
, OFDM_EQ_TOP_TD_TPS_CODE_HP__A
, &CodeRate
);
2722 CodeRate
&= OFDM_EQ_TOP_TD_TPS_CODE_HP__M
;
2724 if (Constellation
> OFDM_EQ_TOP_TD_TPS_CONST_64QAM
||
2725 CodeRate
> OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8
)
2727 SignalToNoiseRel
= SignalToNoise
-
2728 QE_SN
[Constellation
* 5 + CodeRate
];
2731 if (SignalToNoiseRel
< -70)
2733 else if (SignalToNoiseRel
< 30)
2734 *pQuality
= ((SignalToNoiseRel
+ 70) *
2737 *pQuality
= BERQuality
;
2742 static int GetDVBCQuality(struct drxk_state
*state
, s32
*pQuality
)
2750 u32 SignalToNoise
= 0;
2751 u32 BERQuality
= 100;
2752 u32 SignalToNoiseRel
= 0;
2754 status
= GetQAMSignalToNoise(state
, &SignalToNoise
);
2758 switch (state
->props
.modulation
) {
2760 SignalToNoiseRel
= SignalToNoise
- 200;
2763 SignalToNoiseRel
= SignalToNoise
- 230;
2764 break; /* Not in NorDig */
2766 SignalToNoiseRel
= SignalToNoise
- 260;
2769 SignalToNoiseRel
= SignalToNoise
- 290;
2773 SignalToNoiseRel
= SignalToNoise
- 320;
2777 if (SignalToNoiseRel
< -70)
2779 else if (SignalToNoiseRel
< 30)
2780 *pQuality
= ((SignalToNoiseRel
+ 70) *
2783 *pQuality
= BERQuality
;
2789 static int GetQuality(struct drxk_state
*state
, s32
*pQuality
)
2793 switch (state
->m_OperationMode
) {
2795 return GetDVBTQuality(state
, pQuality
);
2797 return GetDVBCQuality(state
, pQuality
);
2806 /* Free data ram in SIO HI */
2807 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2808 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2810 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2811 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2812 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2813 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2815 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2816 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2817 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2819 static int ConfigureI2CBridge(struct drxk_state
*state
, bool bEnableBridge
)
2821 int status
= -EINVAL
;
2825 if (state
->m_DrxkState
== DRXK_UNINITIALIZED
)
2827 if (state
->m_DrxkState
== DRXK_POWERED_DOWN
)
2830 if (state
->no_i2c_bridge
)
2833 status
= write16(state
, SIO_HI_RA_RAM_PAR_1__A
, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY
);
2836 if (bEnableBridge
) {
2837 status
= write16(state
, SIO_HI_RA_RAM_PAR_2__A
, SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED
);
2841 status
= write16(state
, SIO_HI_RA_RAM_PAR_2__A
, SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN
);
2846 status
= HI_Command(state
, SIO_HI_RA_RAM_CMD_BRDCTRL
, 0);
2850 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2854 static int SetPreSaw(struct drxk_state
*state
,
2855 struct SCfgPreSaw
*pPreSawCfg
)
2857 int status
= -EINVAL
;
2861 if ((pPreSawCfg
== NULL
)
2862 || (pPreSawCfg
->reference
> IQM_AF_PDREF__M
))
2865 status
= write16(state
, IQM_AF_PDREF__A
, pPreSawCfg
->reference
);
2868 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2872 static int BLDirectCmd(struct drxk_state
*state
, u32 targetAddr
,
2873 u16 romOffset
, u16 nrOfElements
, u32 timeOut
)
2876 u16 offset
= (u16
) ((targetAddr
>> 0) & 0x00FFFF);
2877 u16 blockbank
= (u16
) ((targetAddr
>> 16) & 0x000FFF);
2883 mutex_lock(&state
->mutex
);
2884 status
= write16(state
, SIO_BL_MODE__A
, SIO_BL_MODE_DIRECT
);
2887 status
= write16(state
, SIO_BL_TGT_HDR__A
, blockbank
);
2890 status
= write16(state
, SIO_BL_TGT_ADDR__A
, offset
);
2893 status
= write16(state
, SIO_BL_SRC_ADDR__A
, romOffset
);
2896 status
= write16(state
, SIO_BL_SRC_LEN__A
, nrOfElements
);
2899 status
= write16(state
, SIO_BL_ENABLE__A
, SIO_BL_ENABLE_ON
);
2903 end
= jiffies
+ msecs_to_jiffies(timeOut
);
2905 status
= read16(state
, SIO_BL_STATUS__A
, &blStatus
);
2908 } while ((blStatus
== 0x1) && time_is_after_jiffies(end
));
2909 if (blStatus
== 0x1) {
2910 printk(KERN_ERR
"drxk: SIO not ready\n");
2916 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2918 mutex_unlock(&state
->mutex
);
2923 static int ADCSyncMeasurement(struct drxk_state
*state
, u16
*count
)
2930 /* Start measurement */
2931 status
= write16(state
, IQM_AF_COMM_EXEC__A
, IQM_AF_COMM_EXEC_ACTIVE
);
2934 status
= write16(state
, IQM_AF_START_LOCK__A
, 1);
2939 status
= read16(state
, IQM_AF_PHASE0__A
, &data
);
2943 *count
= *count
+ 1;
2944 status
= read16(state
, IQM_AF_PHASE1__A
, &data
);
2948 *count
= *count
+ 1;
2949 status
= read16(state
, IQM_AF_PHASE2__A
, &data
);
2953 *count
= *count
+ 1;
2957 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
2961 static int ADCSynchronization(struct drxk_state
*state
)
2968 status
= ADCSyncMeasurement(state
, &count
);
2973 /* Try sampling on a diffrent edge */
2976 status
= read16(state
, IQM_AF_CLKNEG__A
, &clkNeg
);
2979 if ((clkNeg
| IQM_AF_CLKNEG_CLKNEGDATA__M
) ==
2980 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS
) {
2981 clkNeg
&= (~(IQM_AF_CLKNEG_CLKNEGDATA__M
));
2983 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG
;
2985 clkNeg
&= (~(IQM_AF_CLKNEG_CLKNEGDATA__M
));
2987 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS
;
2989 status
= write16(state
, IQM_AF_CLKNEG__A
, clkNeg
);
2992 status
= ADCSyncMeasurement(state
, &count
);
3001 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3005 static int SetFrequencyShifter(struct drxk_state
*state
,
3006 u16 intermediateFreqkHz
,
3007 s32 tunerFreqOffset
, bool isDTV
)
3009 bool selectPosImage
= false;
3010 u32 rfFreqResidual
= tunerFreqOffset
;
3011 u32 fmFrequencyShift
= 0;
3012 bool tunerMirror
= !state
->m_bMirrorFreqSpect
;
3017 u32 samplingFrequency
= (u32
) (state
->m_sysClockFreq
/ 3);
3024 Program frequency shifter
3025 No need to account for mirroring on RF
3028 if ((state
->m_OperationMode
== OM_QAM_ITU_A
) ||
3029 (state
->m_OperationMode
== OM_QAM_ITU_C
) ||
3030 (state
->m_OperationMode
== OM_DVBT
))
3031 selectPosImage
= true;
3033 selectPosImage
= false;
3036 /* tuner doesn't mirror */
3037 ifFreqActual
= intermediateFreqkHz
+
3038 rfFreqResidual
+ fmFrequencyShift
;
3041 ifFreqActual
= intermediateFreqkHz
-
3042 rfFreqResidual
- fmFrequencyShift
;
3043 if (ifFreqActual
> samplingFrequency
/ 2) {
3045 adcFreq
= samplingFrequency
- ifFreqActual
;
3048 /* adc doesn't mirror */
3049 adcFreq
= ifFreqActual
;
3053 frequencyShift
= adcFreq
;
3054 imageToSelect
= state
->m_rfmirror
^ tunerMirror
^
3055 adcFlip
^ selectPosImage
;
3056 state
->m_IqmFsRateOfs
=
3057 Frac28a((frequencyShift
), samplingFrequency
);
3060 state
->m_IqmFsRateOfs
= ~state
->m_IqmFsRateOfs
+ 1;
3062 /* Program frequency shifter with tuner offset compensation */
3063 /* frequencyShift += tunerFreqOffset; TODO */
3064 status
= write32(state
, IQM_FS_RATE_OFS_LO__A
,
3065 state
->m_IqmFsRateOfs
);
3067 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3071 static int InitAGC(struct drxk_state
*state
, bool isDTV
)
3074 u16 ingainTgtMin
= 0;
3075 u16 ingainTgtMax
= 0;
3083 u16 kiInnergainMin
= 0;
3084 u16 ifIaccuHiTgt
= 0;
3085 u16 ifIaccuHiTgtMin
= 0;
3086 u16 ifIaccuHiTgtMax
= 0;
3088 u16 fastClpCtrlDelay
= 0;
3089 u16 clpCtrlMode
= 0;
3094 /* Common settings */
3096 ifIaccuHiTgtMin
= 2047;
3100 /* AGCInit() not available for DVBT; init done in microcode */
3101 if (!IsQAM(state
)) {
3102 printk(KERN_ERR
"drxk: %s: mode %d is not DVB-C\n", __func__
, state
->m_OperationMode
);
3106 /* FIXME: Analog TV AGC require different settings */
3108 /* Standard specific settings */
3110 clpDirTo
= (u16
) -9;
3113 snsDirTo
= (u16
) -9;
3114 kiInnergainMin
= (u16
) -1030;
3115 ifIaccuHiTgtMax
= 0x2380;
3116 ifIaccuHiTgt
= 0x2380;
3117 ingainTgtMin
= 0x0511;
3119 ingainTgtMax
= 5119;
3120 fastClpCtrlDelay
= state
->m_qamIfAgcCfg
.FastClipCtrlDelay
;
3122 status
= write16(state
, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A
, fastClpCtrlDelay
);
3126 status
= write16(state
, SCU_RAM_AGC_CLP_CTRL_MODE__A
, clpCtrlMode
);
3129 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT__A
, ingainTgt
);
3132 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT_MIN__A
, ingainTgtMin
);
3135 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT_MAX__A
, ingainTgtMax
);
3138 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A
, ifIaccuHiTgtMin
);
3141 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A
, ifIaccuHiTgtMax
);
3144 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI__A
, 0);
3147 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_LO__A
, 0);
3150 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_HI__A
, 0);
3153 status
= write16(state
, SCU_RAM_AGC_RF_IACCU_LO__A
, 0);
3156 status
= write16(state
, SCU_RAM_AGC_CLP_SUM_MAX__A
, clpSumMax
);
3159 status
= write16(state
, SCU_RAM_AGC_SNS_SUM_MAX__A
, snsSumMax
);
3163 status
= write16(state
, SCU_RAM_AGC_KI_INNERGAIN_MIN__A
, kiInnergainMin
);
3166 status
= write16(state
, SCU_RAM_AGC_IF_IACCU_HI_TGT__A
, ifIaccuHiTgt
);
3169 status
= write16(state
, SCU_RAM_AGC_CLP_CYCLEN__A
, clpCyclen
);
3173 status
= write16(state
, SCU_RAM_AGC_RF_SNS_DEV_MAX__A
, 1023);
3176 status
= write16(state
, SCU_RAM_AGC_RF_SNS_DEV_MIN__A
, (u16
) -1023);
3179 status
= write16(state
, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A
, 50);
3183 status
= write16(state
, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A
, 20);
3186 status
= write16(state
, SCU_RAM_AGC_CLP_SUM_MIN__A
, clpSumMin
);
3189 status
= write16(state
, SCU_RAM_AGC_SNS_SUM_MIN__A
, snsSumMin
);
3192 status
= write16(state
, SCU_RAM_AGC_CLP_DIR_TO__A
, clpDirTo
);
3195 status
= write16(state
, SCU_RAM_AGC_SNS_DIR_TO__A
, snsDirTo
);
3198 status
= write16(state
, SCU_RAM_AGC_KI_MINGAIN__A
, 0x7fff);
3201 status
= write16(state
, SCU_RAM_AGC_KI_MAXGAIN__A
, 0x0);
3204 status
= write16(state
, SCU_RAM_AGC_KI_MIN__A
, 0x0117);
3207 status
= write16(state
, SCU_RAM_AGC_KI_MAX__A
, 0x0657);
3210 status
= write16(state
, SCU_RAM_AGC_CLP_SUM__A
, 0);
3213 status
= write16(state
, SCU_RAM_AGC_CLP_CYCCNT__A
, 0);
3216 status
= write16(state
, SCU_RAM_AGC_CLP_DIR_WD__A
, 0);
3219 status
= write16(state
, SCU_RAM_AGC_CLP_DIR_STP__A
, 1);
3222 status
= write16(state
, SCU_RAM_AGC_SNS_SUM__A
, 0);
3225 status
= write16(state
, SCU_RAM_AGC_SNS_CYCCNT__A
, 0);
3228 status
= write16(state
, SCU_RAM_AGC_SNS_DIR_WD__A
, 0);
3231 status
= write16(state
, SCU_RAM_AGC_SNS_DIR_STP__A
, 1);
3234 status
= write16(state
, SCU_RAM_AGC_SNS_CYCLEN__A
, 500);
3237 status
= write16(state
, SCU_RAM_AGC_KI_CYCLEN__A
, 500);
3241 /* Initialize inner-loop KI gain factors */
3242 status
= read16(state
, SCU_RAM_AGC_KI__A
, &data
);
3247 data
&= ~SCU_RAM_AGC_KI_RF__M
;
3248 data
|= (DRXK_KI_RAGC_QAM
<< SCU_RAM_AGC_KI_RF__B
);
3249 data
&= ~SCU_RAM_AGC_KI_IF__M
;
3250 data
|= (DRXK_KI_IAGC_QAM
<< SCU_RAM_AGC_KI_IF__B
);
3252 status
= write16(state
, SCU_RAM_AGC_KI__A
, data
);
3255 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3259 static int DVBTQAMGetAccPktErr(struct drxk_state
*state
, u16
*packetErr
)
3264 if (packetErr
== NULL
)
3265 status
= write16(state
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, 0);
3267 status
= read16(state
, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A
, packetErr
);
3269 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3273 static int DVBTScCommand(struct drxk_state
*state
,
3274 u16 cmd
, u16 subcmd
,
3275 u16 param0
, u16 param1
, u16 param2
,
3276 u16 param3
, u16 param4
)
3285 status
= read16(state
, OFDM_SC_COMM_EXEC__A
, &scExec
);
3287 /* SC is not running */
3293 /* Wait until sc is ready to receive command */
3297 status
= read16(state
, OFDM_SC_RA_RAM_CMD__A
, &curCmd
);
3299 } while ((curCmd
!= 0) && (retryCnt
< DRXK_MAX_RETRIES
));
3300 if (retryCnt
>= DRXK_MAX_RETRIES
&& (status
< 0))
3303 /* Write sub-command */
3305 /* All commands using sub-cmd */
3306 case OFDM_SC_RA_RAM_CMD_PROC_START
:
3307 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM
:
3308 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM
:
3309 status
= write16(state
, OFDM_SC_RA_RAM_CMD_ADDR__A
, subcmd
);
3318 /* Write needed parameters and the command */
3320 /* All commands using 5 parameters */
3321 /* All commands using 4 parameters */
3322 /* All commands using 3 parameters */
3323 /* All commands using 2 parameters */
3324 case OFDM_SC_RA_RAM_CMD_PROC_START
:
3325 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM
:
3326 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM
:
3327 status
= write16(state
, OFDM_SC_RA_RAM_PARAM1__A
, param1
);
3328 /* All commands using 1 parameters */
3329 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING
:
3330 case OFDM_SC_RA_RAM_CMD_USER_IO
:
3331 status
= write16(state
, OFDM_SC_RA_RAM_PARAM0__A
, param0
);
3332 /* All commands using 0 parameters */
3333 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM
:
3334 case OFDM_SC_RA_RAM_CMD_NULL
:
3336 status
= write16(state
, OFDM_SC_RA_RAM_CMD__A
, cmd
);
3339 /* Unknown command */
3345 /* Wait until sc is ready processing command */
3349 status
= read16(state
, OFDM_SC_RA_RAM_CMD__A
, &curCmd
);
3351 } while ((curCmd
!= 0) && (retryCnt
< DRXK_MAX_RETRIES
));
3352 if (retryCnt
>= DRXK_MAX_RETRIES
&& (status
< 0))
3355 /* Check for illegal cmd */
3356 status
= read16(state
, OFDM_SC_RA_RAM_CMD_ADDR__A
, &errCode
);
3357 if (errCode
== 0xFFFF) {
3358 /* illegal command */
3364 /* Retreive results parameters from SC */
3366 /* All commands yielding 5 results */
3367 /* All commands yielding 4 results */
3368 /* All commands yielding 3 results */
3369 /* All commands yielding 2 results */
3370 /* All commands yielding 1 result */
3371 case OFDM_SC_RA_RAM_CMD_USER_IO
:
3372 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM
:
3373 status
= read16(state
, OFDM_SC_RA_RAM_PARAM0__A
, &(param0
));
3374 /* All commands yielding 0 results */
3375 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING
:
3376 case OFDM_SC_RA_RAM_CMD_SET_TIMER
:
3377 case OFDM_SC_RA_RAM_CMD_PROC_START
:
3378 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM
:
3379 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM
:
3380 case OFDM_SC_RA_RAM_CMD_NULL
:
3383 /* Unknown command */
3386 } /* switch (cmd->cmd) */
3389 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3393 static int PowerUpDVBT(struct drxk_state
*state
)
3395 enum DRXPowerMode powerMode
= DRX_POWER_UP
;
3399 status
= CtrlPowerMode(state
, &powerMode
);
3401 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3405 static int DVBTCtrlSetIncEnable(struct drxk_state
*state
, bool *enabled
)
3410 if (*enabled
== true)
3411 status
= write16(state
, IQM_CF_BYPASSDET__A
, 0);
3413 status
= write16(state
, IQM_CF_BYPASSDET__A
, 1);
3415 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3419 #define DEFAULT_FR_THRES_8K 4000
3420 static int DVBTCtrlSetFrEnable(struct drxk_state
*state
, bool *enabled
)
3426 if (*enabled
== true) {
3427 /* write mask to 1 */
3428 status
= write16(state
, OFDM_SC_RA_RAM_FR_THRES_8K__A
,
3429 DEFAULT_FR_THRES_8K
);
3431 /* write mask to 0 */
3432 status
= write16(state
, OFDM_SC_RA_RAM_FR_THRES_8K__A
, 0);
3435 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3440 static int DVBTCtrlSetEchoThreshold(struct drxk_state
*state
,
3441 struct DRXKCfgDvbtEchoThres_t
*echoThres
)
3447 status
= read16(state
, OFDM_SC_RA_RAM_ECHO_THRES__A
, &data
);
3451 switch (echoThres
->fftMode
) {
3452 case DRX_FFTMODE_2K
:
3453 data
&= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M
;
3454 data
|= ((echoThres
->threshold
<<
3455 OFDM_SC_RA_RAM_ECHO_THRES_2K__B
)
3456 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M
));
3458 case DRX_FFTMODE_8K
:
3459 data
&= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M
;
3460 data
|= ((echoThres
->threshold
<<
3461 OFDM_SC_RA_RAM_ECHO_THRES_8K__B
)
3462 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M
));
3468 status
= write16(state
, OFDM_SC_RA_RAM_ECHO_THRES__A
, data
);
3471 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3475 static int DVBTCtrlSetSqiSpeed(struct drxk_state
*state
,
3476 enum DRXKCfgDvbtSqiSpeed
*speed
)
3478 int status
= -EINVAL
;
3483 case DRXK_DVBT_SQI_SPEED_FAST
:
3484 case DRXK_DVBT_SQI_SPEED_MEDIUM
:
3485 case DRXK_DVBT_SQI_SPEED_SLOW
:
3490 status
= write16(state
, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A
,
3494 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3498 /*============================================================================*/
3501 * \brief Activate DVBT specific presets
3502 * \param demod instance of demodulator.
3503 * \return DRXStatus_t.
3505 * Called in DVBTSetStandard
3508 static int DVBTActivatePresets(struct drxk_state
*state
)
3511 bool setincenable
= false;
3512 bool setfrenable
= true;
3514 struct DRXKCfgDvbtEchoThres_t echoThres2k
= { 0, DRX_FFTMODE_2K
};
3515 struct DRXKCfgDvbtEchoThres_t echoThres8k
= { 0, DRX_FFTMODE_8K
};
3518 status
= DVBTCtrlSetIncEnable(state
, &setincenable
);
3521 status
= DVBTCtrlSetFrEnable(state
, &setfrenable
);
3524 status
= DVBTCtrlSetEchoThreshold(state
, &echoThres2k
);
3527 status
= DVBTCtrlSetEchoThreshold(state
, &echoThres8k
);
3530 status
= write16(state
, SCU_RAM_AGC_INGAIN_TGT_MAX__A
, state
->m_dvbtIfAgcCfg
.IngainTgtMax
);
3533 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3537 /*============================================================================*/
3540 * \brief Initialize channelswitch-independent settings for DVBT.
3541 * \param demod instance of demodulator.
3542 * \return DRXStatus_t.
3544 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3545 * the DVB-T taps from the drxk_filters.h are used.
3547 static int SetDVBTStandard(struct drxk_state
*state
,
3548 enum OperationMode oMode
)
3557 /* added antenna switch */
3558 SwitchAntennaToDVBT(state
);
3559 /* send OFDM reset command */
3560 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
| SCU_RAM_COMMAND_CMD_DEMOD_RESET
, 0, NULL
, 1, &cmdResult
);
3564 /* send OFDM setenv command */
3565 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
| SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV
, 0, NULL
, 1, &cmdResult
);
3569 /* reset datapath for OFDM, processors first */
3570 status
= write16(state
, OFDM_SC_COMM_EXEC__A
, OFDM_SC_COMM_EXEC_STOP
);
3573 status
= write16(state
, OFDM_LC_COMM_EXEC__A
, OFDM_LC_COMM_EXEC_STOP
);
3576 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_STOP
);
3581 /* synchronize on ofdstate->m_festart */
3582 status
= write16(state
, IQM_AF_UPD_SEL__A
, 1);
3585 /* window size for clipping ADC detection */
3586 status
= write16(state
, IQM_AF_CLP_LEN__A
, 0);
3589 /* window size for for sense pre-SAW detection */
3590 status
= write16(state
, IQM_AF_SNS_LEN__A
, 0);
3593 /* sense threshold for sense pre-SAW detection */
3594 status
= write16(state
, IQM_AF_AMUX__A
, IQM_AF_AMUX_SIGNAL2ADC
);
3597 status
= SetIqmAf(state
, true);
3601 status
= write16(state
, IQM_AF_AGC_RF__A
, 0);
3605 /* Impulse noise cruncher setup */
3606 status
= write16(state
, IQM_AF_INC_LCT__A
, 0); /* crunch in IQM_CF */
3609 status
= write16(state
, IQM_CF_DET_LCT__A
, 0); /* detect in IQM_CF */
3612 status
= write16(state
, IQM_CF_WND_LEN__A
, 3); /* peak detector window length */
3616 status
= write16(state
, IQM_RC_STRETCH__A
, 16);
3619 status
= write16(state
, IQM_CF_OUT_ENA__A
, 0x4); /* enable output 2 */
3622 status
= write16(state
, IQM_CF_DS_ENA__A
, 0x4); /* decimate output 2 */
3625 status
= write16(state
, IQM_CF_SCALE__A
, 1600);
3628 status
= write16(state
, IQM_CF_SCALE_SH__A
, 0);
3632 /* virtual clipping threshold for clipping ADC detection */
3633 status
= write16(state
, IQM_AF_CLP_TH__A
, 448);
3636 status
= write16(state
, IQM_CF_DATATH__A
, 495); /* crunching threshold */
3640 status
= BLChainCmd(state
, DRXK_BL_ROM_OFFSET_TAPS_DVBT
, DRXK_BLCC_NR_ELEMENTS_TAPS
, DRXK_BLC_TIMEOUT
);
3644 status
= write16(state
, IQM_CF_PKDTH__A
, 2); /* peak detector threshold */
3647 status
= write16(state
, IQM_CF_POW_MEAS_LEN__A
, 2);
3650 /* enable power measurement interrupt */
3651 status
= write16(state
, IQM_CF_COMM_INT_MSK__A
, 1);
3654 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_ACTIVE
);
3658 /* IQM will not be reset from here, sync ADC and update/init AGC */
3659 status
= ADCSynchronization(state
);
3662 status
= SetPreSaw(state
, &state
->m_dvbtPreSawCfg
);
3666 /* Halt SCU to enable safe non-atomic accesses */
3667 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_HOLD
);
3671 status
= SetAgcRf(state
, &state
->m_dvbtRfAgcCfg
, true);
3674 status
= SetAgcIf(state
, &state
->m_dvbtIfAgcCfg
, true);
3678 /* Set Noise Estimation notch width and enable DC fix */
3679 status
= read16(state
, OFDM_SC_RA_RAM_CONFIG__A
, &data
);
3682 data
|= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M
;
3683 status
= write16(state
, OFDM_SC_RA_RAM_CONFIG__A
, data
);
3687 /* Activate SCU to enable SCU commands */
3688 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
3692 if (!state
->m_DRXK_A3_ROM_CODE
) {
3693 /* AGCInit() is not done for DVBT, so set agcFastClipCtrlDelay */
3694 status
= write16(state
, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A
, state
->m_dvbtIfAgcCfg
.FastClipCtrlDelay
);
3700 #ifdef COMPILE_FOR_NONRT
3701 status
= write16(state
, OFDM_SC_RA_RAM_BE_OPT_DELAY__A
, 1);
3704 status
= write16(state
, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A
, 2);
3710 status
= write16(state
, FEC_DI_INPUT_CTL__A
, 1); /* OFDM input */
3715 #ifdef COMPILE_FOR_NONRT
3716 status
= write16(state
, FEC_RS_MEASUREMENT_PERIOD__A
, 0x400);
3720 status
= write16(state
, FEC_RS_MEASUREMENT_PERIOD__A
, 0x1000);
3724 status
= write16(state
, FEC_RS_MEASUREMENT_PRESCALE__A
, 0x0001);
3728 /* Setup MPEG bus */
3729 status
= MPEGTSDtoSetup(state
, OM_DVBT
);
3732 /* Set DVBT Presets */
3733 status
= DVBTActivatePresets(state
);
3739 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3743 /*============================================================================*/
3745 * \brief Start dvbt demodulating for channel.
3746 * \param demod instance of demodulator.
3747 * \return DRXStatus_t.
3749 static int DVBTStart(struct drxk_state
*state
)
3753 /* DRXKOfdmScCmd_t scCmd; */
3756 /* Start correct processes to get in lock */
3757 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3758 param1
= OFDM_SC_RA_RAM_LOCKTRACK_MIN
;
3759 status
= DVBTScCommand(state
, OFDM_SC_RA_RAM_CMD_PROC_START
, 0, OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M
, param1
, 0, 0, 0);
3763 status
= MPEGTSStart(state
);
3766 status
= write16(state
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_ACTIVE
);
3771 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
3776 /*============================================================================*/
3779 * \brief Set up dvbt demodulator for channel.
3780 * \param demod instance of demodulator.
3781 * \return DRXStatus_t.
3782 * // original DVBTSetChannel()
3784 static int SetDVBT(struct drxk_state
*state
, u16 IntermediateFreqkHz
,
3785 s32 tunerFreqOffset
)
3788 u16 transmissionParams
= 0;
3789 u16 operationMode
= 0;
3790 u32 iqmRcRateOfs
= 0;
3795 dprintk(1, "IF =%d, TFO = %d\n", IntermediateFreqkHz
, tunerFreqOffset
);
3797 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
| SCU_RAM_COMMAND_CMD_DEMOD_STOP
, 0, NULL
, 1, &cmdResult
);
3801 /* Halt SCU to enable safe non-atomic accesses */
3802 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_HOLD
);
3806 /* Stop processors */
3807 status
= write16(state
, OFDM_SC_COMM_EXEC__A
, OFDM_SC_COMM_EXEC_STOP
);
3810 status
= write16(state
, OFDM_LC_COMM_EXEC__A
, OFDM_LC_COMM_EXEC_STOP
);
3814 /* Mandatory fix, always stop CP, required to set spl offset back to
3815 hardware default (is set to 0 by ucode during pilot detection */
3816 status
= write16(state
, OFDM_CP_COMM_EXEC__A
, OFDM_CP_COMM_EXEC_STOP
);
3820 /*== Write channel settings to device =====================================*/
3823 switch (state
->props
.transmission_mode
) {
3824 case TRANSMISSION_MODE_AUTO
:
3826 operationMode
|= OFDM_SC_RA_RAM_OP_AUTO_MODE__M
;
3827 /* fall through , try first guess DRX_FFTMODE_8K */
3828 case TRANSMISSION_MODE_8K
:
3829 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K
;
3831 case TRANSMISSION_MODE_2K
:
3832 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K
;
3837 switch (state
->props
.guard_interval
) {
3839 case GUARD_INTERVAL_AUTO
:
3840 operationMode
|= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M
;
3841 /* fall through , try first guess DRX_GUARD_1DIV4 */
3842 case GUARD_INTERVAL_1_4
:
3843 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4
;
3845 case GUARD_INTERVAL_1_32
:
3846 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32
;
3848 case GUARD_INTERVAL_1_16
:
3849 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16
;
3851 case GUARD_INTERVAL_1_8
:
3852 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8
;
3857 switch (state
->props
.hierarchy
) {
3858 case HIERARCHY_AUTO
:
3859 case HIERARCHY_NONE
:
3861 operationMode
|= OFDM_SC_RA_RAM_OP_AUTO_HIER__M
;
3862 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3863 /* transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3866 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1
;
3869 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2
;
3872 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4
;
3878 switch (state
->props
.modulation
) {
3881 operationMode
|= OFDM_SC_RA_RAM_OP_AUTO_CONST__M
;
3882 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3884 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64
;
3887 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK
;
3890 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16
;
3894 /* No hierachical channels support in BDA */
3895 /* Priority (only for hierarchical channels) */
3896 switch (channel
->priority
) {
3897 case DRX_PRIORITY_LOW
:
3898 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO
;
3899 WR16(devAddr
, OFDM_EC_SB_PRIOR__A
,
3900 OFDM_EC_SB_PRIOR_LO
);
3902 case DRX_PRIORITY_HIGH
:
3903 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI
;
3904 WR16(devAddr
, OFDM_EC_SB_PRIOR__A
,
3905 OFDM_EC_SB_PRIOR_HI
));
3907 case DRX_PRIORITY_UNKNOWN
: /* fall through */
3913 /* Set Priorty high */
3914 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI
;
3915 status
= write16(state
, OFDM_EC_SB_PRIOR__A
, OFDM_EC_SB_PRIOR_HI
);
3921 switch (state
->props
.code_rate_HP
) {
3924 operationMode
|= OFDM_SC_RA_RAM_OP_AUTO_RATE__M
;
3925 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3927 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3
;
3930 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2
;
3933 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4
;
3936 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6
;
3939 transmissionParams
|= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8
;
3943 /* SAW filter selection: normaly not necesarry, but if wanted
3944 the application can select a SAW filter via the driver by using UIOs */
3945 /* First determine real bandwidth (Hz) */
3946 /* Also set delay for impulse noise cruncher */
3947 /* Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is changed
3948 by SC for fix for some 8K,1/8 guard but is restored by InitEC and ResetEC
3950 switch (state
->props
.bandwidth_hz
) {
3952 state
->props
.bandwidth_hz
= 8000000;
3955 bandwidth
= DRXK_BANDWIDTH_8MHZ_IN_HZ
;
3956 status
= write16(state
, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A
, 3052);
3959 /* cochannel protection for PAL 8 MHz */
3960 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A
, 7);
3963 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A
, 7);
3966 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A
, 7);
3969 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A
, 1);
3974 bandwidth
= DRXK_BANDWIDTH_7MHZ_IN_HZ
;
3975 status
= write16(state
, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A
, 3491);
3978 /* cochannel protection for PAL 7 MHz */
3979 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A
, 8);
3982 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A
, 8);
3985 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A
, 4);
3988 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A
, 1);
3993 bandwidth
= DRXK_BANDWIDTH_6MHZ_IN_HZ
;
3994 status
= write16(state
, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A
, 4073);
3997 /* cochannel protection for NTSC 6 MHz */
3998 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A
, 19);
4001 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A
, 19);
4004 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A
, 14);
4007 status
= write16(state
, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A
, 1);
4016 if (iqmRcRateOfs
== 0) {
4017 /* Now compute IQM_RC_RATE_OFS
4018 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
4020 ((SysFreq / BandWidth) * (2^21)) - (2^23)
4022 /* (SysFreq / BandWidth) * (2^28) */
4023 /* assert (MAX(sysClk)/MIN(bandwidth) < 16)
4024 => assert(MAX(sysClk) < 16*MIN(bandwidth))
4025 => assert(109714272 > 48000000) = true so Frac 28 can be used */
4026 iqmRcRateOfs
= Frac28a((u32
)
4027 ((state
->m_sysClockFreq
*
4028 1000) / 3), bandwidth
);
4029 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
4030 if ((iqmRcRateOfs
& 0x7fL
) >= 0x40)
4031 iqmRcRateOfs
+= 0x80L
;
4032 iqmRcRateOfs
= iqmRcRateOfs
>> 7;
4033 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
4034 iqmRcRateOfs
= iqmRcRateOfs
- (1 << 23);
4038 ((((u32
) IQM_RC_RATE_OFS_HI__M
) <<
4039 IQM_RC_RATE_OFS_LO__W
) | IQM_RC_RATE_OFS_LO__M
);
4040 status
= write32(state
, IQM_RC_RATE_OFS_LO__A
, iqmRcRateOfs
);
4044 /* Bandwidth setting done */
4047 status
= DVBTSetFrequencyShift(demod
, channel
, tunerOffset
);
4051 status
= SetFrequencyShifter(state
, IntermediateFreqkHz
, tunerFreqOffset
, true);
4055 /*== Start SC, write channel settings to SC ===============================*/
4057 /* Activate SCU to enable SCU commands */
4058 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
4062 /* Enable SC after setting all other parameters */
4063 status
= write16(state
, OFDM_SC_COMM_STATE__A
, 0);
4066 status
= write16(state
, OFDM_SC_COMM_EXEC__A
, 1);
4071 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_OFDM
| SCU_RAM_COMMAND_CMD_DEMOD_START
, 0, NULL
, 1, &cmdResult
);
4075 /* Write SC parameter registers, set all AUTO flags in operation mode */
4076 param1
= (OFDM_SC_RA_RAM_OP_AUTO_MODE__M
|
4077 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M
|
4078 OFDM_SC_RA_RAM_OP_AUTO_CONST__M
|
4079 OFDM_SC_RA_RAM_OP_AUTO_HIER__M
|
4080 OFDM_SC_RA_RAM_OP_AUTO_RATE__M
);
4081 status
= DVBTScCommand(state
, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM
,
4082 0, transmissionParams
, param1
, 0, 0, 0);
4086 if (!state
->m_DRXK_A3_ROM_CODE
)
4087 status
= DVBTCtrlSetSqiSpeed(state
, &state
->m_sqiSpeed
);
4090 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
4096 /*============================================================================*/
4099 * \brief Retreive lock status .
4100 * \param demod Pointer to demodulator instance.
4101 * \param lockStat Pointer to lock status structure.
4102 * \return DRXStatus_t.
4105 static int GetDVBTLockStatus(struct drxk_state
*state
, u32
*pLockStatus
)
4108 const u16 mpeg_lock_mask
= (OFDM_SC_RA_RAM_LOCK_MPEG__M
|
4109 OFDM_SC_RA_RAM_LOCK_FEC__M
);
4110 const u16 fec_lock_mask
= (OFDM_SC_RA_RAM_LOCK_FEC__M
);
4111 const u16 demod_lock_mask
= OFDM_SC_RA_RAM_LOCK_DEMOD__M
;
4113 u16 ScRaRamLock
= 0;
4118 *pLockStatus
= NOT_LOCKED
;
4120 /* Check if SC is running */
4121 status
= read16(state
, OFDM_SC_COMM_EXEC__A
, &ScCommExec
);
4124 if (ScCommExec
== OFDM_SC_COMM_EXEC_STOP
)
4127 status
= read16(state
, OFDM_SC_RA_RAM_LOCK__A
, &ScRaRamLock
);
4131 if ((ScRaRamLock
& mpeg_lock_mask
) == mpeg_lock_mask
)
4132 *pLockStatus
= MPEG_LOCK
;
4133 else if ((ScRaRamLock
& fec_lock_mask
) == fec_lock_mask
)
4134 *pLockStatus
= FEC_LOCK
;
4135 else if ((ScRaRamLock
& demod_lock_mask
) == demod_lock_mask
)
4136 *pLockStatus
= DEMOD_LOCK
;
4137 else if (ScRaRamLock
& OFDM_SC_RA_RAM_LOCK_NODVBT__M
)
4138 *pLockStatus
= NEVER_LOCK
;
4141 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
4146 static int PowerUpQAM(struct drxk_state
*state
)
4148 enum DRXPowerMode powerMode
= DRXK_POWER_DOWN_OFDM
;
4152 status
= CtrlPowerMode(state
, &powerMode
);
4154 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
4160 /** Power Down QAM */
4161 static int PowerDownQAM(struct drxk_state
*state
)
4168 status
= read16(state
, SCU_COMM_EXEC__A
, &data
);
4171 if (data
== SCU_COMM_EXEC_ACTIVE
) {
4176 /* stop all comstate->m_exec */
4177 status
= write16(state
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_STOP
);
4180 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
| SCU_RAM_COMMAND_CMD_DEMOD_STOP
, 0, NULL
, 1, &cmdResult
);
4185 status
= SetIqmAf(state
, false);
4189 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
4194 /*============================================================================*/
4197 * \brief Setup of the QAM Measurement intervals for signal quality
4198 * \param demod instance of demod.
4199 * \param modulation current modulation.
4200 * \return DRXStatus_t.
4203 * Take into account that for certain settings the errorcounters can overflow.
4204 * The implementation does not check this.
4207 static int SetQAMMeasurement(struct drxk_state
*state
,
4208 enum EDrxkConstellation modulation
,
4211 u32 fecBitsDesired
= 0; /* BER accounting period */
4212 u32 fecRsPeriodTotal
= 0; /* Total period */
4213 u16 fecRsPrescale
= 0; /* ReedSolomon Measurement Prescale */
4214 u16 fecRsPeriod
= 0; /* Value for corresponding I2C register */
4220 /* fecBitsDesired = symbolRate [kHz] *
4226 switch (modulation
) {
4227 case DRX_CONSTELLATION_QAM16
:
4228 fecBitsDesired
= 4 * symbolRate
;
4230 case DRX_CONSTELLATION_QAM32
:
4231 fecBitsDesired
= 5 * symbolRate
;
4233 case DRX_CONSTELLATION_QAM64
:
4234 fecBitsDesired
= 6 * symbolRate
;
4236 case DRX_CONSTELLATION_QAM128
:
4237 fecBitsDesired
= 7 * symbolRate
;
4239 case DRX_CONSTELLATION_QAM256
:
4240 fecBitsDesired
= 8 * symbolRate
;
4248 fecBitsDesired
/= 1000; /* symbolRate [Hz] -> symbolRate [kHz] */
4249 fecBitsDesired
*= 500; /* meas. period [ms] */
4251 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4252 /* fecRsPeriodTotal = fecBitsDesired / 1632 */
4253 fecRsPeriodTotal
= (fecBitsDesired
/ 1632UL) + 1; /* roughly ceil */
4255 /* fecRsPeriodTotal = fecRsPrescale * fecRsPeriod */
4256 fecRsPrescale
= 1 + (u16
) (fecRsPeriodTotal
>> 16);
4257 if (fecRsPrescale
== 0) {
4258 /* Divide by zero (though impossible) */
4264 ((u16
) fecRsPeriodTotal
+
4265 (fecRsPrescale
>> 1)) / fecRsPrescale
;
4267 /* write corresponding registers */
4268 status
= write16(state
, FEC_RS_MEASUREMENT_PERIOD__A
, fecRsPeriod
);
4271 status
= write16(state
, FEC_RS_MEASUREMENT_PRESCALE__A
, fecRsPrescale
);
4274 status
= write16(state
, FEC_OC_SNC_FAIL_PERIOD__A
, fecRsPeriod
);
4277 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
4281 static int SetQAM16(struct drxk_state
*state
)
4286 /* QAM Equalizer Setup */
4288 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 13517);
4291 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 13517);
4294 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 13517);
4297 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 13517);
4300 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 13517);
4303 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 13517);
4306 /* Decision Feedback Equalizer */
4307 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 2);
4310 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 2);
4313 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 2);
4316 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 2);
4319 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 2);
4322 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
4326 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 5);
4329 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 4);
4332 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
4336 /* QAM Slicer Settings */
4337 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
, DRXK_QAM_SL_SIG_POWER_QAM16
);
4341 /* QAM Loop Controller Coeficients */
4342 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
4345 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
4348 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
4351 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
4354 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
4357 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
4360 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
4363 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
4367 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
4370 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 20);
4373 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 80);
4376 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
4379 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 20);
4382 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50);
4385 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
4388 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 16);
4391 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 32);
4394 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
4397 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
4400 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 10);
4405 /* QAM State Machine (FSM) Thresholds */
4407 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 140);
4410 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 50);
4413 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 95);
4416 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 120);
4419 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 230);
4422 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 105);
4426 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
4429 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 4);
4432 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 24);
4437 /* QAM FSM Tracking Parameters */
4439 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 16);
4442 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 220);
4445 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) 25);
4448 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) 6);
4451 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) -24);
4454 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) -65);
4457 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -127);
4463 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
4467 /*============================================================================*/
4470 * \brief QAM32 specific setup
4471 * \param demod instance of demod.
4472 * \return DRXStatus_t.
4474 static int SetQAM32(struct drxk_state
*state
)
4480 /* QAM Equalizer Setup */
4482 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 6707);
4485 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 6707);
4488 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 6707);
4491 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 6707);
4494 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 6707);
4497 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 6707);
4501 /* Decision Feedback Equalizer */
4502 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 3);
4505 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 3);
4508 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 3);
4511 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 3);
4514 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 3);
4517 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
4521 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 6);
4524 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 5);
4527 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
4531 /* QAM Slicer Settings */
4533 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
, DRXK_QAM_SL_SIG_POWER_QAM32
);
4538 /* QAM Loop Controller Coeficients */
4540 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
4543 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
4546 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
4549 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
4552 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
4555 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
4558 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
4561 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
4565 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
4568 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 20);
4571 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 80);
4574 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
4577 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 20);
4580 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50);
4583 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
4586 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 16);
4589 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 16);
4592 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
4595 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
4598 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 0);
4603 /* QAM State Machine (FSM) Thresholds */
4605 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 90);
4608 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 50);
4611 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 80);
4614 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 100);
4617 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 170);
4620 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 100);
4624 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
4627 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 4);
4630 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 10);
4635 /* QAM FSM Tracking Parameters */
4637 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 12);
4640 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 140);
4643 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) -8);
4646 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) -16);
4649 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) -26);
4652 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) -56);
4655 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -86);
4658 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
4662 /*============================================================================*/
4665 * \brief QAM64 specific setup
4666 * \param demod instance of demod.
4667 * \return DRXStatus_t.
4669 static int SetQAM64(struct drxk_state
*state
)
4674 /* QAM Equalizer Setup */
4676 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 13336);
4679 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 12618);
4682 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 11988);
4685 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 13809);
4688 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 13809);
4691 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 15609);
4695 /* Decision Feedback Equalizer */
4696 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 4);
4699 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 4);
4702 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 4);
4705 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 4);
4708 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 3);
4711 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
4715 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 5);
4718 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 4);
4721 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
4725 /* QAM Slicer Settings */
4726 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
, DRXK_QAM_SL_SIG_POWER_QAM64
);
4731 /* QAM Loop Controller Coeficients */
4733 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
4736 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
4739 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
4742 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
4745 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
4748 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
4751 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
4754 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
4758 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
4761 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 30);
4764 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 100);
4767 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
4770 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 30);
4773 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 50);
4776 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
4779 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 25);
4782 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 48);
4785 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
4788 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
4791 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 10);
4796 /* QAM State Machine (FSM) Thresholds */
4798 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 100);
4801 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 60);
4804 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 80);
4807 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 110);
4810 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 200);
4813 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 95);
4817 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
4820 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 4);
4823 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 15);
4828 /* QAM FSM Tracking Parameters */
4830 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 12);
4833 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 141);
4836 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) 7);
4839 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) 0);
4842 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) -15);
4845 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) -45);
4848 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -80);
4851 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
4856 /*============================================================================*/
4859 * \brief QAM128 specific setup
4860 * \param demod: instance of demod.
4861 * \return DRXStatus_t.
4863 static int SetQAM128(struct drxk_state
*state
)
4868 /* QAM Equalizer Setup */
4870 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 6564);
4873 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 6598);
4876 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 6394);
4879 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 6409);
4882 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 6656);
4885 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 7238);
4889 /* Decision Feedback Equalizer */
4890 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 6);
4893 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 6);
4896 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 6);
4899 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 6);
4902 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 5);
4905 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
4909 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 6);
4912 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 5);
4915 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
4920 /* QAM Slicer Settings */
4922 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
, DRXK_QAM_SL_SIG_POWER_QAM128
);
4927 /* QAM Loop Controller Coeficients */
4929 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
4932 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
4935 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
4938 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
4941 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
4944 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
4947 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
4950 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
4954 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
4957 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 40);
4960 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 120);
4963 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
4966 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 40);
4969 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 60);
4972 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
4975 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 25);
4978 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 64);
4981 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
4984 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
4987 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 0);
4992 /* QAM State Machine (FSM) Thresholds */
4994 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 50);
4997 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 60);
5000 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 80);
5003 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 100);
5006 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 140);
5009 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 100);
5013 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
5016 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 5);
5020 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 12);
5024 /* QAM FSM Tracking Parameters */
5026 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 8);
5029 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 65);
5032 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) 5);
5035 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) 3);
5038 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) -1);
5041 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) -12);
5044 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -23);
5047 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5052 /*============================================================================*/
5055 * \brief QAM256 specific setup
5056 * \param demod: instance of demod.
5057 * \return DRXStatus_t.
5059 static int SetQAM256(struct drxk_state
*state
)
5064 /* QAM Equalizer Setup */
5066 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD0__A
, 11502);
5069 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD1__A
, 12084);
5072 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD2__A
, 12543);
5075 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD3__A
, 12931);
5078 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD4__A
, 13629);
5081 status
= write16(state
, SCU_RAM_QAM_EQ_CMA_RAD5__A
, 15385);
5085 /* Decision Feedback Equalizer */
5086 status
= write16(state
, QAM_DQ_QUAL_FUN0__A
, 8);
5089 status
= write16(state
, QAM_DQ_QUAL_FUN1__A
, 8);
5092 status
= write16(state
, QAM_DQ_QUAL_FUN2__A
, 8);
5095 status
= write16(state
, QAM_DQ_QUAL_FUN3__A
, 8);
5098 status
= write16(state
, QAM_DQ_QUAL_FUN4__A
, 6);
5101 status
= write16(state
, QAM_DQ_QUAL_FUN5__A
, 0);
5105 status
= write16(state
, QAM_SY_SYNC_HWM__A
, 5);
5108 status
= write16(state
, QAM_SY_SYNC_AWM__A
, 4);
5111 status
= write16(state
, QAM_SY_SYNC_LWM__A
, 3);
5115 /* QAM Slicer Settings */
5117 status
= write16(state
, SCU_RAM_QAM_SL_SIG_POWER__A
, DRXK_QAM_SL_SIG_POWER_QAM256
);
5122 /* QAM Loop Controller Coeficients */
5124 status
= write16(state
, SCU_RAM_QAM_LC_CA_FINE__A
, 15);
5127 status
= write16(state
, SCU_RAM_QAM_LC_CA_COARSE__A
, 40);
5130 status
= write16(state
, SCU_RAM_QAM_LC_EP_FINE__A
, 12);
5133 status
= write16(state
, SCU_RAM_QAM_LC_EP_MEDIUM__A
, 24);
5136 status
= write16(state
, SCU_RAM_QAM_LC_EP_COARSE__A
, 24);
5139 status
= write16(state
, SCU_RAM_QAM_LC_EI_FINE__A
, 12);
5142 status
= write16(state
, SCU_RAM_QAM_LC_EI_MEDIUM__A
, 16);
5145 status
= write16(state
, SCU_RAM_QAM_LC_EI_COARSE__A
, 16);
5149 status
= write16(state
, SCU_RAM_QAM_LC_CP_FINE__A
, 5);
5152 status
= write16(state
, SCU_RAM_QAM_LC_CP_MEDIUM__A
, 50);
5155 status
= write16(state
, SCU_RAM_QAM_LC_CP_COARSE__A
, 250);
5158 status
= write16(state
, SCU_RAM_QAM_LC_CI_FINE__A
, 5);
5161 status
= write16(state
, SCU_RAM_QAM_LC_CI_MEDIUM__A
, 50);
5164 status
= write16(state
, SCU_RAM_QAM_LC_CI_COARSE__A
, 125);
5167 status
= write16(state
, SCU_RAM_QAM_LC_CF_FINE__A
, 16);
5170 status
= write16(state
, SCU_RAM_QAM_LC_CF_MEDIUM__A
, 25);
5173 status
= write16(state
, SCU_RAM_QAM_LC_CF_COARSE__A
, 48);
5176 status
= write16(state
, SCU_RAM_QAM_LC_CF1_FINE__A
, 5);
5179 status
= write16(state
, SCU_RAM_QAM_LC_CF1_MEDIUM__A
, 10);
5182 status
= write16(state
, SCU_RAM_QAM_LC_CF1_COARSE__A
, 10);
5187 /* QAM State Machine (FSM) Thresholds */
5189 status
= write16(state
, SCU_RAM_QAM_FSM_RTH__A
, 50);
5192 status
= write16(state
, SCU_RAM_QAM_FSM_FTH__A
, 60);
5195 status
= write16(state
, SCU_RAM_QAM_FSM_CTH__A
, 80);
5198 status
= write16(state
, SCU_RAM_QAM_FSM_PTH__A
, 100);
5201 status
= write16(state
, SCU_RAM_QAM_FSM_QTH__A
, 150);
5204 status
= write16(state
, SCU_RAM_QAM_FSM_MTH__A
, 110);
5208 status
= write16(state
, SCU_RAM_QAM_FSM_RATE_LIM__A
, 40);
5211 status
= write16(state
, SCU_RAM_QAM_FSM_COUNT_LIM__A
, 4);
5214 status
= write16(state
, SCU_RAM_QAM_FSM_FREQ_LIM__A
, 12);
5219 /* QAM FSM Tracking Parameters */
5221 status
= write16(state
, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A
, (u16
) 8);
5224 status
= write16(state
, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A
, (u16
) 74);
5227 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A
, (u16
) 18);
5230 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A
, (u16
) 13);
5233 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A
, (u16
) 7);
5236 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A
, (u16
) 0);
5239 status
= write16(state
, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A
, (u16
) -8);
5242 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5247 /*============================================================================*/
5249 * \brief Reset QAM block.
5250 * \param demod: instance of demod.
5251 * \param channel: pointer to channel data.
5252 * \return DRXStatus_t.
5254 static int QAMResetQAM(struct drxk_state
*state
)
5260 /* Stop QAM comstate->m_exec */
5261 status
= write16(state
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_STOP
);
5265 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
| SCU_RAM_COMMAND_CMD_DEMOD_RESET
, 0, NULL
, 1, &cmdResult
);
5268 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5272 /*============================================================================*/
5275 * \brief Set QAM symbolrate.
5276 * \param demod: instance of demod.
5277 * \param channel: pointer to channel data.
5278 * \return DRXStatus_t.
5280 static int QAMSetSymbolrate(struct drxk_state
*state
)
5282 u32 adcFrequency
= 0;
5290 /* Select & calculate correct IQM rate */
5291 adcFrequency
= (state
->m_sysClockFreq
* 1000) / 3;
5293 /* printk(KERN_DEBUG "drxk: SR %d\n", state->props.symbol_rate); */
5294 if (state
->props
.symbol_rate
<= 1188750)
5296 else if (state
->props
.symbol_rate
<= 2377500)
5298 else if (state
->props
.symbol_rate
<= 4755000)
5300 status
= write16(state
, IQM_FD_RATESEL__A
, ratesel
);
5305 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5307 symbFreq
= state
->props
.symbol_rate
* (1 << ratesel
);
5308 if (symbFreq
== 0) {
5309 /* Divide by zero */
5313 iqmRcRate
= (adcFrequency
/ symbFreq
) * (1 << 21) +
5314 (Frac28a((adcFrequency
% symbFreq
), symbFreq
) >> 7) -
5316 status
= write32(state
, IQM_RC_RATE_OFS_LO__A
, iqmRcRate
);
5319 state
->m_iqmRcRate
= iqmRcRate
;
5321 LcSymbFreq = round (.125 * symbolrate / adcFreq * (1<<15))
5323 symbFreq
= state
->props
.symbol_rate
;
5324 if (adcFrequency
== 0) {
5325 /* Divide by zero */
5329 lcSymbRate
= (symbFreq
/ adcFrequency
) * (1 << 12) +
5330 (Frac28a((symbFreq
% adcFrequency
), adcFrequency
) >>
5332 if (lcSymbRate
> 511)
5334 status
= write16(state
, QAM_LC_SYMBOL_FREQ__A
, (u16
) lcSymbRate
);
5338 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5342 /*============================================================================*/
5345 * \brief Get QAM lock status.
5346 * \param demod: instance of demod.
5347 * \param channel: pointer to channel data.
5348 * \return DRXStatus_t.
5351 static int GetQAMLockStatus(struct drxk_state
*state
, u32
*pLockStatus
)
5354 u16 Result
[2] = { 0, 0 };
5357 *pLockStatus
= NOT_LOCKED
;
5358 status
= scu_command(state
,
5359 SCU_RAM_COMMAND_STANDARD_QAM
|
5360 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK
, 0, NULL
, 2,
5363 printk(KERN_ERR
"drxk: %s status = %08x\n", __func__
, status
);
5365 if (Result
[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED
) {
5366 /* 0x0000 NOT LOCKED */
5367 } else if (Result
[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED
) {
5368 /* 0x4000 DEMOD LOCKED */
5369 *pLockStatus
= DEMOD_LOCK
;
5370 } else if (Result
[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK
) {
5371 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5372 *pLockStatus
= MPEG_LOCK
;
5374 /* 0xC000 NEVER LOCKED */
5375 /* (system will never be able to lock to the signal) */
5376 /* TODO: check this, intermediate & standard specific lock states are not
5377 taken into account here */
5378 *pLockStatus
= NEVER_LOCK
;
5383 #define QAM_MIRROR__M 0x03
5384 #define QAM_MIRROR_NORMAL 0x00
5385 #define QAM_MIRRORED 0x01
5386 #define QAM_MIRROR_AUTO_ON 0x02
5387 #define QAM_LOCKRANGE__M 0x10
5388 #define QAM_LOCKRANGE_NORMAL 0x10
5390 static int SetQAM(struct drxk_state
*state
, u16 IntermediateFreqkHz
,
5391 s32 tunerFreqOffset
)
5394 u16 setParamParameters
[4] = { 0, 0, 0, 0 };
5399 * STEP 1: reset demodulator
5400 * resets FEC DI and FEC RS
5402 * resets SCU variables
5404 status
= write16(state
, FEC_DI_COMM_EXEC__A
, FEC_DI_COMM_EXEC_STOP
);
5407 status
= write16(state
, FEC_RS_COMM_EXEC__A
, FEC_RS_COMM_EXEC_STOP
);
5410 status
= QAMResetQAM(state
);
5415 * STEP 2: configure demodulator
5416 * -set params; resets IQM,QAM,FEC HW; initializes some
5419 status
= QAMSetSymbolrate(state
);
5424 switch (state
->props
.modulation
) {
5426 state
->m_Constellation
= DRX_CONSTELLATION_QAM256
;
5430 state
->m_Constellation
= DRX_CONSTELLATION_QAM64
;
5433 state
->m_Constellation
= DRX_CONSTELLATION_QAM16
;
5436 state
->m_Constellation
= DRX_CONSTELLATION_QAM32
;
5439 state
->m_Constellation
= DRX_CONSTELLATION_QAM128
;
5447 setParamParameters
[0] = state
->m_Constellation
; /* modulation */
5448 setParamParameters
[1] = DRXK_QAM_I12_J17
; /* interleave mode */
5449 if (state
->m_OperationMode
== OM_QAM_ITU_C
)
5450 setParamParameters
[2] = QAM_TOP_ANNEX_C
;
5452 setParamParameters
[2] = QAM_TOP_ANNEX_A
;
5453 setParamParameters
[3] |= (QAM_MIRROR_AUTO_ON
);
5454 /* Env parameters */
5455 /* check for LOCKRANGE Extented */
5456 /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
5458 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
| SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM
, 4, setParamParameters
, 1, &cmdResult
);
5460 /* Fall-back to the simpler call */
5461 if (state
->m_OperationMode
== OM_QAM_ITU_C
)
5462 setParamParameters
[0] = QAM_TOP_ANNEX_C
;
5464 setParamParameters
[0] = QAM_TOP_ANNEX_A
;
5465 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
| SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV
, 1, setParamParameters
, 1, &cmdResult
);
5469 setParamParameters
[0] = state
->m_Constellation
; /* modulation */
5470 setParamParameters
[1] = DRXK_QAM_I12_J17
; /* interleave mode */
5471 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
| SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM
, 2, setParamParameters
, 1, &cmdResult
);
5477 * STEP 3: enable the system in a mode where the ADC provides valid
5478 * signal setup modulation independent registers
5481 status
= SetFrequency(channel
, tunerFreqOffset
));
5485 status
= SetFrequencyShifter(state
, IntermediateFreqkHz
, tunerFreqOffset
, true);
5489 /* Setup BER measurement */
5490 status
= SetQAMMeasurement(state
, state
->m_Constellation
, state
->props
.symbol_rate
);
5494 /* Reset default values */
5495 status
= write16(state
, IQM_CF_SCALE_SH__A
, IQM_CF_SCALE_SH__PRE
);
5498 status
= write16(state
, QAM_SY_TIMEOUT__A
, QAM_SY_TIMEOUT__PRE
);
5502 /* Reset default LC values */
5503 status
= write16(state
, QAM_LC_RATE_LIMIT__A
, 3);
5506 status
= write16(state
, QAM_LC_LPF_FACTORP__A
, 4);
5509 status
= write16(state
, QAM_LC_LPF_FACTORI__A
, 4);
5512 status
= write16(state
, QAM_LC_MODE__A
, 7);
5516 status
= write16(state
, QAM_LC_QUAL_TAB0__A
, 1);
5519 status
= write16(state
, QAM_LC_QUAL_TAB1__A
, 1);
5522 status
= write16(state
, QAM_LC_QUAL_TAB2__A
, 1);
5525 status
= write16(state
, QAM_LC_QUAL_TAB3__A
, 1);
5528 status
= write16(state
, QAM_LC_QUAL_TAB4__A
, 2);
5531 status
= write16(state
, QAM_LC_QUAL_TAB5__A
, 2);
5534 status
= write16(state
, QAM_LC_QUAL_TAB6__A
, 2);
5537 status
= write16(state
, QAM_LC_QUAL_TAB8__A
, 2);
5540 status
= write16(state
, QAM_LC_QUAL_TAB9__A
, 2);
5543 status
= write16(state
, QAM_LC_QUAL_TAB10__A
, 2);
5546 status
= write16(state
, QAM_LC_QUAL_TAB12__A
, 2);
5549 status
= write16(state
, QAM_LC_QUAL_TAB15__A
, 3);
5552 status
= write16(state
, QAM_LC_QUAL_TAB16__A
, 3);
5555 status
= write16(state
, QAM_LC_QUAL_TAB20__A
, 4);
5558 status
= write16(state
, QAM_LC_QUAL_TAB25__A
, 4);
5562 /* Mirroring, QAM-block starting point not inverted */
5563 status
= write16(state
, QAM_SY_SP_INV__A
, QAM_SY_SP_INV_SPECTRUM_INV_DIS
);
5567 /* Halt SCU to enable safe non-atomic accesses */
5568 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_HOLD
);
5572 /* STEP 4: modulation specific setup */
5573 switch (state
->props
.modulation
) {
5575 status
= SetQAM16(state
);
5578 status
= SetQAM32(state
);
5582 status
= SetQAM64(state
);
5585 status
= SetQAM128(state
);
5588 status
= SetQAM256(state
);
5597 /* Activate SCU to enable SCU commands */
5598 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
5602 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5603 /* extAttr->currentChannel.modulation = channel->modulation; */
5604 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5605 status
= MPEGTSDtoSetup(state
, state
->m_OperationMode
);
5609 /* Start processes */
5610 status
= MPEGTSStart(state
);
5613 status
= write16(state
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_ACTIVE
);
5616 status
= write16(state
, QAM_COMM_EXEC__A
, QAM_COMM_EXEC_ACTIVE
);
5619 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_ACTIVE
);
5623 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5624 status
= scu_command(state
, SCU_RAM_COMMAND_STANDARD_QAM
| SCU_RAM_COMMAND_CMD_DEMOD_START
, 0, NULL
, 1, &cmdResult
);
5628 /* update global DRXK data container */
5629 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5633 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5637 static int SetQAMStandard(struct drxk_state
*state
,
5638 enum OperationMode oMode
)
5641 #ifdef DRXK_QAM_TAPS
5642 #define DRXK_QAMA_TAPS_SELECT
5643 #include "drxk_filters.h"
5644 #undef DRXK_QAMA_TAPS_SELECT
5649 /* added antenna switch */
5650 SwitchAntennaToQAM(state
);
5652 /* Ensure correct power-up mode */
5653 status
= PowerUpQAM(state
);
5656 /* Reset QAM block */
5657 status
= QAMResetQAM(state
);
5663 status
= write16(state
, IQM_COMM_EXEC__A
, IQM_COMM_EXEC_B_STOP
);
5666 status
= write16(state
, IQM_AF_AMUX__A
, IQM_AF_AMUX_SIGNAL2ADC
);
5670 /* Upload IQM Channel Filter settings by
5671 boot loader from ROM table */
5674 status
= BLChainCmd(state
, DRXK_BL_ROM_OFFSET_TAPS_ITU_A
, DRXK_BLCC_NR_ELEMENTS_TAPS
, DRXK_BLC_TIMEOUT
);
5677 status
= BLDirectCmd(state
, IQM_CF_TAP_RE0__A
, DRXK_BL_ROM_OFFSET_TAPS_ITU_C
, DRXK_BLDC_NR_ELEMENTS_TAPS
, DRXK_BLC_TIMEOUT
);
5680 status
= BLDirectCmd(state
, IQM_CF_TAP_IM0__A
, DRXK_BL_ROM_OFFSET_TAPS_ITU_C
, DRXK_BLDC_NR_ELEMENTS_TAPS
, DRXK_BLC_TIMEOUT
);
5688 status
= write16(state
, IQM_CF_OUT_ENA__A
, (1 << IQM_CF_OUT_ENA_QAM__B
));
5691 status
= write16(state
, IQM_CF_SYMMETRIC__A
, 0);
5694 status
= write16(state
, IQM_CF_MIDTAP__A
, ((1 << IQM_CF_MIDTAP_RE__B
) | (1 << IQM_CF_MIDTAP_IM__B
)));
5698 status
= write16(state
, IQM_RC_STRETCH__A
, 21);
5701 status
= write16(state
, IQM_AF_CLP_LEN__A
, 0);
5704 status
= write16(state
, IQM_AF_CLP_TH__A
, 448);
5707 status
= write16(state
, IQM_AF_SNS_LEN__A
, 0);
5710 status
= write16(state
, IQM_CF_POW_MEAS_LEN__A
, 0);
5714 status
= write16(state
, IQM_FS_ADJ_SEL__A
, 1);
5717 status
= write16(state
, IQM_RC_ADJ_SEL__A
, 1);
5720 status
= write16(state
, IQM_CF_ADJ_SEL__A
, 1);
5723 status
= write16(state
, IQM_AF_UPD_SEL__A
, 0);
5727 /* IQM Impulse Noise Processing Unit */
5728 status
= write16(state
, IQM_CF_CLP_VAL__A
, 500);
5731 status
= write16(state
, IQM_CF_DATATH__A
, 1000);
5734 status
= write16(state
, IQM_CF_BYPASSDET__A
, 1);
5737 status
= write16(state
, IQM_CF_DET_LCT__A
, 0);
5740 status
= write16(state
, IQM_CF_WND_LEN__A
, 1);
5743 status
= write16(state
, IQM_CF_PKDTH__A
, 1);
5746 status
= write16(state
, IQM_AF_INC_BYPASS__A
, 1);
5750 /* turn on IQMAF. Must be done before setAgc**() */
5751 status
= SetIqmAf(state
, true);
5754 status
= write16(state
, IQM_AF_START_LOCK__A
, 0x01);
5758 /* IQM will not be reset from here, sync ADC and update/init AGC */
5759 status
= ADCSynchronization(state
);
5763 /* Set the FSM step period */
5764 status
= write16(state
, SCU_RAM_QAM_FSM_STEP_PERIOD__A
, 2000);
5768 /* Halt SCU to enable safe non-atomic accesses */
5769 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_HOLD
);
5773 /* No more resets of the IQM, current standard correctly set =>
5774 now AGCs can be configured. */
5776 status
= InitAGC(state
, true);
5779 status
= SetPreSaw(state
, &(state
->m_qamPreSawCfg
));
5783 /* Configure AGC's */
5784 status
= SetAgcRf(state
, &(state
->m_qamRfAgcCfg
), true);
5787 status
= SetAgcIf(state
, &(state
->m_qamIfAgcCfg
), true);
5791 /* Activate SCU to enable SCU commands */
5792 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
5795 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5799 static int WriteGPIO(struct drxk_state
*state
)
5805 /* stop lock indicator process */
5806 status
= write16(state
, SCU_RAM_GPIO__A
, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
5810 /* Write magic word to enable pdr reg write */
5811 status
= write16(state
, SIO_TOP_COMM_KEY__A
, SIO_TOP_COMM_KEY_KEY
);
5815 if (state
->m_hasSAWSW
) {
5816 if (state
->UIO_mask
& 0x0001) { /* UIO-1 */
5817 /* write to io pad configuration register - output mode */
5818 status
= write16(state
, SIO_PDR_SMA_TX_CFG__A
, state
->m_GPIOCfg
);
5822 /* use corresponding bit in io data output registar */
5823 status
= read16(state
, SIO_PDR_UIO_OUT_LO__A
, &value
);
5826 if ((state
->m_GPIO
& 0x0001) == 0)
5827 value
&= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5829 value
|= 0x8000; /* write one to 15th bit - 1st UIO */
5830 /* write back to io data output register */
5831 status
= write16(state
, SIO_PDR_UIO_OUT_LO__A
, value
);
5835 if (state
->UIO_mask
& 0x0002) { /* UIO-2 */
5836 /* write to io pad configuration register - output mode */
5837 status
= write16(state
, SIO_PDR_SMA_TX_CFG__A
, state
->m_GPIOCfg
);
5841 /* use corresponding bit in io data output registar */
5842 status
= read16(state
, SIO_PDR_UIO_OUT_LO__A
, &value
);
5845 if ((state
->m_GPIO
& 0x0002) == 0)
5846 value
&= 0xBFFF; /* write zero to 14th bit - 2st UIO */
5848 value
|= 0x4000; /* write one to 14th bit - 2st UIO */
5849 /* write back to io data output register */
5850 status
= write16(state
, SIO_PDR_UIO_OUT_LO__A
, value
);
5854 if (state
->UIO_mask
& 0x0004) { /* UIO-3 */
5855 /* write to io pad configuration register - output mode */
5856 status
= write16(state
, SIO_PDR_SMA_TX_CFG__A
, state
->m_GPIOCfg
);
5860 /* use corresponding bit in io data output registar */
5861 status
= read16(state
, SIO_PDR_UIO_OUT_LO__A
, &value
);
5864 if ((state
->m_GPIO
& 0x0004) == 0)
5865 value
&= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
5867 value
|= 0x0004; /* write one to 2nd bit - 3rd UIO */
5868 /* write back to io data output register */
5869 status
= write16(state
, SIO_PDR_UIO_OUT_LO__A
, value
);
5874 /* Write magic word to disable pdr reg write */
5875 status
= write16(state
, SIO_TOP_COMM_KEY__A
, 0x0000);
5878 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5882 static int SwitchAntennaToQAM(struct drxk_state
*state
)
5889 if (!state
->antenna_gpio
)
5892 gpio_state
= state
->m_GPIO
& state
->antenna_gpio
;
5894 if (state
->antenna_dvbt
^ gpio_state
) {
5895 /* Antenna is on DVB-T mode. Switch */
5896 if (state
->antenna_dvbt
)
5897 state
->m_GPIO
&= ~state
->antenna_gpio
;
5899 state
->m_GPIO
|= state
->antenna_gpio
;
5900 status
= WriteGPIO(state
);
5903 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5907 static int SwitchAntennaToDVBT(struct drxk_state
*state
)
5914 if (!state
->antenna_gpio
)
5917 gpio_state
= state
->m_GPIO
& state
->antenna_gpio
;
5919 if (!(state
->antenna_dvbt
^ gpio_state
)) {
5920 /* Antenna is on DVB-C mode. Switch */
5921 if (state
->antenna_dvbt
)
5922 state
->m_GPIO
|= state
->antenna_gpio
;
5924 state
->m_GPIO
&= ~state
->antenna_gpio
;
5925 status
= WriteGPIO(state
);
5928 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5933 static int PowerDownDevice(struct drxk_state
*state
)
5935 /* Power down to requested mode */
5936 /* Backup some register settings */
5937 /* Set pins with possible pull-ups connected to them in input mode */
5938 /* Analog power down */
5939 /* ADC power down */
5940 /* Power down device */
5944 if (state
->m_bPDownOpenBridge
) {
5945 /* Open I2C bridge before power down of DRXK */
5946 status
= ConfigureI2CBridge(state
, true);
5951 status
= DVBTEnableOFDMTokenRing(state
, false);
5955 status
= write16(state
, SIO_CC_PWD_MODE__A
, SIO_CC_PWD_MODE_LEVEL_CLOCK
);
5958 status
= write16(state
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
);
5961 state
->m_HICfgCtrl
|= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ
;
5962 status
= HI_CfgCommand(state
);
5965 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
5970 static int load_microcode(struct drxk_state
*state
, const char *mc_name
)
5972 const struct firmware
*fw
= NULL
;
5977 err
= request_firmware(&fw
, mc_name
, state
->i2c
->dev
.parent
);
5980 "drxk: Could not load firmware file %s.\n", mc_name
);
5982 "drxk: Copy %s to your hotplug directory!\n", mc_name
);
5985 err
= DownloadMicrocode(state
, fw
->data
, fw
->size
);
5986 release_firmware(fw
);
5990 static int init_drxk(struct drxk_state
*state
)
5993 enum DRXPowerMode powerMode
= DRXK_POWER_DOWN_OFDM
;
5997 if ((state
->m_DrxkState
== DRXK_UNINITIALIZED
)) {
5998 status
= PowerUpDevice(state
);
6001 status
= DRXX_Open(state
);
6004 /* Soft reset of OFDM-, sys- and osc-clockdomain */
6005 status
= write16(state
, SIO_CC_SOFT_RST__A
, SIO_CC_SOFT_RST_OFDM__M
| SIO_CC_SOFT_RST_SYS__M
| SIO_CC_SOFT_RST_OSC__M
);
6008 status
= write16(state
, SIO_CC_UPDATE__A
, SIO_CC_UPDATE_KEY
);
6011 /* TODO is this needed, if yes how much delay in worst case scenario */
6013 state
->m_DRXK_A3_PATCH_CODE
= true;
6014 status
= GetDeviceCapabilities(state
);
6018 /* Bridge delay, uses oscilator clock */
6019 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
6020 /* SDA brdige delay */
6021 state
->m_HICfgBridgeDelay
=
6022 (u16
) ((state
->m_oscClockFreq
/ 1000) *
6023 HI_I2C_BRIDGE_DELAY
) / 1000;
6025 if (state
->m_HICfgBridgeDelay
>
6026 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M
) {
6027 state
->m_HICfgBridgeDelay
=
6028 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M
;
6030 /* SCL bridge delay, same as SDA for now */
6031 state
->m_HICfgBridgeDelay
+=
6032 state
->m_HICfgBridgeDelay
<<
6033 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B
;
6035 status
= InitHI(state
);
6038 /* disable various processes */
6040 if (!(state
->m_DRXK_A1_ROM_CODE
)
6041 && !(state
->m_DRXK_A2_ROM_CODE
))
6044 status
= write16(state
, SCU_RAM_GPIO__A
, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE
);
6049 /* disable MPEG port */
6050 status
= MPEGTSDisable(state
);
6054 /* Stop AUD and SCU */
6055 status
= write16(state
, AUD_COMM_EXEC__A
, AUD_COMM_EXEC_STOP
);
6058 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_STOP
);
6062 /* enable token-ring bus through OFDM block for possible ucode upload */
6063 status
= write16(state
, SIO_OFDM_SH_OFDM_RING_ENABLE__A
, SIO_OFDM_SH_OFDM_RING_ENABLE_ON
);
6067 /* include boot loader section */
6068 status
= write16(state
, SIO_BL_COMM_EXEC__A
, SIO_BL_COMM_EXEC_ACTIVE
);
6071 status
= BLChainCmd(state
, 0, 6, 100);
6075 if (!state
->microcode_name
)
6076 load_microcode(state
, "drxk_a3.mc");
6078 load_microcode(state
, state
->microcode_name
);
6080 /* disable token-ring bus through OFDM block for possible ucode upload */
6081 status
= write16(state
, SIO_OFDM_SH_OFDM_RING_ENABLE__A
, SIO_OFDM_SH_OFDM_RING_ENABLE_OFF
);
6085 /* Run SCU for a little while to initialize microcode version numbers */
6086 status
= write16(state
, SCU_COMM_EXEC__A
, SCU_COMM_EXEC_ACTIVE
);
6089 status
= DRXX_Open(state
);
6092 /* added for test */
6095 powerMode
= DRXK_POWER_DOWN_OFDM
;
6096 status
= CtrlPowerMode(state
, &powerMode
);
6100 /* Stamp driver version number in SCU data RAM in BCD code
6101 Done to enable field application engineers to retreive drxdriver version
6102 via I2C from SCU RAM.
6103 Not using SCU command interface for SCU register access since no
6104 microcode may be present.
6107 (((DRXK_VERSION_MAJOR
/ 100) % 10) << 12) +
6108 (((DRXK_VERSION_MAJOR
/ 10) % 10) << 8) +
6109 ((DRXK_VERSION_MAJOR
% 10) << 4) +
6110 (DRXK_VERSION_MINOR
% 10);
6111 status
= write16(state
, SCU_RAM_DRIVER_VER_HI__A
, driverVersion
);
6115 (((DRXK_VERSION_PATCH
/ 1000) % 10) << 12) +
6116 (((DRXK_VERSION_PATCH
/ 100) % 10) << 8) +
6117 (((DRXK_VERSION_PATCH
/ 10) % 10) << 4) +
6118 (DRXK_VERSION_PATCH
% 10);
6119 status
= write16(state
, SCU_RAM_DRIVER_VER_LO__A
, driverVersion
);
6123 printk(KERN_INFO
"DRXK driver version %d.%d.%d\n",
6124 DRXK_VERSION_MAJOR
, DRXK_VERSION_MINOR
,
6125 DRXK_VERSION_PATCH
);
6127 /* Dirty fix of default values for ROM/PATCH microcode
6128 Dirty because this fix makes it impossible to setup suitable values
6129 before calling DRX_Open. This solution requires changes to RF AGC speed
6130 to be done via the CTRL function after calling DRX_Open */
6132 /* m_dvbtRfAgcCfg.speed = 3; */
6134 /* Reset driver debug flags to 0 */
6135 status
= write16(state
, SCU_RAM_DRIVER_DEBUG__A
, 0);
6140 NOTE: No more full FEC resets allowed afterwards!! */
6141 status
= write16(state
, FEC_COMM_EXEC__A
, FEC_COMM_EXEC_STOP
);
6144 /* MPEGTS functions are still the same */
6145 status
= MPEGTSDtoInit(state
);
6148 status
= MPEGTSStop(state
);
6151 status
= MPEGTSConfigurePolarity(state
);
6154 status
= MPEGTSConfigurePins(state
, state
->m_enableMPEGOutput
);
6157 /* added: configure GPIO */
6158 status
= WriteGPIO(state
);
6162 state
->m_DrxkState
= DRXK_STOPPED
;
6164 if (state
->m_bPowerDown
) {
6165 status
= PowerDownDevice(state
);
6168 state
->m_DrxkState
= DRXK_POWERED_DOWN
;
6170 state
->m_DrxkState
= DRXK_STOPPED
;
6174 printk(KERN_ERR
"drxk: Error %d on %s\n", status
, __func__
);
6179 static void drxk_release(struct dvb_frontend
*fe
)
6181 struct drxk_state
*state
= fe
->demodulator_priv
;
6187 static int drxk_sleep(struct dvb_frontend
*fe
)
6189 struct drxk_state
*state
= fe
->demodulator_priv
;
6196 static int drxk_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
6198 struct drxk_state
*state
= fe
->demodulator_priv
;
6200 dprintk(1, "%s\n", enable
? "enable" : "disable");
6201 return ConfigureI2CBridge(state
, enable
? true : false);
6204 static int drxk_set_parameters(struct dvb_frontend
*fe
)
6206 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
6207 u32 delsys
= p
->delivery_system
, old_delsys
;
6208 struct drxk_state
*state
= fe
->demodulator_priv
;
6213 if (!fe
->ops
.tuner_ops
.get_if_frequency
) {
6215 "drxk: Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
6219 if (fe
->ops
.i2c_gate_ctrl
)
6220 fe
->ops
.i2c_gate_ctrl(fe
, 1);
6221 if (fe
->ops
.tuner_ops
.set_params
)
6222 fe
->ops
.tuner_ops
.set_params(fe
);
6223 if (fe
->ops
.i2c_gate_ctrl
)
6224 fe
->ops
.i2c_gate_ctrl(fe
, 0);
6226 old_delsys
= state
->props
.delivery_system
;
6229 if (old_delsys
!= delsys
) {
6232 case SYS_DVBC_ANNEX_A
:
6233 case SYS_DVBC_ANNEX_C
:
6234 if (!state
->m_hasDVBC
)
6236 state
->m_itut_annex_c
= (delsys
== SYS_DVBC_ANNEX_C
) ? true : false;
6237 if (state
->m_itut_annex_c
)
6238 SetOperationMode(state
, OM_QAM_ITU_C
);
6240 SetOperationMode(state
, OM_QAM_ITU_A
);
6243 if (!state
->m_hasDVBT
)
6245 SetOperationMode(state
, OM_DVBT
);
6252 fe
->ops
.tuner_ops
.get_if_frequency(fe
, &IF
);
6253 Start(state
, 0, IF
);
6255 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6260 static int drxk_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
6262 struct drxk_state
*state
= fe
->demodulator_priv
;
6267 GetLockStatus(state
, &stat
, 0);
6268 if (stat
== MPEG_LOCK
)
6270 if (stat
== FEC_LOCK
)
6272 if (stat
== DEMOD_LOCK
)
6277 static int drxk_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
6285 static int drxk_read_signal_strength(struct dvb_frontend
*fe
,
6288 struct drxk_state
*state
= fe
->demodulator_priv
;
6292 ReadIFAgc(state
, &val
);
6293 *strength
= val
& 0xffff;
6297 static int drxk_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
6299 struct drxk_state
*state
= fe
->demodulator_priv
;
6303 GetSignalToNoise(state
, &snr2
);
6304 *snr
= snr2
& 0xffff;
6308 static int drxk_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
6310 struct drxk_state
*state
= fe
->demodulator_priv
;
6314 DVBTQAMGetAccPktErr(state
, &err
);
6315 *ucblocks
= (u32
) err
;
6319 static int drxk_get_tune_settings(struct dvb_frontend
*fe
, struct dvb_frontend_tune_settings
6322 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
6325 switch (p
->delivery_system
) {
6326 case SYS_DVBC_ANNEX_A
:
6327 case SYS_DVBC_ANNEX_C
:
6328 sets
->min_delay_ms
= 3000;
6329 sets
->max_drift
= 0;
6330 sets
->step_size
= 0;
6334 * For DVB-T, let it use the default DVB core way, that is:
6335 * fepriv->step_size = fe->ops.info.frequency_stepsize * 2
6341 static struct dvb_frontend_ops drxk_ops
= {
6342 /* .delsys will be filled dynamically */
6345 .frequency_min
= 47000000,
6346 .frequency_max
= 865000000,
6348 .symbol_rate_min
= 870000,
6349 .symbol_rate_max
= 11700000,
6351 .frequency_stepsize
= 166667,
6353 .caps
= FE_CAN_QAM_16
| FE_CAN_QAM_32
| FE_CAN_QAM_64
|
6354 FE_CAN_QAM_128
| FE_CAN_QAM_256
| FE_CAN_FEC_AUTO
|
6355 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
6356 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
| FE_CAN_MUTE_TS
|
6357 FE_CAN_TRANSMISSION_MODE_AUTO
| FE_CAN_RECOVER
|
6358 FE_CAN_GUARD_INTERVAL_AUTO
| FE_CAN_HIERARCHY_AUTO
6361 .release
= drxk_release
,
6362 .sleep
= drxk_sleep
,
6363 .i2c_gate_ctrl
= drxk_gate_ctrl
,
6365 .set_frontend
= drxk_set_parameters
,
6366 .get_tune_settings
= drxk_get_tune_settings
,
6368 .read_status
= drxk_read_status
,
6369 .read_ber
= drxk_read_ber
,
6370 .read_signal_strength
= drxk_read_signal_strength
,
6371 .read_snr
= drxk_read_snr
,
6372 .read_ucblocks
= drxk_read_ucblocks
,
6375 struct dvb_frontend
*drxk_attach(const struct drxk_config
*config
,
6376 struct i2c_adapter
*i2c
)
6380 struct drxk_state
*state
= NULL
;
6381 u8 adr
= config
->adr
;
6384 state
= kzalloc(sizeof(struct drxk_state
), GFP_KERNEL
);
6389 state
->demod_address
= adr
;
6390 state
->single_master
= config
->single_master
;
6391 state
->microcode_name
= config
->microcode_name
;
6392 state
->no_i2c_bridge
= config
->no_i2c_bridge
;
6393 state
->antenna_gpio
= config
->antenna_gpio
;
6394 state
->antenna_dvbt
= config
->antenna_dvbt
;
6395 state
->m_ChunkSize
= config
->chunk_size
;
6397 if (config
->parallel_ts
)
6398 state
->m_enableParallel
= true;
6400 state
->m_enableParallel
= false;
6402 /* NOTE: as more UIO bits will be used, add them to the mask */
6403 state
->UIO_mask
= config
->antenna_gpio
;
6405 /* Default gpio to DVB-C */
6406 if (!state
->antenna_dvbt
&& state
->antenna_gpio
)
6407 state
->m_GPIO
|= state
->antenna_gpio
;
6409 state
->m_GPIO
&= ~state
->antenna_gpio
;
6411 mutex_init(&state
->mutex
);
6413 memcpy(&state
->frontend
.ops
, &drxk_ops
, sizeof(drxk_ops
));
6414 state
->frontend
.demodulator_priv
= state
;
6417 if (init_drxk(state
) < 0)
6420 /* Initialize the supported delivery systems */
6422 if (state
->m_hasDVBC
) {
6423 state
->frontend
.ops
.delsys
[n
++] = SYS_DVBC_ANNEX_A
;
6424 state
->frontend
.ops
.delsys
[n
++] = SYS_DVBC_ANNEX_C
;
6425 strlcat(state
->frontend
.ops
.info
.name
, " DVB-C",
6426 sizeof(state
->frontend
.ops
.info
.name
));
6428 if (state
->m_hasDVBT
) {
6429 state
->frontend
.ops
.delsys
[n
++] = SYS_DVBT
;
6430 strlcat(state
->frontend
.ops
.info
.name
, " DVB-T",
6431 sizeof(state
->frontend
.ops
.info
.name
));
6434 printk(KERN_INFO
"drxk: frontend initialized.\n");
6435 return &state
->frontend
;
6438 printk(KERN_ERR
"drxk: not found\n");
6442 EXPORT_SYMBOL(drxk_attach
);
6444 MODULE_DESCRIPTION("DRX-K driver");
6445 MODULE_AUTHOR("Ralph Metzler");
6446 MODULE_LICENSE("GPL");