dib0700_devices.c 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792
  1. /* Linux driver for devices based on the DiBcom DiB0700 USB bridge
  2. *
  3. * This program is free software; you can redistribute it and/or modify it
  4. * under the terms of the GNU General Public License as published by the Free
  5. * Software Foundation, version 2.
  6. *
  7. * Copyright (C) 2005-7 DiBcom, SA
  8. */
  9. #include "dib0700.h"
  10. #include "dib3000mc.h"
  11. #include "dib7000m.h"
  12. #include "dib7000p.h"
  13. #include "mt2060.h"
  14. #include "mt2266.h"
  15. #include "tuner-xc2028.h"
  16. #include "xc5000.h"
  17. #include "s5h1411.h"
  18. #include "dib0070.h"
  19. static int force_lna_activation;
  20. module_param(force_lna_activation, int, 0644);
  21. MODULE_PARM_DESC(force_lna_activation, "force the activation of Low-Noise-Amplifyer(s) (LNA), "
  22. "if applicable for the device (default: 0=automatic/off).");
  23. struct dib0700_adapter_state {
  24. int (*set_param_save) (struct dvb_frontend *, struct dvb_frontend_parameters *);
  25. };
  26. /* Hauppauge Nova-T 500 (aka Bristol)
  27. * has a LNA on GPIO0 which is enabled by setting 1 */
  28. static struct mt2060_config bristol_mt2060_config[2] = {
  29. {
  30. .i2c_address = 0x60,
  31. .clock_out = 3,
  32. }, {
  33. .i2c_address = 0x61,
  34. }
  35. };
  36. static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
  37. .band_caps = BAND_VHF | BAND_UHF,
  38. .setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
  39. .agc1_max = 42598,
  40. .agc1_min = 17694,
  41. .agc2_max = 45875,
  42. .agc2_min = 0,
  43. .agc1_pt1 = 0,
  44. .agc1_pt2 = 59,
  45. .agc1_slope1 = 0,
  46. .agc1_slope2 = 69,
  47. .agc2_pt1 = 0,
  48. .agc2_pt2 = 59,
  49. .agc2_slope1 = 111,
  50. .agc2_slope2 = 28,
  51. };
  52. static struct dib3000mc_config bristol_dib3000mc_config[2] = {
  53. { .agc = &bristol_dib3000p_mt2060_agc_config,
  54. .max_time = 0x196,
  55. .ln_adc_level = 0x1cc7,
  56. .output_mpeg2_in_188_bytes = 1,
  57. },
  58. { .agc = &bristol_dib3000p_mt2060_agc_config,
  59. .max_time = 0x196,
  60. .ln_adc_level = 0x1cc7,
  61. .output_mpeg2_in_188_bytes = 1,
  62. }
  63. };
  64. static int bristol_frontend_attach(struct dvb_usb_adapter *adap)
  65. {
  66. struct dib0700_state *st = adap->dev->priv;
  67. if (adap->id == 0) {
  68. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
  69. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
  70. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
  71. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
  72. if (force_lna_activation)
  73. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  74. else
  75. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
  76. if (dib3000mc_i2c_enumeration(&adap->dev->i2c_adap, 2, DEFAULT_DIB3000P_I2C_ADDRESS, bristol_dib3000mc_config) != 0) {
  77. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
  78. return -ENODEV;
  79. }
  80. }
  81. st->mt2060_if1[adap->id] = 1220;
  82. return (adap->fe = dvb_attach(dib3000mc_attach, &adap->dev->i2c_adap,
  83. (10 + adap->id) << 1, &bristol_dib3000mc_config[adap->id])) == NULL ? -ENODEV : 0;
  84. }
  85. static int eeprom_read(struct i2c_adapter *adap,u8 adrs,u8 *pval)
  86. {
  87. struct i2c_msg msg[2] = {
  88. { .addr = 0x50, .flags = 0, .buf = &adrs, .len = 1 },
  89. { .addr = 0x50, .flags = I2C_M_RD, .buf = pval, .len = 1 },
  90. };
  91. if (i2c_transfer(adap, msg, 2) != 2) return -EREMOTEIO;
  92. return 0;
  93. }
  94. static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
  95. {
  96. struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
  97. struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
  98. s8 a;
  99. int if1=1220;
  100. if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
  101. adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) {
  102. if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a;
  103. }
  104. return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id],
  105. if1) == NULL ? -ENODEV : 0;
  106. }
  107. /* STK7700D: Pinnacle/Terratec/Hauppauge Dual DVB-T Diversity */
  108. /* MT226x */
  109. static struct dibx000_agc_config stk7700d_7000p_mt2266_agc_config[2] = {
  110. {
  111. BAND_UHF, // band_caps
  112. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,
  113. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  114. (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
  115. 1130, // inv_gain
  116. 21, // time_stabiliz
  117. 0, // alpha_level
  118. 118, // thlock
  119. 0, // wbd_inv
  120. 3530, // wbd_ref
  121. 1, // wbd_sel
  122. 0, // wbd_alpha
  123. 65535, // agc1_max
  124. 33770, // agc1_min
  125. 65535, // agc2_max
  126. 23592, // agc2_min
  127. 0, // agc1_pt1
  128. 62, // agc1_pt2
  129. 255, // agc1_pt3
  130. 64, // agc1_slope1
  131. 64, // agc1_slope2
  132. 132, // agc2_pt1
  133. 192, // agc2_pt2
  134. 80, // agc2_slope1
  135. 80, // agc2_slope2
  136. 17, // alpha_mant
  137. 27, // alpha_exp
  138. 23, // beta_mant
  139. 51, // beta_exp
  140. 1, // perform_agc_softsplit
  141. }, {
  142. BAND_VHF | BAND_LBAND, // band_caps
  143. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=1, P_agc_inv_pwm1=1, P_agc_inv_pwm2=1,
  144. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  145. (0 << 15) | (0 << 14) | (1 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
  146. 2372, // inv_gain
  147. 21, // time_stabiliz
  148. 0, // alpha_level
  149. 118, // thlock
  150. 0, // wbd_inv
  151. 3530, // wbd_ref
  152. 1, // wbd_sel
  153. 0, // wbd_alpha
  154. 65535, // agc1_max
  155. 0, // agc1_min
  156. 65535, // agc2_max
  157. 23592, // agc2_min
  158. 0, // agc1_pt1
  159. 128, // agc1_pt2
  160. 128, // agc1_pt3
  161. 128, // agc1_slope1
  162. 0, // agc1_slope2
  163. 128, // agc2_pt1
  164. 253, // agc2_pt2
  165. 81, // agc2_slope1
  166. 0, // agc2_slope2
  167. 17, // alpha_mant
  168. 27, // alpha_exp
  169. 23, // beta_mant
  170. 51, // beta_exp
  171. 1, // perform_agc_softsplit
  172. }
  173. };
  174. static struct dibx000_bandwidth_config stk7700d_mt2266_pll_config = {
  175. 60000, 30000, // internal, sampling
  176. 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
  177. 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
  178. (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
  179. 0, // ifreq
  180. 20452225, // timf
  181. };
  182. static struct dib7000p_config stk7700d_dib7000p_mt2266_config[] = {
  183. { .output_mpeg2_in_188_bytes = 1,
  184. .hostbus_diversity = 1,
  185. .tuner_is_baseband = 1,
  186. .agc_config_count = 2,
  187. .agc = stk7700d_7000p_mt2266_agc_config,
  188. .bw = &stk7700d_mt2266_pll_config,
  189. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  190. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  191. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  192. },
  193. { .output_mpeg2_in_188_bytes = 1,
  194. .hostbus_diversity = 1,
  195. .tuner_is_baseband = 1,
  196. .agc_config_count = 2,
  197. .agc = stk7700d_7000p_mt2266_agc_config,
  198. .bw = &stk7700d_mt2266_pll_config,
  199. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  200. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  201. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  202. }
  203. };
  204. static struct mt2266_config stk7700d_mt2266_config[2] = {
  205. { .i2c_address = 0x60
  206. },
  207. { .i2c_address = 0x60
  208. }
  209. };
  210. static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
  211. {
  212. if (adap->id == 0) {
  213. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  214. msleep(10);
  215. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  216. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  217. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  218. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  219. msleep(10);
  220. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  221. msleep(10);
  222. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
  223. stk7700d_dib7000p_mt2266_config)
  224. != 0) {
  225. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
  226. return -ENODEV;
  227. }
  228. }
  229. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
  230. &stk7700d_dib7000p_mt2266_config[adap->id]);
  231. return adap->fe == NULL ? -ENODEV : 0;
  232. }
  233. static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
  234. {
  235. if (adap->id == 0) {
  236. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  237. msleep(10);
  238. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  239. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  240. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  241. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  242. msleep(10);
  243. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  244. msleep(10);
  245. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  246. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
  247. stk7700d_dib7000p_mt2266_config)
  248. != 0) {
  249. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", __func__);
  250. return -ENODEV;
  251. }
  252. }
  253. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap,0x80+(adap->id << 1),
  254. &stk7700d_dib7000p_mt2266_config[adap->id]);
  255. return adap->fe == NULL ? -ENODEV : 0;
  256. }
  257. static int stk7700d_tuner_attach(struct dvb_usb_adapter *adap)
  258. {
  259. struct i2c_adapter *tun_i2c;
  260. tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
  261. return dvb_attach(mt2266_attach, adap->fe, tun_i2c,
  262. &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;;
  263. }
  264. /* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */
  265. static struct dibx000_agc_config xc3028_agc_config = {
  266. BAND_VHF | BAND_UHF, /* band_caps */
  267. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
  268. * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
  269. * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  270. (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
  271. (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */
  272. 712, /* inv_gain */
  273. 21, /* time_stabiliz */
  274. 0, /* alpha_level */
  275. 118, /* thlock */
  276. 0, /* wbd_inv */
  277. 2867, /* wbd_ref */
  278. 0, /* wbd_sel */
  279. 2, /* wbd_alpha */
  280. 0, /* agc1_max */
  281. 0, /* agc1_min */
  282. 39718, /* agc2_max */
  283. 9930, /* agc2_min */
  284. 0, /* agc1_pt1 */
  285. 0, /* agc1_pt2 */
  286. 0, /* agc1_pt3 */
  287. 0, /* agc1_slope1 */
  288. 0, /* agc1_slope2 */
  289. 0, /* agc2_pt1 */
  290. 128, /* agc2_pt2 */
  291. 29, /* agc2_slope1 */
  292. 29, /* agc2_slope2 */
  293. 17, /* alpha_mant */
  294. 27, /* alpha_exp */
  295. 23, /* beta_mant */
  296. 51, /* beta_exp */
  297. 1, /* perform_agc_softsplit */
  298. };
  299. /* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */
  300. static struct dibx000_bandwidth_config xc3028_bw_config = {
  301. 60000, 30000, /* internal, sampling */
  302. 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */
  303. 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc,
  304. modulo */
  305. (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
  306. (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
  307. 20452225, /* timf */
  308. 30000000, /* xtal_hz */
  309. };
  310. static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
  311. .output_mpeg2_in_188_bytes = 1,
  312. .tuner_is_baseband = 1,
  313. .agc_config_count = 1,
  314. .agc = &xc3028_agc_config,
  315. .bw = &xc3028_bw_config,
  316. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  317. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  318. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  319. };
  320. static int stk7700ph_xc3028_callback(void *ptr, int component,
  321. int command, int arg)
  322. {
  323. struct dvb_usb_adapter *adap = ptr;
  324. switch (command) {
  325. case XC2028_TUNER_RESET:
  326. /* Send the tuner in then out of reset */
  327. dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10);
  328. dib7000p_set_gpio(adap->fe, 8, 0, 1);
  329. break;
  330. case XC2028_RESET_CLK:
  331. break;
  332. default:
  333. err("%s: unknown command %d, arg %d\n", __func__,
  334. command, arg);
  335. return -EINVAL;
  336. }
  337. return 0;
  338. }
  339. static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
  340. .fname = XC2028_DEFAULT_FIRMWARE,
  341. .max_len = 64,
  342. .demod = XC3028_FE_DIBCOM52,
  343. };
  344. static struct xc2028_config stk7700ph_xc3028_config = {
  345. .i2c_addr = 0x61,
  346. .ctrl = &stk7700ph_xc3028_ctrl,
  347. };
  348. static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
  349. {
  350. struct usb_device_descriptor *desc = &adap->dev->udev->descriptor;
  351. if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
  352. desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX))
  353. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
  354. else
  355. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  356. msleep(20);
  357. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  358. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  359. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  360. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  361. msleep(10);
  362. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  363. msleep(20);
  364. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  365. msleep(10);
  366. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
  367. &stk7700ph_dib7700_xc3028_config) != 0) {
  368. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
  369. __func__);
  370. return -ENODEV;
  371. }
  372. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
  373. &stk7700ph_dib7700_xc3028_config);
  374. return adap->fe == NULL ? -ENODEV : 0;
  375. }
  376. static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
  377. {
  378. struct i2c_adapter *tun_i2c;
  379. tun_i2c = dib7000p_get_i2c_master(adap->fe,
  380. DIBX000_I2C_INTERFACE_TUNER, 1);
  381. stk7700ph_xc3028_config.i2c_adap = tun_i2c;
  382. /* FIXME: generalize & move to common area */
  383. adap->fe->callback = stk7700ph_xc3028_callback;
  384. return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
  385. == NULL ? -ENODEV : 0;
  386. }
  387. #define DEFAULT_RC_INTERVAL 50
  388. static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
  389. /* Number of keypresses to ignore before start repeating */
  390. #define RC_REPEAT_DELAY 6
  391. #define RC_REPEAT_DELAY_V1_20 10
  392. /* Used by firmware versions < 1.20 (deprecated) */
  393. static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
  394. int *state)
  395. {
  396. u8 key[4];
  397. int i;
  398. struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
  399. struct dib0700_state *st = d->priv;
  400. *event = 0;
  401. *state = REMOTE_NO_KEY_PRESSED;
  402. i=dib0700_ctrl_rd(d,rc_request,2,key,4);
  403. if (i<=0) {
  404. err("RC Query Failed");
  405. return -1;
  406. }
  407. /* losing half of KEY_0 events from Philipps rc5 remotes.. */
  408. if (key[0]==0 && key[1]==0 && key[2]==0 && key[3]==0) return 0;
  409. /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)key[3-2],(int)key[3-3],(int)key[3-1],(int)key[3]); */
  410. dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */
  411. switch (dvb_usb_dib0700_ir_proto) {
  412. case 0: {
  413. /* NEC protocol sends repeat code as 0 0 0 FF */
  414. if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
  415. (key[3] == 0xFF)) {
  416. st->rc_counter++;
  417. if (st->rc_counter > RC_REPEAT_DELAY) {
  418. *event = d->last_event;
  419. *state = REMOTE_KEY_PRESSED;
  420. st->rc_counter = RC_REPEAT_DELAY;
  421. }
  422. return 0;
  423. }
  424. for (i=0;i<d->props.rc_key_map_size; i++) {
  425. if (keymap[i].custom == key[3-2] && keymap[i].data == key[3-3]) {
  426. st->rc_counter = 0;
  427. *event = keymap[i].event;
  428. *state = REMOTE_KEY_PRESSED;
  429. d->last_event = keymap[i].event;
  430. return 0;
  431. }
  432. }
  433. break;
  434. }
  435. default: {
  436. /* RC-5 protocol changes toggle bit on new keypress */
  437. for (i = 0; i < d->props.rc_key_map_size; i++) {
  438. if (keymap[i].custom == key[3-2] && keymap[i].data == key[3-3]) {
  439. if (d->last_event == keymap[i].event &&
  440. key[3-1] == st->rc_toggle) {
  441. st->rc_counter++;
  442. /* prevents unwanted double hits */
  443. if (st->rc_counter > RC_REPEAT_DELAY) {
  444. *event = d->last_event;
  445. *state = REMOTE_KEY_PRESSED;
  446. st->rc_counter = RC_REPEAT_DELAY;
  447. }
  448. return 0;
  449. }
  450. st->rc_counter = 0;
  451. *event = keymap[i].event;
  452. *state = REMOTE_KEY_PRESSED;
  453. st->rc_toggle = key[3-1];
  454. d->last_event = keymap[i].event;
  455. return 0;
  456. }
  457. }
  458. break;
  459. }
  460. }
  461. err("Unknown remote controller key: %2X %2X %2X %2X", (int) key[3-2], (int) key[3-3], (int) key[3-1], (int) key[3]);
  462. d->last_event = 0;
  463. return 0;
  464. }
  465. /* This is the structure of the RC response packet starting in firmware 1.20 */
  466. struct dib0700_rc_response {
  467. u8 report_id;
  468. u8 data_state;
  469. u8 system_msb;
  470. u8 system_lsb;
  471. u8 data;
  472. u8 not_data;
  473. };
  474. /* This supports the new IR response format for firmware v1.20 */
  475. static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event,
  476. int *state)
  477. {
  478. struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
  479. struct dib0700_state *st = d->priv;
  480. struct dib0700_rc_response poll_reply;
  481. u8 buf[6];
  482. int i;
  483. int status;
  484. int actlen;
  485. int found = 0;
  486. /* Set initial results in case we exit the function early */
  487. *event = 0;
  488. *state = REMOTE_NO_KEY_PRESSED;
  489. /* Firmware v1.20 provides RC data via bulk endpoint 1 */
  490. status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf,
  491. sizeof(buf), &actlen, 50);
  492. if (status < 0) {
  493. /* No data available (meaning no key press) */
  494. return 0;
  495. }
  496. if (actlen != sizeof(buf)) {
  497. /* We didn't get back the 6 byte message we expected */
  498. err("Unexpected RC response size [%d]", actlen);
  499. return -1;
  500. }
  501. poll_reply.report_id = buf[0];
  502. poll_reply.data_state = buf[1];
  503. poll_reply.system_msb = buf[2];
  504. poll_reply.system_lsb = buf[3];
  505. poll_reply.data = buf[4];
  506. poll_reply.not_data = buf[5];
  507. /*
  508. info("rid=%02x ds=%02x sm=%02x sl=%02x d=%02x nd=%02x\n",
  509. poll_reply.report_id, poll_reply.data_state,
  510. poll_reply.system_msb, poll_reply.system_lsb,
  511. poll_reply.data, poll_reply.not_data);
  512. */
  513. if ((poll_reply.data + poll_reply.not_data) != 0xff) {
  514. /* Key failed integrity check */
  515. err("key failed integrity check: %02x %02x %02x %02x",
  516. poll_reply.system_msb, poll_reply.system_lsb,
  517. poll_reply.data, poll_reply.not_data);
  518. return -1;
  519. }
  520. /* Find the key in the map */
  521. for (i = 0; i < d->props.rc_key_map_size; i++) {
  522. if (keymap[i].custom == poll_reply.system_lsb &&
  523. keymap[i].data == poll_reply.data) {
  524. *event = keymap[i].event;
  525. found = 1;
  526. break;
  527. }
  528. }
  529. if (found == 0) {
  530. err("Unknown remote controller key: %02x %02x %02x %02x",
  531. poll_reply.system_msb, poll_reply.system_lsb,
  532. poll_reply.data, poll_reply.not_data);
  533. d->last_event = 0;
  534. return 0;
  535. }
  536. if (poll_reply.data_state == 1) {
  537. /* New key hit */
  538. st->rc_counter = 0;
  539. *event = keymap[i].event;
  540. *state = REMOTE_KEY_PRESSED;
  541. d->last_event = keymap[i].event;
  542. } else if (poll_reply.data_state == 2) {
  543. /* Key repeated */
  544. st->rc_counter++;
  545. /* prevents unwanted double hits */
  546. if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
  547. *event = d->last_event;
  548. *state = REMOTE_KEY_PRESSED;
  549. st->rc_counter = RC_REPEAT_DELAY_V1_20;
  550. }
  551. } else {
  552. err("Unknown data state [%d]", poll_reply.data_state);
  553. }
  554. return 0;
  555. }
  556. static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
  557. {
  558. struct dib0700_state *st = d->priv;
  559. /* Because some people may have improperly named firmware files,
  560. let's figure out whether to use the new firmware call or the legacy
  561. call based on the firmware version embedded in the file */
  562. if (st->rc_func_version == 0) {
  563. u32 hwver, romver, ramver, fwtype;
  564. int ret = dib0700_get_version(d, &hwver, &romver, &ramver,
  565. &fwtype);
  566. if (ret < 0) {
  567. err("Could not determine version info");
  568. return -1;
  569. }
  570. if (ramver < 0x10200)
  571. st->rc_func_version = 1;
  572. else
  573. st->rc_func_version = 2;
  574. }
  575. if (st->rc_func_version == 2)
  576. return dib0700_rc_query_v1_20(d, event, state);
  577. else
  578. return dib0700_rc_query_legacy(d, event, state);
  579. }
  580. static struct dvb_usb_rc_key dib0700_rc_keys[] = {
  581. /* Key codes for the tiny Pinnacle remote*/
  582. { 0x07, 0x00, KEY_MUTE },
  583. { 0x07, 0x01, KEY_MENU }, // Pinnacle logo
  584. { 0x07, 0x39, KEY_POWER },
  585. { 0x07, 0x03, KEY_VOLUMEUP },
  586. { 0x07, 0x09, KEY_VOLUMEDOWN },
  587. { 0x07, 0x06, KEY_CHANNELUP },
  588. { 0x07, 0x0c, KEY_CHANNELDOWN },
  589. { 0x07, 0x0f, KEY_1 },
  590. { 0x07, 0x15, KEY_2 },
  591. { 0x07, 0x10, KEY_3 },
  592. { 0x07, 0x18, KEY_4 },
  593. { 0x07, 0x1b, KEY_5 },
  594. { 0x07, 0x1e, KEY_6 },
  595. { 0x07, 0x11, KEY_7 },
  596. { 0x07, 0x21, KEY_8 },
  597. { 0x07, 0x12, KEY_9 },
  598. { 0x07, 0x27, KEY_0 },
  599. { 0x07, 0x24, KEY_SCREEN }, // 'Square' key
  600. { 0x07, 0x2a, KEY_TEXT }, // 'T' key
  601. { 0x07, 0x2d, KEY_REWIND },
  602. { 0x07, 0x30, KEY_PLAY },
  603. { 0x07, 0x33, KEY_FASTFORWARD },
  604. { 0x07, 0x36, KEY_RECORD },
  605. { 0x07, 0x3c, KEY_STOP },
  606. { 0x07, 0x3f, KEY_CANCEL }, // '?' key
  607. /* Key codes for the Terratec Cinergy DT XS Diversity, similar to cinergyT2.c */
  608. { 0xeb, 0x01, KEY_POWER },
  609. { 0xeb, 0x02, KEY_1 },
  610. { 0xeb, 0x03, KEY_2 },
  611. { 0xeb, 0x04, KEY_3 },
  612. { 0xeb, 0x05, KEY_4 },
  613. { 0xeb, 0x06, KEY_5 },
  614. { 0xeb, 0x07, KEY_6 },
  615. { 0xeb, 0x08, KEY_7 },
  616. { 0xeb, 0x09, KEY_8 },
  617. { 0xeb, 0x0a, KEY_9 },
  618. { 0xeb, 0x0b, KEY_VIDEO },
  619. { 0xeb, 0x0c, KEY_0 },
  620. { 0xeb, 0x0d, KEY_REFRESH },
  621. { 0xeb, 0x0f, KEY_EPG },
  622. { 0xeb, 0x10, KEY_UP },
  623. { 0xeb, 0x11, KEY_LEFT },
  624. { 0xeb, 0x12, KEY_OK },
  625. { 0xeb, 0x13, KEY_RIGHT },
  626. { 0xeb, 0x14, KEY_DOWN },
  627. { 0xeb, 0x16, KEY_INFO },
  628. { 0xeb, 0x17, KEY_RED },
  629. { 0xeb, 0x18, KEY_GREEN },
  630. { 0xeb, 0x19, KEY_YELLOW },
  631. { 0xeb, 0x1a, KEY_BLUE },
  632. { 0xeb, 0x1b, KEY_CHANNELUP },
  633. { 0xeb, 0x1c, KEY_VOLUMEUP },
  634. { 0xeb, 0x1d, KEY_MUTE },
  635. { 0xeb, 0x1e, KEY_VOLUMEDOWN },
  636. { 0xeb, 0x1f, KEY_CHANNELDOWN },
  637. { 0xeb, 0x40, KEY_PAUSE },
  638. { 0xeb, 0x41, KEY_HOME },
  639. { 0xeb, 0x42, KEY_MENU }, /* DVD Menu */
  640. { 0xeb, 0x43, KEY_SUBTITLE },
  641. { 0xeb, 0x44, KEY_TEXT }, /* Teletext */
  642. { 0xeb, 0x45, KEY_DELETE },
  643. { 0xeb, 0x46, KEY_TV },
  644. { 0xeb, 0x47, KEY_DVD },
  645. { 0xeb, 0x48, KEY_STOP },
  646. { 0xeb, 0x49, KEY_VIDEO },
  647. { 0xeb, 0x4a, KEY_AUDIO }, /* Music */
  648. { 0xeb, 0x4b, KEY_SCREEN }, /* Pic */
  649. { 0xeb, 0x4c, KEY_PLAY },
  650. { 0xeb, 0x4d, KEY_BACK },
  651. { 0xeb, 0x4e, KEY_REWIND },
  652. { 0xeb, 0x4f, KEY_FASTFORWARD },
  653. { 0xeb, 0x54, KEY_PREVIOUS },
  654. { 0xeb, 0x58, KEY_RECORD },
  655. { 0xeb, 0x5c, KEY_NEXT },
  656. /* Key codes for the Haupauge WinTV Nova-TD, copied from nova-t-usb2.c (Nova-T USB2) */
  657. { 0x1e, 0x00, KEY_0 },
  658. { 0x1e, 0x01, KEY_1 },
  659. { 0x1e, 0x02, KEY_2 },
  660. { 0x1e, 0x03, KEY_3 },
  661. { 0x1e, 0x04, KEY_4 },
  662. { 0x1e, 0x05, KEY_5 },
  663. { 0x1e, 0x06, KEY_6 },
  664. { 0x1e, 0x07, KEY_7 },
  665. { 0x1e, 0x08, KEY_8 },
  666. { 0x1e, 0x09, KEY_9 },
  667. { 0x1e, 0x0a, KEY_KPASTERISK },
  668. { 0x1e, 0x0b, KEY_RED },
  669. { 0x1e, 0x0c, KEY_RADIO },
  670. { 0x1e, 0x0d, KEY_MENU },
  671. { 0x1e, 0x0e, KEY_GRAVE }, /* # */
  672. { 0x1e, 0x0f, KEY_MUTE },
  673. { 0x1e, 0x10, KEY_VOLUMEUP },
  674. { 0x1e, 0x11, KEY_VOLUMEDOWN },
  675. { 0x1e, 0x12, KEY_CHANNEL },
  676. { 0x1e, 0x14, KEY_UP },
  677. { 0x1e, 0x15, KEY_DOWN },
  678. { 0x1e, 0x16, KEY_LEFT },
  679. { 0x1e, 0x17, KEY_RIGHT },
  680. { 0x1e, 0x18, KEY_VIDEO },
  681. { 0x1e, 0x19, KEY_AUDIO },
  682. { 0x1e, 0x1a, KEY_MEDIA },
  683. { 0x1e, 0x1b, KEY_EPG },
  684. { 0x1e, 0x1c, KEY_TV },
  685. { 0x1e, 0x1e, KEY_NEXT },
  686. { 0x1e, 0x1f, KEY_BACK },
  687. { 0x1e, 0x20, KEY_CHANNELUP },
  688. { 0x1e, 0x21, KEY_CHANNELDOWN },
  689. { 0x1e, 0x24, KEY_LAST }, /* Skip backwards */
  690. { 0x1e, 0x25, KEY_OK },
  691. { 0x1e, 0x29, KEY_BLUE},
  692. { 0x1e, 0x2e, KEY_GREEN },
  693. { 0x1e, 0x30, KEY_PAUSE },
  694. { 0x1e, 0x32, KEY_REWIND },
  695. { 0x1e, 0x34, KEY_FASTFORWARD },
  696. { 0x1e, 0x35, KEY_PLAY },
  697. { 0x1e, 0x36, KEY_STOP },
  698. { 0x1e, 0x37, KEY_RECORD },
  699. { 0x1e, 0x38, KEY_YELLOW },
  700. { 0x1e, 0x3b, KEY_GOTO },
  701. { 0x1e, 0x3d, KEY_POWER },
  702. /* Key codes for the Leadtek Winfast DTV Dongle */
  703. { 0x00, 0x42, KEY_POWER },
  704. { 0x07, 0x7c, KEY_TUNER },
  705. { 0x0f, 0x4e, KEY_PRINT }, /* PREVIEW */
  706. { 0x08, 0x40, KEY_SCREEN }, /* full screen toggle*/
  707. { 0x0f, 0x71, KEY_DOT }, /* frequency */
  708. { 0x07, 0x43, KEY_0 },
  709. { 0x0c, 0x41, KEY_1 },
  710. { 0x04, 0x43, KEY_2 },
  711. { 0x0b, 0x7f, KEY_3 },
  712. { 0x0e, 0x41, KEY_4 },
  713. { 0x06, 0x43, KEY_5 },
  714. { 0x09, 0x7f, KEY_6 },
  715. { 0x0d, 0x7e, KEY_7 },
  716. { 0x05, 0x7c, KEY_8 },
  717. { 0x0a, 0x40, KEY_9 },
  718. { 0x0e, 0x4e, KEY_CLEAR },
  719. { 0x04, 0x7c, KEY_CHANNEL }, /* show channel number */
  720. { 0x0f, 0x41, KEY_LAST }, /* recall */
  721. { 0x03, 0x42, KEY_MUTE },
  722. { 0x06, 0x4c, KEY_RESERVED }, /* PIP button*/
  723. { 0x01, 0x72, KEY_SHUFFLE }, /* SNAPSHOT */
  724. { 0x0c, 0x4e, KEY_PLAYPAUSE }, /* TIMESHIFT */
  725. { 0x0b, 0x70, KEY_RECORD },
  726. { 0x03, 0x7d, KEY_VOLUMEUP },
  727. { 0x01, 0x7d, KEY_VOLUMEDOWN },
  728. { 0x02, 0x42, KEY_CHANNELUP },
  729. { 0x00, 0x7d, KEY_CHANNELDOWN },
  730. /* Key codes for Nova-TD "credit card" remote control. */
  731. { 0x1d, 0x00, KEY_0 },
  732. { 0x1d, 0x01, KEY_1 },
  733. { 0x1d, 0x02, KEY_2 },
  734. { 0x1d, 0x03, KEY_3 },
  735. { 0x1d, 0x04, KEY_4 },
  736. { 0x1d, 0x05, KEY_5 },
  737. { 0x1d, 0x06, KEY_6 },
  738. { 0x1d, 0x07, KEY_7 },
  739. { 0x1d, 0x08, KEY_8 },
  740. { 0x1d, 0x09, KEY_9 },
  741. { 0x1d, 0x0a, KEY_TEXT },
  742. { 0x1d, 0x0d, KEY_MENU },
  743. { 0x1d, 0x0f, KEY_MUTE },
  744. { 0x1d, 0x10, KEY_VOLUMEUP },
  745. { 0x1d, 0x11, KEY_VOLUMEDOWN },
  746. { 0x1d, 0x12, KEY_CHANNEL },
  747. { 0x1d, 0x14, KEY_UP },
  748. { 0x1d, 0x15, KEY_DOWN },
  749. { 0x1d, 0x16, KEY_LEFT },
  750. { 0x1d, 0x17, KEY_RIGHT },
  751. { 0x1d, 0x1c, KEY_TV },
  752. { 0x1d, 0x1e, KEY_NEXT },
  753. { 0x1d, 0x1f, KEY_BACK },
  754. { 0x1d, 0x20, KEY_CHANNELUP },
  755. { 0x1d, 0x21, KEY_CHANNELDOWN },
  756. { 0x1d, 0x24, KEY_LAST },
  757. { 0x1d, 0x25, KEY_OK },
  758. { 0x1d, 0x30, KEY_PAUSE },
  759. { 0x1d, 0x32, KEY_REWIND },
  760. { 0x1d, 0x34, KEY_FASTFORWARD },
  761. { 0x1d, 0x35, KEY_PLAY },
  762. { 0x1d, 0x36, KEY_STOP },
  763. { 0x1d, 0x37, KEY_RECORD },
  764. { 0x1d, 0x3b, KEY_GOTO },
  765. { 0x1d, 0x3d, KEY_POWER },
  766. };
  767. /* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
  768. static struct dibx000_agc_config stk7700p_7000m_mt2060_agc_config = {
  769. BAND_UHF | BAND_VHF, // band_caps
  770. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
  771. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  772. (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
  773. 712, // inv_gain
  774. 41, // time_stabiliz
  775. 0, // alpha_level
  776. 118, // thlock
  777. 0, // wbd_inv
  778. 4095, // wbd_ref
  779. 0, // wbd_sel
  780. 0, // wbd_alpha
  781. 42598, // agc1_max
  782. 17694, // agc1_min
  783. 45875, // agc2_max
  784. 2621, // agc2_min
  785. 0, // agc1_pt1
  786. 76, // agc1_pt2
  787. 139, // agc1_pt3
  788. 52, // agc1_slope1
  789. 59, // agc1_slope2
  790. 107, // agc2_pt1
  791. 172, // agc2_pt2
  792. 57, // agc2_slope1
  793. 70, // agc2_slope2
  794. 21, // alpha_mant
  795. 25, // alpha_exp
  796. 28, // beta_mant
  797. 48, // beta_exp
  798. 1, // perform_agc_softsplit
  799. { 0, // split_min
  800. 107, // split_max
  801. 51800, // global_split_min
  802. 24700 // global_split_max
  803. },
  804. };
  805. static struct dibx000_agc_config stk7700p_7000p_mt2060_agc_config = {
  806. BAND_UHF | BAND_VHF,
  807. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
  808. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
  809. (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
  810. 712, // inv_gain
  811. 41, // time_stabiliz
  812. 0, // alpha_level
  813. 118, // thlock
  814. 0, // wbd_inv
  815. 4095, // wbd_ref
  816. 0, // wbd_sel
  817. 0, // wbd_alpha
  818. 42598, // agc1_max
  819. 16384, // agc1_min
  820. 42598, // agc2_max
  821. 0, // agc2_min
  822. 0, // agc1_pt1
  823. 137, // agc1_pt2
  824. 255, // agc1_pt3
  825. 0, // agc1_slope1
  826. 255, // agc1_slope2
  827. 0, // agc2_pt1
  828. 0, // agc2_pt2
  829. 0, // agc2_slope1
  830. 41, // agc2_slope2
  831. 15, // alpha_mant
  832. 25, // alpha_exp
  833. 28, // beta_mant
  834. 48, // beta_exp
  835. 0, // perform_agc_softsplit
  836. };
  837. static struct dibx000_bandwidth_config stk7700p_pll_config = {
  838. 60000, 30000, // internal, sampling
  839. 1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
  840. 0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
  841. (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
  842. 60258167, // ifreq
  843. 20452225, // timf
  844. 30000000, // xtal
  845. };
  846. static struct dib7000m_config stk7700p_dib7000m_config = {
  847. .dvbt_mode = 1,
  848. .output_mpeg2_in_188_bytes = 1,
  849. .quartz_direct = 1,
  850. .agc_config_count = 1,
  851. .agc = &stk7700p_7000m_mt2060_agc_config,
  852. .bw = &stk7700p_pll_config,
  853. .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
  854. .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
  855. .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
  856. };
  857. static struct dib7000p_config stk7700p_dib7000p_config = {
  858. .output_mpeg2_in_188_bytes = 1,
  859. .agc_config_count = 1,
  860. .agc = &stk7700p_7000p_mt2060_agc_config,
  861. .bw = &stk7700p_pll_config,
  862. .gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
  863. .gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
  864. .gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
  865. };
  866. static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
  867. {
  868. struct dib0700_state *st = adap->dev->priv;
  869. /* unless there is no real power management in DVB - we leave the device on GPIO6 */
  870. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  871. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(50);
  872. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
  873. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  874. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
  875. dib0700_ctrl_clock(adap->dev, 72, 1);
  876. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(100);
  877. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  878. st->mt2060_if1[0] = 1220;
  879. if (dib7000pc_detection(&adap->dev->i2c_adap)) {
  880. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000p_config);
  881. st->is_dib7000pc = 1;
  882. } else
  883. adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config);
  884. return adap->fe == NULL ? -ENODEV : 0;
  885. }
  886. static struct mt2060_config stk7700p_mt2060_config = {
  887. 0x60
  888. };
  889. static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
  890. {
  891. struct i2c_adapter *prim_i2c = &adap->dev->i2c_adap;
  892. struct dib0700_state *st = adap->dev->priv;
  893. struct i2c_adapter *tun_i2c;
  894. s8 a;
  895. int if1=1220;
  896. if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) &&
  897. adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) {
  898. if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a;
  899. }
  900. if (st->is_dib7000pc)
  901. tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
  902. else
  903. tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
  904. return dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk7700p_mt2060_config,
  905. if1) == NULL ? -ENODEV : 0;
  906. }
  907. /* DIB7070 generic */
  908. static struct dibx000_agc_config dib7070_agc_config = {
  909. BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
  910. /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
  911. * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0 */
  912. (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0), // setup
  913. 600, // inv_gain
  914. 10, // time_stabiliz
  915. 0, // alpha_level
  916. 118, // thlock
  917. 0, // wbd_inv
  918. 3530, // wbd_ref
  919. 1, // wbd_sel
  920. 5, // wbd_alpha
  921. 65535, // agc1_max
  922. 0, // agc1_min
  923. 65535, // agc2_max
  924. 0, // agc2_min
  925. 0, // agc1_pt1
  926. 40, // agc1_pt2
  927. 183, // agc1_pt3
  928. 206, // agc1_slope1
  929. 255, // agc1_slope2
  930. 72, // agc2_pt1
  931. 152, // agc2_pt2
  932. 88, // agc2_slope1
  933. 90, // agc2_slope2
  934. 17, // alpha_mant
  935. 27, // alpha_exp
  936. 23, // beta_mant
  937. 51, // beta_exp
  938. 0, // perform_agc_softsplit
  939. };
  940. static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
  941. {
  942. return dib7000p_set_gpio(fe, 8, 0, !onoff);
  943. }
  944. static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
  945. {
  946. return dib7000p_set_gpio(fe, 9, 0, onoff);
  947. }
  948. static struct dib0070_config dib7070p_dib0070_config[2] = {
  949. {
  950. .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
  951. .reset = dib7070_tuner_reset,
  952. .sleep = dib7070_tuner_sleep,
  953. .clock_khz = 12000,
  954. .clock_pad_drive = 4
  955. }, {
  956. .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
  957. .reset = dib7070_tuner_reset,
  958. .sleep = dib7070_tuner_sleep,
  959. .clock_khz = 12000,
  960. }
  961. };
  962. static int dib7070_set_param_override(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
  963. {
  964. struct dvb_usb_adapter *adap = fe->dvb->priv;
  965. struct dib0700_adapter_state *state = adap->priv;
  966. u16 offset;
  967. u8 band = BAND_OF_FREQUENCY(fep->frequency/1000);
  968. switch (band) {
  969. case BAND_VHF: offset = 950; break;
  970. case BAND_UHF:
  971. default: offset = 550; break;
  972. }
  973. deb_info("WBD for DiB7000P: %d\n", offset + dib0070_wbd_offset(fe));
  974. dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
  975. return state->set_param_save(fe, fep);
  976. }
  977. static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
  978. {
  979. struct dib0700_adapter_state *st = adap->priv;
  980. struct i2c_adapter *tun_i2c = dib7000p_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
  981. if (adap->id == 0) {
  982. if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[0]) == NULL)
  983. return -ENODEV;
  984. } else {
  985. if (dvb_attach(dib0070_attach, adap->fe, tun_i2c, &dib7070p_dib0070_config[1]) == NULL)
  986. return -ENODEV;
  987. }
  988. st->set_param_save = adap->fe->ops.tuner_ops.set_params;
  989. adap->fe->ops.tuner_ops.set_params = dib7070_set_param_override;
  990. return 0;
  991. }
  992. static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
  993. 60000, 15000, // internal, sampling
  994. 1, 20, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
  995. 0, 0, 1, 1, 2, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
  996. (3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
  997. (0 << 25) | 0, // ifreq = 0.000000 MHz
  998. 20452225, // timf
  999. 12000000, // xtal_hz
  1000. };
  1001. static struct dib7000p_config dib7070p_dib7000p_config = {
  1002. .output_mpeg2_in_188_bytes = 1,
  1003. .agc_config_count = 1,
  1004. .agc = &dib7070_agc_config,
  1005. .bw = &dib7070_bw_config_12_mhz,
  1006. .tuner_is_baseband = 1,
  1007. .spur_protect = 1,
  1008. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  1009. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  1010. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  1011. .hostbus_diversity = 1,
  1012. };
  1013. /* STK7070P */
  1014. static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
  1015. {
  1016. struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
  1017. if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
  1018. p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
  1019. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
  1020. else
  1021. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1022. msleep(10);
  1023. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  1024. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  1025. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  1026. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1027. dib0700_ctrl_clock(adap->dev, 72, 1);
  1028. msleep(10);
  1029. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1030. msleep(10);
  1031. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  1032. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
  1033. &dib7070p_dib7000p_config) != 0) {
  1034. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
  1035. __func__);
  1036. return -ENODEV;
  1037. }
  1038. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
  1039. &dib7070p_dib7000p_config);
  1040. return adap->fe == NULL ? -ENODEV : 0;
  1041. }
  1042. /* STK7070PD */
  1043. static struct dib7000p_config stk7070pd_dib7000p_config[2] = {
  1044. {
  1045. .output_mpeg2_in_188_bytes = 1,
  1046. .agc_config_count = 1,
  1047. .agc = &dib7070_agc_config,
  1048. .bw = &dib7070_bw_config_12_mhz,
  1049. .tuner_is_baseband = 1,
  1050. .spur_protect = 1,
  1051. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  1052. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  1053. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  1054. .hostbus_diversity = 1,
  1055. }, {
  1056. .output_mpeg2_in_188_bytes = 1,
  1057. .agc_config_count = 1,
  1058. .agc = &dib7070_agc_config,
  1059. .bw = &dib7070_bw_config_12_mhz,
  1060. .tuner_is_baseband = 1,
  1061. .spur_protect = 1,
  1062. .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
  1063. .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
  1064. .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
  1065. .hostbus_diversity = 1,
  1066. }
  1067. };
  1068. static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
  1069. {
  1070. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1071. msleep(10);
  1072. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  1073. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  1074. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  1075. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1076. dib0700_ctrl_clock(adap->dev, 72, 1);
  1077. msleep(10);
  1078. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1079. msleep(10);
  1080. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  1081. if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 2, 18,
  1082. stk7070pd_dib7000p_config) != 0) {
  1083. err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
  1084. __func__);
  1085. return -ENODEV;
  1086. }
  1087. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &stk7070pd_dib7000p_config[0]);
  1088. return adap->fe == NULL ? -ENODEV : 0;
  1089. }
  1090. static int stk7070pd_frontend_attach1(struct dvb_usb_adapter *adap)
  1091. {
  1092. adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x82, &stk7070pd_dib7000p_config[1]);
  1093. return adap->fe == NULL ? -ENODEV : 0;
  1094. }
  1095. /* S5H1411 */
  1096. static struct s5h1411_config pinnacle_801e_config = {
  1097. .output_mode = S5H1411_PARALLEL_OUTPUT,
  1098. .gpio = S5H1411_GPIO_OFF,
  1099. .mpeg_timing = S5H1411_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
  1100. .qam_if = S5H1411_IF_44000,
  1101. .vsb_if = S5H1411_IF_44000,
  1102. .inversion = S5H1411_INVERSION_OFF,
  1103. .status_mode = S5H1411_DEMODLOCKING
  1104. };
  1105. /* Pinnacle PCTV HD Pro 801e GPIOs map:
  1106. GPIO0 - currently unknown
  1107. GPIO1 - xc5000 tuner reset
  1108. GPIO2 - CX25843 sleep
  1109. GPIO3 - currently unknown
  1110. GPIO4 - currently unknown
  1111. GPIO6 - currently unknown
  1112. GPIO7 - currently unknown
  1113. GPIO9 - currently unknown
  1114. GPIO10 - CX25843 reset
  1115. */
  1116. static int s5h1411_frontend_attach(struct dvb_usb_adapter *adap)
  1117. {
  1118. struct dib0700_state *st = adap->dev->priv;
  1119. /* Make use of the new i2c functions from FW 1.20 */
  1120. st->fw_use_new_i2c_api = 1;
  1121. /* The s5h1411 requires the dib0700 to not be in master mode */
  1122. st->disable_streaming_master_mode = 1;
  1123. /* All msleep values taken from Windows USB trace */
  1124. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 0);
  1125. dib0700_set_gpio(adap->dev, GPIO3, GPIO_OUT, 0);
  1126. dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
  1127. msleep(400);
  1128. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
  1129. msleep(60);
  1130. dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
  1131. msleep(30);
  1132. dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
  1133. dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
  1134. dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
  1135. dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
  1136. dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 0);
  1137. msleep(30);
  1138. /* Put the CX25843 to sleep for now since we're in digital mode */
  1139. dib0700_set_gpio(adap->dev, GPIO2, GPIO_OUT, 1);
  1140. /* GPIOs are initialized, do the attach */
  1141. adap->fe = dvb_attach(s5h1411_attach, &pinnacle_801e_config,
  1142. &adap->dev->i2c_adap);
  1143. return adap->fe == NULL ? -ENODEV : 0;
  1144. }
  1145. static int dib0700_xc5000_tuner_callback(void *priv, int component,
  1146. int command, int arg)
  1147. {
  1148. struct dvb_usb_adapter *adap = priv;
  1149. if (command == XC5000_TUNER_RESET) {
  1150. /* Reset the tuner */
  1151. dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0);
  1152. msleep(330); /* from Windows USB trace */
  1153. dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1);
  1154. msleep(330); /* from Windows USB trace */
  1155. } else {
  1156. err("xc5000: unknown tuner callback command: %d\n", command);
  1157. return -EINVAL;
  1158. }
  1159. return 0;
  1160. }
  1161. static struct xc5000_config s5h1411_xc5000_tunerconfig = {
  1162. .i2c_address = 0x64,
  1163. .if_khz = 5380,
  1164. };
  1165. static int xc5000_tuner_attach(struct dvb_usb_adapter *adap)
  1166. {
  1167. /* FIXME: generalize & move to common area */
  1168. adap->fe->callback = dib0700_xc5000_tuner_callback;
  1169. return dvb_attach(xc5000_attach, adap->fe, &adap->dev->i2c_adap,
  1170. &s5h1411_xc5000_tunerconfig)
  1171. == NULL ? -ENODEV : 0;
  1172. }
  1173. /* DVB-USB and USB stuff follows */
  1174. struct usb_device_id dib0700_usb_id_table[] = {
  1175. /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) },
  1176. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
  1177. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) },
  1178. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
  1179. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
  1180. /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
  1181. { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) },
  1182. { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) },
  1183. { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) },
  1184. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) },
  1185. /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) },
  1186. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) },
  1187. { USB_DEVICE(USB_VID_TERRATEC,
  1188. USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) },
  1189. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) },
  1190. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) },
  1191. /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) },
  1192. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) },
  1193. { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) },
  1194. { USB_DEVICE(USB_VID_PINNACLE,
  1195. USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) },
  1196. { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) },
  1197. /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) },
  1198. { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) },
  1199. { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) },
  1200. { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) },
  1201. { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) },
  1202. /* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) },
  1203. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) },
  1204. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) },
  1205. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) },
  1206. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) },
  1207. /* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) },
  1208. { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) },
  1209. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
  1210. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
  1211. { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
  1212. /* 35 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
  1213. { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_3) },
  1214. { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U8000) },
  1215. { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_STK7700PH) },
  1216. { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
  1217. /* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
  1218. { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
  1219. { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
  1220. { USB_DEVICE(USB_VID_TERRATEC,
  1221. USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
  1222. { 0 } /* Terminating entry */
  1223. };
  1224. MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
  1225. #define DIB0700_DEFAULT_DEVICE_PROPERTIES \
  1226. .caps = DVB_USB_IS_AN_I2C_ADAPTER, \
  1227. .usb_ctrl = DEVICE_SPECIFIC, \
  1228. .firmware = "dvb-usb-dib0700-1.20.fw", \
  1229. .download_firmware = dib0700_download_firmware, \
  1230. .no_reconnect = 1, \
  1231. .size_of_priv = sizeof(struct dib0700_state), \
  1232. .i2c_algo = &dib0700_i2c_algo, \
  1233. .identify_state = dib0700_identify_state
  1234. #define DIB0700_DEFAULT_STREAMING_CONFIG(ep) \
  1235. .streaming_ctrl = dib0700_streaming_ctrl, \
  1236. .stream = { \
  1237. .type = USB_BULK, \
  1238. .count = 4, \
  1239. .endpoint = ep, \
  1240. .u = { \
  1241. .bulk = { \
  1242. .buffersize = 39480, \
  1243. } \
  1244. } \
  1245. }
  1246. struct dvb_usb_device_properties dib0700_devices[] = {
  1247. {
  1248. DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1249. .num_adapters = 1,
  1250. .adapter = {
  1251. {
  1252. .frontend_attach = stk7700p_frontend_attach,
  1253. .tuner_attach = stk7700p_tuner_attach,
  1254. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1255. },
  1256. },
  1257. .num_device_descs = 8,
  1258. .devices = {
  1259. { "DiBcom STK7700P reference design",
  1260. { &dib0700_usb_id_table[0], &dib0700_usb_id_table[1] },
  1261. { NULL },
  1262. },
  1263. { "Hauppauge Nova-T Stick",
  1264. { &dib0700_usb_id_table[4], &dib0700_usb_id_table[9], NULL },
  1265. { NULL },
  1266. },
  1267. { "AVerMedia AVerTV DVB-T Volar",
  1268. { &dib0700_usb_id_table[5], &dib0700_usb_id_table[10] },
  1269. { NULL },
  1270. },
  1271. { "Compro Videomate U500",
  1272. { &dib0700_usb_id_table[6], &dib0700_usb_id_table[19] },
  1273. { NULL },
  1274. },
  1275. { "Uniwill STK7700P based (Hama and others)",
  1276. { &dib0700_usb_id_table[7], NULL },
  1277. { NULL },
  1278. },
  1279. { "Leadtek Winfast DTV Dongle (STK7700P based)",
  1280. { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
  1281. { NULL },
  1282. },
  1283. { "AVerMedia AVerTV DVB-T Express",
  1284. { &dib0700_usb_id_table[20] },
  1285. { NULL },
  1286. },
  1287. { "Gigabyte U7000",
  1288. { &dib0700_usb_id_table[21], NULL },
  1289. { NULL },
  1290. }
  1291. },
  1292. .rc_interval = DEFAULT_RC_INTERVAL,
  1293. .rc_key_map = dib0700_rc_keys,
  1294. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1295. .rc_query = dib0700_rc_query
  1296. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1297. .num_adapters = 2,
  1298. .adapter = {
  1299. {
  1300. .frontend_attach = bristol_frontend_attach,
  1301. .tuner_attach = bristol_tuner_attach,
  1302. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1303. }, {
  1304. .frontend_attach = bristol_frontend_attach,
  1305. .tuner_attach = bristol_tuner_attach,
  1306. DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
  1307. }
  1308. },
  1309. .num_device_descs = 1,
  1310. .devices = {
  1311. { "Hauppauge Nova-T 500 Dual DVB-T",
  1312. { &dib0700_usb_id_table[2], &dib0700_usb_id_table[3], NULL },
  1313. { NULL },
  1314. },
  1315. },
  1316. .rc_interval = DEFAULT_RC_INTERVAL,
  1317. .rc_key_map = dib0700_rc_keys,
  1318. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1319. .rc_query = dib0700_rc_query
  1320. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1321. .num_adapters = 2,
  1322. .adapter = {
  1323. {
  1324. .frontend_attach = stk7700d_frontend_attach,
  1325. .tuner_attach = stk7700d_tuner_attach,
  1326. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1327. }, {
  1328. .frontend_attach = stk7700d_frontend_attach,
  1329. .tuner_attach = stk7700d_tuner_attach,
  1330. DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
  1331. }
  1332. },
  1333. .num_device_descs = 4,
  1334. .devices = {
  1335. { "Pinnacle PCTV 2000e",
  1336. { &dib0700_usb_id_table[11], NULL },
  1337. { NULL },
  1338. },
  1339. { "Terratec Cinergy DT XS Diversity",
  1340. { &dib0700_usb_id_table[12], NULL },
  1341. { NULL },
  1342. },
  1343. { "Hauppauge Nova-TD Stick/Elgato Eye-TV Diversity",
  1344. { &dib0700_usb_id_table[13], NULL },
  1345. { NULL },
  1346. },
  1347. { "DiBcom STK7700D reference design",
  1348. { &dib0700_usb_id_table[14], NULL },
  1349. { NULL },
  1350. },
  1351. },
  1352. .rc_interval = DEFAULT_RC_INTERVAL,
  1353. .rc_key_map = dib0700_rc_keys,
  1354. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1355. .rc_query = dib0700_rc_query
  1356. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1357. .num_adapters = 1,
  1358. .adapter = {
  1359. {
  1360. .frontend_attach = stk7700P2_frontend_attach,
  1361. .tuner_attach = stk7700d_tuner_attach,
  1362. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1363. },
  1364. },
  1365. .num_device_descs = 3,
  1366. .devices = {
  1367. { "ASUS My Cinema U3000 Mini DVBT Tuner",
  1368. { &dib0700_usb_id_table[23], NULL },
  1369. { NULL },
  1370. },
  1371. { "Yuan EC372S",
  1372. { &dib0700_usb_id_table[31], NULL },
  1373. { NULL },
  1374. },
  1375. { "Terratec Cinergy T Express",
  1376. { &dib0700_usb_id_table[42], NULL },
  1377. { NULL },
  1378. }
  1379. },
  1380. .rc_interval = DEFAULT_RC_INTERVAL,
  1381. .rc_key_map = dib0700_rc_keys,
  1382. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1383. .rc_query = dib0700_rc_query
  1384. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1385. .num_adapters = 1,
  1386. .adapter = {
  1387. {
  1388. .frontend_attach = stk7070p_frontend_attach,
  1389. .tuner_attach = dib7070p_tuner_attach,
  1390. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1391. .size_of_priv = sizeof(struct dib0700_adapter_state),
  1392. },
  1393. },
  1394. .num_device_descs = 9,
  1395. .devices = {
  1396. { "DiBcom STK7070P reference design",
  1397. { &dib0700_usb_id_table[15], NULL },
  1398. { NULL },
  1399. },
  1400. { "Pinnacle PCTV DVB-T Flash Stick",
  1401. { &dib0700_usb_id_table[16], NULL },
  1402. { NULL },
  1403. },
  1404. { "Artec T14BR DVB-T",
  1405. { &dib0700_usb_id_table[22], NULL },
  1406. { NULL },
  1407. },
  1408. { "ASUS My Cinema U3100 Mini DVBT Tuner",
  1409. { &dib0700_usb_id_table[24], NULL },
  1410. { NULL },
  1411. },
  1412. { "Hauppauge Nova-T Stick",
  1413. { &dib0700_usb_id_table[25], NULL },
  1414. { NULL },
  1415. },
  1416. { "Hauppauge Nova-T MyTV.t",
  1417. { &dib0700_usb_id_table[26], NULL },
  1418. { NULL },
  1419. },
  1420. { "Pinnacle PCTV 72e",
  1421. { &dib0700_usb_id_table[29], NULL },
  1422. { NULL },
  1423. },
  1424. { "Pinnacle PCTV 73e",
  1425. { &dib0700_usb_id_table[30], NULL },
  1426. { NULL },
  1427. },
  1428. { "Terratec Cinergy T USB XXS",
  1429. { &dib0700_usb_id_table[33], NULL },
  1430. { NULL },
  1431. },
  1432. },
  1433. .rc_interval = DEFAULT_RC_INTERVAL,
  1434. .rc_key_map = dib0700_rc_keys,
  1435. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1436. .rc_query = dib0700_rc_query
  1437. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1438. .num_adapters = 2,
  1439. .adapter = {
  1440. {
  1441. .frontend_attach = stk7070pd_frontend_attach0,
  1442. .tuner_attach = dib7070p_tuner_attach,
  1443. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1444. .size_of_priv = sizeof(struct dib0700_adapter_state),
  1445. }, {
  1446. .frontend_attach = stk7070pd_frontend_attach1,
  1447. .tuner_attach = dib7070p_tuner_attach,
  1448. DIB0700_DEFAULT_STREAMING_CONFIG(0x03),
  1449. .size_of_priv = sizeof(struct dib0700_adapter_state),
  1450. }
  1451. },
  1452. .num_device_descs = 5,
  1453. .devices = {
  1454. { "DiBcom STK7070PD reference design",
  1455. { &dib0700_usb_id_table[17], NULL },
  1456. { NULL },
  1457. },
  1458. { "Pinnacle PCTV Dual DVB-T Diversity Stick",
  1459. { &dib0700_usb_id_table[18], NULL },
  1460. { NULL },
  1461. },
  1462. { "Hauppauge Nova-TD Stick (52009)",
  1463. { &dib0700_usb_id_table[35], NULL },
  1464. { NULL },
  1465. },
  1466. { "Hauppauge Nova-TD-500 (84xxx)",
  1467. { &dib0700_usb_id_table[36], NULL },
  1468. { NULL },
  1469. },
  1470. { "Terratec Cinergy DT USB XS Diversity",
  1471. { &dib0700_usb_id_table[43], NULL },
  1472. { NULL },
  1473. }
  1474. },
  1475. .rc_interval = DEFAULT_RC_INTERVAL,
  1476. .rc_key_map = dib0700_rc_keys,
  1477. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1478. .rc_query = dib0700_rc_query
  1479. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1480. .num_adapters = 1,
  1481. .adapter = {
  1482. {
  1483. .frontend_attach = stk7700ph_frontend_attach,
  1484. .tuner_attach = stk7700ph_tuner_attach,
  1485. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1486. .size_of_priv = sizeof(struct
  1487. dib0700_adapter_state),
  1488. },
  1489. },
  1490. .num_device_descs = 5,
  1491. .devices = {
  1492. { "Terratec Cinergy HT USB XE",
  1493. { &dib0700_usb_id_table[27], NULL },
  1494. { NULL },
  1495. },
  1496. { "Pinnacle Expresscard 320cx",
  1497. { &dib0700_usb_id_table[28], NULL },
  1498. { NULL },
  1499. },
  1500. { "Terratec Cinergy HT Express",
  1501. { &dib0700_usb_id_table[32], NULL },
  1502. { NULL },
  1503. },
  1504. { "Gigabyte U8000-RH",
  1505. { &dib0700_usb_id_table[37], NULL },
  1506. { NULL },
  1507. },
  1508. { "YUAN High-Tech STK7700PH",
  1509. { &dib0700_usb_id_table[38], NULL },
  1510. { NULL },
  1511. },
  1512. { "Asus My Cinema-U3000Hybrid",
  1513. { &dib0700_usb_id_table[39], NULL },
  1514. { NULL },
  1515. },
  1516. },
  1517. .rc_interval = DEFAULT_RC_INTERVAL,
  1518. .rc_key_map = dib0700_rc_keys,
  1519. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1520. .rc_query = dib0700_rc_query
  1521. }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
  1522. .num_adapters = 1,
  1523. .adapter = {
  1524. {
  1525. .frontend_attach = s5h1411_frontend_attach,
  1526. .tuner_attach = xc5000_tuner_attach,
  1527. DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
  1528. .size_of_priv = sizeof(struct
  1529. dib0700_adapter_state),
  1530. },
  1531. },
  1532. .num_device_descs = 2,
  1533. .devices = {
  1534. { "Pinnacle PCTV HD Pro USB Stick",
  1535. { &dib0700_usb_id_table[40], NULL },
  1536. { NULL },
  1537. },
  1538. { "Pinnacle PCTV HD USB Stick",
  1539. { &dib0700_usb_id_table[41], NULL },
  1540. { NULL },
  1541. },
  1542. },
  1543. .rc_interval = DEFAULT_RC_INTERVAL,
  1544. .rc_key_map = dib0700_rc_keys,
  1545. .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys),
  1546. .rc_query = dib0700_rc_query
  1547. },
  1548. };
  1549. int dib0700_device_count = ARRAY_SIZE(dib0700_devices);