0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "dibusb.h"
0010
0011 #include "mt352.h"
0012
0013 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
0014
0015 static int umt_mt352_demod_init(struct dvb_frontend *fe)
0016 {
0017 static u8 mt352_clock_config[] = { 0x89, 0xb8, 0x2d };
0018 static u8 mt352_reset[] = { 0x50, 0x80 };
0019 static u8 mt352_mclk_ratio[] = { 0x8b, 0x00 };
0020 static u8 mt352_adc_ctl_1_cfg[] = { 0x8E, 0x40 };
0021 static u8 mt352_agc_cfg[] = { 0x67, 0x10, 0xa0 };
0022
0023 static u8 mt352_sec_agc_cfg1[] = { 0x6a, 0xff };
0024 static u8 mt352_sec_agc_cfg2[] = { 0x6d, 0xff };
0025 static u8 mt352_sec_agc_cfg3[] = { 0x70, 0x40 };
0026 static u8 mt352_sec_agc_cfg4[] = { 0x7b, 0x03 };
0027 static u8 mt352_sec_agc_cfg5[] = { 0x7d, 0x0f };
0028
0029 static u8 mt352_acq_ctl[] = { 0x53, 0x50 };
0030 static u8 mt352_input_freq_1[] = { 0x56, 0x31, 0x06 };
0031
0032 mt352_write(fe, mt352_clock_config, sizeof(mt352_clock_config));
0033 udelay(2000);
0034 mt352_write(fe, mt352_reset, sizeof(mt352_reset));
0035 mt352_write(fe, mt352_mclk_ratio, sizeof(mt352_mclk_ratio));
0036
0037 mt352_write(fe, mt352_adc_ctl_1_cfg, sizeof(mt352_adc_ctl_1_cfg));
0038 mt352_write(fe, mt352_agc_cfg, sizeof(mt352_agc_cfg));
0039
0040 mt352_write(fe, mt352_sec_agc_cfg1, sizeof(mt352_sec_agc_cfg1));
0041 mt352_write(fe, mt352_sec_agc_cfg2, sizeof(mt352_sec_agc_cfg2));
0042 mt352_write(fe, mt352_sec_agc_cfg3, sizeof(mt352_sec_agc_cfg3));
0043 mt352_write(fe, mt352_sec_agc_cfg4, sizeof(mt352_sec_agc_cfg4));
0044 mt352_write(fe, mt352_sec_agc_cfg5, sizeof(mt352_sec_agc_cfg5));
0045
0046 mt352_write(fe, mt352_acq_ctl, sizeof(mt352_acq_ctl));
0047 mt352_write(fe, mt352_input_freq_1, sizeof(mt352_input_freq_1));
0048
0049 return 0;
0050 }
0051
0052 static int umt_mt352_frontend_attach(struct dvb_usb_adapter *adap)
0053 {
0054 struct mt352_config umt_config;
0055
0056 memset(&umt_config,0,sizeof(struct mt352_config));
0057 umt_config.demod_init = umt_mt352_demod_init;
0058 umt_config.demod_address = 0xf;
0059
0060 adap->fe_adap[0].fe = dvb_attach(mt352_attach, &umt_config, &adap->dev->i2c_adap);
0061
0062 return 0;
0063 }
0064
0065 static int umt_tuner_attach (struct dvb_usb_adapter *adap)
0066 {
0067 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, NULL, DVB_PLL_TUA6034);
0068 return 0;
0069 }
0070
0071
0072 static struct dvb_usb_device_properties umt_properties;
0073
0074 static int umt_probe(struct usb_interface *intf,
0075 const struct usb_device_id *id)
0076 {
0077 if (0 == dvb_usb_device_init(intf, &umt_properties,
0078 THIS_MODULE, NULL, adapter_nr))
0079 return 0;
0080 return -EINVAL;
0081 }
0082
0083
0084 enum {
0085 HANFTEK_UMT_010_COLD,
0086 HANFTEK_UMT_010_WARM,
0087 };
0088
0089 static struct usb_device_id umt_table[] = {
0090 DVB_USB_DEV(HANFTEK, HANFTEK_UMT_010_COLD),
0091 DVB_USB_DEV(HANFTEK, HANFTEK_UMT_010_WARM),
0092 { }
0093 };
0094
0095 MODULE_DEVICE_TABLE (usb, umt_table);
0096
0097 static struct dvb_usb_device_properties umt_properties = {
0098 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
0099
0100 .usb_ctrl = CYPRESS_FX2,
0101 .firmware = "dvb-usb-umt-010-02.fw",
0102
0103 .num_adapters = 1,
0104 .adapter = {
0105 {
0106 .num_frontends = 1,
0107 .fe = {{
0108 .streaming_ctrl = dibusb2_0_streaming_ctrl,
0109 .frontend_attach = umt_mt352_frontend_attach,
0110 .tuner_attach = umt_tuner_attach,
0111
0112
0113 .stream = {
0114 .type = USB_BULK,
0115 .count = MAX_NO_URBS_FOR_DATA_STREAM,
0116 .endpoint = 0x06,
0117 .u = {
0118 .bulk = {
0119 .buffersize = 512,
0120 }
0121 }
0122 },
0123 }},
0124 .size_of_priv = sizeof(struct dibusb_state),
0125 }
0126 },
0127 .power_ctrl = dibusb_power_ctrl,
0128
0129 .i2c_algo = &dibusb_i2c_algo,
0130
0131 .generic_bulk_ctrl_endpoint = 0x01,
0132
0133 .num_device_descs = 1,
0134 .devices = {
0135 { "Hanftek UMT-010 DVB-T USB2.0",
0136 { &umt_table[HANFTEK_UMT_010_COLD], NULL },
0137 { &umt_table[HANFTEK_UMT_010_WARM], NULL },
0138 },
0139 }
0140 };
0141
0142 static struct usb_driver umt_driver = {
0143 .name = "dvb_usb_umt_010",
0144 .probe = umt_probe,
0145 .disconnect = dvb_usb_device_exit,
0146 .id_table = umt_table,
0147 };
0148
0149 module_usb_driver(umt_driver);
0150
0151 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
0152 MODULE_DESCRIPTION("Driver for HanfTek UMT 010 USB2.0 DVB-T device");
0153 MODULE_VERSION("1.0");
0154 MODULE_LICENSE("GPL");