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
1.3.9.1