CREAM TEA -- ROOT MCP

stdUSBl.cxx

00001 /*****
00002  
00003 stdUSBL - A libusb implementation of ezusbsys.
00004 
00005 StdUSB libusb implementation used here uses same function interface with native stdUSB Windows WDM driver.
00006  
00007 *****/
00008 
00009 #include <string.h>
00010 #include <stdio.h>
00011 #include "stdUSB.h"
00012 
00013 stdUSB::stdUSB(void) {
00014     stdUSB::stdHandle = INVALID_HANDLE_VALUE;
00015     //    createHandles();
00016 }
00017 
00018 stdUSB::~stdUSB(void) {
00019     if(stdHandle != INVALID_HANDLE_VALUE)
00020         freeHandle();
00021 }
00022 
00029 bool stdUSB::createHandles(void) {
00030     int retval;
00031     struct usb_device *dev;
00032    
00033     if (stdHandle != INVALID_HANDLE_VALUE)
00034         goto ok;
00035     
00036     dev = stdUSB::init();
00037     retval = (long) dev;
00038 
00039     if (retval == 0)
00040         goto fail;
00041 
00042     stdHandle = usb_open(dev);
00043     if (stdHandle == INVALID_HANDLE_VALUE)
00044         goto fail;
00045 
00046     retval = usb_set_configuration(stdHandle, USBFX2_CNFNO);
00047     if (retval != 0)
00048         goto fail;
00049 
00050     retval = usb_claim_interface(stdHandle, USBFX2_INTFNO);
00051     if (retval != 0)
00052         goto fail;
00053 
00054     retval = usb_set_altinterface(stdHandle, USBFX2_INTFNO);
00055     if (retval != 0)
00056         goto fail;
00057 
00058     goto ok;
00059 
00060     /* on ok */
00061 ok:
00062 //printf("createhandles: OK\n");
00063     return SUCCEED;
00064 
00065     /* on failure*/
00066 fail:
00067 printf("createhandles: FAILED\n");
00068     return FAILED; // Unable to open usb device. No handle.}
00069 }
00070 
00077 struct usb_device* stdUSB::init(void) {
00078     struct usb_bus *usb_bus;
00079     struct usb_device *dev;
00080 
00081     /* init libusb*/
00082     usb_init();
00083     usb_find_busses();
00084     usb_find_devices();
00085 
00086     /* usb_busses is a linked list which after above init function calls contains every single usb device in the computer.
00087         We need to browse that linked list and find EZ USB-FX2 by VENDOR and PRODUCT ID */
00088     for (usb_bus = usb_busses; usb_bus; usb_bus = usb_bus->next) {
00089         for (dev = usb_bus->devices; dev; dev = dev->next) {
00090             if ((dev->descriptor.idVendor == USBFX2_VENDOR_ID) && (dev->descriptor.idProduct == USBFX2_PRODUCT_ID)) {
00091 //                printf("init: found device: %d\n", (int)dev);
00092                 return dev;
00093             }
00094         }
00095     }
00096 
00097     printf("init: device not found)");
00098     /* on failure (device not found) */
00099     return INVALID_HANDLE_VALUE;
00100 }
00101 
00107 bool stdUSB::freeHandle(void) //throw(...)
00108 {
00109     /* release interface */
00110     int retval = usb_release_interface(stdHandle, USBFX2_INTFNO);
00111     if (retval != 0)
00112         return FAILED;
00113 
00114     /* close usb handle */
00115     retval = usb_close(stdHandle);
00116     if (retval != 0)
00117         return FAILED;
00118 
00119     /* all ok */
00120     return SUCCEED;
00121 }
00122 
00123 bool stdUSB::freeHandles(void) {
00124     // this function exits just because there is no reason
00125     // to open and close handle all time
00126     return SUCCEED;
00127 }
00128 
00134 bool stdUSB::sendData(unsigned int data)// throw(...)
00135 {
00136     /* Shifted right because send value needs to be in HEX base. char[4] ^= int (char -> 1byte, int -> 4 bytes)*/
00137     char buff[4];
00138     buff[0] = data;
00139     buff[1] = (data >> 8);
00140     buff[2] = (data >> 16);
00141     buff[3] = (data >> 24);
00142 
00143     /*  USBFX2_EP_WRITE => end point addr.
00144     buff => bytes to send
00145     USB_TOUT_MS => timeout in ms
00146     */
00147     int retval = usb_bulk_write(stdHandle, USBFX2_EP_WRITE, buff, sizeof(buff), USB_TOUT_MS);
00148 
00149 //    printf("SendData: sent %d bytes\n", retval);
00150 
00151     if (retval == 4) //return value must be exact as the bytes transferred
00152         return SUCCEED;
00153     else
00154         return FAILED;
00155 }
00156 
00164 bool stdUSB::readData(unsigned short * pData, int l, int* lread)// throw(...)
00165 {
00166     int buff_sz = l*sizeof(unsigned short);
00167     //char* buff = new char[110];
00168     //buff_sz = 110;
00169 
00170     /*  USBFX2_EP_READ => end point addr.
00171     buff => bytes to read (has to be <64 bytes)
00172     USB_TOUT_MS => timeout in ms
00173     */
00174     int retval = usb_bulk_read(stdHandle, USBFX2_EP_READ, (char*)pData, buff_sz, USB_TOUT_MS);
00175 
00176 //    printf("readData: read %d bytes\n", retval);
00177 
00178     if (retval > 0) {
00179         //*lread = retval/buff_sz;
00180         *lread = (int)(retval / (unsigned long)sizeof(unsigned short));
00181         //*lread *= 4;
00182         return SUCCEED;
00183     } else {
00184       if(retval==-110) { 
00185         //Think this is a timeout
00186         usleep(1000);
00187         retval = usb_bulk_read(stdHandle, USBFX2_EP_READ, (char*)pData, buff_sz, USB_TOUT_MS);
00188         if(retval>0) {
00189           *lread = (int)(retval / (unsigned long)sizeof(unsigned short));
00190           return SUCCEED;
00191         }
00192       }
00193       else {           
00194         printf("error code: %d %s\n", retval,strerror(-1 * retval));      
00195         *lread = retval;
00196       }
00197       return FAILED;
00198     }
00199 }

Generated on Tue Nov 24 19:05:00 2009 for CREAM TEA -- MCP/TARGET Readout by doxygen 1.3.9.1