18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* DVB USB library compliant Linux driver for the WideView/ Yakumo/ Hama/ 38c2ecf20Sopenharmony_ci * Typhoon/ Yuan/ Miglia DVB-T USB2.0 receiver. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de) 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Thanks to Steve Chang from WideView for providing support for the WT-220U. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci#include "dtt200u.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* debug */ 148c2ecf20Sopenharmony_ciint dvb_usb_dtt200u_debug; 158c2ecf20Sopenharmony_cimodule_param_named(debug,dvb_usb_dtt200u_debug, int, 0644); 168c2ecf20Sopenharmony_ciMODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2 (or-able))." DVB_USB_DEBUG_STATUS); 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ciDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistruct dtt200u_state { 218c2ecf20Sopenharmony_ci unsigned char data[80]; 228c2ecf20Sopenharmony_ci}; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci struct dtt200u_state *st = d->priv; 278c2ecf20Sopenharmony_ci int ret = 0; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci mutex_lock(&d->data_mutex); 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci st->data[0] = SET_INIT; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci if (onoff) 348c2ecf20Sopenharmony_ci ret = dvb_usb_generic_write(d, st->data, 2); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci mutex_unlock(&d->data_mutex); 378c2ecf20Sopenharmony_ci return ret; 388c2ecf20Sopenharmony_ci} 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic int dtt200u_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci struct dvb_usb_device *d = adap->dev; 438c2ecf20Sopenharmony_ci struct dtt200u_state *st = d->priv; 448c2ecf20Sopenharmony_ci int ret; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci mutex_lock(&d->data_mutex); 478c2ecf20Sopenharmony_ci st->data[0] = SET_STREAMING; 488c2ecf20Sopenharmony_ci st->data[1] = onoff; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci ret = dvb_usb_generic_write(adap->dev, st->data, 2); 518c2ecf20Sopenharmony_ci if (ret < 0) 528c2ecf20Sopenharmony_ci goto ret; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci if (onoff) 558c2ecf20Sopenharmony_ci goto ret; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci st->data[0] = RESET_PID_FILTER; 588c2ecf20Sopenharmony_ci ret = dvb_usb_generic_write(adap->dev, st->data, 1); 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ciret: 618c2ecf20Sopenharmony_ci mutex_unlock(&d->data_mutex); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci return ret; 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_cistatic int dtt200u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff) 678c2ecf20Sopenharmony_ci{ 688c2ecf20Sopenharmony_ci struct dvb_usb_device *d = adap->dev; 698c2ecf20Sopenharmony_ci struct dtt200u_state *st = d->priv; 708c2ecf20Sopenharmony_ci int ret; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci pid = onoff ? pid : 0; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci mutex_lock(&d->data_mutex); 758c2ecf20Sopenharmony_ci st->data[0] = SET_PID_FILTER; 768c2ecf20Sopenharmony_ci st->data[1] = index; 778c2ecf20Sopenharmony_ci st->data[2] = pid & 0xff; 788c2ecf20Sopenharmony_ci st->data[3] = (pid >> 8) & 0x1f; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci ret = dvb_usb_generic_write(adap->dev, st->data, 4); 818c2ecf20Sopenharmony_ci mutex_unlock(&d->data_mutex); 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci return ret; 848c2ecf20Sopenharmony_ci} 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_cistatic int dtt200u_rc_query(struct dvb_usb_device *d) 878c2ecf20Sopenharmony_ci{ 888c2ecf20Sopenharmony_ci struct dtt200u_state *st = d->priv; 898c2ecf20Sopenharmony_ci u32 scancode; 908c2ecf20Sopenharmony_ci int ret; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci mutex_lock(&d->data_mutex); 938c2ecf20Sopenharmony_ci st->data[0] = GET_RC_CODE; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 5, 0); 968c2ecf20Sopenharmony_ci if (ret < 0) 978c2ecf20Sopenharmony_ci goto ret; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci if (st->data[0] == 1) { 1008c2ecf20Sopenharmony_ci enum rc_proto proto = RC_PROTO_NEC; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci scancode = st->data[1]; 1038c2ecf20Sopenharmony_ci if ((u8) ~st->data[1] != st->data[2]) { 1048c2ecf20Sopenharmony_ci /* Extended NEC */ 1058c2ecf20Sopenharmony_ci scancode = scancode << 8; 1068c2ecf20Sopenharmony_ci scancode |= st->data[2]; 1078c2ecf20Sopenharmony_ci proto = RC_PROTO_NECX; 1088c2ecf20Sopenharmony_ci } 1098c2ecf20Sopenharmony_ci scancode = scancode << 8; 1108c2ecf20Sopenharmony_ci scancode |= st->data[3]; 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci /* Check command checksum is ok */ 1138c2ecf20Sopenharmony_ci if ((u8) ~st->data[3] == st->data[4]) 1148c2ecf20Sopenharmony_ci rc_keydown(d->rc_dev, proto, scancode, 0); 1158c2ecf20Sopenharmony_ci else 1168c2ecf20Sopenharmony_ci rc_keyup(d->rc_dev); 1178c2ecf20Sopenharmony_ci } else if (st->data[0] == 2) { 1188c2ecf20Sopenharmony_ci rc_repeat(d->rc_dev); 1198c2ecf20Sopenharmony_ci } else { 1208c2ecf20Sopenharmony_ci rc_keyup(d->rc_dev); 1218c2ecf20Sopenharmony_ci } 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci if (st->data[0] != 0) 1248c2ecf20Sopenharmony_ci deb_info("st->data: %*ph\n", 5, st->data); 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ciret: 1278c2ecf20Sopenharmony_ci mutex_unlock(&d->data_mutex); 1288c2ecf20Sopenharmony_ci return ret; 1298c2ecf20Sopenharmony_ci} 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cistatic int dtt200u_frontend_attach(struct dvb_usb_adapter *adap) 1328c2ecf20Sopenharmony_ci{ 1338c2ecf20Sopenharmony_ci adap->fe_adap[0].fe = dtt200u_fe_attach(adap->dev); 1348c2ecf20Sopenharmony_ci return 0; 1358c2ecf20Sopenharmony_ci} 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties dtt200u_properties; 1388c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties wt220u_fc_properties; 1398c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties wt220u_properties; 1408c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties wt220u_zl0353_properties; 1418c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties wt220u_miglia_properties; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cistatic int dtt200u_usb_probe(struct usb_interface *intf, 1448c2ecf20Sopenharmony_ci const struct usb_device_id *id) 1458c2ecf20Sopenharmony_ci{ 1468c2ecf20Sopenharmony_ci if (0 == dvb_usb_device_init(intf, &dtt200u_properties, 1478c2ecf20Sopenharmony_ci THIS_MODULE, NULL, adapter_nr) || 1488c2ecf20Sopenharmony_ci 0 == dvb_usb_device_init(intf, &wt220u_properties, 1498c2ecf20Sopenharmony_ci THIS_MODULE, NULL, adapter_nr) || 1508c2ecf20Sopenharmony_ci 0 == dvb_usb_device_init(intf, &wt220u_fc_properties, 1518c2ecf20Sopenharmony_ci THIS_MODULE, NULL, adapter_nr) || 1528c2ecf20Sopenharmony_ci 0 == dvb_usb_device_init(intf, &wt220u_zl0353_properties, 1538c2ecf20Sopenharmony_ci THIS_MODULE, NULL, adapter_nr) || 1548c2ecf20Sopenharmony_ci 0 == dvb_usb_device_init(intf, &wt220u_miglia_properties, 1558c2ecf20Sopenharmony_ci THIS_MODULE, NULL, adapter_nr)) 1568c2ecf20Sopenharmony_ci return 0; 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci return -ENODEV; 1598c2ecf20Sopenharmony_ci} 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_cistatic struct usb_device_id dtt200u_usb_table [] = { 1628c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_COLD) }, 1638c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) }, 1648c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) }, 1658c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) }, 1668c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_COLD) }, 1678c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_WARM) }, 1688c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_FC_COLD) }, 1698c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_FC_WARM) }, 1708c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZAP250_COLD) }, 1718c2ecf20Sopenharmony_ci { USB_DEVICE(USB_VID_MIGLIA, USB_PID_WT220U_ZAP250_COLD) }, 1728c2ecf20Sopenharmony_ci { 0 }, 1738c2ecf20Sopenharmony_ci}; 1748c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(usb, dtt200u_usb_table); 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties dtt200u_properties = { 1778c2ecf20Sopenharmony_ci .usb_ctrl = CYPRESS_FX2, 1788c2ecf20Sopenharmony_ci .firmware = "dvb-usb-dtt200u-01.fw", 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci .size_of_priv = sizeof(struct dtt200u_state), 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci .num_adapters = 1, 1838c2ecf20Sopenharmony_ci .adapter = { 1848c2ecf20Sopenharmony_ci { 1858c2ecf20Sopenharmony_ci .num_frontends = 1, 1868c2ecf20Sopenharmony_ci .fe = {{ 1878c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 1888c2ecf20Sopenharmony_ci .pid_filter_count = 15, 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci .streaming_ctrl = dtt200u_streaming_ctrl, 1918c2ecf20Sopenharmony_ci .pid_filter = dtt200u_pid_filter, 1928c2ecf20Sopenharmony_ci .frontend_attach = dtt200u_frontend_attach, 1938c2ecf20Sopenharmony_ci /* parameter for the MPEG2-data transfer */ 1948c2ecf20Sopenharmony_ci .stream = { 1958c2ecf20Sopenharmony_ci .type = USB_BULK, 1968c2ecf20Sopenharmony_ci .count = 7, 1978c2ecf20Sopenharmony_ci .endpoint = 0x02, 1988c2ecf20Sopenharmony_ci .u = { 1998c2ecf20Sopenharmony_ci .bulk = { 2008c2ecf20Sopenharmony_ci .buffersize = 4096, 2018c2ecf20Sopenharmony_ci } 2028c2ecf20Sopenharmony_ci } 2038c2ecf20Sopenharmony_ci }, 2048c2ecf20Sopenharmony_ci }}, 2058c2ecf20Sopenharmony_ci } 2068c2ecf20Sopenharmony_ci }, 2078c2ecf20Sopenharmony_ci .power_ctrl = dtt200u_power_ctrl, 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci .rc.core = { 2108c2ecf20Sopenharmony_ci .rc_interval = 300, 2118c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DTT200U, 2128c2ecf20Sopenharmony_ci .rc_query = dtt200u_rc_query, 2138c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_NEC, 2148c2ecf20Sopenharmony_ci }, 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci .num_device_descs = 1, 2198c2ecf20Sopenharmony_ci .devices = { 2208c2ecf20Sopenharmony_ci { .name = "WideView/Yuan/Yakumo/Hama/Typhoon DVB-T USB2.0 (WT-200U)", 2218c2ecf20Sopenharmony_ci .cold_ids = { &dtt200u_usb_table[0], NULL }, 2228c2ecf20Sopenharmony_ci .warm_ids = { &dtt200u_usb_table[1], NULL }, 2238c2ecf20Sopenharmony_ci }, 2248c2ecf20Sopenharmony_ci { NULL }, 2258c2ecf20Sopenharmony_ci } 2268c2ecf20Sopenharmony_ci}; 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties wt220u_properties = { 2298c2ecf20Sopenharmony_ci .usb_ctrl = CYPRESS_FX2, 2308c2ecf20Sopenharmony_ci .firmware = "dvb-usb-wt220u-02.fw", 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci .size_of_priv = sizeof(struct dtt200u_state), 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci .num_adapters = 1, 2358c2ecf20Sopenharmony_ci .adapter = { 2368c2ecf20Sopenharmony_ci { 2378c2ecf20Sopenharmony_ci .num_frontends = 1, 2388c2ecf20Sopenharmony_ci .fe = {{ 2398c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 2408c2ecf20Sopenharmony_ci .pid_filter_count = 15, 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci .streaming_ctrl = dtt200u_streaming_ctrl, 2438c2ecf20Sopenharmony_ci .pid_filter = dtt200u_pid_filter, 2448c2ecf20Sopenharmony_ci .frontend_attach = dtt200u_frontend_attach, 2458c2ecf20Sopenharmony_ci /* parameter for the MPEG2-data transfer */ 2468c2ecf20Sopenharmony_ci .stream = { 2478c2ecf20Sopenharmony_ci .type = USB_BULK, 2488c2ecf20Sopenharmony_ci .count = 7, 2498c2ecf20Sopenharmony_ci .endpoint = 0x02, 2508c2ecf20Sopenharmony_ci .u = { 2518c2ecf20Sopenharmony_ci .bulk = { 2528c2ecf20Sopenharmony_ci .buffersize = 4096, 2538c2ecf20Sopenharmony_ci } 2548c2ecf20Sopenharmony_ci } 2558c2ecf20Sopenharmony_ci }, 2568c2ecf20Sopenharmony_ci }}, 2578c2ecf20Sopenharmony_ci } 2588c2ecf20Sopenharmony_ci }, 2598c2ecf20Sopenharmony_ci .power_ctrl = dtt200u_power_ctrl, 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci .rc.core = { 2628c2ecf20Sopenharmony_ci .rc_interval = 300, 2638c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DTT200U, 2648c2ecf20Sopenharmony_ci .rc_query = dtt200u_rc_query, 2658c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_NEC, 2668c2ecf20Sopenharmony_ci }, 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci .num_device_descs = 1, 2718c2ecf20Sopenharmony_ci .devices = { 2728c2ecf20Sopenharmony_ci { .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)", 2738c2ecf20Sopenharmony_ci .cold_ids = { &dtt200u_usb_table[2], &dtt200u_usb_table[8], NULL }, 2748c2ecf20Sopenharmony_ci .warm_ids = { &dtt200u_usb_table[3], NULL }, 2758c2ecf20Sopenharmony_ci }, 2768c2ecf20Sopenharmony_ci { NULL }, 2778c2ecf20Sopenharmony_ci } 2788c2ecf20Sopenharmony_ci}; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties wt220u_fc_properties = { 2818c2ecf20Sopenharmony_ci .usb_ctrl = CYPRESS_FX2, 2828c2ecf20Sopenharmony_ci .firmware = "dvb-usb-wt220u-fc03.fw", 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci .size_of_priv = sizeof(struct dtt200u_state), 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci .num_adapters = 1, 2878c2ecf20Sopenharmony_ci .adapter = { 2888c2ecf20Sopenharmony_ci { 2898c2ecf20Sopenharmony_ci .num_frontends = 1, 2908c2ecf20Sopenharmony_ci .fe = {{ 2918c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 2928c2ecf20Sopenharmony_ci .pid_filter_count = 15, 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci .streaming_ctrl = dtt200u_streaming_ctrl, 2958c2ecf20Sopenharmony_ci .pid_filter = dtt200u_pid_filter, 2968c2ecf20Sopenharmony_ci .frontend_attach = dtt200u_frontend_attach, 2978c2ecf20Sopenharmony_ci /* parameter for the MPEG2-data transfer */ 2988c2ecf20Sopenharmony_ci .stream = { 2998c2ecf20Sopenharmony_ci .type = USB_BULK, 3008c2ecf20Sopenharmony_ci .count = 7, 3018c2ecf20Sopenharmony_ci .endpoint = 0x06, 3028c2ecf20Sopenharmony_ci .u = { 3038c2ecf20Sopenharmony_ci .bulk = { 3048c2ecf20Sopenharmony_ci .buffersize = 4096, 3058c2ecf20Sopenharmony_ci } 3068c2ecf20Sopenharmony_ci } 3078c2ecf20Sopenharmony_ci }, 3088c2ecf20Sopenharmony_ci }}, 3098c2ecf20Sopenharmony_ci } 3108c2ecf20Sopenharmony_ci }, 3118c2ecf20Sopenharmony_ci .power_ctrl = dtt200u_power_ctrl, 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci .rc.core = { 3148c2ecf20Sopenharmony_ci .rc_interval = 300, 3158c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DTT200U, 3168c2ecf20Sopenharmony_ci .rc_query = dtt200u_rc_query, 3178c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_NEC, 3188c2ecf20Sopenharmony_ci }, 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci .num_device_descs = 1, 3238c2ecf20Sopenharmony_ci .devices = { 3248c2ecf20Sopenharmony_ci { .name = "WideView WT-220U PenType Receiver (Typhoon/Freecom)", 3258c2ecf20Sopenharmony_ci .cold_ids = { &dtt200u_usb_table[6], NULL }, 3268c2ecf20Sopenharmony_ci .warm_ids = { &dtt200u_usb_table[7], NULL }, 3278c2ecf20Sopenharmony_ci }, 3288c2ecf20Sopenharmony_ci { NULL }, 3298c2ecf20Sopenharmony_ci } 3308c2ecf20Sopenharmony_ci}; 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties wt220u_zl0353_properties = { 3338c2ecf20Sopenharmony_ci .usb_ctrl = CYPRESS_FX2, 3348c2ecf20Sopenharmony_ci .firmware = "dvb-usb-wt220u-zl0353-01.fw", 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci .size_of_priv = sizeof(struct dtt200u_state), 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci .num_adapters = 1, 3398c2ecf20Sopenharmony_ci .adapter = { 3408c2ecf20Sopenharmony_ci { 3418c2ecf20Sopenharmony_ci .num_frontends = 1, 3428c2ecf20Sopenharmony_ci .fe = {{ 3438c2ecf20Sopenharmony_ci .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING, 3448c2ecf20Sopenharmony_ci .pid_filter_count = 15, 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_ci .streaming_ctrl = dtt200u_streaming_ctrl, 3478c2ecf20Sopenharmony_ci .pid_filter = dtt200u_pid_filter, 3488c2ecf20Sopenharmony_ci .frontend_attach = dtt200u_frontend_attach, 3498c2ecf20Sopenharmony_ci /* parameter for the MPEG2-data transfer */ 3508c2ecf20Sopenharmony_ci .stream = { 3518c2ecf20Sopenharmony_ci .type = USB_BULK, 3528c2ecf20Sopenharmony_ci .count = 7, 3538c2ecf20Sopenharmony_ci .endpoint = 0x02, 3548c2ecf20Sopenharmony_ci .u = { 3558c2ecf20Sopenharmony_ci .bulk = { 3568c2ecf20Sopenharmony_ci .buffersize = 4096, 3578c2ecf20Sopenharmony_ci } 3588c2ecf20Sopenharmony_ci } 3598c2ecf20Sopenharmony_ci }, 3608c2ecf20Sopenharmony_ci }}, 3618c2ecf20Sopenharmony_ci } 3628c2ecf20Sopenharmony_ci }, 3638c2ecf20Sopenharmony_ci .power_ctrl = dtt200u_power_ctrl, 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci .rc.core = { 3668c2ecf20Sopenharmony_ci .rc_interval = 300, 3678c2ecf20Sopenharmony_ci .rc_codes = RC_MAP_DTT200U, 3688c2ecf20Sopenharmony_ci .rc_query = dtt200u_rc_query, 3698c2ecf20Sopenharmony_ci .allowed_protos = RC_PROTO_BIT_NEC, 3708c2ecf20Sopenharmony_ci }, 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci .num_device_descs = 1, 3758c2ecf20Sopenharmony_ci .devices = { 3768c2ecf20Sopenharmony_ci { .name = "WideView WT-220U PenType Receiver (based on ZL353)", 3778c2ecf20Sopenharmony_ci .cold_ids = { &dtt200u_usb_table[4], NULL }, 3788c2ecf20Sopenharmony_ci .warm_ids = { &dtt200u_usb_table[5], NULL }, 3798c2ecf20Sopenharmony_ci }, 3808c2ecf20Sopenharmony_ci { NULL }, 3818c2ecf20Sopenharmony_ci } 3828c2ecf20Sopenharmony_ci}; 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_cistatic struct dvb_usb_device_properties wt220u_miglia_properties = { 3858c2ecf20Sopenharmony_ci .usb_ctrl = CYPRESS_FX2, 3868c2ecf20Sopenharmony_ci .firmware = "dvb-usb-wt220u-miglia-01.fw", 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci .size_of_priv = sizeof(struct dtt200u_state), 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci .num_adapters = 1, 3918c2ecf20Sopenharmony_ci .generic_bulk_ctrl_endpoint = 0x01, 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_ci .num_device_descs = 1, 3948c2ecf20Sopenharmony_ci .devices = { 3958c2ecf20Sopenharmony_ci { .name = "WideView WT-220U PenType Receiver (Miglia)", 3968c2ecf20Sopenharmony_ci .cold_ids = { &dtt200u_usb_table[9], NULL }, 3978c2ecf20Sopenharmony_ci /* This device turns into WT220U_ZL0353_WARM when fw 3988c2ecf20Sopenharmony_ci has been uploaded */ 3998c2ecf20Sopenharmony_ci .warm_ids = { NULL }, 4008c2ecf20Sopenharmony_ci }, 4018c2ecf20Sopenharmony_ci { NULL }, 4028c2ecf20Sopenharmony_ci } 4038c2ecf20Sopenharmony_ci}; 4048c2ecf20Sopenharmony_ci 4058c2ecf20Sopenharmony_ci/* usb specific object needed to register this driver with the usb subsystem */ 4068c2ecf20Sopenharmony_cistatic struct usb_driver dtt200u_usb_driver = { 4078c2ecf20Sopenharmony_ci .name = "dvb_usb_dtt200u", 4088c2ecf20Sopenharmony_ci .probe = dtt200u_usb_probe, 4098c2ecf20Sopenharmony_ci .disconnect = dvb_usb_device_exit, 4108c2ecf20Sopenharmony_ci .id_table = dtt200u_usb_table, 4118c2ecf20Sopenharmony_ci}; 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_cimodule_usb_driver(dtt200u_usb_driver); 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ciMODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>"); 4168c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Driver for the WideView/Yakumo/Hama/Typhoon/Club3D/Miglia DVB-T USB2.0 devices"); 4178c2ecf20Sopenharmony_ciMODULE_VERSION("1.0"); 4188c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 419