On Wed, 28 Mar 2007, M A Young wrote:
> I have a Freecom dvb-t USB stick (14aa:022b with
> dvb-usb-wt220u-zl0353-01.fw firmware) which works fine when connected via
> my USB 2.0 CardBus card, but not the onboard USB 1.1 port, where the card
> initializes but fails to start when attempting to watch TV and this is a
> problem if the CardBus slot is occupied with something else.
>
> I have been doing some investigating and it seems that the differences are
> that under USB 2.0 the usb settings are
>
> T: Bus=05 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=480 MxCh= 0
> D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
> P: Vendor=14aa ProdID=022b Rev= 5.21
> S: Manufacturer=Digital TV Receiver
> S: Product=Digital TV Receiver
> C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=450mA
> I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00
> Driver=dvb_usb_dtt200u
> E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
> E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
> E: Ad=82(I) Atr=02(Bulk) MxPS= 189 Ivl=0ms
>
> but under USB 1.1 they are
>
> T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
> D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
> P: Vendor=14aa ProdID=022b Rev= 5.21
> S: Manufacturer=Digital TV Receiver
> S: Product=Digital TV Receiver
> C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=450mA
> I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00
> Driver=dvb_usb_dtt200u
> E: Ad=01(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
> E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
> E: Ad=82(I) Atr=01(Isoc) MxPS= 940 Ivl=1ms
>
> so the main data stream has gone from Bulk under 2.0 to Isoc under 1.1. If
> I naively change the stream settings in wt220u_zl0353_properties from a
> USB_BULK one to USB_ISOC settings (from another driver) then the card
> works under USB 1.1 instead.
>
> Is it possible that this driver could auto-detect the USB speed and use
> the appropriate USB transfer mode so that it works under both USB 1.1 and
> USB 2.0?
To answer my own question, it is possible to patch the driver, as the one
I am attaching allows my USB stick to work under both USB 1.1 and USB 2.0.
Michael Young
--- linux-2.6.20.i386/drivers/media/dvb/dvb-usb/dtt200u.c.orig 2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20.i386/drivers/media/dvb/dvb-usb/dtt200u.c 2007-03-29 22:23:34.000000000 +0100
@@ -96,15 +96,28 @@
static struct dvb_usb_device_properties wt220u_fc_properties;
static struct dvb_usb_device_properties wt220u_properties;
static struct dvb_usb_device_properties wt220u_zl0353_properties;
+static struct dvb_usb_device_properties wt220u_zl0353_usb1_properties;
static int dtt200u_usb_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
if (dvb_usb_device_init(intf,&dtt200u_properties,THIS_MODULE,NULL) == 0 ||
dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE,NULL) == 0 ||
- dvb_usb_device_init(intf,&wt220u_fc_properties,THIS_MODULE,NULL) == 0 ||
- dvb_usb_device_init(intf,&wt220u_zl0353_properties,THIS_MODULE,NULL) == 0)
+ dvb_usb_device_init(intf,&wt220u_fc_properties,THIS_MODULE,NULL) == 0)
return 0;
+ switch (interface_to_usbdev(intf)->speed) {
+ case USB_SPEED_FULL:
+ /* USB 1.1 settings */
+ if ( dvb_usb_device_init(intf,&wt220u_zl0353_usb1_properties,THIS_MODULE,NULL) == 0)
+ return 0;
+ break;
+ default:
+ case USB_SPEED_HIGH:
+ /* USB 2.0 settings */
+ if (dvb_usb_device_init(intf,&wt220u_zl0353_properties,THIS_MODULE,NULL) == 0)
+ return 0;
+ break;
+ }
return -ENODEV;
}
@@ -303,6 +316,53 @@
}
};
+static struct dvb_usb_device_properties wt220u_zl0353_usb1_properties = {
+ .usb_ctrl = CYPRESS_FX2,
+ .firmware = "dvb-usb-wt220u-zl0353-01.fw",
+
+ .num_adapters = 1,
+ .adapter = {
+ {
+ .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_NEED_PID_FILTERING,
+ .pid_filter_count = 15,
+
+ .streaming_ctrl = dtt200u_streaming_ctrl,
+ .pid_filter = dtt200u_pid_filter,
+ .frontend_attach = dtt200u_frontend_attach,
+ /* parameter for the MPEG2-data transfer */
+ .stream = {
+ .type = USB_ISOC,
+ .count = 5,
+ .endpoint = 0x02,
+ .u = {
+ .isoc = {
+ .framesperurb = 4,
+ .framesize = 940,
+ .interval = 1,
+ }
+ }
+ },
+ }
+ },
+ .power_ctrl = dtt200u_power_ctrl,
+
+ .rc_interval = 300,
+ .rc_key_map = dtt200u_rc_keys,
+ .rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
+ .rc_query = dtt200u_rc_query,
+
+ .generic_bulk_ctrl_endpoint = 0x01,
+
+ .num_device_descs = 1,
+ .devices = {
+ { .name = "WideView WT-220U PenType Receiver (based on ZL353) (USB1.1)",
+ .cold_ids = { &dtt200u_usb_table[4], NULL },
+ .warm_ids = { &dtt200u_usb_table[5], NULL },
+ },
+ { NULL },
+ }
+};
+
/* usb specific object needed to register this driver with the usb subsystem */
static struct usb_driver dtt200u_usb_driver = {
.name = "dvb_usb_dtt200u",
_______________________________________________
linux-dvb mailing list
linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb