Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /* DVB USB framework compliant Linux driver for the HanfTek UMT-010 USB2.0
0003  * DVB-T receiver.
0004  *
0005  * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de)
0006  *
0007  * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
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 /* USB Driver stuff */
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 /* do not change the order of the ID table */
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             /* parameter for the MPEG2-data transfer */
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");