1 /* DVB USB compliant Linux driver for the Friio USB2.0 ISDB-T receiver.
3 * Copyright (C) 2009 Akihiro Tsukada <tskd2@yahoo.co.jp>
5 * This module is based off the the gl861 and vp702x modules.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation, version 2.
11 * see Documentation/dvb/README.dvb-usb for more information
13 #include <linux/init.h>
14 #include <linux/string.h>
15 #include <linux/slab.h>
19 struct jdvbt90502_state
{
20 struct i2c_adapter
*i2c
;
21 struct dvb_frontend frontend
;
22 struct jdvbt90502_config config
;
25 /* NOTE: TC90502 has 16bit register-address? */
26 /* register 0x0100 is used for reading PLL status, so reg is u16 here */
27 static int jdvbt90502_reg_read(struct jdvbt90502_state
*state
,
28 const u16 reg
, u8
*buf
, const size_t count
)
32 struct i2c_msg msg
[2];
38 msg
[0].addr
= state
->config
.demod_address
;
41 msg
[0].len
= sizeof(wbuf
);
43 msg
[1].addr
= msg
[0].addr
;
44 msg
[1].flags
= I2C_M_RD
;
48 ret
= i2c_transfer(state
->i2c
, msg
, 2);
50 deb_fe(" reg read failed.\n");
56 /* currently 16bit register-address is not used, so reg is u8 here */
57 static int jdvbt90502_single_reg_write(struct jdvbt90502_state
*state
,
58 const u8 reg
, const u8 val
)
66 msg
.addr
= state
->config
.demod_address
;
69 msg
.len
= sizeof(wbuf
);
71 if (i2c_transfer(state
->i2c
, &msg
, 1) != 1) {
72 deb_fe(" reg write failed.");
78 static int _jdvbt90502_write(struct dvb_frontend
*fe
, u8
*buf
, int len
)
80 struct jdvbt90502_state
*state
= fe
->demodulator_priv
;
82 for (i
= 0; i
< len
- 1; i
++) {
83 err
= jdvbt90502_single_reg_write(state
,
84 buf
[0] + i
, buf
[i
+ 1]);
92 /* read pll status byte via the demodulator's I2C register */
93 /* note: Win box reads it by 8B block at the I2C addr 0x30 from reg:0x80 */
94 static int jdvbt90502_pll_read(struct jdvbt90502_state
*state
, u8
*result
)
99 u8 pll_addr_byte
= (state
->config
.pll_address
<< 1) + 1;
103 ret
= jdvbt90502_single_reg_write(state
, JDVBT90502_2ND_I2C_REG
,
108 ret
= jdvbt90502_reg_read(state
, 0x0100, result
, 1);
112 deb_fe("PLL read val:%02x\n", *result
);
116 deb_fe("%s:ret == %d\n", __func__
, ret
);
121 /* set pll frequency via the demodulator's I2C register */
122 static int jdvbt90502_pll_set_freq(struct jdvbt90502_state
*state
, u32 freq
)
129 u8 pll_freq_cmd
[PLL_CMD_LEN
];
130 u8 pll_agc_cmd
[PLL_CMD_LEN
];
131 struct i2c_msg msg
[2];
134 deb_fe("%s: freq=%d, step=%d\n", __func__
, freq
,
135 state
->frontend
.ops
.info
.frequency_stepsize
);
136 /* freq -> oscilator frequency conversion. */
137 /* freq: 473,000,000 + n*6,000,000 (no 1/7MHz shift to center freq) */
138 /* add 400[1/7 MHZ] = 57.142857MHz. 57MHz for the IF, */
139 /* 1/7MHz for center freq shift */
140 f
= freq
/ state
->frontend
.ops
.info
.frequency_stepsize
;
142 pll_freq_cmd
[DEMOD_REDIRECT_REG
] = JDVBT90502_2ND_I2C_REG
; /* 0xFE */
143 pll_freq_cmd
[ADDRESS_BYTE
] = state
->config
.pll_address
<< 1;
144 pll_freq_cmd
[DIVIDER_BYTE1
] = (f
>> 8) & 0x7F;
145 pll_freq_cmd
[DIVIDER_BYTE2
] = f
& 0xFF;
146 pll_freq_cmd
[CONTROL_BYTE
] = 0xB2; /* ref.divider:28, 4MHz/28=1/7MHz */
147 pll_freq_cmd
[BANDSWITCH_BYTE
] = 0x08; /* UHF band */
149 msg
[0].addr
= state
->config
.demod_address
;
151 msg
[0].buf
= pll_freq_cmd
;
152 msg
[0].len
= sizeof(pll_freq_cmd
);
154 ret
= i2c_transfer(state
->i2c
, &msg
[0], 1);
160 pll_agc_cmd
[DEMOD_REDIRECT_REG
] = pll_freq_cmd
[DEMOD_REDIRECT_REG
];
161 pll_agc_cmd
[ADDRESS_BYTE
] = pll_freq_cmd
[ADDRESS_BYTE
];
162 pll_agc_cmd
[DIVIDER_BYTE1
] = pll_freq_cmd
[DIVIDER_BYTE1
];
163 pll_agc_cmd
[DIVIDER_BYTE2
] = pll_freq_cmd
[DIVIDER_BYTE2
];
164 pll_agc_cmd
[CONTROL_BYTE
] = 0x9A; /* AGC_CTRL instead of BANDSWITCH */
165 pll_agc_cmd
[AGC_CTRL_BYTE
] = 0x50;
166 /* AGC Time Constant 2s, AGC take-over point:103dBuV(lowest) */
168 msg
[1].addr
= msg
[0].addr
;
170 msg
[1].buf
= pll_agc_cmd
;
171 msg
[1].len
= sizeof(pll_agc_cmd
);
173 ret
= i2c_transfer(state
->i2c
, &msg
[1], 1);
177 /* I don't know what these cmds are for, */
178 /* but the USB log on a windows box contains them */
179 ret
= jdvbt90502_single_reg_write(state
, 0x01, 0x40);
180 ret
|= jdvbt90502_single_reg_write(state
, 0x01, 0x00);
185 /* wait for the demod to be ready? */
186 #define RETRY_COUNT 5
187 for (retry
= 0; retry
< RETRY_COUNT
; retry
++) {
188 ret
= jdvbt90502_reg_read(state
, 0x0096, &res1
, 1);
191 /* if (res1 != 0x00) goto error; */
192 ret
= jdvbt90502_reg_read(state
, 0x00B0, res2
, sizeof(res2
));
199 if (retry
>= RETRY_COUNT
) {
200 deb_fe("%s: FE does not get ready after freq setting.\n",
207 deb_fe("%s:ret == %d\n", __func__
, ret
);
211 static int jdvbt90502_read_status(struct dvb_frontend
*fe
, fe_status_t
*state
)
216 *state
= FE_HAS_SIGNAL
;
218 ret
= jdvbt90502_pll_read(fe
->demodulator_priv
, &result
);
220 deb_fe("%s:ret == %d\n", __func__
, ret
);
224 *state
= FE_HAS_SIGNAL
229 if (result
& PLL_STATUS_LOCKED
)
230 *state
|= FE_HAS_LOCK
;
235 static int jdvbt90502_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
241 static int jdvbt90502_read_signal_strength(struct dvb_frontend
*fe
,
249 /* status register (incl. signal strength) : 0x89 */
250 /* TODO: read just the necessary registers [0x8B..0x8D]? */
251 ret
= jdvbt90502_reg_read(fe
->demodulator_priv
, 0x0089,
255 deb_fe("%s:ret == %d\n", __func__
, ret
);
259 /* signal_strength: rbuf[2-4] (24bit BE), use lower 16bit for now. */
260 *strength
= (rbuf
[3] << 8) + rbuf
[4];
267 static int jdvbt90502_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
273 static int jdvbt90502_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
279 static int jdvbt90502_get_tune_settings(struct dvb_frontend
*fe
,
280 struct dvb_frontend_tune_settings
*fs
)
282 fs
->min_delay_ms
= 500;
289 static int jdvbt90502_get_frontend(struct dvb_frontend
*fe
,
290 struct dvb_frontend_parameters
*p
)
292 p
->inversion
= INVERSION_AUTO
;
293 p
->u
.ofdm
.bandwidth
= BANDWIDTH_6_MHZ
;
294 p
->u
.ofdm
.code_rate_HP
= FEC_AUTO
;
295 p
->u
.ofdm
.code_rate_LP
= FEC_AUTO
;
296 p
->u
.ofdm
.constellation
= QAM_64
;
297 p
->u
.ofdm
.transmission_mode
= TRANSMISSION_MODE_AUTO
;
298 p
->u
.ofdm
.guard_interval
= GUARD_INTERVAL_AUTO
;
299 p
->u
.ofdm
.hierarchy_information
= HIERARCHY_AUTO
;
303 static int jdvbt90502_set_frontend(struct dvb_frontend
*fe
,
304 struct dvb_frontend_parameters
*p
)
307 * NOTE: ignore all the paramters except frequency.
308 * others should be fixed to the proper value for ISDB-T,
309 * but don't check here.
312 struct jdvbt90502_state
*state
= fe
->demodulator_priv
;
315 deb_fe("%s: Freq:%d\n", __func__
, p
->frequency
);
317 ret
= jdvbt90502_pll_set_freq(state
, p
->frequency
);
319 deb_fe("%s:ret == %d\n", __func__
, ret
);
326 static int jdvbt90502_sleep(struct dvb_frontend
*fe
)
328 deb_fe("%s called.\n", __func__
);
334 * (reg, val) commad list to initialize this module.
335 * captured on a Windows box.
337 static u8 init_code
[][2] = {
376 const static int init_code_len
= sizeof(init_code
) / sizeof(u8
[2]);
378 static int jdvbt90502_init(struct dvb_frontend
*fe
)
384 struct jdvbt90502_state
*state
= fe
->demodulator_priv
;
386 deb_fe("%s called.\n", __func__
);
388 msg
.addr
= state
->config
.demod_address
;
391 for (i
= 0; i
< init_code_len
; i
++) {
392 msg
.buf
= init_code
[i
];
393 ret
= i2c_transfer(state
->i2c
, &msg
, 1);
402 deb_fe("%s: init_code[%d] failed. ret==%d\n", __func__
, i
, ret
);
407 static void jdvbt90502_release(struct dvb_frontend
*fe
)
409 struct jdvbt90502_state
*state
= fe
->demodulator_priv
;
414 static struct dvb_frontend_ops jdvbt90502_ops
;
416 struct dvb_frontend
*jdvbt90502_attach(struct dvb_usb_device
*d
)
418 struct jdvbt90502_state
*state
= NULL
;
420 deb_info("%s called.\n", __func__
);
422 /* allocate memory for the internal state */
423 state
= kzalloc(sizeof(struct jdvbt90502_state
), GFP_KERNEL
);
427 /* setup the state */
428 state
->i2c
= &d
->i2c_adap
;
429 memcpy(&state
->config
, &friio_fe_config
, sizeof(friio_fe_config
));
431 /* create dvb_frontend */
432 memcpy(&state
->frontend
.ops
, &jdvbt90502_ops
,
433 sizeof(jdvbt90502_ops
));
434 state
->frontend
.demodulator_priv
= state
;
436 if (jdvbt90502_init(&state
->frontend
) < 0)
439 return &state
->frontend
;
446 static struct dvb_frontend_ops jdvbt90502_ops
= {
449 .name
= "Comtech JDVBT90502 ISDB-T",
451 .frequency_min
= 473000000, /* UHF 13ch, center */
452 .frequency_max
= 767142857, /* UHF 62ch, center */
453 .frequency_stepsize
= JDVBT90502_PLL_CLK
/
454 JDVBT90502_PLL_DIVIDER
,
455 .frequency_tolerance
= 0,
457 /* NOTE: this driver ignores all parameters but frequency. */
458 .caps
= FE_CAN_INVERSION_AUTO
|
459 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
460 FE_CAN_FEC_4_5
| FE_CAN_FEC_5_6
| FE_CAN_FEC_6_7
|
461 FE_CAN_FEC_7_8
| FE_CAN_FEC_8_9
| FE_CAN_FEC_AUTO
|
462 FE_CAN_QAM_16
| FE_CAN_QAM_64
| FE_CAN_QAM_AUTO
|
463 FE_CAN_TRANSMISSION_MODE_AUTO
|
464 FE_CAN_GUARD_INTERVAL_AUTO
|
465 FE_CAN_HIERARCHY_AUTO
,
468 .release
= jdvbt90502_release
,
470 .init
= jdvbt90502_init
,
471 .sleep
= jdvbt90502_sleep
,
472 .write
= _jdvbt90502_write
,
474 .set_frontend
= jdvbt90502_set_frontend
,
475 .get_frontend
= jdvbt90502_get_frontend
,
476 .get_tune_settings
= jdvbt90502_get_tune_settings
,
478 .read_status
= jdvbt90502_read_status
,
479 .read_ber
= jdvbt90502_read_ber
,
480 .read_signal_strength
= jdvbt90502_read_signal_strength
,
481 .read_snr
= jdvbt90502_read_snr
,
482 .read_ucblocks
= jdvbt90502_read_ucblocks
,