2 * Support for OR51132 (pcHDTV HD-3000) - VSB/QAM
4 * Copyright (C) 2005 Kirk Lapray <kirk_lapray@bigfoot.com>
6 * Based on code from Jack Kelliher (kelliher@xmission.com)
7 * Copyright (C) 2002 & pcHDTV, inc.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 * This driver needs two external firmware files. Please copy
27 * "dvb-fe-or51132-vsb.fw" and "dvb-fe-or51132-qam.fw" to
28 * /usr/lib/hotplug/firmware/ or /lib/firmware/
29 * (depending on configuration of firmware hotplug).
31 #define OR51132_VSB_FIRMWARE "dvb-fe-or51132-vsb.fw"
32 #define OR51132_QAM_FIRMWARE "dvb-fe-or51132-qam.fw"
34 #include <linux/kernel.h>
35 #include <linux/module.h>
36 #include <linux/moduleparam.h>
37 #include <linux/init.h>
38 #include <linux/delay.h>
39 #include <linux/string.h>
40 #include <linux/slab.h>
41 #include <asm/byteorder.h>
43 #include "dvb_frontend.h"
48 #define dprintk(args...) \
50 if (debug) printk(KERN_DEBUG "or51132: " args); \
56 struct i2c_adapter
* i2c
;
57 struct dvb_frontend_ops ops
;
59 /* Configuration settings */
60 const struct or51132_config
* config
;
62 struct dvb_frontend frontend
;
64 /* Demodulator private data */
65 fe_modulation_t current_modulation
;
67 /* Tuner private data */
68 u32 current_frequency
;
71 static int i2c_writebytes (struct or51132_state
* state
, u8 reg
, u8
*buf
, int len
)
80 if ((err
= i2c_transfer(state
->i2c
, &msg
, 1)) != 1) {
81 printk(KERN_WARNING
"or51132: i2c_writebytes error (addr %02x, err == %i)\n", reg
, err
);
88 static u8
i2c_readbytes (struct or51132_state
* state
, u8 reg
, u8
* buf
, int len
)
97 if ((err
= i2c_transfer(state
->i2c
, &msg
, 1)) != 1) {
98 printk(KERN_WARNING
"or51132: i2c_readbytes error (addr %02x, err == %i)\n", reg
, err
);
105 static int or51132_load_firmware (struct dvb_frontend
* fe
, const struct firmware
*fw
)
107 struct or51132_state
* state
= fe
->demodulator_priv
;
108 static u8 run_buf
[] = {0x7F,0x01};
111 u32 firmwareAsize
, firmwareBsize
;
114 dprintk("Firmware is %Zd bytes\n",fw
->size
);
116 /* Get size of firmware A and B */
117 firmwareAsize
= le32_to_cpu(*((u32
*)fw
->data
));
118 dprintk("FirmwareA is %i bytes\n",firmwareAsize
);
119 firmwareBsize
= le32_to_cpu(*((u32
*)(fw
->data
+4)));
120 dprintk("FirmwareB is %i bytes\n",firmwareBsize
);
122 /* Upload firmware */
123 if ((ret
= i2c_writebytes(state
,state
->config
->demod_address
,
124 &fw
->data
[8],firmwareAsize
))) {
125 printk(KERN_WARNING
"or51132: load_firmware error 1\n");
129 if ((ret
= i2c_writebytes(state
,state
->config
->demod_address
,
130 &fw
->data
[8+firmwareAsize
],firmwareBsize
))) {
131 printk(KERN_WARNING
"or51132: load_firmware error 2\n");
136 if ((ret
= i2c_writebytes(state
,state
->config
->demod_address
,
138 printk(KERN_WARNING
"or51132: load_firmware error 3\n");
142 /* Wait at least 5 msec */
143 msleep(20); /* 10ms */
145 if ((ret
= i2c_writebytes(state
,state
->config
->demod_address
,
147 printk(KERN_WARNING
"or51132: load_firmware error 4\n");
151 /* 50ms for operation to begin */
154 /* Read back ucode version to besure we loaded correctly and are really up and running */
155 /* Get uCode version */
159 msleep(20); /* 20ms */
160 if ((ret
= i2c_writebytes(state
,state
->config
->demod_address
,
162 printk(KERN_WARNING
"or51132: load_firmware error a\n");
168 msleep(20); /* 20ms */
169 if ((ret
= i2c_writebytes(state
,state
->config
->demod_address
,
171 printk(KERN_WARNING
"or51132: load_firmware error b\n");
177 msleep(20); /* 20ms */
178 if ((ret
= i2c_writebytes(state
,state
->config
->demod_address
,
180 printk(KERN_WARNING
"or51132: load_firmware error c\n");
185 msleep(20); /* 20ms */
186 /* One apon a time, this command might have had something
187 to do with getting the firmware version, but it's
189 {0x04,0x00,0x30,0x00,i+1} */
190 /* Read 8 bytes, two bytes at a time */
191 if ((ret
= i2c_readbytes(state
,state
->config
->demod_address
,
194 "or51132: load_firmware error d - %d\n",i
);
200 "or51132: Version: %02X%02X%02X%02X-%02X%02X%02X%02X (%02X%01X-%01X-%02X%01X-%01X)\n",
201 rec_buf
[1],rec_buf
[0],rec_buf
[3],rec_buf
[2],
202 rec_buf
[5],rec_buf
[4],rec_buf
[7],rec_buf
[6],
203 rec_buf
[3],rec_buf
[2]>>4,rec_buf
[2]&0x0f,
204 rec_buf
[5],rec_buf
[4]>>4,rec_buf
[4]&0x0f);
209 msleep(20); /* 20ms */
210 if ((ret
= i2c_writebytes(state
,state
->config
->demod_address
,
212 printk(KERN_WARNING
"or51132: load_firmware error e\n");
218 static int or51132_init(struct dvb_frontend
* fe
)
223 static int or51132_read_ber(struct dvb_frontend
* fe
, u32
* ber
)
229 static int or51132_read_ucblocks(struct dvb_frontend
* fe
, u32
* ucblocks
)
235 static int or51132_sleep(struct dvb_frontend
* fe
)
240 static int or51132_setmode(struct dvb_frontend
* fe
)
242 struct or51132_state
* state
= fe
->demodulator_priv
;
243 unsigned char cmd_buf
[4];
245 dprintk("setmode %d\n",(int)state
->current_modulation
);
246 /* set operation mode in Receiver 1 register; */
249 switch (state
->current_modulation
) {
253 /* Auto-deinterleave; MPEG ser, MPEG2tr, phase noise-high*/
257 /* Auto CH, Auto NTSC rej, MPEGser, MPEG2tr, phase noise-high*/
261 printk("setmode:Modulation set to unsupported value\n");
264 if (i2c_writebytes(state
,state
->config
->demod_address
,
266 printk(KERN_WARNING
"or51132: set_mode error 1\n");
269 dprintk("or51132: set #1 to %02x\n", cmd_buf
[2]);
271 /* Set operation mode in Receiver 6 register */
273 switch (state
->current_modulation
) {
275 /* REC MODE Normal Carrier Lock */
277 /* Channel MODE Auto QAM64/256 */
281 /* REC MODE Normal Carrier Lock */
283 /* Channel MODE QAM256 */
287 /* REC MODE Normal Carrier Lock */
289 /* Channel MODE QAM64 */
293 /* REC MODE inv IF spectrum, Normal */
295 /* Channel MODE ATSC/VSB8 */
299 printk("setmode: Modulation set to unsupported value\n");
302 msleep(20); /* 20ms */
303 if (i2c_writebytes(state
,state
->config
->demod_address
,
305 printk(KERN_WARNING
"or51132: set_mode error 2\n");
308 dprintk("or51132: set #6 to 0x%02x%02x\n", cmd_buf
[1], cmd_buf
[2]);
313 static int or51132_set_parameters(struct dvb_frontend
* fe
,
314 struct dvb_frontend_parameters
*param
)
318 struct or51132_state
* state
= fe
->demodulator_priv
;
319 const struct firmware
*fw
;
321 /* Change only if we are actually changing the modulation */
322 if (state
->current_modulation
!= param
->u
.vsb
.modulation
) {
323 switch(param
->u
.vsb
.modulation
) {
325 dprintk("set_parameters VSB MODE\n");
326 printk("or51132: Waiting for firmware upload(%s)...\n",
327 OR51132_VSB_FIRMWARE
);
328 ret
= request_firmware(&fw
, OR51132_VSB_FIRMWARE
,
331 printk(KERN_WARNING
"or51132: No firmware up"
332 "loaded(timeout or file not found?)\n");
335 /* Set non-punctured clock for VSB */
336 state
->config
->set_ts_params(fe
, 0);
341 dprintk("set_parameters QAM MODE\n");
342 printk("or51132: Waiting for firmware upload(%s)...\n",
343 OR51132_QAM_FIRMWARE
);
344 ret
= request_firmware(&fw
, OR51132_QAM_FIRMWARE
,
347 printk(KERN_WARNING
"or51132: No firmware up"
348 "loaded(timeout or file not found?)\n");
351 /* Set punctured clock for QAM */
352 state
->config
->set_ts_params(fe
, 1);
355 printk("or51132:Modulation type(%d) UNSUPPORTED\n",
356 param
->u
.vsb
.modulation
);
359 ret
= or51132_load_firmware(fe
, fw
);
360 release_firmware(fw
);
362 printk(KERN_WARNING
"or51132: Writing firmware to "
366 printk("or51132: Firmware upload complete.\n");
368 state
->current_modulation
= param
->u
.vsb
.modulation
;
372 dvb_pll_configure(state
->config
->pll_desc
, buf
,
373 param
->frequency
, 0);
374 dprintk("set_parameters tuner bytes: 0x%02x 0x%02x "
375 "0x%02x 0x%02x\n",buf
[0],buf
[1],buf
[2],buf
[3]);
376 if (i2c_writebytes(state
, state
->config
->pll_address
,buf
, 4))
377 printk(KERN_WARNING
"or51132: set_parameters error "
378 "writing to tuner\n");
380 /* Set to current mode */
383 /* Update current frequency */
384 state
->current_frequency
= param
->frequency
;
388 static int or51132_read_status(struct dvb_frontend
* fe
, fe_status_t
* status
)
390 struct or51132_state
* state
= fe
->demodulator_priv
;
391 unsigned char rec_buf
[2];
392 unsigned char snd_buf
[2];
395 /* Receiver Status */
398 msleep(30); /* 30ms */
399 if (i2c_writebytes(state
,state
->config
->demod_address
,snd_buf
,2)) {
400 printk(KERN_WARNING
"or51132: read_status write error\n");
403 msleep(30); /* 30ms */
404 if (i2c_readbytes(state
,state
->config
->demod_address
,rec_buf
,2)) {
405 printk(KERN_WARNING
"or51132: read_status read error\n");
408 dprintk("read_status %x %x\n",rec_buf
[0],rec_buf
[1]);
410 if (rec_buf
[1] & 0x01) { /* Receiver Lock */
411 *status
|= FE_HAS_SIGNAL
;
412 *status
|= FE_HAS_CARRIER
;
413 *status
|= FE_HAS_VITERBI
;
414 *status
|= FE_HAS_SYNC
;
415 *status
|= FE_HAS_LOCK
;
420 /* log10-1 table at .5 increments from 1 to 100.5 */
421 static unsigned int i100x20log10
[] = {
422 0, 352, 602, 795, 954, 1088, 1204, 1306, 1397, 1480,
423 1556, 1625, 1690, 1750, 1806, 1858, 1908, 1955, 2000, 2042,
424 2082, 2121, 2158, 2193, 2227, 2260, 2292, 2322, 2352, 2380,
425 2408, 2434, 2460, 2486, 2510, 2534, 2557, 2580, 2602, 2623,
426 2644, 2664, 2684, 2704, 2723, 2742, 2760, 2778, 2795, 2813,
427 2829, 2846, 2862, 2878, 2894, 2909, 2924, 2939, 2954, 2968,
428 2982, 2996, 3010, 3023, 3037, 3050, 3062, 3075, 3088, 3100,
429 3112, 3124, 3136, 3148, 3159, 3170, 3182, 3193, 3204, 3214,
430 3225, 3236, 3246, 3256, 3266, 3276, 3286, 3296, 3306, 3316,
431 3325, 3334, 3344, 3353, 3362, 3371, 3380, 3389, 3397, 3406,
432 3415, 3423, 3432, 3440, 3448, 3456, 3464, 3472, 3480, 3488,
433 3496, 3504, 3511, 3519, 3526, 3534, 3541, 3549, 3556, 3563,
434 3570, 3577, 3584, 3591, 3598, 3605, 3612, 3619, 3625, 3632,
435 3639, 3645, 3652, 3658, 3665, 3671, 3677, 3683, 3690, 3696,
436 3702, 3708, 3714, 3720, 3726, 3732, 3738, 3744, 3750, 3755,
437 3761, 3767, 3772, 3778, 3784, 3789, 3795, 3800, 3806, 3811,
438 3816, 3822, 3827, 3832, 3838, 3843, 3848, 3853, 3858, 3863,
439 3868, 3874, 3879, 3884, 3888, 3893, 3898, 3903, 3908, 3913,
440 3918, 3922, 3927, 3932, 3936, 3941, 3946, 3950, 3955, 3960,
441 3964, 3969, 3973, 3978, 3982, 3986, 3991, 3995, 4000, 4004,
444 static unsigned int denom
[] = {1,1,100,1000,10000,100000,1000000,10000000,100000000};
446 static unsigned int i20Log10(unsigned short val
)
448 unsigned int rntval
= 100;
449 unsigned int tmp
= val
;
450 unsigned int exp
= 1;
452 while(tmp
> 100) {tmp
/= 100; exp
++;}
454 val
= (2 * val
)/denom
[exp
];
455 if (exp
> 1) rntval
= 2000*exp
;
457 rntval
+= i100x20log10
[val
];
461 static int or51132_read_signal_strength(struct dvb_frontend
* fe
, u16
* strength
)
463 struct or51132_state
* state
= fe
->demodulator_priv
;
464 unsigned char rec_buf
[2];
465 unsigned char snd_buf
[2];
472 snd_buf
[1]=0x02; /* SNR after Equalizer */
473 msleep(30); /* 30ms */
474 if (i2c_writebytes(state
,state
->config
->demod_address
,snd_buf
,2)) {
475 printk(KERN_WARNING
"or51132: read_status write error\n");
478 msleep(30); /* 30ms */
479 if (i2c_readbytes(state
,state
->config
->demod_address
,rec_buf
,2)) {
480 printk(KERN_WARNING
"or51132: read_status read error\n");
483 snr_equ
= rec_buf
[0] | (rec_buf
[1] << 8);
484 dprintk("read_signal_strength snr_equ %x %x (%i)\n",rec_buf
[0],rec_buf
[1],snr_equ
);
486 /* Receiver Status */
489 msleep(30); /* 30ms */
490 if (i2c_writebytes(state
,state
->config
->demod_address
,snd_buf
,2)) {
491 printk(KERN_WARNING
"or51132: read_signal_strength read_status write error\n");
494 msleep(30); /* 30ms */
495 if (i2c_readbytes(state
,state
->config
->demod_address
,rec_buf
,2)) {
496 printk(KERN_WARNING
"or51132: read_signal_strength read_status read error\n");
499 dprintk("read_signal_strength read_status %x %x\n",rec_buf
[0],rec_buf
[1]);
500 rcvr_stat
= rec_buf
[1];
501 usK
= (rcvr_stat
& 0x10) ? 3 : 0;
503 /* The value reported back from the frontend will be FFFF=100% 0000=0% */
504 signal_strength
= (((8952 - i20Log10(snr_equ
) - usK
*100)/3+5)*65535)/1000;
505 if (signal_strength
> 0xffff)
508 *strength
= signal_strength
;
509 dprintk("read_signal_strength %i\n",*strength
);
514 static int or51132_read_snr(struct dvb_frontend
* fe
, u16
* snr
)
516 struct or51132_state
* state
= fe
->demodulator_priv
;
517 unsigned char rec_buf
[2];
518 unsigned char snd_buf
[2];
522 snd_buf
[1]=0x02; /* SNR after Equalizer */
523 msleep(30); /* 30ms */
524 if (i2c_writebytes(state
,state
->config
->demod_address
,snd_buf
,2)) {
525 printk(KERN_WARNING
"or51132: read_snr write error\n");
528 msleep(30); /* 30ms */
529 if (i2c_readbytes(state
,state
->config
->demod_address
,rec_buf
,2)) {
530 printk(KERN_WARNING
"or51132: read_snr dvr read error\n");
533 snr_equ
= rec_buf
[0] | (rec_buf
[1] << 8);
534 dprintk("read_snr snr_equ %x %x (%i)\n",rec_buf
[0],rec_buf
[1],snr_equ
);
536 *snr
= 0xFFFF - snr_equ
;
537 dprintk("read_snr %i\n",*snr
);
542 static int or51132_get_tune_settings(struct dvb_frontend
* fe
, struct dvb_frontend_tune_settings
* fe_tune_settings
)
544 fe_tune_settings
->min_delay_ms
= 500;
545 fe_tune_settings
->step_size
= 0;
546 fe_tune_settings
->max_drift
= 0;
551 static void or51132_release(struct dvb_frontend
* fe
)
553 struct or51132_state
* state
= fe
->demodulator_priv
;
557 static struct dvb_frontend_ops or51132_ops
;
559 struct dvb_frontend
* or51132_attach(const struct or51132_config
* config
,
560 struct i2c_adapter
* i2c
)
562 struct or51132_state
* state
= NULL
;
564 /* Allocate memory for the internal state */
565 state
= kmalloc(sizeof(struct or51132_state
), GFP_KERNEL
);
569 /* Setup the state */
570 state
->config
= config
;
572 memcpy(&state
->ops
, &or51132_ops
, sizeof(struct dvb_frontend_ops
));
573 state
->current_frequency
= -1;
574 state
->current_modulation
= -1;
576 /* Create dvb_frontend */
577 state
->frontend
.ops
= &state
->ops
;
578 state
->frontend
.demodulator_priv
= state
;
579 return &state
->frontend
;
586 static struct dvb_frontend_ops or51132_ops
= {
589 .name
= "Oren OR51132 VSB/QAM Frontend",
591 .frequency_min
= 44000000,
592 .frequency_max
= 958000000,
593 .frequency_stepsize
= 166666,
594 .caps
= FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
595 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
| FE_CAN_FEC_AUTO
|
596 FE_CAN_QAM_64
| FE_CAN_QAM_256
| FE_CAN_QAM_AUTO
|
600 .release
= or51132_release
,
602 .init
= or51132_init
,
603 .sleep
= or51132_sleep
,
605 .set_frontend
= or51132_set_parameters
,
606 .get_tune_settings
= or51132_get_tune_settings
,
608 .read_status
= or51132_read_status
,
609 .read_ber
= or51132_read_ber
,
610 .read_signal_strength
= or51132_read_signal_strength
,
611 .read_snr
= or51132_read_snr
,
612 .read_ucblocks
= or51132_read_ucblocks
,
615 module_param(debug
, int, 0644);
616 MODULE_PARM_DESC(debug
, "Turn on/off frontend debugging (default:off).");
618 MODULE_DESCRIPTION("OR51132 ATSC [pcHDTV HD-3000] (8VSB & ITU J83 AnnexB FEC QAM64/256) Demodulator Driver");
619 MODULE_AUTHOR("Kirk Lapray");
620 MODULE_LICENSE("GPL");
622 EXPORT_SYMBOL(or51132_attach
);