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];
189 buf[3] = msg[i].buf[1];
190 buf[4] = msg[i].len-1;
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);
401 case ANYSEE_HW_507CD: /* 6 */
404 /* enable DVB-T demod on IOD[0] */
405 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
409 /* enable transport stream on IOA[7] */
410 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
415 adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
416 &adap->dev->i2c_adap);
419 case ANYSEE_HW_507DC: /* 10 */
422 /* enable DVB-C demod on IOD[0] */
423 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
428 adap->fe = dvb_attach(tda10023_attach, &anysee_tda10023_config,
429 &adap->dev->i2c_adap, 0x48);
432 case ANYSEE_HW_507FA: /* 15 */
436 /* enable tuner on IOE[4] */
437 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
443 ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
444 if (ret == 2 && tmp == 0xc7)
445 deb_info("%s: TDA18212 found\n", __func__);
449 /* disable tuner on IOE[4] */
450 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
454 if (dvb_usb_anysee_delsys) {
455 /* disable DVB-C demod on IOD[5] */
456 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
461 /* enable DVB-T demod on IOD[0] */
462 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
469 /* TDA18212 config */
470 adap->fe = dvb_attach(zl10353_attach,
471 &anysee_zl10353_tda18212_config2,
472 &adap->dev->i2c_adap);
475 adap->fe = dvb_attach(zl10353_attach,
476 &anysee_zl10353_config,
477 &adap->dev->i2c_adap);
480 /* disable DVB-T demod on IOD[0] */
481 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
486 /* enable DVB-C demod on IOD[5] */
487 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
494 /* TDA18212 config */
495 adap->fe = dvb_attach(tda10023_attach,
496 &anysee_tda10023_tda18212_config,
497 &adap->dev->i2c_adap, 0x48);
500 adap->fe = dvb_attach(tda10023_attach,
501 &anysee_tda10023_config,
502 &adap->dev->i2c_adap, 0x48);
507 case ANYSEE_HW_508TC: /* 18 */
510 /* enable transport stream on IOA[7] */
511 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
515 if (dvb_usb_anysee_delsys) {
516 /* disable DVB-C demod on IOD[5] */
517 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
522 /* enable DVB-T demod on IOD[6] */
523 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
528 /* enable IF route on IOE[0] */
529 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
535 adap->fe = dvb_attach(zl10353_attach,
536 &anysee_zl10353_tda18212_config,
537 &adap->dev->i2c_adap);
539 /* disable DVB-T demod on IOD[6] */
540 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
545 /* enable DVB-C demod on IOD[5] */
546 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
551 /* enable IF route on IOE[0] */
552 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
558 adap->fe = dvb_attach(tda10023_attach,
559 &anysee_tda10023_tda18212_config,
560 &adap->dev->i2c_adap, 0x48);
567 /* we have no frontend :-( */
569 err("Unsupported Anysee version. " \
570 "Please report the <linux-media@vger.kernel.org>.");
576 static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
578 struct anysee_state *state = adap->dev->priv;
579 struct dvb_frontend *fe;
581 deb_info("%s:\n", __func__);
584 case ANYSEE_HW_02: /* 2 */
588 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
589 NULL, DVB_PLL_THOMSON_DTT7579);
592 case ANYSEE_HW_507CD: /* 6 */
596 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
597 &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
600 case ANYSEE_HW_507DC: /* 10 */
604 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
605 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
608 case ANYSEE_HW_507FA: /* 15 */
612 if (dvb_usb_anysee_delsys) {
613 /* enable DVB-T tuner on IOE[0] */
614 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
619 /* enable DVB-C tuner on IOE[0] */
620 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
626 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
627 * fails attach old simple PLL. */
629 /* enable tuner on IOE[4] */
630 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
635 fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
636 &anysee_tda18212_config);
640 /* disable tuner on IOE[4] */
641 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
646 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
647 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
650 case ANYSEE_HW_508TC: /* 18 */
653 /* enable tuner on IOE[4] */
654 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
659 fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
660 &anysee_tda18212_config);
676 static int anysee_rc_query(struct dvb_usb_device *d)
678 u8 buf[] = {CMD_GET_IR_CODE};
682 /* Remote controller is basic NEC using address byte 0x08.
683 Anysee device RC query returns only two bytes, status and code,
684 address byte is dropped. Also it does not return any value for
685 NEC RCs having address byte other than 0x08. Due to that, we
686 cannot use that device as standard NEC receiver.
687 It could be possible make hack which reads whole code directly
688 from device memory... */
690 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
695 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
696 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
702 /* DVB USB Driver stuff */
703 static struct dvb_usb_device_properties anysee_properties;
705 static int anysee_probe(struct usb_interface *intf,
706 const struct usb_device_id *id)
708 struct dvb_usb_device *d;
709 struct usb_host_interface *alt;
712 /* There is one interface with two alternate settings.
713 Alternate setting 0 is for bulk transfer.
714 Alternate setting 1 is for isochronous transfer.
715 We use bulk transfer (alternate setting 0). */
716 if (intf->num_altsetting < 1)
720 * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
721 * firmware from eeprom). If dvb_usb_device_init() succeeds that
722 * means d is a valid pointer.
724 ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
729 alt = usb_altnum_to_altsetting(intf, 0);
731 deb_info("%s: no alt found!\n", __func__);
735 ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
736 alt->desc.bAlternateSetting);
740 return anysee_init(d);
743 static struct usb_device_id anysee_table[] = {
744 { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
745 { USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE) },
746 { } /* Terminating entry */
748 MODULE_DEVICE_TABLE(usb, anysee_table);
750 static struct dvb_usb_device_properties anysee_properties = {
751 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
753 .usb_ctrl = DEVICE_SPECIFIC,
755 .size_of_priv = sizeof(struct anysee_state),
760 .streaming_ctrl = anysee_streaming_ctrl,
761 .frontend_attach = anysee_frontend_attach,
762 .tuner_attach = anysee_tuner_attach,
769 .buffersize = (16*512),
777 .rc_codes = RC_MAP_ANYSEE,
778 .protocol = RC_TYPE_OTHER,
779 .module_name = "anysee",
780 .rc_query = anysee_rc_query,
781 .rc_interval = 250, /* windows driver uses 500ms */
784 .i2c_algo = &anysee_i2c_algo,
786 .generic_bulk_ctrl_endpoint = 1,
788 .num_device_descs = 1,
791 .name = "Anysee DVB USB2.0",
793 .warm_ids = {&anysee_table[0],
794 &anysee_table[1], NULL},
799 static struct usb_driver anysee_driver = {
800 .name = "dvb_usb_anysee",
801 .probe = anysee_probe,
802 .disconnect = dvb_usb_device_exit,
803 .id_table = anysee_table,
807 static int __init anysee_module_init(void)
811 ret = usb_register(&anysee_driver);
813 err("%s: usb_register failed. Error number %d", __func__, ret);
818 static void __exit anysee_module_exit(void)
820 /* deregister this driver from the USB subsystem */
821 usb_deregister(&anysee_driver);
824 module_init(anysee_module_init);
825 module_exit(anysee_module_exit);
827 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
828 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
829 MODULE_LICENSE("GPL");