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/media/dvb-drivers/dvb-usb.rst for more information
13 #include <linux/init.h>
14 #include <linux/string.h>
15 #include <linux/slab.h>
16 #include <linux/kernel.h>
20 struct jdvbt90502_state
{
21 struct i2c_adapter
*i2c
;
22 struct dvb_frontend frontend
;
23 struct jdvbt90502_config config
;
26 /* NOTE: TC90502 has 16bit register-address? */
27 /* register 0x0100 is used for reading PLL status, so reg is u16 here */
28 static int jdvbt90502_reg_read(struct jdvbt90502_state
*state
,
29 const u16 reg
, u8
*buf
, const size_t count
)
33 struct i2c_msg msg
[2];
39 msg
[0].addr
= state
->config
.demod_address
;
42 msg
[0].len
= sizeof(wbuf
);
44 msg
[1].addr
= msg
[0].addr
;
45 msg
[1].flags
= I2C_M_RD
;
49 ret
= i2c_transfer(state
->i2c
, msg
, 2);
51 deb_fe(" reg read failed.\n");
57 /* currently 16bit register-address is not used, so reg is u8 here */
58 static int jdvbt90502_single_reg_write(struct jdvbt90502_state
*state
,
59 const u8 reg
, const u8 val
)
67 msg
.addr
= state
->config
.demod_address
;
70 msg
.len
= sizeof(wbuf
);
72 if (i2c_transfer(state
->i2c
, &msg
, 1) != 1) {
73 deb_fe(" reg write failed.");
79 static int _jdvbt90502_write(struct dvb_frontend
*fe
, const u8 buf
[], int len
)
81 struct jdvbt90502_state
*state
= fe
->demodulator_priv
;
83 for (i
= 0; i
< len
- 1; i
++) {
84 err
= jdvbt90502_single_reg_write(state
,
85 buf
[0] + i
, buf
[i
+ 1]);
93 /* read pll status byte via the demodulator's I2C register */
94 /* note: Win box reads it by 8B block at the I2C addr 0x30 from reg:0x80 */
95 static int jdvbt90502_pll_read(struct jdvbt90502_state
*state
, u8
*result
)
100 u8 pll_addr_byte
= (state
->config
.pll_address
<< 1) + 1;
104 ret
= jdvbt90502_single_reg_write(state
, JDVBT90502_2ND_I2C_REG
,
109 ret
= jdvbt90502_reg_read(state
, 0x0100, result
, 1);
113 deb_fe("PLL read val:%02x\n", *result
);
117 deb_fe("%s:ret == %d\n", __func__
, ret
);
122 /* set pll frequency via the demodulator's I2C register */
123 static int jdvbt90502_pll_set_freq(struct jdvbt90502_state
*state
, u32 freq
)
130 u8 pll_freq_cmd
[PLL_CMD_LEN
];
131 u8 pll_agc_cmd
[PLL_CMD_LEN
];
132 struct i2c_msg msg
[2];
135 deb_fe("%s: freq=%d, step=%d\n", __func__
, freq
,
136 state
->frontend
.ops
.info
.frequency_stepsize_hz
);
137 /* freq -> oscilator frequency conversion. */
138 /* freq: 473,000,000 + n*6,000,000 [+ 142857 (center freq. shift)] */
139 f
= freq
/ state
->frontend
.ops
.info
.frequency_stepsize_hz
;
140 /* add 399[1/7 MHZ] = 57MHz for the IF */
142 /* add center frequency shift if necessary */
145 pll_freq_cmd
[DEMOD_REDIRECT_REG
] = JDVBT90502_2ND_I2C_REG
; /* 0xFE */
146 pll_freq_cmd
[ADDRESS_BYTE
] = state
->config
.pll_address
<< 1;
147 pll_freq_cmd
[DIVIDER_BYTE1
] = (f
>> 8) & 0x7F;
148 pll_freq_cmd
[DIVIDER_BYTE2
] = f
& 0xFF;
149 pll_freq_cmd
[CONTROL_BYTE
] = 0xB2; /* ref.divider:28, 4MHz/28=1/7MHz */
150 pll_freq_cmd
[BANDSWITCH_BYTE
] = 0x08; /* UHF band */
152 msg
[0].addr
= state
->config
.demod_address
;
154 msg
[0].buf
= pll_freq_cmd
;
155 msg
[0].len
= sizeof(pll_freq_cmd
);
157 ret
= i2c_transfer(state
->i2c
, &msg
[0], 1);
163 pll_agc_cmd
[DEMOD_REDIRECT_REG
] = pll_freq_cmd
[DEMOD_REDIRECT_REG
];
164 pll_agc_cmd
[ADDRESS_BYTE
] = pll_freq_cmd
[ADDRESS_BYTE
];
165 pll_agc_cmd
[DIVIDER_BYTE1
] = pll_freq_cmd
[DIVIDER_BYTE1
];
166 pll_agc_cmd
[DIVIDER_BYTE2
] = pll_freq_cmd
[DIVIDER_BYTE2
];
167 pll_agc_cmd
[CONTROL_BYTE
] = 0x9A; /* AGC_CTRL instead of BANDSWITCH */
168 pll_agc_cmd
[AGC_CTRL_BYTE
] = 0x50;
169 /* AGC Time Constant 2s, AGC take-over point:103dBuV(lowest) */
171 msg
[1].addr
= msg
[0].addr
;
173 msg
[1].buf
= pll_agc_cmd
;
174 msg
[1].len
= sizeof(pll_agc_cmd
);
176 ret
= i2c_transfer(state
->i2c
, &msg
[1], 1);
180 /* I don't know what these cmds are for, */
181 /* but the USB log on a windows box contains them */
182 ret
= jdvbt90502_single_reg_write(state
, 0x01, 0x40);
183 ret
|= jdvbt90502_single_reg_write(state
, 0x01, 0x00);
188 /* wait for the demod to be ready? */
189 #define RETRY_COUNT 5
190 for (retry
= 0; retry
< RETRY_COUNT
; retry
++) {
191 ret
= jdvbt90502_reg_read(state
, 0x0096, &res1
, 1);
194 /* if (res1 != 0x00) goto error; */
195 ret
= jdvbt90502_reg_read(state
, 0x00B0, res2
, sizeof(res2
));
202 if (retry
>= RETRY_COUNT
) {
203 deb_fe("%s: FE does not get ready after freq setting.\n",
210 deb_fe("%s:ret == %d\n", __func__
, ret
);
214 static int jdvbt90502_read_status(struct dvb_frontend
*fe
,
215 enum fe_status
*state
)
220 *state
= FE_HAS_SIGNAL
;
222 ret
= jdvbt90502_pll_read(fe
->demodulator_priv
, &result
);
224 deb_fe("%s:ret == %d\n", __func__
, ret
);
228 *state
= FE_HAS_SIGNAL
233 if (result
& PLL_STATUS_LOCKED
)
234 *state
|= FE_HAS_LOCK
;
239 static int jdvbt90502_read_signal_strength(struct dvb_frontend
*fe
,
247 /* status register (incl. signal strength) : 0x89 */
248 /* TODO: read just the necessary registers [0x8B..0x8D]? */
249 ret
= jdvbt90502_reg_read(fe
->demodulator_priv
, 0x0089,
253 deb_fe("%s:ret == %d\n", __func__
, ret
);
257 /* signal_strength: rbuf[2-4] (24bit BE), use lower 16bit for now. */
258 *strength
= (rbuf
[3] << 8) + rbuf
[4];
265 static int jdvbt90502_set_frontend(struct dvb_frontend
*fe
)
267 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
270 * NOTE: ignore all the parameters except frequency.
271 * others should be fixed to the proper value for ISDB-T,
272 * but don't check here.
275 struct jdvbt90502_state
*state
= fe
->demodulator_priv
;
278 deb_fe("%s: Freq:%d\n", __func__
, p
->frequency
);
280 /* This driver only works on auto mode */
281 p
->inversion
= INVERSION_AUTO
;
282 p
->bandwidth_hz
= 6000000;
283 p
->code_rate_HP
= FEC_AUTO
;
284 p
->code_rate_LP
= FEC_AUTO
;
285 p
->modulation
= QAM_64
;
286 p
->transmission_mode
= TRANSMISSION_MODE_AUTO
;
287 p
->guard_interval
= GUARD_INTERVAL_AUTO
;
288 p
->hierarchy
= HIERARCHY_AUTO
;
289 p
->delivery_system
= SYS_ISDBT
;
291 ret
= jdvbt90502_pll_set_freq(state
, p
->frequency
);
293 deb_fe("%s:ret == %d\n", __func__
, ret
);
302 * (reg, val) commad list to initialize this module.
303 * captured on a Windows box.
305 static u8 init_code
[][2] = {
344 static int jdvbt90502_init(struct dvb_frontend
*fe
)
350 struct jdvbt90502_state
*state
= fe
->demodulator_priv
;
352 deb_fe("%s called.\n", __func__
);
354 msg
.addr
= state
->config
.demod_address
;
357 for (i
= 0; i
< ARRAY_SIZE(init_code
); i
++) {
358 msg
.buf
= init_code
[i
];
359 ret
= i2c_transfer(state
->i2c
, &msg
, 1);
363 fe
->dtv_property_cache
.delivery_system
= SYS_ISDBT
;
369 deb_fe("%s: init_code[%d] failed. ret==%d\n", __func__
, i
, ret
);
374 static void jdvbt90502_release(struct dvb_frontend
*fe
)
376 struct jdvbt90502_state
*state
= fe
->demodulator_priv
;
381 static const struct dvb_frontend_ops jdvbt90502_ops
;
383 struct dvb_frontend
*jdvbt90502_attach(struct dvb_usb_device
*d
)
385 struct jdvbt90502_state
*state
= NULL
;
387 deb_info("%s called.\n", __func__
);
389 /* allocate memory for the internal state */
390 state
= kzalloc(sizeof(struct jdvbt90502_state
), GFP_KERNEL
);
394 /* setup the state */
395 state
->i2c
= &d
->i2c_adap
;
396 state
->config
= friio_fe_config
;
398 /* create dvb_frontend */
399 state
->frontend
.ops
= jdvbt90502_ops
;
400 state
->frontend
.demodulator_priv
= state
;
402 if (jdvbt90502_init(&state
->frontend
) < 0)
405 return &state
->frontend
;
412 static const struct dvb_frontend_ops jdvbt90502_ops
= {
413 .delsys
= { SYS_ISDBT
},
415 .name
= "Comtech JDVBT90502 ISDB-T",
416 .frequency_min_hz
= 473000000, /* UHF 13ch, center */
417 .frequency_max_hz
= 767142857, /* UHF 62ch, center */
418 .frequency_stepsize_hz
= JDVBT90502_PLL_CLK
/ JDVBT90502_PLL_DIVIDER
,
420 /* NOTE: this driver ignores all parameters but frequency. */
421 .caps
= FE_CAN_INVERSION_AUTO
|
422 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
423 FE_CAN_FEC_4_5
| FE_CAN_FEC_5_6
| FE_CAN_FEC_6_7
|
424 FE_CAN_FEC_7_8
| FE_CAN_FEC_8_9
| FE_CAN_FEC_AUTO
|
425 FE_CAN_QAM_16
| FE_CAN_QAM_64
| FE_CAN_QAM_AUTO
|
426 FE_CAN_TRANSMISSION_MODE_AUTO
|
427 FE_CAN_GUARD_INTERVAL_AUTO
|
428 FE_CAN_HIERARCHY_AUTO
,
431 .release
= jdvbt90502_release
,
433 .init
= jdvbt90502_init
,
434 .write
= _jdvbt90502_write
,
436 .set_frontend
= jdvbt90502_set_frontend
,
438 .read_status
= jdvbt90502_read_status
,
439 .read_signal_strength
= jdvbt90502_read_signal_strength
,