1/* DVB USB framework compliant Linux driver for the HanfTek UMT-010 USB2.0 2 * DVB-T receiver. 3 * 4 * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the Free 8 * Software Foundation, version 2. 9 * 10 * see Documentation/dvb/README.dvb-usb for more information 11 */ 12#include "dibusb.h" 13 14#include "mt352.h" 15 16static int umt_mt352_demod_init(struct dvb_frontend *fe) 17{ 18 static u8 mt352_clock_config[] = { 0x89, 0xb8, 0x2d }; 19 static u8 mt352_reset[] = { 0x50, 0x80 }; 20 static u8 mt352_mclk_ratio[] = { 0x8b, 0x00 }; 21 static u8 mt352_adc_ctl_1_cfg[] = { 0x8E, 0x40 }; 22 static u8 mt352_agc_cfg[] = { 0x67, 0x10, 0xa0 }; 23 24 static u8 mt352_sec_agc_cfg1[] = { 0x6a, 0xff }; 25 static u8 mt352_sec_agc_cfg2[] = { 0x6d, 0xff }; 26 static u8 mt352_sec_agc_cfg3[] = { 0x70, 0x40 }; 27 static u8 mt352_sec_agc_cfg4[] = { 0x7b, 0x03 }; 28 static u8 mt352_sec_agc_cfg5[] = { 0x7d, 0x0f }; 29 30 static u8 mt352_acq_ctl[] = { 0x53, 0x50 }; 31 static u8 mt352_input_freq_1[] = { 0x56, 0x31, 0x06 }; 32 33 mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config)); 34 udelay(2000); 35 mt352_write(fe, mt352_reset, sizeof(mt352_reset)); 36 mt352_write(fe, mt352_mclk_ratio, sizeof(mt352_mclk_ratio)); 37 38 mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg)); 39 mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg)); 40 41 mt352_write(fe, mt352_sec_agc_cfg1, sizeof(mt352_sec_agc_cfg1)); 42 mt352_write(fe, mt352_sec_agc_cfg2, sizeof(mt352_sec_agc_cfg2)); 43 mt352_write(fe, mt352_sec_agc_cfg3, sizeof(mt352_sec_agc_cfg3)); 44 mt352_write(fe, mt352_sec_agc_cfg4, sizeof(mt352_sec_agc_cfg4)); 45 mt352_write(fe, mt352_sec_agc_cfg5, sizeof(mt352_sec_agc_cfg5)); 46 47 mt352_write(fe, mt352_acq_ctl, sizeof(mt352_acq_ctl)); 48 mt352_write(fe, mt352_input_freq_1, sizeof(mt352_input_freq_1)); 49 50 return 0; 51} 52 53static int umt_mt352_frontend_attach(struct dvb_usb_adapter *adap) 54{ 55 struct mt352_config umt_config; 56 57 memset(&umt_config,0,sizeof(struct mt352_config)); 58 umt_config.demod_init = umt_mt352_demod_init; 59 umt_config.demod_address = 0xf; 60 61 adap->fe = dvb_attach(mt352_attach, &umt_config, &adap->dev->i2c_adap); 62 63 return 0; 64} 65 66static int umt_tuner_attach (struct dvb_usb_adapter *adap) 67{ 68 adap->pll_addr = 0x61; 69 adap->pll_desc = &dvb_pll_tua6034; 70 adap->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs; 71 return 0; 72} 73 74/* USB Driver stuff */ 75static struct dvb_usb_device_properties umt_properties; 76 77static int umt_probe(struct usb_interface *intf, 78 const struct usb_device_id *id) 79{ 80 if (dvb_usb_device_init(intf,&umt_properties,THIS_MODULE,NULL) == 0) 81 return 0; 82 return -EINVAL; 83} 84 85/* do not change the order of the ID table */ 86static struct usb_device_id umt_table [] = { 87/* 00 */ { USB_DEVICE(USB_VID_HANFTEK, USB_PID_HANFTEK_UMT_010_COLD) }, 88/* 01 */ { USB_DEVICE(USB_VID_HANFTEK, USB_PID_HANFTEK_UMT_010_WARM) }, 89 { } /* Terminating entry */ 90}; 91MODULE_DEVICE_TABLE (usb, umt_table); 92 93static struct dvb_usb_device_properties umt_properties = { 94 .caps = DVB_USB_IS_AN_I2C_ADAPTER, 95 96 .usb_ctrl = CYPRESS_FX2, 97 .firmware = "dvb-usb-umt-010-02.fw", 98 99 .num_adapters = 1, 100 .adapter = { 101 { 102 .streaming_ctrl = dibusb2_0_streaming_ctrl, 103 .frontend_attach = umt_mt352_frontend_attach, 104 .tuner_attach = umt_tuner_attach, 105 106 /* parameter for the MPEG2-data transfer */ 107 .stream = { 108 .type = USB_BULK, 109 .count = 20, 110 .endpoint = 0x06, 111 .u = { 112 .bulk = { 113 .buffersize = 512, 114 } 115 } 116 }, 117 118 .size_of_priv = sizeof(struct dibusb_state), 119 } 120 }, 121 .power_ctrl = dibusb_power_ctrl, 122 123 .i2c_algo = &dibusb_i2c_algo, 124 125 .generic_bulk_ctrl_endpoint = 0x01, 126 127 .num_device_descs = 1, 128 .devices = { 129 { "Hanftek UMT-010 DVB-T USB2.0", 130 { &umt_table[0], NULL }, 131 { &umt_table[1], NULL }, 132 }, 133 } 134}; 135 136static struct usb_driver umt_driver = { 137 .name = "dvb_usb_umt_010", 138 .probe = umt_probe, 139 .disconnect = dvb_usb_device_exit, 140 .id_table = umt_table, 141}; 142 143/* module stuff */ 144static int __init umt_module_init(void) 145{ 146 int result; 147 if ((result = usb_register(&umt_driver))) { 148 err("usb_register failed. Error number %d",result); 149 return result; 150 } 151 152 return 0; 153} 154 155static void __exit umt_module_exit(void) 156{ 157 /* deregister this driver from the USB subsystem */ 158 usb_deregister(&umt_driver); 159} 160 161module_init (umt_module_init); 162module_exit (umt_module_exit); 163 164MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>"); 165MODULE_DESCRIPTION("Driver for HanfTek UMT 010 USB2.0 DVB-T device"); 166MODULE_VERSION("1.0"); 167MODULE_LICENSE("GPL"); 168