From: Dan E. <Dan...@di...> - 2007-02-28 16:39:51
|
You'll do much better if you write more than 512 bytes at a time, e.g. 64kB. At the moment you're waiting for each 512 bytes to be transmitted before the next one is sent. This is going to take at least 125us per call, and probably quite a bit longer (e.g. 500us). =20 Dan. ________________________________ From: lib...@li... [mailto:lib...@li...] On Behalf Of mohammed abuhijle Sent: 28 February 2007 14:19 To: lib...@li... Subject: [Libusb-devel] Slow USB bulk transfer Hello, I have the following code that takes more than a min to finisg: ------------------------------------------------------- #include <stdio.h> #include <string.h> #include <usb.h>=20 // Search token for the cypress chip. #define CYP_VENDOR_ID 0x04b4 #define CYP_PRODUCT_ID 0x8613 struct usb_device* cypress_init(); void sighandler(int ); =20 // Global vars struct usb_device* cypress_dev;=20 struct usb_dev_handle* cypress_dev_handle;=20 char* bytes; struct usb_interface_descriptor interface ; int verbose =3D 0; int c,i,a,ret; int main(int argc, char* argv[]){ // First, init the cypress chip..=20 cypress_dev =3D cypress_init();=20 // Second, open it ... if (cypress_dev) cypress_dev_handle =3D usb_open(cypress_dev); else { printf("Fatel Error: No Cypress CY7C68xx devices connected. Exiting \n");=20 return -9; } if (cypress_dev_handle){ // Now, detatch the usbtest kernel driver assigned to the cypress chip upon=20 //hotpluging it into the system usb_detach_kernel_driver_np(cypress_dev_handle ,0);=20 usb_set_configuration(cypress_dev_handle, cypress_dev->config->bConfigurationValue); interface =3D cypress_dev->config[0].interface[0].altsetting[1]; usb_claim_interface(cypress_dev_handle,interface.bInterfaceNumber ); usb_set_altinterface(cypress_dev_handle,interface.bAlternateSetting); //assign the endpoint addresses.... int epo =3D interface.endpoint[0].bEndpointAddress; int epi =3D interface.endpoint[1].bEndpointAddress;=20 usb_clear_halt(cypress_dev_handle, epi ); //printf ("ep_out is %0x while ep_in is %0x\n",epo,epi); bytes =3D (char*) malloc(512); memset(bytes,0,sizeof(bytes)); /*write 40 Mbytes worth of data to the bulk endpoint*/=20 /*i am calculating this by: 512 (packet size) * 2 =3D 1 KB, * 1000 =3D = 1MB, * 40 =3D 40 MB*/ for (i =3D 0; i < 2 * 1000 * 40 ; i++){ ret =3D usb_bulk_write(cypress_dev_handle, epi,bytes, 512, 0 /*the = timrout is ignored for bulk transfer*/);=20 //printf ("i is:%d\t ret is %d\t bytes is %s\n",i, ret,bytes); } } else { printf("Could not open the Cypress chip. Quiting \n"); return -1; } usb_release_interface(cypress_dev_handle,0);=20 usb_close(cypress_dev_handle); return 0;=20 } =20 struct usb_device* cypress_init(){ =20 struct usb_bus *bus =3DNULL;=20 struct usb_device *dev =3DNULL; =20 usb_init();=20 usb_find_busses();=20 usb_find_devices(); usb_set_debug(9); for (bus =3D usb_busses; bus; bus =3D bus->next)=20 for (dev =3D bus->devices; dev; dev =3D dev->next)=20 if ((dev->descriptor.idVendor =3D=3D CYP_VENDOR_ID) &&=20 (dev->descriptor.idProduct =3D=3D CYP_PRODUCT_ID)) return = dev; =20 return NULL; } void sighandler(int sig){ =20 //usb_release_interface(cypress_dev_handle,0); usb_close(cypress_dev_handle); =20 =20 } ------------------------------------------------------- As root, I ran "time ./a.out" and got # time ./a.out real 1m9.793s user 0m0.118s sys 0m0.490s # time ./a.out real 1m15.078s user 0m0.095s sys 0m0.438s root@elive[/home/me/cypress]# The lsusb -vv output of the cypress FX2 device is at:=20 http://abuhijle.googlepages.com/libusb-vvoutput I am trying to achieve that max possible speed to write to the device. There are no other processes I am running along with a.out. My goal is to reduce this > 1 minute to less than one second!! It is a USB 2, I know I should not expect the standard's 60 MBytes transfer rate because of overhead and all other issues so I am shooting for 40.=20 Any errors in my code, please..? Any tipe on making this faster.... here are some more info:=20 # libusb-config --version 0.1.12 # uname -a Linux elive 2.6.15.7 #2 Tue Dec 5 06:48:06 CET 2006 i686 GNU/Linux gcc -v Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --enable-languages=3Dc,c++,fortran,objc,obj-c++,treelang --prefix=3D/usr --enable-shared --with-system-zlib --libexecdir=3D/usr/lib --without-included-gettext --enable-threads=3Dposix --enable-nls --program-suffix=3D- 4.1 --enable-__cxa_atexit --enable-clocale=3Dgnu --enable-libstdcxx-debug --enable-mpfr --with-tune=3Di686 --enable-checking=3Drelease i486-linux-gnu Thread model: posix gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21 ) -M |