2 * DVB USB Linux driver for Anysee E30 DVB-C & DVB-T USB2.0 receiver
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
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.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * - add smart card reader support for Conditional Access (CA)
23 * Card reader in Anysee is nothing more than ISO 7816 card reader.
24 * There is no hardware CAM in any Anysee device sold.
25 * In my understanding it should be implemented by making own module
26 * for ISO 7816 card reader, like dvb_ca_en50221 is implemented. This
27 * module registers serial interface that can be used to communicate
28 * with any ISO 7816 smart card.
30 * Any help according to implement serial smart card reader support
38 #include "mt352_priv.h"
47 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr
);
49 static int anysee_ctrl_msg(struct dvb_usb_device
*d
,
50 u8
*sbuf
, u8 slen
, u8
*rbuf
, u8 rlen
)
52 struct anysee_state
*state
= d_to_priv(d
);
55 mutex_lock(&d
->usb_mutex
);
57 memcpy(&state
->buf
[0], sbuf
, slen
);
58 state
->buf
[60] = state
->seq
++;
60 dev_dbg(&d
->udev
->dev
, "%s: >>> %*ph\n", __func__
, slen
, state
->buf
);
62 /* We need receive one message more after dvb_usb_generic_rw due
63 to weird transaction flow, which is 1 x send + 2 x receive. */
64 ret
= dvb_usbv2_generic_rw_locked(d
, state
->buf
, sizeof(state
->buf
),
65 state
->buf
, sizeof(state
->buf
));
69 /* TODO FIXME: dvb_usb_generic_rw() fails rarely with error code -32
70 * (EPIPE, Broken pipe). Function supports currently msleep() as a
71 * parameter but I would not like to use it, since according to
72 * Documentation/timers/timers-howto.txt it should not be used such
73 * short, under < 20ms, sleeps. Repeating failed message would be
74 * better choice as not to add unwanted delays...
75 * Fixing that correctly is one of those or both;
76 * 1) use repeat if possible
77 * 2) add suitable delay
80 /* get answer, retry few times if error returned */
81 for (i
= 0; i
< 3; i
++) {
82 /* receive 2nd answer */
83 ret
= usb_bulk_msg(d
->udev
, usb_rcvbulkpipe(d
->udev
,
84 d
->props
->generic_bulk_ctrl_endpoint
),
85 state
->buf
, sizeof(state
->buf
), &act_len
, 2000);
87 dev_dbg(&d
->udev
->dev
,
88 "%s: recv bulk message failed=%d\n",
91 dev_dbg(&d
->udev
->dev
, "%s: <<< %*ph\n", __func__
,
94 if (state
->buf
[63] != 0x4f)
95 dev_dbg(&d
->udev
->dev
,
96 "%s: cmd failed\n", __func__
);
102 /* all retries failed, it is fatal */
103 dev_err(&d
->udev
->dev
, "%s: recv bulk message failed=%d\n",
104 KBUILD_MODNAME
, ret
);
108 /* read request, copy returned data to return buf */
110 memcpy(rbuf
, state
->buf
, rlen
);
113 mutex_unlock(&d
->usb_mutex
);
117 static int anysee_read_reg(struct dvb_usb_device
*d
, u16 reg
, u8
*val
)
119 u8 buf
[] = {CMD_REG_READ
, reg
>> 8, reg
& 0xff, 0x01};
121 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), val
, 1);
122 dev_dbg(&d
->udev
->dev
, "%s: reg=%04x val=%02x\n", __func__
, reg
, *val
);
126 static int anysee_write_reg(struct dvb_usb_device
*d
, u16 reg
, u8 val
)
128 u8 buf
[] = {CMD_REG_WRITE
, reg
>> 8, reg
& 0xff, 0x01, val
};
129 dev_dbg(&d
->udev
->dev
, "%s: reg=%04x val=%02x\n", __func__
, reg
, val
);
130 return anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
133 /* write single register with mask */
134 static int anysee_wr_reg_mask(struct dvb_usb_device
*d
, u16 reg
, u8 val
,
140 /* no need for read if whole reg is written */
142 ret
= anysee_read_reg(d
, reg
, &tmp
);
151 return anysee_write_reg(d
, reg
, val
);
154 /* read single register with mask */
155 static int anysee_rd_reg_mask(struct dvb_usb_device
*d
, u16 reg
, u8
*val
,
161 ret
= anysee_read_reg(d
, reg
, &tmp
);
167 /* find position of the first bit */
168 for (i
= 0; i
< 8; i
++) {
169 if ((mask
>> i
) & 0x01)
177 static int anysee_get_hw_info(struct dvb_usb_device
*d
, u8
*id
)
179 u8 buf
[] = {CMD_GET_HW_INFO
};
180 return anysee_ctrl_msg(d
, buf
, sizeof(buf
), id
, 3);
183 static int anysee_streaming_ctrl(struct dvb_frontend
*fe
, int onoff
)
185 u8 buf
[] = {CMD_STREAMING_CTRL
, (u8
)onoff
, 0x00};
186 dev_dbg(&fe_to_d(fe
)->udev
->dev
, "%s: onoff=%d\n", __func__
, onoff
);
187 return anysee_ctrl_msg(fe_to_d(fe
), buf
, sizeof(buf
), NULL
, 0);
190 static int anysee_led_ctrl(struct dvb_usb_device
*d
, u8 mode
, u8 interval
)
192 u8 buf
[] = {CMD_LED_AND_IR_CTRL
, 0x01, mode
, interval
};
193 dev_dbg(&d
->udev
->dev
, "%s: state=%d interval=%d\n", __func__
,
195 return anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
198 static int anysee_ir_ctrl(struct dvb_usb_device
*d
, u8 onoff
)
200 u8 buf
[] = {CMD_LED_AND_IR_CTRL
, 0x02, onoff
};
201 dev_dbg(&d
->udev
->dev
, "%s: onoff=%d\n", __func__
, onoff
);
202 return anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
206 static int anysee_master_xfer(struct i2c_adapter
*adap
, struct i2c_msg
*msg
,
209 struct dvb_usb_device
*d
= i2c_get_adapdata(adap
);
210 int ret
= 0, inc
, i
= 0;
211 u8 buf
[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
213 if (mutex_lock_interruptible(&d
->i2c_mutex
) < 0)
217 if (num
> i
+ 1 && (msg
[i
+1].flags
& I2C_M_RD
)) {
218 if (msg
[i
].len
> 2 || msg
[i
+1].len
> 60) {
222 buf
[0] = CMD_I2C_READ
;
223 buf
[1] = (msg
[i
].addr
<< 1) | 0x01;
224 buf
[2] = msg
[i
].buf
[0];
225 buf
[3] = msg
[i
].buf
[1];
226 buf
[4] = msg
[i
].len
-1;
227 buf
[5] = msg
[i
+1].len
;
228 ret
= anysee_ctrl_msg(d
, buf
, 6, msg
[i
+1].buf
,
232 if (msg
[i
].len
> 48) {
236 buf
[0] = CMD_I2C_WRITE
;
237 buf
[1] = (msg
[i
].addr
<< 1);
240 memcpy(&buf
[4], msg
[i
].buf
, msg
[i
].len
);
241 ret
= anysee_ctrl_msg(d
, buf
, 4 + msg
[i
].len
, NULL
, 0);
250 mutex_unlock(&d
->i2c_mutex
);
252 return ret
? ret
: i
;
255 static u32
anysee_i2c_func(struct i2c_adapter
*adapter
)
260 static struct i2c_algorithm anysee_i2c_algo
= {
261 .master_xfer
= anysee_master_xfer
,
262 .functionality
= anysee_i2c_func
,
265 static int anysee_mt352_demod_init(struct dvb_frontend
*fe
)
267 static u8 clock_config
[] = { CLOCK_CTL
, 0x38, 0x28 };
268 static u8 reset
[] = { RESET
, 0x80 };
269 static u8 adc_ctl_1_cfg
[] = { ADC_CTL_1
, 0x40 };
270 static u8 agc_cfg
[] = { AGC_TARGET
, 0x28, 0x20 };
271 static u8 gpp_ctl_cfg
[] = { GPP_CTL
, 0x33 };
272 static u8 capt_range_cfg
[] = { CAPT_RANGE
, 0x32 };
274 mt352_write(fe
, clock_config
, sizeof(clock_config
));
276 mt352_write(fe
, reset
, sizeof(reset
));
277 mt352_write(fe
, adc_ctl_1_cfg
, sizeof(adc_ctl_1_cfg
));
279 mt352_write(fe
, agc_cfg
, sizeof(agc_cfg
));
280 mt352_write(fe
, gpp_ctl_cfg
, sizeof(gpp_ctl_cfg
));
281 mt352_write(fe
, capt_range_cfg
, sizeof(capt_range_cfg
));
286 /* Callbacks for DVB USB */
287 static struct tda10023_config anysee_tda10023_config
= {
288 .demod_address
= (0x1a >> 1),
294 .output_mode
= TDA10023_OUTPUT_MODE_PARALLEL_C
,
298 static struct mt352_config anysee_mt352_config
= {
299 .demod_address
= (0x1e >> 1),
300 .demod_init
= anysee_mt352_demod_init
,
303 static struct zl10353_config anysee_zl10353_config
= {
304 .demod_address
= (0x1e >> 1),
308 static struct zl10353_config anysee_zl10353_tda18212_config2
= {
309 .demod_address
= (0x1e >> 1),
311 .disable_i2c_gate_ctrl
= 1,
316 static struct zl10353_config anysee_zl10353_tda18212_config
= {
317 .demod_address
= (0x18 >> 1),
319 .disable_i2c_gate_ctrl
= 1,
324 static struct tda10023_config anysee_tda10023_tda18212_config
= {
325 .demod_address
= (0x1a >> 1),
330 .output_mode
= TDA10023_OUTPUT_MODE_PARALLEL_B
,
334 static struct tda18212_config anysee_tda18212_config
= {
335 .i2c_address
= (0xc0 >> 1),
342 static struct tda18212_config anysee_tda18212_config2
= {
343 .i2c_address
= 0x60 /* (0xc0 >> 1) */,
353 static struct cx24116_config anysee_cx24116_config
= {
354 .demod_address
= (0xaa >> 1),
355 .mpg_clk_pos_pol
= 0x00,
359 static struct stv0900_config anysee_stv0900_config
= {
360 .demod_address
= (0xd0 >> 1),
366 .tun1_adc
= 1, /* 1 Vpp */
370 static struct stv6110_config anysee_stv6110_config
= {
371 .i2c_address
= (0xc0 >> 1),
376 static struct isl6423_config anysee_isl6423_config
= {
377 .current_max
= SEC_CURRENT_800m
,
378 .curlim
= SEC_CURRENT_LIM_OFF
,
383 static struct cxd2820r_config anysee_cxd2820r_config
= {
384 .i2c_address
= 0x6d, /* (0xda >> 1) */
389 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
390 * Manufacturer: AMT.CO.KR
392 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
394 * parts: DNOS404ZH102A(MT352, DTT7579(?))
396 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
397 * PCB: PCB 507T (rev1.61)
398 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
399 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
400 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
402 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
403 * PCB: 507CD (rev1.1)
404 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
405 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
406 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
407 * IOD[0] ZL10353 1=enabled
408 * IOA[7] TS 0=enabled
409 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
411 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
412 * PCB: 507DC (rev0.2)
413 * parts: TDA10023, DTOS403IH102B TM, CST56I01
414 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
415 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
416 * IOD[0] TDA10023 1=enabled
418 * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
419 * PCB: 507SI (rev2.1)
420 * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
421 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
422 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
423 * IOD[0] CX24116 1=enabled
425 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
426 * PCB: 507FA (rev0.4)
427 * parts: TDA10023, DTOS403IH102B TM, TDA8024
428 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
429 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
430 * IOD[5] TDA10023 1=enabled
431 * IOE[0] tuner 1=enabled
433 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
434 * PCB: 507FA (rev1.1)
435 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
436 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
437 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
439 * IOD[5] TDA10023 1=enabled
440 * IOE[0] tuner 1=enabled
442 * IOD[0] ZL10353 1=enabled
443 * IOE[0] tuner 0=enabled
444 * tuner is behind ZL10353 I2C-gate
445 * tuner is behind TDA10023 I2C-gate
447 * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
448 * PCB: 508TC (rev0.6)
449 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
450 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
451 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
452 * IOA[7] TS 1=enabled
453 * IOE[4] TDA18212 1=enabled
455 * IOD[6] ZL10353 0=disabled
456 * IOD[5] TDA10023 1=enabled
457 * IOE[0] IF 1=enabled
459 * IOD[5] TDA10023 0=disabled
460 * IOD[6] ZL10353 1=enabled
461 * IOE[0] IF 0=enabled
463 * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
464 * PCB: 508S2 (rev0.7)
465 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
466 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
467 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
468 * IOA[7] TS 1=enabled
469 * IOE[5] STV0903 1=enabled
471 * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
472 * PCB: 508T2C (rev0.3)
473 * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
474 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
475 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
476 * IOA[7] TS 1=enabled
477 * IOE[5] CXD2820R 1=enabled
479 * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
480 * PCB: 508PTC (rev0.5)
481 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
482 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
483 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
484 * IOA[7] TS 1=enabled
485 * IOE[4] TDA18212 1=enabled
487 * IOD[6] ZL10353 0=disabled
488 * IOD[5] TDA10023 1=enabled
489 * IOE[0] IF 1=enabled
491 * IOD[5] TDA10023 0=disabled
492 * IOD[6] ZL10353 1=enabled
493 * IOE[0] IF 0=enabled
495 * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
496 * PCB: 508PS2 (rev0.4)
497 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
498 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
499 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
500 * IOA[7] TS 1=enabled
501 * IOE[5] STV0903 1=enabled
504 static int anysee_read_config(struct dvb_usb_device
*d
)
506 struct anysee_state
*state
= d_to_priv(d
);
511 * Check which hardware we have.
512 * We must do this call two times to get reliable values (hw/fw bug).
514 ret
= anysee_get_hw_info(d
, hw_info
);
518 ret
= anysee_get_hw_info(d
, hw_info
);
523 * Meaning of these info bytes are guessed.
525 dev_info(&d
->udev
->dev
, "%s: firmware version %d.%d hardware id %d\n",
526 KBUILD_MODNAME
, hw_info
[1], hw_info
[2], hw_info
[0]);
528 state
->hw
= hw_info
[0];
533 /* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
534 static int anysee_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
536 /* enable / disable tuner access on IOE[4] */
537 return anysee_wr_reg_mask(fe_to_d(fe
), REG_IOE
, (enable
<< 4), 0x10);
540 static int anysee_frontend_ctrl(struct dvb_frontend
*fe
, int onoff
)
542 struct anysee_state
*state
= fe_to_priv(fe
);
543 struct dvb_usb_device
*d
= fe_to_d(fe
);
545 dev_dbg(&d
->udev
->dev
, "%s: fe=%d onoff=%d\n", __func__
, fe
->id
, onoff
);
547 /* no frontend sleep control */
552 case ANYSEE_HW_507FA
: /* 15 */
557 /* disable DVB-T demod on IOD[0] */
558 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 0), 0x01);
562 /* enable DVB-C demod on IOD[5] */
563 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 5), 0x20);
567 /* enable DVB-C tuner on IOE[0] */
568 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 0), 0x01);
572 /* disable DVB-C demod on IOD[5] */
573 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 5), 0x20);
577 /* enable DVB-T demod on IOD[0] */
578 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
582 /* enable DVB-T tuner on IOE[0] */
583 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (0 << 0), 0x01);
589 case ANYSEE_HW_508TC
: /* 18 */
590 case ANYSEE_HW_508PTC
: /* 21 */
595 /* disable DVB-T demod on IOD[6] */
596 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 6), 0x40);
600 /* enable DVB-C demod on IOD[5] */
601 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 5), 0x20);
605 /* enable IF route on IOE[0] */
606 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 0), 0x01);
610 /* disable DVB-C demod on IOD[5] */
611 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 5), 0x20);
615 /* enable DVB-T demod on IOD[6] */
616 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 6), 0x40);
620 /* enable IF route on IOE[0] */
621 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (0 << 0), 0x01);
635 static int anysee_frontend_attach(struct dvb_usb_adapter
*adap
)
637 struct anysee_state
*state
= adap_to_priv(adap
);
638 struct dvb_usb_device
*d
= adap_to_d(adap
);
641 struct i2c_msg msg
[2] = {
643 .addr
= anysee_tda18212_config
.i2c_address
,
648 .addr
= anysee_tda18212_config
.i2c_address
,
656 case ANYSEE_HW_507T
: /* 2 */
660 adap
->fe
[0] = dvb_attach(mt352_attach
, &anysee_mt352_config
,
666 adap
->fe
[0] = dvb_attach(zl10353_attach
, &anysee_zl10353_config
,
670 case ANYSEE_HW_507CD
: /* 6 */
673 /* enable DVB-T demod on IOD[0] */
674 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
678 /* enable transport stream on IOA[7] */
679 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (0 << 7), 0x80);
684 adap
->fe
[0] = dvb_attach(zl10353_attach
, &anysee_zl10353_config
,
688 case ANYSEE_HW_507DC
: /* 10 */
691 /* enable DVB-C demod on IOD[0] */
692 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
697 adap
->fe
[0] = dvb_attach(tda10023_attach
,
698 &anysee_tda10023_config
, &d
->i2c_adap
, 0x48);
701 case ANYSEE_HW_507SI
: /* 11 */
704 /* enable DVB-S/S2 demod on IOD[0] */
705 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
710 adap
->fe
[0] = dvb_attach(cx24116_attach
, &anysee_cx24116_config
,
714 case ANYSEE_HW_507FA
: /* 15 */
718 /* enable tuner on IOE[4] */
719 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 4), 0x10);
725 ret
= i2c_transfer(&d
->i2c_adap
, msg
, 2);
726 if (ret
== 2 && tmp
== 0xc7)
727 dev_dbg(&d
->udev
->dev
, "%s: TDA18212 found\n",
732 /* disable tuner on IOE[4] */
733 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (0 << 4), 0x10);
737 /* disable DVB-T demod on IOD[0] */
738 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 0), 0x01);
742 /* enable DVB-C demod on IOD[5] */
743 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 5), 0x20);
749 /* TDA18212 config */
750 adap
->fe
[0] = dvb_attach(tda10023_attach
,
751 &anysee_tda10023_tda18212_config
,
754 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
756 adap
->fe
[0]->ops
.i2c_gate_ctrl
=
757 anysee_i2c_gate_ctrl
;
760 adap
->fe
[0] = dvb_attach(tda10023_attach
,
761 &anysee_tda10023_config
,
765 /* break out if first frontend attaching fails */
769 /* disable DVB-C demod on IOD[5] */
770 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 5), 0x20);
774 /* enable DVB-T demod on IOD[0] */
775 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
781 /* TDA18212 config */
782 adap
->fe
[1] = dvb_attach(zl10353_attach
,
783 &anysee_zl10353_tda18212_config2
,
786 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
788 adap
->fe
[1]->ops
.i2c_gate_ctrl
=
789 anysee_i2c_gate_ctrl
;
792 adap
->fe
[1] = dvb_attach(zl10353_attach
,
793 &anysee_zl10353_config
,
798 case ANYSEE_HW_508TC
: /* 18 */
799 case ANYSEE_HW_508PTC
: /* 21 */
803 /* disable DVB-T demod on IOD[6] */
804 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 6), 0x40);
808 /* enable DVB-C demod on IOD[5] */
809 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 5), 0x20);
814 adap
->fe
[0] = dvb_attach(tda10023_attach
,
815 &anysee_tda10023_tda18212_config
,
818 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
820 adap
->fe
[0]->ops
.i2c_gate_ctrl
= anysee_i2c_gate_ctrl
;
822 /* break out if first frontend attaching fails */
826 /* disable DVB-C demod on IOD[5] */
827 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 5), 0x20);
831 /* enable DVB-T demod on IOD[6] */
832 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 6), 0x40);
837 adap
->fe
[1] = dvb_attach(zl10353_attach
,
838 &anysee_zl10353_tda18212_config
,
841 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
843 adap
->fe
[1]->ops
.i2c_gate_ctrl
= anysee_i2c_gate_ctrl
;
845 state
->has_ci
= true;
848 case ANYSEE_HW_508S2
: /* 19 */
849 case ANYSEE_HW_508PS2
: /* 22 */
853 /* enable DVB-S/S2 demod on IOE[5] */
854 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 5), 0x20);
859 adap
->fe
[0] = dvb_attach(stv0900_attach
,
860 &anysee_stv0900_config
, &d
->i2c_adap
, 0);
862 state
->has_ci
= true;
865 case ANYSEE_HW_508T2C
: /* 20 */
868 /* enable DVB-T/T2/C demod on IOE[5] */
869 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 5), 0x20);
874 adap
->fe
[0] = dvb_attach(cxd2820r_attach
,
875 &anysee_cxd2820r_config
, &d
->i2c_adap
, NULL
);
877 state
->has_ci
= true;
883 /* we have no frontend :-( */
885 dev_err(&d
->udev
->dev
,
886 "%s: Unsupported Anysee version. Please report to <linux-media@vger.kernel.org>.\n",
893 static int anysee_tuner_attach(struct dvb_usb_adapter
*adap
)
895 struct anysee_state
*state
= adap_to_priv(adap
);
896 struct dvb_usb_device
*d
= adap_to_d(adap
);
897 struct dvb_frontend
*fe
;
899 dev_dbg(&d
->udev
->dev
, "%s:\n", __func__
);
902 case ANYSEE_HW_507T
: /* 2 */
906 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[0], (0xc2 >> 1), NULL
,
907 DVB_PLL_THOMSON_DTT7579
);
910 case ANYSEE_HW_507CD
: /* 6 */
914 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[0], (0xc2 >> 1),
915 &d
->i2c_adap
, DVB_PLL_THOMSON_DTT7579
);
918 case ANYSEE_HW_507DC
: /* 10 */
922 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[0], (0xc0 >> 1),
923 &d
->i2c_adap
, DVB_PLL_SAMSUNG_DTOS403IH102A
);
926 case ANYSEE_HW_507SI
: /* 11 */
929 /* attach LNB controller */
930 fe
= dvb_attach(isl6423_attach
, adap
->fe
[0], &d
->i2c_adap
,
931 &anysee_isl6423_config
);
934 case ANYSEE_HW_507FA
: /* 15 */
938 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
939 * fails attach old simple PLL. */
942 fe
= dvb_attach(tda18212_attach
, adap
->fe
[0], &d
->i2c_adap
,
943 &anysee_tda18212_config
);
945 if (fe
&& adap
->fe
[1]) {
946 /* attach tuner for 2nd FE */
947 fe
= dvb_attach(tda18212_attach
, adap
->fe
[1],
948 &d
->i2c_adap
, &anysee_tda18212_config
);
955 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[0], (0xc0 >> 1),
956 &d
->i2c_adap
, DVB_PLL_SAMSUNG_DTOS403IH102A
);
958 if (fe
&& adap
->fe
[1]) {
959 /* attach tuner for 2nd FE */
960 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[1],
961 (0xc0 >> 1), &d
->i2c_adap
,
962 DVB_PLL_SAMSUNG_DTOS403IH102A
);
966 case ANYSEE_HW_508TC
: /* 18 */
967 case ANYSEE_HW_508PTC
: /* 21 */
972 fe
= dvb_attach(tda18212_attach
, adap
->fe
[0], &d
->i2c_adap
,
973 &anysee_tda18212_config
);
976 /* attach tuner for 2nd FE */
977 fe
= dvb_attach(tda18212_attach
, adap
->fe
[1],
978 &d
->i2c_adap
, &anysee_tda18212_config
);
982 case ANYSEE_HW_508S2
: /* 19 */
983 case ANYSEE_HW_508PS2
: /* 22 */
988 fe
= dvb_attach(stv6110_attach
, adap
->fe
[0],
989 &anysee_stv6110_config
, &d
->i2c_adap
);
992 /* attach LNB controller */
993 fe
= dvb_attach(isl6423_attach
, adap
->fe
[0],
994 &d
->i2c_adap
, &anysee_isl6423_config
);
999 case ANYSEE_HW_508T2C
: /* 20 */
1003 fe
= dvb_attach(tda18212_attach
, adap
->fe
[0], &d
->i2c_adap
,
1004 &anysee_tda18212_config2
);
1019 #if IS_ENABLED(CONFIG_RC_CORE)
1020 static int anysee_rc_query(struct dvb_usb_device
*d
)
1022 u8 buf
[] = {CMD_GET_IR_CODE
};
1026 /* Remote controller is basic NEC using address byte 0x08.
1027 Anysee device RC query returns only two bytes, status and code,
1028 address byte is dropped. Also it does not return any value for
1029 NEC RCs having address byte other than 0x08. Due to that, we
1030 cannot use that device as standard NEC receiver.
1031 It could be possible make hack which reads whole code directly
1032 from device memory... */
1034 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), ircode
, sizeof(ircode
));
1039 dev_dbg(&d
->udev
->dev
, "%s: key pressed %02x\n", __func__
,
1041 rc_keydown(d
->rc_dev
, 0x08 << 8 | ircode
[1], 0);
1047 static int anysee_get_rc_config(struct dvb_usb_device
*d
, struct dvb_usb_rc
*rc
)
1049 rc
->allowed_protos
= RC_BIT_NEC
;
1050 rc
->query
= anysee_rc_query
;
1051 rc
->interval
= 250; /* windows driver uses 500ms */
1056 #define anysee_get_rc_config NULL
1059 static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221
*ci
, int slot
,
1062 struct dvb_usb_device
*d
= ci
->data
;
1064 u8 buf
[] = {CMD_CI
, 0x02, 0x40 | addr
>> 8, addr
& 0xff, 0x00, 1};
1067 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), &val
, 1);
1074 static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221
*ci
, int slot
,
1077 struct dvb_usb_device
*d
= ci
->data
;
1079 u8 buf
[] = {CMD_CI
, 0x03, 0x40 | addr
>> 8, addr
& 0xff, 0x00, 1, val
};
1081 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
1088 static int anysee_ci_read_cam_control(struct dvb_ca_en50221
*ci
, int slot
,
1091 struct dvb_usb_device
*d
= ci
->data
;
1093 u8 buf
[] = {CMD_CI
, 0x04, 0x40, addr
, 0x00, 1};
1096 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), &val
, 1);
1103 static int anysee_ci_write_cam_control(struct dvb_ca_en50221
*ci
, int slot
,
1106 struct dvb_usb_device
*d
= ci
->data
;
1108 u8 buf
[] = {CMD_CI
, 0x05, 0x40, addr
, 0x00, 1, val
};
1110 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
1117 static int anysee_ci_slot_reset(struct dvb_ca_en50221
*ci
, int slot
)
1119 struct dvb_usb_device
*d
= ci
->data
;
1121 struct anysee_state
*state
= d_to_priv(d
);
1123 state
->ci_cam_ready
= jiffies
+ msecs_to_jiffies(1000);
1125 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (0 << 7), 0x80);
1131 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1138 static int anysee_ci_slot_shutdown(struct dvb_ca_en50221
*ci
, int slot
)
1140 struct dvb_usb_device
*d
= ci
->data
;
1143 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (0 << 7), 0x80);
1149 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1156 static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221
*ci
, int slot
)
1158 struct dvb_usb_device
*d
= ci
->data
;
1161 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 1), 0x02);
1168 static int anysee_ci_poll_slot_status(struct dvb_ca_en50221
*ci
, int slot
,
1171 struct dvb_usb_device
*d
= ci
->data
;
1172 struct anysee_state
*state
= d_to_priv(d
);
1176 ret
= anysee_rd_reg_mask(d
, REG_IOC
, &tmp
, 0x40);
1181 ret
= DVB_CA_EN50221_POLL_CAM_PRESENT
;
1182 if (time_after(jiffies
, state
->ci_cam_ready
))
1183 ret
|= DVB_CA_EN50221_POLL_CAM_READY
;
1189 static int anysee_ci_init(struct dvb_usb_device
*d
)
1191 struct anysee_state
*state
= d_to_priv(d
);
1194 state
->ci
.owner
= THIS_MODULE
;
1195 state
->ci
.read_attribute_mem
= anysee_ci_read_attribute_mem
;
1196 state
->ci
.write_attribute_mem
= anysee_ci_write_attribute_mem
;
1197 state
->ci
.read_cam_control
= anysee_ci_read_cam_control
;
1198 state
->ci
.write_cam_control
= anysee_ci_write_cam_control
;
1199 state
->ci
.slot_reset
= anysee_ci_slot_reset
;
1200 state
->ci
.slot_shutdown
= anysee_ci_slot_shutdown
;
1201 state
->ci
.slot_ts_enable
= anysee_ci_slot_ts_enable
;
1202 state
->ci
.poll_slot_status
= anysee_ci_poll_slot_status
;
1205 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1209 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 2)|(0 << 1)|(0 << 0), 0x07);
1213 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 2)|(1 << 1)|(1 << 0), 0x07);
1217 ret
= dvb_ca_en50221_init(&d
->adapter
[0].dvb_adap
, &state
->ci
, 0, 1);
1221 state
->ci_attached
= true;
1226 static void anysee_ci_release(struct dvb_usb_device
*d
)
1228 struct anysee_state
*state
= d_to_priv(d
);
1231 if (state
->ci_attached
)
1232 dvb_ca_en50221_release(&state
->ci
);
1237 static int anysee_init(struct dvb_usb_device
*d
)
1239 struct anysee_state
*state
= d_to_priv(d
);
1242 /* There is one interface with two alternate settings.
1243 Alternate setting 0 is for bulk transfer.
1244 Alternate setting 1 is for isochronous transfer.
1245 We use bulk transfer (alternate setting 0). */
1246 ret
= usb_set_interface(d
->udev
, 0, 0);
1251 ret
= anysee_led_ctrl(d
, 0x01, 0x03);
1256 ret
= anysee_ir_ctrl(d
, 1);
1261 if (state
->has_ci
) {
1262 ret
= anysee_ci_init(d
);
1270 static void anysee_exit(struct dvb_usb_device
*d
)
1272 return anysee_ci_release(d
);
1275 /* DVB USB Driver stuff */
1276 static struct dvb_usb_device_properties anysee_props
= {
1277 .driver_name
= KBUILD_MODNAME
,
1278 .owner
= THIS_MODULE
,
1279 .adapter_nr
= adapter_nr
,
1280 .size_of_priv
= sizeof(struct anysee_state
),
1282 .generic_bulk_ctrl_endpoint
= 0x01,
1283 .generic_bulk_ctrl_endpoint_response
= 0x81,
1285 .i2c_algo
= &anysee_i2c_algo
,
1286 .read_config
= anysee_read_config
,
1287 .frontend_attach
= anysee_frontend_attach
,
1288 .tuner_attach
= anysee_tuner_attach
,
1289 .init
= anysee_init
,
1290 .get_rc_config
= anysee_get_rc_config
,
1291 .frontend_ctrl
= anysee_frontend_ctrl
,
1292 .streaming_ctrl
= anysee_streaming_ctrl
,
1293 .exit
= anysee_exit
,
1298 .stream
= DVB_USB_STREAM_BULK(0x82, 8, 16 * 512),
1303 static const struct usb_device_id anysee_id_table
[] = {
1304 { DVB_USB_DEVICE(USB_VID_CYPRESS
, USB_PID_ANYSEE
,
1305 &anysee_props
, "Anysee", RC_MAP_ANYSEE
) },
1306 { DVB_USB_DEVICE(USB_VID_AMT
, USB_PID_ANYSEE
,
1307 &anysee_props
, "Anysee", RC_MAP_ANYSEE
) },
1310 MODULE_DEVICE_TABLE(usb
, anysee_id_table
);
1312 static struct usb_driver anysee_usb_driver
= {
1313 .name
= KBUILD_MODNAME
,
1314 .id_table
= anysee_id_table
,
1315 .probe
= dvb_usbv2_probe
,
1316 .disconnect
= dvb_usbv2_disconnect
,
1317 .suspend
= dvb_usbv2_suspend
,
1318 .resume
= dvb_usbv2_resume
,
1319 .reset_resume
= dvb_usbv2_reset_resume
,
1324 module_usb_driver(anysee_usb_driver
);
1326 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1327 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1328 MODULE_LICENSE("GPL");