From: aaron.gage <aar...@oc...> - 2005-03-30 22:12:02
|
Greetings, all. I've been working on writing a Linux interface for a scientific instrument that uses USB 2 to transfer data. A version of the driver has been written for Windows (using the Ez-USB library), leading to three questions for the development group here: *) Is there a known bound on how long it takes to complete bulk read/write operations? It appears that on average, the Linux driver is taking 2 milliseconds longer per reading than the Windows version (e.g. 5ms becomes 7ms over 1000 readings). This is true for USB 1 and USB 2. *) I am periodically losing a single byte. I am attempting to read a 4096-byte scan followed by a single check byte, but the check byte is missing at least 25% of the time (whether I read 4097 bytes at once, or 4096 and then 1). Is there a limit on the transfer packet size at 4 kilobytes? Timeouts on the read do not make a difference here. *) Is there any reason that usb_dev_handle is not defined fully in usb.h? This is a useful struct to have access to, and I've ended up pasting the definition into my C code (from usbi.h). This seemed unnecessary, so I'm sure there is a good reason I shouldn't have done that. The device works as expected under Windows, and all devices seem to work fine under libusb when run through a USB 1.2 bus. Problems only occur when doing USB 2.0 speeds, and have appeared on two different devices (so it isn't the device itself). One thing that I've found is that the time required to read from the device seems to change -- it starts off slow (30-40ms to read 4097 bytes), then seems to accelerate, needing 0.7-2ms to read 4097 bytes, then backs off again to 7-10ms before dropping the check byte. (All timing was done with gettimeofday(), which reports microseconds, but there may still be some resolution artifacts in those numbers.) Is it possible that I'm bottoming out something? I am always using a timeout (usually huge, like 50000), so the bulk_read call shouldn't be returning without the byte, should it? My test setup is as follows: Fedora Core 3 with 2.6.10-1.770_FC3 kernel on a Celeron 1.4Ghz with 256MB of RAM. The USB 2 adapter is a PCI card from ALi Corporation. I am using libusb version 0.1.10a, compiled from source (which fixed some problems I had with 0.1.8). All transfers are done with usb_bulk_read and usb_bulk_write. gcc is version 3.4.2 with glibc-2.3.4-2. I know you are working toward version 1.0, so if there are specific tests I can perform to help iron out these speed wrinkles, let me know and I'll see what I can do (time permitting). Thanks. --Aaron |