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
37 #include "mt352_priv.h"
47 static int dvb_usb_anysee_debug
;
48 module_param_named(debug
, dvb_usb_anysee_debug
, int, 0644);
49 MODULE_PARM_DESC(debug
, "set debugging level" DVB_USB_DEBUG_STATUS
);
50 static int dvb_usb_anysee_delsys
;
51 module_param_named(delsys
, dvb_usb_anysee_delsys
, int, 0644);
52 MODULE_PARM_DESC(delsys
, "select delivery mode (0=DVB-C, 1=DVB-T)");
53 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr
);
55 static DEFINE_MUTEX(anysee_usb_mutex
);
57 static int anysee_ctrl_msg(struct dvb_usb_device
*d
, u8
*sbuf
, u8 slen
,
60 struct anysee_state
*state
= d
->priv
;
64 memcpy(&buf
[0], sbuf
, slen
);
65 buf
[60] = state
->seq
++;
67 if (mutex_lock_interruptible(&anysee_usb_mutex
) < 0)
71 debug_dump(buf
, slen
, deb_xfer
);
73 /* We need receive one message more after dvb_usb_generic_rw due
74 to weird transaction flow, which is 1 x send + 2 x receive. */
75 ret
= dvb_usb_generic_rw(d
, buf
, sizeof(buf
), buf
, sizeof(buf
), 0);
77 /* receive 2nd answer */
78 ret
= usb_bulk_msg(d
->udev
, usb_rcvbulkpipe(d
->udev
,
79 d
->props
.generic_bulk_ctrl_endpoint
), buf
, sizeof(buf
),
82 err("%s: recv bulk message failed: %d", __func__
, ret
);
85 debug_dump(buf
, rlen
, deb_xfer
);
88 deb_info("%s: cmd failed\n", __func__
);
92 /* read request, copy returned data to return buf */
93 if (!ret
&& rbuf
&& rlen
)
94 memcpy(rbuf
, buf
, rlen
);
96 mutex_unlock(&anysee_usb_mutex
);
101 static int anysee_read_reg(struct dvb_usb_device
*d
, u16 reg
, u8
*val
)
103 u8 buf
[] = {CMD_REG_READ
, reg
>> 8, reg
& 0xff, 0x01};
105 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), val
, 1);
106 deb_info("%s: reg:%04x val:%02x\n", __func__
, reg
, *val
);
110 static int anysee_write_reg(struct dvb_usb_device
*d
, u16 reg
, u8 val
)
112 u8 buf
[] = {CMD_REG_WRITE
, reg
>> 8, reg
& 0xff, 0x01, val
};
113 deb_info("%s: reg:%04x val:%02x\n", __func__
, reg
, val
);
114 return anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
117 /* write single register with mask */
118 static int anysee_wr_reg_mask(struct dvb_usb_device
*d
, u16 reg
, u8 val
,
124 /* no need for read if whole reg is written */
126 ret
= anysee_read_reg(d
, reg
, &tmp
);
135 return anysee_write_reg(d
, reg
, val
);
138 /* read single register with mask */
139 static int anysee_rd_reg_mask(struct dvb_usb_device
*d
, u16 reg
, u8
*val
,
145 ret
= anysee_read_reg(d
, reg
, &tmp
);
151 /* find position of the first bit */
152 for (i
= 0; i
< 8; i
++) {
153 if ((mask
>> i
) & 0x01)
161 static int anysee_get_hw_info(struct dvb_usb_device
*d
, u8
*id
)
163 u8 buf
[] = {CMD_GET_HW_INFO
};
164 return anysee_ctrl_msg(d
, buf
, sizeof(buf
), id
, 3);
167 static int anysee_streaming_ctrl(struct dvb_usb_adapter
*adap
, int onoff
)
169 u8 buf
[] = {CMD_STREAMING_CTRL
, (u8
)onoff
, 0x00};
170 deb_info("%s: onoff:%02x\n", __func__
, onoff
);
171 return anysee_ctrl_msg(adap
->dev
, buf
, sizeof(buf
), NULL
, 0);
174 static int anysee_led_ctrl(struct dvb_usb_device
*d
, u8 mode
, u8 interval
)
176 u8 buf
[] = {CMD_LED_AND_IR_CTRL
, 0x01, mode
, interval
};
177 deb_info("%s: state:%02x interval:%02x\n", __func__
, mode
, interval
);
178 return anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
181 static int anysee_ir_ctrl(struct dvb_usb_device
*d
, u8 onoff
)
183 u8 buf
[] = {CMD_LED_AND_IR_CTRL
, 0x02, onoff
};
184 deb_info("%s: onoff:%02x\n", __func__
, onoff
);
185 return anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
189 static int anysee_master_xfer(struct i2c_adapter
*adap
, struct i2c_msg
*msg
,
192 struct dvb_usb_device
*d
= i2c_get_adapdata(adap
);
193 int ret
= 0, inc
, i
= 0;
194 u8 buf
[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
196 if (mutex_lock_interruptible(&d
->i2c_mutex
) < 0)
200 if (num
> i
+ 1 && (msg
[i
+1].flags
& I2C_M_RD
)) {
201 if (msg
[i
].len
> 2 || msg
[i
+1].len
> 60) {
205 buf
[0] = CMD_I2C_READ
;
206 buf
[1] = (msg
[i
].addr
<< 1) | 0x01;
207 buf
[2] = msg
[i
].buf
[0];
208 buf
[3] = msg
[i
].buf
[1];
209 buf
[4] = msg
[i
].len
-1;
210 buf
[5] = msg
[i
+1].len
;
211 ret
= anysee_ctrl_msg(d
, buf
, 6, msg
[i
+1].buf
,
215 if (msg
[i
].len
> 48) {
219 buf
[0] = CMD_I2C_WRITE
;
220 buf
[1] = (msg
[i
].addr
<< 1);
223 memcpy(&buf
[4], msg
[i
].buf
, msg
[i
].len
);
224 ret
= anysee_ctrl_msg(d
, buf
, 4 + msg
[i
].len
, NULL
, 0);
233 mutex_unlock(&d
->i2c_mutex
);
235 return ret
? ret
: i
;
238 static u32
anysee_i2c_func(struct i2c_adapter
*adapter
)
243 static struct i2c_algorithm anysee_i2c_algo
= {
244 .master_xfer
= anysee_master_xfer
,
245 .functionality
= anysee_i2c_func
,
248 static int anysee_mt352_demod_init(struct dvb_frontend
*fe
)
250 static u8 clock_config
[] = { CLOCK_CTL
, 0x38, 0x28 };
251 static u8 reset
[] = { RESET
, 0x80 };
252 static u8 adc_ctl_1_cfg
[] = { ADC_CTL_1
, 0x40 };
253 static u8 agc_cfg
[] = { AGC_TARGET
, 0x28, 0x20 };
254 static u8 gpp_ctl_cfg
[] = { GPP_CTL
, 0x33 };
255 static u8 capt_range_cfg
[] = { CAPT_RANGE
, 0x32 };
257 mt352_write(fe
, clock_config
, sizeof(clock_config
));
259 mt352_write(fe
, reset
, sizeof(reset
));
260 mt352_write(fe
, adc_ctl_1_cfg
, sizeof(adc_ctl_1_cfg
));
262 mt352_write(fe
, agc_cfg
, sizeof(agc_cfg
));
263 mt352_write(fe
, gpp_ctl_cfg
, sizeof(gpp_ctl_cfg
));
264 mt352_write(fe
, capt_range_cfg
, sizeof(capt_range_cfg
));
269 /* Callbacks for DVB USB */
270 static struct tda10023_config anysee_tda10023_config
= {
271 .demod_address
= (0x1a >> 1),
277 .output_mode
= TDA10023_OUTPUT_MODE_PARALLEL_C
,
281 static struct mt352_config anysee_mt352_config
= {
282 .demod_address
= (0x1e >> 1),
283 .demod_init
= anysee_mt352_demod_init
,
286 static struct zl10353_config anysee_zl10353_config
= {
287 .demod_address
= (0x1e >> 1),
291 static struct zl10353_config anysee_zl10353_tda18212_config2
= {
292 .demod_address
= (0x1e >> 1),
294 .disable_i2c_gate_ctrl
= 1,
299 static struct zl10353_config anysee_zl10353_tda18212_config
= {
300 .demod_address
= (0x18 >> 1),
302 .disable_i2c_gate_ctrl
= 1,
307 static struct tda10023_config anysee_tda10023_tda18212_config
= {
308 .demod_address
= (0x1a >> 1),
313 .output_mode
= TDA10023_OUTPUT_MODE_PARALLEL_B
,
317 static struct tda18212_config anysee_tda18212_config
= {
318 .i2c_address
= (0xc0 >> 1),
325 static struct tda18212_config anysee_tda18212_config2
= {
326 .i2c_address
= 0x60 /* (0xc0 >> 1) */,
336 static struct cx24116_config anysee_cx24116_config
= {
337 .demod_address
= (0xaa >> 1),
338 .mpg_clk_pos_pol
= 0x00,
342 static struct stv0900_config anysee_stv0900_config
= {
343 .demod_address
= (0xd0 >> 1),
349 .tun1_adc
= 1, /* 1 Vpp */
353 static struct stv6110_config anysee_stv6110_config
= {
354 .i2c_address
= (0xc0 >> 1),
359 static struct isl6423_config anysee_isl6423_config
= {
360 .current_max
= SEC_CURRENT_800m
,
361 .curlim
= SEC_CURRENT_LIM_OFF
,
366 static struct cxd2820r_config anysee_cxd2820r_config
= {
367 .i2c_address
= 0x6d, /* (0xda >> 1) */
372 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
373 * Manufacturer: AMT.CO.KR
375 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
377 * parts: DNOS404ZH102A(MT352, DTT7579(?))
379 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
380 * PCB: PCB 507T (rev1.61)
381 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
382 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
383 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
385 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
386 * PCB: 507CD (rev1.1)
387 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
388 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
389 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
390 * IOD[0] ZL10353 1=enabled
391 * IOA[7] TS 0=enabled
392 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
394 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
395 * PCB: 507DC (rev0.2)
396 * parts: TDA10023, DTOS403IH102B TM, CST56I01
397 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
398 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
399 * IOD[0] TDA10023 1=enabled
401 * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
402 * PCB: 507SI (rev2.1)
403 * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
404 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
405 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
406 * IOD[0] CX24116 1=enabled
408 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
409 * PCB: 507FA (rev0.4)
410 * parts: TDA10023, DTOS403IH102B TM, TDA8024
411 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
412 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
413 * IOD[5] TDA10023 1=enabled
414 * IOE[0] tuner 1=enabled
416 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
417 * PCB: 507FA (rev1.1)
418 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
419 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
420 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
422 * IOD[5] TDA10023 1=enabled
423 * IOE[0] tuner 1=enabled
425 * IOD[0] ZL10353 1=enabled
426 * IOE[0] tuner 0=enabled
427 * tuner is behind ZL10353 I2C-gate
429 * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
430 * PCB: 508TC (rev0.6)
431 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
432 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
433 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
434 * IOA[7] TS 1=enabled
435 * IOE[4] TDA18212 1=enabled
437 * IOD[6] ZL10353 0=disabled
438 * IOD[5] TDA10023 1=enabled
439 * IOE[0] IF 1=enabled
441 * IOD[5] TDA10023 0=disabled
442 * IOD[6] ZL10353 1=enabled
443 * IOE[0] IF 0=enabled
445 * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
446 * PCB: 508S2 (rev0.7)
447 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
448 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
449 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
450 * IOA[7] TS 1=enabled
451 * IOE[5] STV0903 1=enabled
453 * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
454 * PCB: 508T2C (rev0.3)
455 * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
456 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
457 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
458 * IOA[7] TS 1=enabled
459 * IOE[5] CXD2820R 1=enabled
461 * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
462 * PCB: 508PTC (rev0.5)
463 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
464 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
465 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
466 * IOA[7] TS 1=enabled
467 * IOE[4] TDA18212 1=enabled
469 * IOD[6] ZL10353 0=disabled
470 * IOD[5] TDA10023 1=enabled
471 * IOE[0] IF 1=enabled
473 * IOD[5] TDA10023 0=disabled
474 * IOD[6] ZL10353 1=enabled
475 * IOE[0] IF 0=enabled
477 * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
478 * PCB: 508PS2 (rev0.4)
479 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
480 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
481 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
482 * IOA[7] TS 1=enabled
483 * IOE[5] STV0903 1=enabled
487 /* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
488 static int anysee_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
490 struct dvb_usb_adapter
*adap
= fe
->dvb
->priv
;
492 /* enable / disable tuner access on IOE[4] */
493 return anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (enable
<< 4), 0x10);
496 static int anysee_frontend_ctrl(struct dvb_frontend
*fe
, int onoff
)
498 struct dvb_usb_adapter
*adap
= fe
->dvb
->priv
;
499 struct anysee_state
*state
= adap
->dev
->priv
;
502 deb_info("%s: fe=%d onoff=%d\n", __func__
, fe
->id
, onoff
);
504 /* no frontend sleep control */
509 case ANYSEE_HW_507FA
: /* 15 */
513 if ((fe
->id
^ dvb_usb_anysee_delsys
) == 0) {
514 /* disable DVB-T demod on IOD[0] */
515 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (0 << 0),
520 /* enable DVB-C demod on IOD[5] */
521 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 5),
526 /* enable DVB-C tuner on IOE[0] */
527 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (1 << 0),
532 /* disable DVB-C demod on IOD[5] */
533 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (0 << 5),
538 /* enable DVB-T demod on IOD[0] */
539 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 0),
544 /* enable DVB-T tuner on IOE[0] */
545 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (0 << 0),
552 case ANYSEE_HW_508TC
: /* 18 */
553 case ANYSEE_HW_508PTC
: /* 21 */
557 if ((fe
->id
^ dvb_usb_anysee_delsys
) == 0) {
558 /* disable DVB-T demod on IOD[6] */
559 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (0 << 6),
564 /* enable DVB-C demod on IOD[5] */
565 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 5),
570 /* enable IF route on IOE[0] */
571 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (1 << 0),
576 /* disable DVB-C demod on IOD[5] */
577 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (0 << 5),
582 /* enable DVB-T demod on IOD[6] */
583 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 6),
588 /* enable IF route on IOE[0] */
589 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (0 << 0),
604 static int anysee_frontend_attach(struct dvb_usb_adapter
*adap
)
607 struct anysee_state
*state
= adap
->dev
->priv
;
610 struct i2c_msg msg
[2] = {
612 .addr
= anysee_tda18212_config
.i2c_address
,
617 .addr
= anysee_tda18212_config
.i2c_address
,
624 /* detect hardware only once */
625 if (adap
->fe_adap
[0].fe
== NULL
) {
626 /* Check which hardware we have.
627 * We must do this call two times to get reliable values
630 ret
= anysee_get_hw_info(adap
->dev
, hw_info
);
634 ret
= anysee_get_hw_info(adap
->dev
, hw_info
);
638 /* Meaning of these info bytes are guessed. */
639 info("firmware version:%d.%d hardware id:%d",
640 hw_info
[1], hw_info
[2], hw_info
[0]);
642 state
->hw
= hw_info
[0];
645 /* set current frondend ID for devices having two frondends */
646 if (adap
->fe_adap
[0].fe
)
650 case ANYSEE_HW_507T
: /* 2 */
657 adap
->fe_adap
[0].fe
= dvb_attach(mt352_attach
,
658 &anysee_mt352_config
, &adap
->dev
->i2c_adap
);
659 if (adap
->fe_adap
[0].fe
)
663 adap
->fe_adap
[0].fe
= dvb_attach(zl10353_attach
,
664 &anysee_zl10353_config
, &adap
->dev
->i2c_adap
);
667 case ANYSEE_HW_507CD
: /* 6 */
673 /* enable DVB-T demod on IOD[0] */
674 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 0), 0x01);
678 /* enable transport stream on IOA[7] */
679 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOA
, (0 << 7), 0x80);
684 adap
->fe_adap
[0].fe
= dvb_attach(zl10353_attach
,
685 &anysee_zl10353_config
, &adap
->dev
->i2c_adap
);
688 case ANYSEE_HW_507DC
: /* 10 */
694 /* enable DVB-C demod on IOD[0] */
695 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 0), 0x01);
700 adap
->fe_adap
[0].fe
= dvb_attach(tda10023_attach
,
701 &anysee_tda10023_config
, &adap
->dev
->i2c_adap
, 0x48);
704 case ANYSEE_HW_507SI
: /* 11 */
710 /* enable DVB-S/S2 demod on IOD[0] */
711 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 0), 0x01);
716 adap
->fe_adap
[0].fe
= dvb_attach(cx24116_attach
,
717 &anysee_cx24116_config
, &adap
->dev
->i2c_adap
);
720 case ANYSEE_HW_507FA
: /* 15 */
724 /* enable tuner on IOE[4] */
725 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (1 << 4), 0x10);
731 ret
= i2c_transfer(&adap
->dev
->i2c_adap
, msg
, 2);
732 if (ret
== 2 && tmp
== 0xc7)
733 deb_info("%s: TDA18212 found\n", __func__
);
737 /* disable tuner on IOE[4] */
738 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (0 << 4), 0x10);
742 if ((state
->fe_id
^ dvb_usb_anysee_delsys
) == 0) {
743 /* disable DVB-T demod on IOD[0] */
744 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (0 << 0),
749 /* enable DVB-C demod on IOD[5] */
750 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 5),
757 /* TDA18212 config */
758 adap
->fe_adap
[state
->fe_id
].fe
= dvb_attach(
760 &anysee_tda10023_tda18212_config
,
761 &adap
->dev
->i2c_adap
, 0x48);
764 adap
->fe_adap
[state
->fe_id
].fe
= dvb_attach(
766 &anysee_tda10023_config
,
767 &adap
->dev
->i2c_adap
, 0x48);
770 /* disable DVB-C demod on IOD[5] */
771 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (0 << 5),
776 /* enable DVB-T demod on IOD[0] */
777 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 0),
784 /* TDA18212 config */
785 adap
->fe_adap
[state
->fe_id
].fe
= dvb_attach(
787 &anysee_zl10353_tda18212_config2
,
788 &adap
->dev
->i2c_adap
);
791 adap
->fe_adap
[state
->fe_id
].fe
= dvb_attach(
793 &anysee_zl10353_config
,
794 &adap
->dev
->i2c_adap
);
798 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
800 if (adap
->fe_adap
[state
->fe_id
].fe
)
801 adap
->fe_adap
[state
->fe_id
].fe
->ops
.i2c_gate_ctrl
=
802 anysee_i2c_gate_ctrl
;
806 case ANYSEE_HW_508TC
: /* 18 */
807 case ANYSEE_HW_508PTC
: /* 21 */
811 if ((state
->fe_id
^ dvb_usb_anysee_delsys
) == 0) {
812 /* disable DVB-T demod on IOD[6] */
813 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (0 << 6),
818 /* enable DVB-C demod on IOD[5] */
819 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 5),
825 adap
->fe_adap
[state
->fe_id
].fe
=
826 dvb_attach(tda10023_attach
,
827 &anysee_tda10023_tda18212_config
,
828 &adap
->dev
->i2c_adap
, 0x48);
830 /* disable DVB-C demod on IOD[5] */
831 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (0 << 5),
836 /* enable DVB-T demod on IOD[6] */
837 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOD
, (1 << 6),
843 adap
->fe_adap
[state
->fe_id
].fe
=
844 dvb_attach(zl10353_attach
,
845 &anysee_zl10353_tda18212_config
,
846 &adap
->dev
->i2c_adap
);
849 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
850 if (adap
->fe_adap
[state
->fe_id
].fe
)
851 adap
->fe_adap
[state
->fe_id
].fe
->ops
.i2c_gate_ctrl
=
852 anysee_i2c_gate_ctrl
;
854 state
->has_ci
= true;
857 case ANYSEE_HW_508S2
: /* 19 */
858 case ANYSEE_HW_508PS2
: /* 22 */
865 /* enable DVB-S/S2 demod on IOE[5] */
866 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (1 << 5), 0x20);
871 adap
->fe_adap
[0].fe
= dvb_attach(stv0900_attach
,
872 &anysee_stv0900_config
, &adap
->dev
->i2c_adap
, 0);
874 state
->has_ci
= true;
877 case ANYSEE_HW_508T2C
: /* 20 */
880 /* enable DVB-T/T2/C demod on IOE[5] */
881 ret
= anysee_wr_reg_mask(adap
->dev
, REG_IOE
, (1 << 5), 0x20);
885 if (state
->fe_id
== 0) {
887 adap
->fe_adap
[state
->fe_id
].fe
=
888 dvb_attach(cxd2820r_attach
,
889 &anysee_cxd2820r_config
,
890 &adap
->dev
->i2c_adap
, NULL
);
893 adap
->fe_adap
[state
->fe_id
].fe
=
894 dvb_attach(cxd2820r_attach
,
895 &anysee_cxd2820r_config
,
896 &adap
->dev
->i2c_adap
, adap
->fe_adap
[0].fe
);
899 state
->has_ci
= true;
904 if (!adap
->fe_adap
[0].fe
) {
905 /* we have no frontend :-( */
907 err("Unsupported Anysee version. " \
908 "Please report the <linux-media@vger.kernel.org>.");
914 static int anysee_tuner_attach(struct dvb_usb_adapter
*adap
)
916 struct anysee_state
*state
= adap
->dev
->priv
;
917 struct dvb_frontend
*fe
;
919 deb_info("%s: fe=%d\n", __func__
, state
->fe_id
);
922 case ANYSEE_HW_507T
: /* 2 */
926 fe
= dvb_attach(dvb_pll_attach
, adap
->fe_adap
[0].fe
,
927 (0xc2 >> 1), NULL
, DVB_PLL_THOMSON_DTT7579
);
930 case ANYSEE_HW_507CD
: /* 6 */
934 fe
= dvb_attach(dvb_pll_attach
, adap
->fe_adap
[0].fe
,
935 (0xc2 >> 1), &adap
->dev
->i2c_adap
,
936 DVB_PLL_THOMSON_DTT7579
);
939 case ANYSEE_HW_507DC
: /* 10 */
943 fe
= dvb_attach(dvb_pll_attach
, adap
->fe_adap
[0].fe
,
944 (0xc0 >> 1), &adap
->dev
->i2c_adap
,
945 DVB_PLL_SAMSUNG_DTOS403IH102A
);
948 case ANYSEE_HW_507SI
: /* 11 */
951 /* attach LNB controller */
952 fe
= dvb_attach(isl6423_attach
, adap
->fe_adap
[0].fe
,
953 &adap
->dev
->i2c_adap
, &anysee_isl6423_config
);
956 case ANYSEE_HW_507FA
: /* 15 */
960 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
961 * fails attach old simple PLL. */
964 fe
= dvb_attach(tda18212_attach
, adap
->fe_adap
[state
->fe_id
].fe
,
965 &adap
->dev
->i2c_adap
, &anysee_tda18212_config
);
970 fe
= dvb_attach(dvb_pll_attach
, adap
->fe_adap
[state
->fe_id
].fe
,
971 (0xc0 >> 1), &adap
->dev
->i2c_adap
,
972 DVB_PLL_SAMSUNG_DTOS403IH102A
);
975 case ANYSEE_HW_508TC
: /* 18 */
976 case ANYSEE_HW_508PTC
: /* 21 */
981 fe
= dvb_attach(tda18212_attach
, adap
->fe_adap
[state
->fe_id
].fe
,
982 &adap
->dev
->i2c_adap
, &anysee_tda18212_config
);
985 case ANYSEE_HW_508S2
: /* 19 */
986 case ANYSEE_HW_508PS2
: /* 22 */
991 fe
= dvb_attach(stv6110_attach
, adap
->fe_adap
[0].fe
,
992 &anysee_stv6110_config
, &adap
->dev
->i2c_adap
);
995 /* attach LNB controller */
996 fe
= dvb_attach(isl6423_attach
, adap
->fe_adap
[0].fe
,
997 &adap
->dev
->i2c_adap
, &anysee_isl6423_config
);
1002 case ANYSEE_HW_508T2C
: /* 20 */
1006 fe
= dvb_attach(tda18212_attach
, adap
->fe_adap
[state
->fe_id
].fe
,
1007 &adap
->dev
->i2c_adap
, &anysee_tda18212_config2
);
1022 static int anysee_rc_query(struct dvb_usb_device
*d
)
1024 u8 buf
[] = {CMD_GET_IR_CODE
};
1028 /* Remote controller is basic NEC using address byte 0x08.
1029 Anysee device RC query returns only two bytes, status and code,
1030 address byte is dropped. Also it does not return any value for
1031 NEC RCs having address byte other than 0x08. Due to that, we
1032 cannot use that device as standard NEC receiver.
1033 It could be possible make hack which reads whole code directly
1034 from device memory... */
1036 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), ircode
, sizeof(ircode
));
1041 deb_rc("%s: key pressed %02x\n", __func__
, ircode
[1]);
1042 rc_keydown(d
->rc_dev
, 0x08 << 8 | ircode
[1], 0);
1048 static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221
*ci
, int slot
,
1051 struct dvb_usb_device
*d
= ci
->data
;
1053 u8 buf
[] = {CMD_CI
, 0x02, 0x40 | addr
>> 8, addr
& 0xff, 0x00, 1};
1056 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), &val
, 1);
1063 static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221
*ci
, int slot
,
1066 struct dvb_usb_device
*d
= ci
->data
;
1068 u8 buf
[] = {CMD_CI
, 0x03, 0x40 | addr
>> 8, addr
& 0xff, 0x00, 1, val
};
1070 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
1077 static int anysee_ci_read_cam_control(struct dvb_ca_en50221
*ci
, int slot
,
1080 struct dvb_usb_device
*d
= ci
->data
;
1082 u8 buf
[] = {CMD_CI
, 0x04, 0x40, addr
, 0x00, 1};
1085 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), &val
, 1);
1092 static int anysee_ci_write_cam_control(struct dvb_ca_en50221
*ci
, int slot
,
1095 struct dvb_usb_device
*d
= ci
->data
;
1097 u8 buf
[] = {CMD_CI
, 0x05, 0x40, addr
, 0x00, 1, val
};
1099 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
1106 static int anysee_ci_slot_reset(struct dvb_ca_en50221
*ci
, int slot
)
1108 struct dvb_usb_device
*d
= ci
->data
;
1110 struct anysee_state
*state
= d
->priv
;
1112 state
->ci_cam_ready
= jiffies
+ msecs_to_jiffies(1000);
1114 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (0 << 7), 0x80);
1120 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1127 static int anysee_ci_slot_shutdown(struct dvb_ca_en50221
*ci
, int slot
)
1129 struct dvb_usb_device
*d
= ci
->data
;
1132 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (0 << 7), 0x80);
1138 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1145 static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221
*ci
, int slot
)
1147 struct dvb_usb_device
*d
= ci
->data
;
1150 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 1), 0x02);
1157 static int anysee_ci_poll_slot_status(struct dvb_ca_en50221
*ci
, int slot
,
1160 struct dvb_usb_device
*d
= ci
->data
;
1161 struct anysee_state
*state
= d
->priv
;
1165 ret
= anysee_rd_reg_mask(d
, REG_IOC
, &tmp
, 0x40);
1170 ret
= DVB_CA_EN50221_POLL_CAM_PRESENT
;
1171 if (time_after(jiffies
, state
->ci_cam_ready
))
1172 ret
|= DVB_CA_EN50221_POLL_CAM_READY
;
1178 static int anysee_ci_init(struct dvb_usb_device
*d
)
1180 struct anysee_state
*state
= d
->priv
;
1183 state
->ci
.owner
= THIS_MODULE
;
1184 state
->ci
.read_attribute_mem
= anysee_ci_read_attribute_mem
;
1185 state
->ci
.write_attribute_mem
= anysee_ci_write_attribute_mem
;
1186 state
->ci
.read_cam_control
= anysee_ci_read_cam_control
;
1187 state
->ci
.write_cam_control
= anysee_ci_write_cam_control
;
1188 state
->ci
.slot_reset
= anysee_ci_slot_reset
;
1189 state
->ci
.slot_shutdown
= anysee_ci_slot_shutdown
;
1190 state
->ci
.slot_ts_enable
= anysee_ci_slot_ts_enable
;
1191 state
->ci
.poll_slot_status
= anysee_ci_poll_slot_status
;
1194 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1198 ret
= dvb_ca_en50221_init(&d
->adapter
[0].dvb_adap
, &state
->ci
, 0, 1);
1205 static void anysee_ci_release(struct dvb_usb_device
*d
)
1207 struct anysee_state
*state
= d
->priv
;
1211 dvb_ca_en50221_release(&state
->ci
);
1216 static int anysee_init(struct dvb_usb_device
*d
)
1218 struct anysee_state
*state
= d
->priv
;
1222 ret
= anysee_led_ctrl(d
, 0x01, 0x03);
1227 ret
= anysee_ir_ctrl(d
, 1);
1232 if (state
->has_ci
) {
1233 ret
= anysee_ci_init(d
);
1235 state
->has_ci
= false;
1243 /* DVB USB Driver stuff */
1244 static struct dvb_usb_device_properties anysee_properties
;
1246 static int anysee_probe(struct usb_interface
*intf
,
1247 const struct usb_device_id
*id
)
1249 struct dvb_usb_device
*d
;
1250 struct usb_host_interface
*alt
;
1253 /* There is one interface with two alternate settings.
1254 Alternate setting 0 is for bulk transfer.
1255 Alternate setting 1 is for isochronous transfer.
1256 We use bulk transfer (alternate setting 0). */
1257 if (intf
->num_altsetting
< 1)
1261 * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
1262 * firmware from eeprom). If dvb_usb_device_init() succeeds that
1263 * means d is a valid pointer.
1265 ret
= dvb_usb_device_init(intf
, &anysee_properties
, THIS_MODULE
, &d
,
1270 alt
= usb_altnum_to_altsetting(intf
, 0);
1272 deb_info("%s: no alt found!\n", __func__
);
1276 ret
= usb_set_interface(d
->udev
, alt
->desc
.bInterfaceNumber
,
1277 alt
->desc
.bAlternateSetting
);
1281 return anysee_init(d
);
1284 static void anysee_disconnect(struct usb_interface
*intf
)
1286 struct dvb_usb_device
*d
= usb_get_intfdata(intf
);
1288 anysee_ci_release(d
);
1289 dvb_usb_device_exit(intf
);
1294 static struct usb_device_id anysee_table
[] = {
1295 { USB_DEVICE(USB_VID_CYPRESS
, USB_PID_ANYSEE
) },
1296 { USB_DEVICE(USB_VID_AMT
, USB_PID_ANYSEE
) },
1297 { } /* Terminating entry */
1299 MODULE_DEVICE_TABLE(usb
, anysee_table
);
1301 static struct dvb_usb_device_properties anysee_properties
= {
1302 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
1304 .usb_ctrl
= DEVICE_SPECIFIC
,
1306 .size_of_priv
= sizeof(struct anysee_state
),
1312 .frontend_ctrl
= anysee_frontend_ctrl
,
1314 .streaming_ctrl
= anysee_streaming_ctrl
,
1315 .frontend_attach
= anysee_frontend_attach
,
1316 .tuner_attach
= anysee_tuner_attach
,
1323 .buffersize
= (16*512),
1328 .streaming_ctrl
= anysee_streaming_ctrl
,
1329 .frontend_attach
= anysee_frontend_attach
,
1330 .tuner_attach
= anysee_tuner_attach
,
1337 .buffersize
= (16*512),
1346 .rc_codes
= RC_MAP_ANYSEE
,
1347 .protocol
= RC_TYPE_OTHER
,
1348 .module_name
= "anysee",
1349 .rc_query
= anysee_rc_query
,
1350 .rc_interval
= 250, /* windows driver uses 500ms */
1353 .i2c_algo
= &anysee_i2c_algo
,
1355 .generic_bulk_ctrl_endpoint
= 1,
1357 .num_device_descs
= 1,
1360 .name
= "Anysee DVB USB2.0",
1362 .warm_ids
= {&anysee_table
[0],
1363 &anysee_table
[1], NULL
},
1368 static struct usb_driver anysee_driver
= {
1369 .name
= "dvb_usb_anysee",
1370 .probe
= anysee_probe
,
1371 .disconnect
= anysee_disconnect
,
1372 .id_table
= anysee_table
,
1375 module_usb_driver(anysee_driver
);
1377 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1378 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1379 MODULE_LICENSE("GPL");