/* DVB USB compliant linux driver for mobile DVB-T USB devices based on * reference designs made by DiBcom (http://www.dibcom.fr/) (DiB3000M-C/P) * * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) * * based on GPL code from DiBcom, which has * Copyright (C) 2004 Amaury Demol for DiBcom (ademol@dibcom.fr) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 2. * * see Documentation/dvb/README.dvb-usb for more information */ #include "dibusb.h" DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); /* USB Driver stuff */ static struct dvb_usb_device_properties dibusb_mc_properties; static int dibusb_mc_probe(struct usb_interface *intf, const struct usb_device_id *id) { printk("dibusb_mc_probe");//JHA return dvb_usb_device_init(intf,&dibusb_mc_properties,THIS_MODULE,NULL,adapter_nr); } // 20080513, chihming static int asus_dmbth_identify_state (struct usb_device *udev, struct dvb_usb_device_properties *props, struct dvb_usb_device_description **desc, int *cold) { static unsigned short int pid=0; //printk("%s: iManufacturer => %d, iProduct => 0x%0x\n",__FUNCTION__, udev->descriptor.iManufacturer, udev->descriptor.iProduct);//20080513, chihming *cold = udev->descriptor.iManufacturer == 0 && udev->descriptor.iProduct == 0; #if 0 t = last_tick + 3*HZ; if (time_before(jiffies, t)) *cold = false; else *cold = true; if (last_tick == 0) *cold = true; last_tick = jiffies; printk("time_before => %s\n", (*cold) ? "true":"false"); #endif // 20071103, chihming #if 1 //printk("%s: pid => 0x%x, idProduct => 0x%x\n", __FUNCTION__, pid, le16_to_cpu(udev->descriptor.idProduct)) if (pid == 0 && (0x1749 == le16_to_cpu(udev->descriptor.idProduct))) { int ret = usb_trylock_device(udev); if (ret == 1) { ret = usb_reset_device(udev); usb_unlock_device(udev); //printk("usb_reset_device1"); } else { ret = usb_reset_device(udev); //printk("usb_reset_device2"); } msleep(100); //printk("%s\n", __FUNCTION__); } pid = le16_to_cpu(udev->descriptor.idProduct); //printk("%s: Now pid => 0x%x\n", __FUNCTION__, pid); #endif // return 0; } /* do not change the order of the ID table */ static struct usb_device_id dibusb_dib3000mc_table [] = { /* 0 */ {USB_DEVICE (USB_VID_ASUSTeK, USB_PID_U3100_8934_COLD) }, //JHA /* 1 */ {USB_DEVICE (USB_VID_ASUSTeK, USB_PID_U3100_8934_WARM) }, //JHA /* 2 */ {USB_DEVICE (USB_VID_ASUSTeK, USB_PID_U3100_8GL5_COLD) }, //JHA /* 3 */ {USB_DEVICE (USB_VID_ASUSTeK, USB_PID_U3100_8GL5_WARM) }, //JHA { } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, dibusb_dib3000mc_table); static struct dvb_usb_device_properties dibusb_mc_properties = { .caps = DVB_USB_IS_AN_I2C_ADAPTER, .usb_ctrl = CYPRESS_FX2, .firmware = "u3100dmbth.fw", .num_adapters = 1, .adapter = { { .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, .pid_filter_count = 32, .streaming_ctrl = dibusb2_0_streaming_ctrl, .pid_filter = dibusb_pid_filter, .pid_filter_ctrl = dibusb_pid_filter_ctrl, .frontend_attach = dibusb_dib3000mc_frontend_attach, .tuner_attach = dibusb_dib3000mc_tuner_attach, /* parameter for the MPEG2-data transfer */ .stream = { .type = USB_BULK, .count = 7, .endpoint = 0x02, .u = { .bulk = { .buffersize = 4096, } } }, .size_of_priv = sizeof(struct dibusb_state), } }, .identify_state = asus_dmbth_identify_state, // 20080513, chihming .power_ctrl = dibusb2_0_power_ctrl, .rc_interval = DEFAULT_RC_INTERVAL, .rc_key_map = dibusb_rc_keys, .rc_key_map_size = 111, /* FIXME */ .rc_query = dibusb_rc_query, .i2c_algo = &dibusb_i2c_algo, .generic_bulk_ctrl_endpoint = 0x01, .num_device_descs = 7, .devices = { //{,JHA { "ASUSTeK DMB-TH ", { &dibusb_dib3000mc_table[0], NULL }, { &dibusb_dib3000mc_table[1], NULL }, }, { "ASUSTeK DMB-TH", { &dibusb_dib3000mc_table[2], NULL }, { &dibusb_dib3000mc_table[3], NULL }, }, //},JHA { NULL }, } }; static struct usb_driver dibusb_mc_driver = { .name = "dvb_usb_dibusb_mc", .probe = dibusb_mc_probe, .disconnect = dvb_usb_device_exit, .id_table = dibusb_dib3000mc_table, }; /* module stuff */ static int __init dibusb_mc_module_init(void) { int result; if ((result = usb_register(&dibusb_mc_driver))) { err("usb_register failed. Error number %d",result); return result; } return 0; } static void __exit dibusb_mc_module_exit(void) { /* deregister this driver from the USB subsystem */ usb_deregister(&dibusb_mc_driver); } module_init (dibusb_mc_module_init); module_exit (dibusb_mc_module_exit); MODULE_AUTHOR("Patrick Boettcher "); MODULE_DESCRIPTION("Driver for DiBcom USB2.0 DVB-T (DiB3000M-C/P based) devices"); MODULE_VERSION("1.0"); MODULE_LICENSE("GPL");