1786baecfSMauro Carvalho Chehab /* 2786baecfSMauro Carvalho Chehab * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver 3786baecfSMauro Carvalho Chehab * 4786baecfSMauro Carvalho Chehab * Copyright (C) 2007 Antti Palosaari <crope@iki.fi> 5786baecfSMauro Carvalho Chehab * 6786baecfSMauro Carvalho Chehab * Thanks to Afatech who kindly provided information. 7786baecfSMauro Carvalho Chehab * 8786baecfSMauro Carvalho Chehab * This program is free software; you can redistribute it and/or modify 9786baecfSMauro Carvalho Chehab * it under the terms of the GNU General Public License as published by 10786baecfSMauro Carvalho Chehab * the Free Software Foundation; either version 2 of the License, or 11786baecfSMauro Carvalho Chehab * (at your option) any later version. 12786baecfSMauro Carvalho Chehab * 13786baecfSMauro Carvalho Chehab * This program is distributed in the hope that it will be useful, 14786baecfSMauro Carvalho Chehab * but WITHOUT ANY WARRANTY; without even the implied warranty of 15786baecfSMauro Carvalho Chehab * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16786baecfSMauro Carvalho Chehab * GNU General Public License for more details. 17786baecfSMauro Carvalho Chehab * 18786baecfSMauro Carvalho Chehab * You should have received a copy of the GNU General Public License 19786baecfSMauro Carvalho Chehab * along with this program; if not, write to the Free Software 20786baecfSMauro Carvalho Chehab * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21786baecfSMauro Carvalho Chehab * 22786baecfSMauro Carvalho Chehab */ 23786baecfSMauro Carvalho Chehab 24786baecfSMauro Carvalho Chehab #ifndef AF9015_H 25786baecfSMauro Carvalho Chehab #define AF9015_H 26786baecfSMauro Carvalho Chehab 27786baecfSMauro Carvalho Chehab #include <linux/hash.h> 28786baecfSMauro Carvalho Chehab #include "dvb_usb.h" 29786baecfSMauro Carvalho Chehab #include "af9013.h" 30786baecfSMauro Carvalho Chehab #include "dvb-pll.h" 31786baecfSMauro Carvalho Chehab #include "mt2060.h" 32786baecfSMauro Carvalho Chehab #include "qt1010.h" 33786baecfSMauro Carvalho Chehab #include "tda18271.h" 34786baecfSMauro Carvalho Chehab #include "mxl5005s.h" 35786baecfSMauro Carvalho Chehab #include "mc44s803.h" 36786baecfSMauro Carvalho Chehab #include "tda18218.h" 37786baecfSMauro Carvalho Chehab #include "mxl5007t.h" 38786baecfSMauro Carvalho Chehab 39bab9b4feSAntti Palosaari #define AF9015_FIRMWARE "dvb-usb-af9015.fw" 40bab9b4feSAntti Palosaari 41786baecfSMauro Carvalho Chehab /* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0. 42786baecfSMauro Carvalho Chehab We use smaller - about 1/4 from the original, 5 and 87. */ 43786baecfSMauro Carvalho Chehab #define TS_PACKET_SIZE 188 44786baecfSMauro Carvalho Chehab 45786baecfSMauro Carvalho Chehab #define TS_USB20_PACKET_COUNT 87 46786baecfSMauro Carvalho Chehab #define TS_USB20_FRAME_SIZE (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT) 47786baecfSMauro Carvalho Chehab 48786baecfSMauro Carvalho Chehab #define TS_USB11_PACKET_COUNT 5 49786baecfSMauro Carvalho Chehab #define TS_USB11_FRAME_SIZE (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT) 50786baecfSMauro Carvalho Chehab 51786baecfSMauro Carvalho Chehab #define TS_USB20_MAX_PACKET_SIZE 512 52786baecfSMauro Carvalho Chehab #define TS_USB11_MAX_PACKET_SIZE 64 53786baecfSMauro Carvalho Chehab 54786baecfSMauro Carvalho Chehab #define AF9015_I2C_EEPROM 0xa0 55786baecfSMauro Carvalho Chehab #define AF9015_I2C_DEMOD 0x38 56786baecfSMauro Carvalho Chehab #define AF9015_USB_TIMEOUT 2000 57786baecfSMauro Carvalho Chehab 58786baecfSMauro Carvalho Chehab /* EEPROM locations */ 59786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IR_MODE 0x18 60786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IR_REMOTE_TYPE 0x34 61786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_TS_MODE 0x31 62786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_DEMOD2_I2C 0x32 63786baecfSMauro Carvalho Chehab 64786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_SAW_BW1 0x35 65786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_XTAL_TYPE1 0x36 66786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_SPEC_INV1 0x37 67786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IF1L 0x38 68786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IF1H 0x39 69786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_MT2060_IF1L 0x3a 70786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_MT2060_IF1H 0x3b 71786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_TUNER_ID1 0x3c 72786baecfSMauro Carvalho Chehab 73786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_SAW_BW2 0x45 74786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_XTAL_TYPE2 0x46 75786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_SPEC_INV2 0x47 76786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IF2L 0x48 77786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IF2H 0x49 78786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_MT2060_IF2L 0x4a 79786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_MT2060_IF2H 0x4b 80786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_TUNER_ID2 0x4c 81786baecfSMauro Carvalho Chehab 82786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_OFFSET (AF9015_EEPROM_SAW_BW2 - AF9015_EEPROM_SAW_BW1) 83786baecfSMauro Carvalho Chehab 84786baecfSMauro Carvalho Chehab struct req_t { 85786baecfSMauro Carvalho Chehab u8 cmd; /* [0] */ 86786baecfSMauro Carvalho Chehab /* seq */ /* [1] */ 87786baecfSMauro Carvalho Chehab u8 i2c_addr; /* [2] */ 88786baecfSMauro Carvalho Chehab u16 addr; /* [3|4] */ 89786baecfSMauro Carvalho Chehab u8 mbox; /* [5] */ 90786baecfSMauro Carvalho Chehab u8 addr_len; /* [6] */ 91786baecfSMauro Carvalho Chehab u8 data_len; /* [7] */ 92786baecfSMauro Carvalho Chehab u8 *data; 93786baecfSMauro Carvalho Chehab }; 94786baecfSMauro Carvalho Chehab 95786baecfSMauro Carvalho Chehab enum af9015_cmd { 96786baecfSMauro Carvalho Chehab GET_CONFIG = 0x10, 97786baecfSMauro Carvalho Chehab DOWNLOAD_FIRMWARE = 0x11, 98786baecfSMauro Carvalho Chehab BOOT = 0x13, 99786baecfSMauro Carvalho Chehab READ_MEMORY = 0x20, 100786baecfSMauro Carvalho Chehab WRITE_MEMORY = 0x21, 101786baecfSMauro Carvalho Chehab READ_WRITE_I2C = 0x22, 102786baecfSMauro Carvalho Chehab COPY_FIRMWARE = 0x23, 103786baecfSMauro Carvalho Chehab RECONNECT_USB = 0x5a, 104786baecfSMauro Carvalho Chehab WRITE_VIRTUAL_MEMORY = 0x26, 105786baecfSMauro Carvalho Chehab GET_IR_CODE = 0x27, 106786baecfSMauro Carvalho Chehab READ_I2C, 107786baecfSMauro Carvalho Chehab WRITE_I2C, 108786baecfSMauro Carvalho Chehab }; 109786baecfSMauro Carvalho Chehab 110786baecfSMauro Carvalho Chehab enum af9015_ir_mode { 111786baecfSMauro Carvalho Chehab AF9015_IR_MODE_DISABLED = 0, 112786baecfSMauro Carvalho Chehab AF9015_IR_MODE_HID, 113786baecfSMauro Carvalho Chehab AF9015_IR_MODE_RLC, 114786baecfSMauro Carvalho Chehab AF9015_IR_MODE_RC6, 115786baecfSMauro Carvalho Chehab AF9015_IR_MODE_POLLING, /* just guess */ 116786baecfSMauro Carvalho Chehab }; 117786baecfSMauro Carvalho Chehab 118aff8c2d4SAntti Palosaari #define BUF_LEN 63 119786baecfSMauro Carvalho Chehab struct af9015_state { 120aff8c2d4SAntti Palosaari u8 buf[BUF_LEN]; /* bulk USB control message */ 121786baecfSMauro Carvalho Chehab u8 ir_mode; 122786baecfSMauro Carvalho Chehab u8 rc_repeat; 123786baecfSMauro Carvalho Chehab u32 rc_keycode; 124786baecfSMauro Carvalho Chehab u8 rc_last[4]; 125786baecfSMauro Carvalho Chehab bool rc_failed; 126786baecfSMauro Carvalho Chehab u8 dual_mode; 127786baecfSMauro Carvalho Chehab u8 seq; /* packet sequence number */ 128786baecfSMauro Carvalho Chehab u16 mt2060_if1[2]; 129786baecfSMauro Carvalho Chehab u16 firmware_size; 130786baecfSMauro Carvalho Chehab u16 firmware_checksum; 131786baecfSMauro Carvalho Chehab u32 eeprom_sum; 132786baecfSMauro Carvalho Chehab struct af9013_config af9013_config[2]; 133786baecfSMauro Carvalho Chehab 134786baecfSMauro Carvalho Chehab /* for demod callback override */ 135786baecfSMauro Carvalho Chehab int (*set_frontend[2]) (struct dvb_frontend *fe); 1360df289a2SMauro Carvalho Chehab int (*read_status[2]) (struct dvb_frontend *fe, enum fe_status *status); 137786baecfSMauro Carvalho Chehab int (*init[2]) (struct dvb_frontend *fe); 138786baecfSMauro Carvalho Chehab int (*sleep[2]) (struct dvb_frontend *fe); 139786baecfSMauro Carvalho Chehab int (*tuner_init[2]) (struct dvb_frontend *fe); 140786baecfSMauro Carvalho Chehab int (*tuner_sleep[2]) (struct dvb_frontend *fe); 141786baecfSMauro Carvalho Chehab struct mutex fe_mutex; 142786baecfSMauro Carvalho Chehab }; 143786baecfSMauro Carvalho Chehab 144786baecfSMauro Carvalho Chehab enum af9015_remote { 145786baecfSMauro Carvalho Chehab AF9015_REMOTE_NONE = 0, 146786baecfSMauro Carvalho Chehab /* 1 */ AF9015_REMOTE_A_LINK_DTU_M, 147786baecfSMauro Carvalho Chehab AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, 148786baecfSMauro Carvalho Chehab AF9015_REMOTE_MYGICTV_U718, 149786baecfSMauro Carvalho Chehab AF9015_REMOTE_DIGITTRADE_DVB_T, 150786baecfSMauro Carvalho Chehab /* 5 */ AF9015_REMOTE_AVERMEDIA_KS, 151786baecfSMauro Carvalho Chehab }; 152786baecfSMauro Carvalho Chehab 153786baecfSMauro Carvalho Chehab #endif 154