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"
42 static int dvb_usb_anysee_debug;
43 module_param_named(debug, dvb_usb_anysee_debug, int, 0644);
44 MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
45 static int dvb_usb_anysee_delsys;
46 module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
47 MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
48 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
50 static DEFINE_MUTEX(anysee_usb_mutex);
52 static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
55 struct anysee_state *state = d->priv;
59 if (slen > sizeof(buf))
61 memcpy(&buf[0], sbuf, slen);
62 buf[60] = state->seq++;
64 if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
67 /* We need receive one message more after dvb_usb_generic_rw due
68 to weird transaction flow, which is 1 x send + 2 x receive. */
69 ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
72 /* receive 2nd answer */
73 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
74 d->props.generic_bulk_ctrl_endpoint), buf, sizeof(buf),
77 err("%s: recv bulk message failed: %d", __func__, ret);
80 debug_dump(buf, act_len, deb_xfer);
84 /* read request, copy returned data to return buf */
85 if (!ret && rbuf && rlen)
86 memcpy(rbuf, buf, rlen);
88 mutex_unlock(&anysee_usb_mutex);
93 static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
95 u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
97 ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
98 deb_info("%s: reg:%04x val:%02x\n", __func__, reg, *val);
102 static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
104 u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
105 deb_info("%s: reg:%04x val:%02x\n", __func__, reg, val);
106 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
109 /* write single register with mask */
110 static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
116 /* no need for read if whole reg is written */
118 ret = anysee_read_reg(d, reg, &tmp);
127 return anysee_write_reg(d, reg, val);
130 static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
132 u8 buf[] = {CMD_GET_HW_INFO};
133 return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
136 static int anysee_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
138 u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
139 deb_info("%s: onoff:%02x\n", __func__, onoff);
140 return anysee_ctrl_msg(adap->dev, buf, sizeof(buf), NULL, 0);
143 static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
145 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
146 deb_info("%s: state:%02x interval:%02x\n", __func__, mode, interval);
147 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
150 static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
152 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
153 deb_info("%s: onoff:%02x\n", __func__, onoff);
154 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
157 static int anysee_init(struct dvb_usb_device *d)
161 ret = anysee_led_ctrl(d, 0x01, 0x03);
166 ret = anysee_ir_ctrl(d, 1);
174 static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
177 struct dvb_usb_device *d = i2c_get_adapdata(adap);
178 int ret = 0, inc, i = 0;
180 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
184 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
186 buf[0] = CMD_I2C_READ;
187 buf[1] = (msg[i].addr << 1) | 0x01;
188 buf[2] = msg[i].buf[0];
191 buf[5] = msg[i+1].len;
192 ret = anysee_ctrl_msg(d, buf, sizeof(buf), msg[i+1].buf,
196 u8 buf[4+msg[i].len];
197 buf[0] = CMD_I2C_WRITE;
198 buf[1] = (msg[i].addr << 1);
201 memcpy(&buf[4], msg[i].buf, msg[i].len);
202 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
211 mutex_unlock(&d->i2c_mutex);
213 return ret ? ret : i;
216 static u32 anysee_i2c_func(struct i2c_adapter *adapter)
221 static struct i2c_algorithm anysee_i2c_algo = {
222 .master_xfer = anysee_master_xfer,
223 .functionality = anysee_i2c_func,
226 static int anysee_mt352_demod_init(struct dvb_frontend *fe)
228 static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x28 };
229 static u8 reset[] = { RESET, 0x80 };
230 static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
231 static u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 };
232 static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
233 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
235 mt352_write(fe, clock_config, sizeof(clock_config));
237 mt352_write(fe, reset, sizeof(reset));
238 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
240 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
241 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
242 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
247 /* Callbacks for DVB USB */
248 static struct tda10023_config anysee_tda10023_config = {
249 .demod_address = (0x1a >> 1),
255 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
259 static struct mt352_config anysee_mt352_config = {
260 .demod_address = (0x1e >> 1),
261 .demod_init = anysee_mt352_demod_init,
264 static struct zl10353_config anysee_zl10353_config = {
265 .demod_address = (0x1e >> 1),
269 static struct zl10353_config anysee_zl10353_tda18212_config2 = {
270 .demod_address = (0x1e >> 1),
272 .disable_i2c_gate_ctrl = 1,
277 static struct zl10353_config anysee_zl10353_tda18212_config = {
278 .demod_address = (0x18 >> 1),
280 .disable_i2c_gate_ctrl = 1,
285 static struct tda10023_config anysee_tda10023_tda18212_config = {
286 .demod_address = (0x1a >> 1),
291 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
295 static struct tda18212_config anysee_tda18212_config = {
296 .i2c_address = (0xc0 >> 1),
304 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
305 * Manufacturer: AMT.CO.KR
307 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
309 * parts: MT352, DTT7579(?), DNOS404ZH102A NIM
311 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
313 * parts: ZL10353, DTT7579(?), DNOS404ZH103A NIM
315 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
316 * PCB: 507CD (rev1.1)
317 * parts: ZL10353, DTT7579(?), CST56I01, DNOS404ZH103A NIM
318 * OEA=80 OEB=00 OEC=00 OED=ff OEF=fe
319 * IOD[0] ZL10353 1=enabled
320 * IOA[7] TS 0=enabled
321 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
323 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
324 * PCB: 507DC (rev0.2)
325 * parts: TDA10023, CST56I01, DTOS403IH102B TM
326 * OEA=80 OEB=00 OEC=00 OED=ff OEF=fe
327 * IOD[0] TDA10023 1=enabled
329 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
330 * PCB: 507FA (rev0.4)
331 * parts: TDA10023, TDA8024, DTOS403IH102B TM
332 * OEA=80 OEB=00 OEC=ff OED=ff OEF=ff
333 * IOD[5] TDA10023 1=enabled
334 * IOE[0] tuner 1=enabled
336 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
337 * PCB: 507FA (rev1.1)
338 * parts: ZL10353, TDA10023, TDA8024, DTOS403IH102B TM
339 * OEA=80 OEB=00 OEC=ff OED=ff OEF=ff
341 * IOD[5] TDA10023 1=enabled
342 * IOE[0] tuner 1=enabled
344 * IOD[0] ZL10353 1=enabled
345 * IOE[0] tuner 0=enabled
346 * tuner is behind ZL10353 I2C-gate
349 static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
352 struct anysee_state *state = adap->dev->priv;
355 struct i2c_msg msg[2] = {
357 .addr = anysee_tda18212_config.i2c_address,
362 .addr = anysee_tda18212_config.i2c_address,
369 /* Check which hardware we have.
370 * We must do this call two times to get reliable values (hw bug).
372 ret = anysee_get_hw_info(adap->dev, hw_info);
376 ret = anysee_get_hw_info(adap->dev, hw_info);
380 /* Meaning of these info bytes are guessed. */
381 info("firmware version:%d.%d hardware id:%d",
382 hw_info[1], hw_info[2], hw_info[0]);
384 state->hw = hw_info[0];
387 case ANYSEE_HW_02: /* 2 */
391 adap->fe = dvb_attach(mt352_attach, &anysee_mt352_config,
392 &adap->dev->i2c_adap);
397 adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
398 &adap->dev->i2c_adap);
403 case ANYSEE_HW_507CD: /* 6 */
406 /* enable DVB-T demod on IOD[0] */
407 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
411 /* enable transport stream on IOA[7] */
412 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
417 adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
418 &adap->dev->i2c_adap);
423 case ANYSEE_HW_507DC: /* 10 */
426 /* enable DVB-C demod on IOD[0] */
427 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
432 adap->fe = dvb_attach(tda10023_attach, &anysee_tda10023_config,
433 &adap->dev->i2c_adap, 0x48);
438 case ANYSEE_HW_507FA: /* 15 */
442 /* enable tuner on IOE[4] */
443 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
449 ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
450 if (ret == 2 && tmp == 0xc7)
451 deb_info("%s: TDA18212 found\n", __func__);
455 /* disable tuner on IOE[4] */
456 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
460 if (dvb_usb_anysee_delsys) {
461 /* disable DVB-C demod on IOD[5] */
462 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
467 /* enable DVB-T demod on IOD[0] */
468 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
475 /* TDA18212 config */
476 adap->fe = dvb_attach(zl10353_attach,
477 &anysee_zl10353_tda18212_config2,
478 &adap->dev->i2c_adap);
481 adap->fe = dvb_attach(zl10353_attach,
482 &anysee_zl10353_config,
483 &adap->dev->i2c_adap);
488 /* disable DVB-T demod on IOD[0] */
489 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
494 /* enable DVB-C demod on IOD[5] */
495 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
502 /* TDA18212 config */
503 adap->fe = dvb_attach(tda10023_attach,
504 &anysee_tda10023_tda18212_config,
505 &adap->dev->i2c_adap, 0x48);
508 adap->fe = dvb_attach(tda10023_attach,
509 &anysee_tda10023_config,
510 &adap->dev->i2c_adap, 0x48);
516 case ANYSEE_HW_508TC: /* 18 */
519 /* enable transport stream on IOA[7] */
520 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
524 if (dvb_usb_anysee_delsys) {
525 /* disable DVB-C demod on IOD[5] */
526 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
531 /* enable DVB-T demod on IOD[6] */
532 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
537 /* enable IF route on IOE[0] */
538 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
544 adap->fe = dvb_attach(zl10353_attach,
545 &anysee_zl10353_tda18212_config,
546 &adap->dev->i2c_adap);
550 /* disable DVB-T demod on IOD[6] */
551 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
556 /* enable DVB-C demod on IOD[5] */
557 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
562 /* enable IF route on IOE[0] */
563 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
569 adap->fe = dvb_attach(tda10023_attach,
570 &anysee_tda10023_tda18212_config,
571 &adap->dev->i2c_adap, 0x48);
579 /* we have no frontend :-( */
581 err("Unknown Anysee version: %02x %02x %02x. " \
582 "Please report the <linux-media@vger.kernel.org>.",
583 hw_info[0], hw_info[1], hw_info[2]);
589 static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
591 struct anysee_state *state = adap->dev->priv;
592 struct dvb_frontend *fe;
594 deb_info("%s:\n", __func__);
597 case ANYSEE_HW_02: /* 2 */
601 dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
602 NULL, DVB_PLL_THOMSON_DTT7579);
604 case ANYSEE_HW_507CD: /* 6 */
608 dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
609 &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
612 case ANYSEE_HW_507DC: /* 10 */
616 dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
617 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
619 case ANYSEE_HW_507FA: /* 15 */
623 if (dvb_usb_anysee_delsys) {
624 /* enable DVB-T tuner on IOE[0] */
625 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
630 /* enable DVB-C tuner on IOE[0] */
631 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
637 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
638 * fails attach old simple PLL. */
640 /* enable tuner on IOE[4] */
641 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
646 fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
647 &anysee_tda18212_config);
651 /* disable tuner on IOE[4] */
652 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
657 dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
658 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
661 case ANYSEE_HW_508TC: /* 18 */
664 /* enable tuner on IOE[4] */
665 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
670 fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
671 &anysee_tda18212_config);
685 static int anysee_rc_query(struct dvb_usb_device *d)
687 u8 buf[] = {CMD_GET_IR_CODE};
691 /* Remote controller is basic NEC using address byte 0x08.
692 Anysee device RC query returns only two bytes, status and code,
693 address byte is dropped. Also it does not return any value for
694 NEC RCs having address byte other than 0x08. Due to that, we
695 cannot use that device as standard NEC receiver.
696 It could be possible make hack which reads whole code directly
697 from device memory... */
699 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
704 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
705 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
711 /* DVB USB Driver stuff */
712 static struct dvb_usb_device_properties anysee_properties;
714 static int anysee_probe(struct usb_interface *intf,
715 const struct usb_device_id *id)
717 struct dvb_usb_device *d;
718 struct usb_host_interface *alt;
721 /* There is one interface with two alternate settings.
722 Alternate setting 0 is for bulk transfer.
723 Alternate setting 1 is for isochronous transfer.
724 We use bulk transfer (alternate setting 0). */
725 if (intf->num_altsetting < 1)
729 * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
730 * firmware from eeprom). If dvb_usb_device_init() succeeds that
731 * means d is a valid pointer.
733 ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
738 alt = usb_altnum_to_altsetting(intf, 0);
740 deb_info("%s: no alt found!\n", __func__);
744 ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
745 alt->desc.bAlternateSetting);
749 return anysee_init(d);
752 static struct usb_device_id anysee_table[] = {
753 { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
754 { USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE) },
755 { } /* Terminating entry */
757 MODULE_DEVICE_TABLE(usb, anysee_table);
759 static struct dvb_usb_device_properties anysee_properties = {
760 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
762 .usb_ctrl = DEVICE_SPECIFIC,
764 .size_of_priv = sizeof(struct anysee_state),
769 .streaming_ctrl = anysee_streaming_ctrl,
770 .frontend_attach = anysee_frontend_attach,
771 .tuner_attach = anysee_tuner_attach,
778 .buffersize = (16*512),
786 .rc_codes = RC_MAP_ANYSEE,
787 .protocol = RC_TYPE_OTHER,
788 .module_name = "anysee",
789 .rc_query = anysee_rc_query,
790 .rc_interval = 250, /* windows driver uses 500ms */
793 .i2c_algo = &anysee_i2c_algo,
795 .generic_bulk_ctrl_endpoint = 1,
797 .num_device_descs = 1,
800 .name = "Anysee DVB USB2.0",
802 .warm_ids = {&anysee_table[0],
803 &anysee_table[1], NULL},
808 static struct usb_driver anysee_driver = {
809 .name = "dvb_usb_anysee",
810 .probe = anysee_probe,
811 .disconnect = dvb_usb_device_exit,
812 .id_table = anysee_table,
816 static int __init anysee_module_init(void)
820 ret = usb_register(&anysee_driver);
822 err("%s: usb_register failed. Error number %d", __func__, ret);
827 static void __exit anysee_module_exit(void)
829 /* deregister this driver from the USB subsystem */
830 usb_deregister(&anysee_driver);
833 module_init(anysee_module_init);
834 module_exit(anysee_module_exit);
836 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
837 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
838 MODULE_LICENSE("GPL");