/* List connected TCTEC Relays */ void listRelays() { int ret, i, bRelayStates; struct ftdi_device_list *devlist, *curdev; char manufacturer[128], description[128], serial[128], buf[1]; if ((ret = ftdi_usb_find_all(&ftdic, &devlist, 0x0403, 0x6001)) < 0) { fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); return; } printf("Number of FTDI devices found: %d\n", ret); for (curdev = devlist; curdev != NULL; i++) { if ((ret = ftdi_usb_get_strings(&ftdic, curdev->dev, manufacturer, 128, description, 128, serial, 128)) < 0) { fprintf(stderr, "ftdi_usb_get_strings failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); return; } if (strncmp(description, "TCTEC USB RELAY", 15) == 0) { printf("Manufacturer: %s, Description: %s, Serial: %s\n\n", manufacturer, description, serial); } curdev = curdev->next; } ftdi_list_free(&devlist); ftdi_deinit(&ftdic); return; }
void list_devices() { struct ftdi_context *ftdi; struct ftdi_device_list *dev_list; struct ftdi_device_list *dev_current; int num_devices; ftdi = ftdi_new(); if (!ftdi) { fprintf(stderr, "failed to initialize ftdi context\n"); exit(1); } num_devices = ftdi_usb_find_all(ftdi, &dev_list, VID, PID); if (num_devices < 0) { fprintf(stderr, "ftdi error: %s\n", ftdi_get_error_string(ftdi)); goto error; } if (!num_devices) { printf("unable to find saturn device!\n"); goto done; } dev_current = dev_list; num_devices = 0; while (dev_current) { char manufacturer[255]; char description[255]; char serial[255]; if (ftdi_usb_get_strings(ftdi, dev_current->dev, manufacturer, 255, description, 255, serial, 255) < 0) { fprintf(stderr, "ftdi error: %s\n", ftdi_get_error_string(ftdi)); goto done; } if (strcmp(DESCRIPTION, description) == 0) printf("%d: %s (%s, %s)\n", num_devices++, description, manufacturer, serial); dev_current = dev_current->next; } if (!num_devices) printf("unable to find saturn device!\n"); done: ftdi_list_free(&dev_list); error: ftdi_free(ftdi); }
int GetFTDIDevicePortNumUSingLibFTDI(UInt32 locationIDFromInterface) { int ret, i; struct ftdi_context ftdic; struct ftdi_device_list *devlist, *curdev; char manufacturer[128], description[128]; if (ftdi_init(&ftdic) < 0) { fprintf(stderr, "ftdi_init failed\n"); return -1; } if ((ret = ftdi_usb_find_all(&ftdic, &devlist, 0x0403, 0x6001)) < 0) { fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); return -1; } printf("Number of FTDI devices found: %d\n", ret); i = 0; for (curdev = devlist; curdev != NULL; i++) { //printf("Checking device: %d\n", i); if ((ret = ftdi_usb_get_strings(&ftdic, curdev->dev, manufacturer, 128, description, 128, NULL, 0)) < 0) { fprintf(stderr, "ftdi_usb_get_strings failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); return -1; } uint32_t *locationId = (uint32_t *)malloc(sizeof(uint32_t)); xlibusb_get_device_location_id((struct libusb_device *)curdev->dev->dev,locationId); printf("Manufacturer: %s, Description: %s\n\n", manufacturer, description); if ((*locationId) == locationIDFromInterface) { free(locationId); return i; } free(locationId); //printf("0x%x deviceDesc[%d] %s",(unsigned int)&(deviceDesc[i]),i,deviceDesc[i]); curdev = curdev->next; } ftdi_list_free(&devlist); ftdi_deinit(&ftdic); return -1; }
struct FtdiDevice::usbInformation* FtdiDevice::fetchUsbInformation( ftdi_context* context, struct usb_device* dev ) { struct usbInformation* info = new struct usbInformation(); int r = ftdi_usb_get_strings( context, dev, info->manufacturer, USB_INFO_FIELD_LENGTH, info->description, USB_INFO_FIELD_LENGTH, info->serial, USB_INFO_FIELD_LENGTH ); if ( r < 0 ) { delete info; info = 0; } return info; }
int Context::get_strings() { // Prepare buffers char vendor[512], desc[512], serial[512]; int ret = ftdi_usb_get_strings(d->ftdi, d->dev, vendor, 512, desc, 512, serial, 512); if (ret < 0) return -1; d->vendor = vendor; d->description = desc; d->serial = serial; return 1; }
/* Fills spi_ports array with discovered devices, sets spi_nports */ static int spi_enumerate_ports(void) { int id, rc; struct ftdi_device_list *ftdevlist, *ftdev; spi_nports = 0; for (id = 0; id < sizeof(ftdi_device_ids) / sizeof(ftdi_device_ids[0]) && spi_nports < SPI_MAX_PORTS; id++) { LOG(DEBUG, "find all: 0x%04x:0x%04x", ftdi_device_ids[id].vid, ftdi_device_ids[id].pid); rc = ftdi_usb_find_all(&ftdic, &ftdevlist, ftdi_device_ids[id].vid, ftdi_device_ids[id].pid); if (rc < 0) { SPI_ERR("FTDI: ftdi_usb_find_all() failed: %s", ftdi_get_error_string(&ftdic)); return -1; } if (rc == 0) continue; for (ftdev = ftdevlist; ftdev && spi_nports < SPI_MAX_PORTS; ftdev = ftdev->next) { spi_ports[spi_nports].vid = ftdi_device_ids[id].vid; spi_ports[spi_nports].pid = ftdi_device_ids[id].pid; if (ftdi_usb_get_strings(&ftdic, ftdev->dev, spi_ports[spi_nports].manuf, sizeof(spi_ports[spi_nports].manuf), spi_ports[spi_nports].desc, sizeof(spi_ports[spi_nports].desc), spi_ports[spi_nports].serial, sizeof(spi_ports[spi_nports].serial)) < 0) { SPI_ERR("FTDI: ftdi_usb_get_strings() failed: %s", ftdi_get_error_string(&ftdic)); return -1; } snprintf(spi_ports[spi_nports].name, sizeof(spi_ports[spi_nports].name), "%s %s", ftdi_device_ids[id].name, spi_ports[spi_nports].serial); LOG(INFO, "Found device: name=\"%s\", manuf=\"%s\", desc=\"%s\", serial=\"%s\", vid=0x%04x, pid=0x%04x", spi_ports[spi_nports].name, spi_ports[spi_nports].manuf, spi_ports[spi_nports].desc, spi_ports[spi_nports].serial, ftdi_device_ids[id].vid, ftdi_device_ids[id].pid); spi_nports++; } ftdi_list_free(&ftdevlist); } return 0; }
int main(int argc, char **argv) { int ret, i, no_devices; struct ftdi_context ftdic; struct ftdi_device_list *devlist, *curdev; char manufacturer[128], description[128]; char serial[128]; if (ftdi_init(&ftdic) < 0) { std::cerr << "ftdi_init failed" << std::endl; return EXIT_FAILURE; } if ((no_devices = ftdi_usb_find_all(&ftdic, &devlist, 0x0403, 0x6001)) < 0) { std::cerr << "ftdi_usb_find_all failed: " << ftdi_get_error_string(&ftdic) << std::endl; return EXIT_FAILURE; } std::cout << "Number of FTDI devices found: " << no_devices << std::endl; i = 0; for (curdev = devlist; curdev != NULL; i++) { std::cout << "Device #" << i << std::endl; if ((ret = ftdi_usb_get_strings(&ftdic, curdev->dev, manufacturer, 128, description, 128, serial, 128)) < 0) { std::cerr << "ftdi_usb_get_strings failed: " << ftdi_get_error_string(&ftdic) << std::endl; return EXIT_FAILURE; } std::cout << " Manufacturer: " << manufacturer << std::endl; std::cout << " Description : " << description << std::endl; std::cout << " Serial Id : " << serial << std::endl; curdev = curdev->next; } ftdi_list_free(&devlist); ftdi_deinit(&ftdic); return 0; }
int sys_init() { int ret, i; struct ftdi_device_list *devlist, *curdev; char manufacturer[128], description[128], serialno[128]; if (ftdi_init(&ux400_ftdic) < 0) { fprintf(stderr, "ftdi_init failed\n"); return EXIT_FAILURE; } #if 0 if ((ret = ftdi_usb_find_all(&ux400_ftdic, &devlist, UX400VENDOR, UX400PRODUCT)) < 0) { fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", ret, ftdi_get_error_string(&ux400_ftdic)); return EXIT_FAILURE; } printf("Number of FTDI devices found: %d\n", ret); i = 0; for (curdev = devlist; curdev != NULL; i++) { printf("Checking device: %d\n", i); if ((ret = ftdi_usb_get_strings(&ux400_ftdic, curdev->dev, manufacturer, 128, description, 128, serialno, 128)) < 0) { fprintf(stderr, "ftdi_usb_get_strings failed: %d (%s)\n", ret, ftdi_get_error_string(&ux400_ftdic)); return EXIT_FAILURE; } printf("Manufacturer: %s, Description: %s, Serial number: %s\n\n", manufacturer, description, serialno); curdev = curdev->next; } ftdi_list_free(&devlist); #endif if((ret = ftdi_usb_open_desc(&ux400_ftdic, UX400VENDOR, UX400PRODUCT, UX400DES, UX400_LOCAL_SN)) < 0) { fprintf(stderr, "ftdi_usb_open_desc failed: %d (%s)\n", ret, ftdi_get_error_string(&ux400_ftdic)); return EXIT_FAILURE; } if((ret = ftdi_usb_reset(&ux400_ftdic)) < 0) { fprintf(stderr, "ftdi_usb_reset failed: %d (%s)\n", ret, ftdi_get_error_string(&ux400_ftdic)); return EXIT_FAILURE; } if((ret = ftdi_set_baudrate(&ux400_ftdic, 9600)) < 0) { fprintf(stderr, "ftdi_set_baudrate failed: %d (%s)\n", ret, ftdi_get_error_string(&ux400_ftdic)); return EXIT_FAILURE; } if((ret = ftdi_set_bitmode(&ux400_ftdic, 0x00, BITMODE_RESET)) < 0) { fprintf(stderr, "ftdi_set_bitmode failed: %d (%s)\n", ret, ftdi_get_error_string(&ux400_ftdic)); return EXIT_FAILURE; } usleep(10000); if((ret = ftdi_set_bitmode(&ux400_ftdic, 0x00, BITMODE_MCU)) < 0) { fprintf(stderr, "ftdi_set_bitmode failed: %d (%s)\n", ret, ftdi_get_error_string(&ux400_ftdic)); return EXIT_FAILURE; } return 0; }
QList<DMXInterface *> LibFTDIInterface::interfaces(QList<DMXInterface *> discoveredList) { QList <DMXInterface*> interfacesList; int id = 0; struct ftdi_context ftdi; ftdi_init(&ftdi); #ifdef LIBFTDI1 libusb_device *dev; libusb_device **devs; struct libusb_device_descriptor dev_descriptor; int i = 0; if (libusb_get_device_list(ftdi.usb_ctx, &devs) < 0) { qDebug() << "usb_find_devices() failed"; return interfacesList; } while ((dev = devs[i++]) != NULL) { libusb_get_device_descriptor(dev, &dev_descriptor); #else struct usb_bus *bus; struct usb_device *dev; struct usb_device_descriptor dev_descriptor; usb_init(); if (usb_find_busses() < 0) { qDebug() << "usb_find_busses() failed"; return interfacesList; } if (usb_find_devices() < 0) { qDebug() << "usb_find_devices() failed"; return interfacesList; } for (bus = usb_get_busses(); bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { dev_descriptor = dev->descriptor; #endif Q_ASSERT(dev != NULL); // Skip non wanted devices if (validInterface(dev_descriptor.idVendor, dev_descriptor.idProduct) == false) continue; char ser[256]; memset(ser, 0, 256); char nme[256]; char vend[256]; ftdi_usb_get_strings(&ftdi, dev, vend, 256, nme, 256, ser, 256); QString serial(ser); QString name(nme); QString vendor(vend); qDebug() << Q_FUNC_INFO << "DMX USB VID:" << QString::number(dev_descriptor.idVendor, 16) << "PID:" << QString::number(dev_descriptor.idProduct, 16); qDebug() << Q_FUNC_INFO << "DMX USB serial: " << serial << "name:" << name << "vendor:" << vendor; bool found = false; for (int c = 0; c < discoveredList.count(); c++) { if (discoveredList.at(c)->checkInfo(serial, name, vendor) == true) { found = true; break; } } if (found == false) { LibFTDIInterface *iface = new LibFTDIInterface(serial, name, vendor, dev_descriptor.idVendor, dev_descriptor.idProduct, id++); #ifdef LIBFTDI1 iface->setBusLocation(libusb_get_port_number(dev)); #else iface->setBusLocation(dev->bus->location); #endif interfacesList << iface; } #ifndef LIBFTDI1 } #endif } #ifdef LIBFTDI1 libusb_free_device_list(devs, 1); #endif ftdi_deinit(&ftdi); return interfacesList; } bool LibFTDIInterface::open() { if (isOpen() == true) return true; QByteArray sba = serial().toLatin1(); const char *ser = NULL; if (serial().isEmpty() == false) ser = (const char *)sba.data(); if (ftdi_usb_open_desc(&m_handle, vendorID(), productID(), name().toLatin1(), ser) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::openByPID(const int PID) { if (isOpen() == true) return true; if (ftdi_usb_open(&m_handle, DMXInterface::FTDIVID, PID) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::close() { if (ftdi_usb_close(&m_handle) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::isOpen() const { return (m_handle.usb_dev != NULL) ? true : false; } bool LibFTDIInterface::reset() { if (ftdi_usb_reset(&m_handle) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::setLineProperties() { if (ftdi_set_line_property(&m_handle, BITS_8, STOP_BIT_2, NONE) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::setBaudRate() { if (ftdi_set_baudrate(&m_handle, 250000) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::setFlowControl() { if (ftdi_setflowctrl(&m_handle, SIO_DISABLE_FLOW_CTRL) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::clearRts() { if (ftdi_setrts(&m_handle, 0) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::purgeBuffers() { if (ftdi_usb_purge_buffers(&m_handle) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool LibFTDIInterface::setBreak(bool on) { ftdi_break_type type; if (on == true) type = BREAK_ON; else type = BREAK_OFF; if (ftdi_set_line_property2(&m_handle, BITS_8, STOP_BIT_2, NONE, type) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } }
QList <DMXUSBWidget*> QLCFTDI::widgets() { QList <DMXUSBWidget*> widgetList; quint32 input_id = 0; struct ftdi_context ftdi; ftdi_init(&ftdi); #ifdef LIBFTDI1 libusb_device *dev; libusb_device **devs; int i = 0; if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0) { qDebug() << "usb_find_devices() failed"; ftdi_error_return(-5, "libusb_get_device_list() failed"); } while ((dev = devs[i++]) != NULL) { #else struct usb_bus *bus; struct usb_device *dev; usb_init(); if (usb_find_busses() < 0) { qDebug() << "usb_find_busses() failed"; return widgetList; } if (usb_find_devices() < 0) { qDebug() << "usb_find_devices() failed"; return widgetList; } for (bus = usb_get_busses(); bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { #endif Q_ASSERT(dev != NULL); // Skip non wanted devices if (dev->descriptor.idVendor != QLCFTDI::FTDIVID && dev->descriptor.idVendor != QLCFTDI::ATMELVID) continue; if (dev->descriptor.idProduct != QLCFTDI::FTDIPID && dev->descriptor.idProduct != QLCFTDI::DMX4ALLPID && dev->descriptor.idProduct != QLCFTDI::NANODMXPID) continue; char ser[256]; char nme[256]; char vend[256]; ftdi_usb_get_strings(&ftdi, dev, vend, 256, nme, 256, ser, 256); QString serial(ser); QString name(nme); QString vendor(vend); QMap <QString,QVariant> types(typeMap()); qDebug() << Q_FUNC_INFO << "DMX USB VID:" << QString::number(dev->descriptor.idVendor, 16) << "PID:" << QString::number(dev->descriptor.idProduct, 16); qDebug() << Q_FUNC_INFO << "DMX USB serial: " << serial << "name:" << name << "vendor:" << vendor; if (types.contains(serial) == true) { // Force a widget with a specific serial to either type DMXUSBWidget::Type type = (DMXUSBWidget::Type) types[serial].toInt(); switch (type) { case DMXUSBWidget::OpenTX: widgetList << new EnttecDMXUSBOpen(serial, name, vendor); break; case DMXUSBWidget::ProRX: { EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++); widgetList << prorx; break; } case DMXUSBWidget::ProMk2: { EnttecDMXUSBProTX* protx = new EnttecDMXUSBProTX(serial, name, vendor, 1); widgetList << protx; widgetList << new EnttecDMXUSBProTX(serial, name, vendor, 2, protx->ftdi()); EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protx->ftdi()); widgetList << prorx; break; } case DMXUSBWidget::UltraProTx: { UltraDMXUSBProTx* protx = new UltraDMXUSBProTx(serial, name, vendor, 1); widgetList << protx; widgetList << new UltraDMXUSBProTx(serial, name, vendor, 2, protx->ftdi()); EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protx->ftdi()); widgetList << prorx; break; } case DMXUSBWidget::VinceTX: widgetList << new VinceUSBDMX512TX(serial, name, vendor); break; default: case DMXUSBWidget::ProTX: widgetList << new EnttecDMXUSBProTX(serial, name, vendor); break; } } else if (name.toUpper().contains("PRO MK2") == true) { EnttecDMXUSBProTX* protx = new EnttecDMXUSBProTX(serial, name, vendor, 1); widgetList << protx; widgetList << new EnttecDMXUSBProTX(serial, name, vendor, 2, protx->ftdi()); EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protx->ftdi()); widgetList << prorx; } else if (name.toUpper().contains("DMX USB PRO")) { /** Check if the device responds to label 77 and 78, so it might be a DMXking adapter */ int ESTAID = 0; int DEVID = 0; QString manName = readLabel(&ftdi, name.toLatin1().data(), serial.toLatin1().data(), USB_DEVICE_MANUFACTURER, &ESTAID); qDebug() << "--------> Device Manufacturer: " << manName; QString devName = readLabel(&ftdi, name.toLatin1().data(), serial.toLatin1().data(), USB_DEVICE_NAME, &DEVID); qDebug() << "--------> Device Name: " << devName; qDebug() << "--------> ESTA Code: " << QString::number(ESTAID, 16) << ", Device ID: " << QString::number(DEVID, 16); if (ESTAID == DMXKING_ESTA_ID) { if (DEVID == ULTRADMX_PRO_DEV_ID) { UltraDMXUSBProTx* protxP1 = new UltraDMXUSBProTx(serial, name, vendor, 1); protxP1->setRealName(devName); widgetList << protxP1; UltraDMXUSBProTx* protxP2 = new UltraDMXUSBProTx(serial, name, vendor, 2, protxP1->ftdi()); protxP2->setRealName(devName); widgetList << protxP2; EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protxP1->ftdi()); prorx->setRealName(devName); widgetList << prorx; } else { EnttecDMXUSBProTX* protx = new EnttecDMXUSBProTX(serial, name, vendor); protx->setRealName(devName); widgetList << protx; } } else { /* This is probably a Enttec DMX USB Pro widget */ EnttecDMXUSBProTX* protx = new EnttecDMXUSBProTX(serial, name, vendor); widgetList << protx; EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protx->ftdi()); widgetList << prorx; } } else if (name.toUpper().contains("USB-DMX512 CONVERTER") == true) { widgetList << new VinceUSBDMX512TX(serial, name, vendor); } else if (dev->descriptor.idVendor == QLCFTDI::FTDIVID && dev->descriptor.idProduct == QLCFTDI::DMX4ALLPID) { widgetList << new Stageprofi(serial, name, vendor); } #if defined(Q_WS_X11) || defined(Q_OS_LINUX) else if (dev->descriptor.idVendor == QLCFTDI::ATMELVID && dev->descriptor.idProduct == QLCFTDI::NANODMXPID) { widgetList << new NanoDMX(serial, name, vendor); } #endif else { /* This is probably an Open DMX USB widget */ widgetList << new EnttecDMXUSBOpen(serial, name, vendor, 0); } #ifndef LIBFTDI1 } #endif } #ifdef LIBFTDI1 libusb_free_device_list(devs, 1); #endif ftdi_deinit(&ftdi); return widgetList; } bool QLCFTDI::open() { if (m_openCount < m_refCount) m_openCount++; if (isOpen() == true) return true; if (ftdi_usb_open_desc(&m_handle, QLCFTDI::FTDIVID, QLCFTDI::FTDIPID, name().toLatin1(), serial().toLatin1()) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::openByPID(const int PID) { if (m_openCount < m_refCount) m_openCount++; if (isOpen() == true) return true; if (ftdi_usb_open(&m_handle, QLCFTDI::FTDIVID, PID) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::close() { if (m_openCount > 1) { m_openCount--; return true; } if (ftdi_usb_close(&m_handle) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::isOpen() const { return (m_handle.usb_dev != NULL) ? true : false; } bool QLCFTDI::reset() { if (ftdi_usb_reset(&m_handle) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::setLineProperties() { if (ftdi_set_line_property(&m_handle, BITS_8, STOP_BIT_2, NONE) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::setBaudRate() { if (ftdi_set_baudrate(&m_handle, 250000) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::setFlowControl() { if (ftdi_setflowctrl(&m_handle, SIO_DISABLE_FLOW_CTRL) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::clearRts() { if (ftdi_setrts(&m_handle, 0) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::purgeBuffers() { if (ftdi_usb_purge_buffers(&m_handle) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } } bool QLCFTDI::setBreak(bool on) { ftdi_break_type type; if (on == true) type = BREAK_ON; else type = BREAK_OFF; if (ftdi_set_line_property2(&m_handle, BITS_8, STOP_BIT_2, NONE, type) < 0) { qWarning() << Q_FUNC_INFO << name() << ftdi_get_error_string(&m_handle); return false; } else { return true; } }
QList <DMXUSBWidget*> QLCFTDI::widgets() { QList <DMXUSBWidget*> widgetList; quint32 input_id = 0; struct ftdi_device_list* list = 0; struct ftdi_context ftdi; ftdi_init(&ftdi); ftdi_usb_find_all(&ftdi, &list, QLCFTDI::VID, QLCFTDI::PID); while (list != NULL) { #ifdef LIBFTDI1 struct libusb_device* dev = list->dev; #else struct usb_device* dev = list->dev; #endif Q_ASSERT(dev != NULL); char serial[256]; char name[256]; char vendor[256]; ftdi_usb_get_strings(&ftdi, dev, vendor, sizeof(vendor), name, sizeof(name), serial, sizeof(serial)); QString ser(serial); QString nme(name); QString ven(vendor); QMap <QString,QVariant> types(typeMap()); qDebug() << "serial: " << ser << "name:" << nme << "vendor:" << ven; if (types.contains(ser) == true) { // Force a widget with a specific serial to either type DMXUSBWidget::Type type = (DMXUSBWidget::Type) types[ser].toInt(); switch (type) { case DMXUSBWidget::OpenTX: widgetList << new EnttecDMXUSBOpen(serial, name, vendor); break; case DMXUSBWidget::ProRX: { EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++); widgetList << prorx; break; } case DMXUSBWidget::ProMk2: { EnttecDMXUSBProTX* protx = new EnttecDMXUSBProTX(serial, name, vendor, 1); widgetList << protx; widgetList << new EnttecDMXUSBProTX(serial, name, vendor, 2, protx->ftdi()); EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protx->ftdi()); widgetList << prorx; break; } case DMXUSBWidget::UltraProTx: { UltraDMXUSBProTx* protx = new UltraDMXUSBProTx(serial, name, vendor, 1); widgetList << protx; widgetList << new UltraDMXUSBProTx(serial, name, vendor, 2, protx->ftdi()); EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protx->ftdi()); widgetList << prorx; break; } case DMXUSBWidget::VinceTX: widgetList << new VinceUSBDMX512TX(serial, name, vendor); break; default: case DMXUSBWidget::ProTX: widgetList << new EnttecDMXUSBProTX(serial, name, vendor); break; } } else if (nme.toUpper().contains("PRO MK2") == true) { EnttecDMXUSBProTX* protx = new EnttecDMXUSBProTX(serial, name, vendor, 1); widgetList << protx; widgetList << new EnttecDMXUSBProTX(serial, name, vendor, 2, protx->ftdi()); EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protx->ftdi()); widgetList << prorx; } else if (nme.toUpper().contains("DMX USB PRO")) { /** Check if the device responds to label 77 and 78, so it might be a DMXking adapter */ int ESTAID = 0; int DEVID = 0; QString manName = readLabel(&ftdi, name, serial, USB_DEVICE_MANUFACTURER, &ESTAID); qDebug() << "--------> Device Manufacturer: " << manName; QString devName = readLabel(&ftdi, name, serial, USB_DEVICE_NAME, &DEVID); qDebug() << "--------> Device Name: " << devName; qDebug() << "--------> ESTA Code: " << QString::number(ESTAID, 16) << ", Device ID: " << QString::number(DEVID, 16); if (ESTAID == DMXKING_ESTA_ID) { if (DEVID == ULTRADMX_PRO_DEV_ID) { UltraDMXUSBProTx* protxP1 = new UltraDMXUSBProTx(serial, name, vendor, 1); protxP1->setRealName(devName); widgetList << protxP1; UltraDMXUSBProTx* protxP2 = new UltraDMXUSBProTx(serial, name, vendor, 2, protxP1->ftdi()); protxP2->setRealName(devName); widgetList << protxP2; EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protxP1->ftdi()); prorx->setRealName(devName); widgetList << prorx; } else { EnttecDMXUSBProTX* protx = new EnttecDMXUSBProTX(serial, name, vendor); protx->setRealName(devName); widgetList << protx; } } else { /* This is probably a Enttec DMX USB Pro widget */ EnttecDMXUSBProTX* protx = new EnttecDMXUSBProTX(serial, name, vendor); widgetList << protx; EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, vendor, input_id++, protx->ftdi()); widgetList << prorx; } } else if (nme.toUpper().contains("USB-DMX512 CONVERTER") == true) { widgetList << new VinceUSBDMX512TX(serial, name, vendor); } else { /* This is probably an Open DMX USB widget */ widgetList << new EnttecDMXUSBOpen(serial, name, vendor, 0); } list = list->next; } /* Search for DMX4ALL devices now */ ftdi_usb_find_all(&ftdi, &list, QLCFTDI::VID, QLCFTDI::DMX4ALLPID); while (list != NULL) { #ifdef LIBFTDI1 struct libusb_device* dev = list->dev; #else struct usb_device* dev = list->dev; #endif Q_ASSERT(dev != NULL); char serial[256]; char name[256]; char vendor[256]; ftdi_usb_get_strings(&ftdi, dev, vendor, sizeof(vendor), name, sizeof(name), serial, sizeof(serial)); QString ser(serial); QString nme(name); QString ven(vendor); qDebug() << "serial: " << ser << "name:" << nme << "vendor:" << ven; widgetList << new DMX4ALL(ser, nme, ven); list = list->next; } ftdi_deinit(&ftdi); return widgetList; }
static GSList *scan(struct sr_dev_driver *di, GSList *options) { struct sr_dev_inst *sdi; struct drv_context *drvc; struct dev_context *devc; GSList *devices; struct ftdi_device_list *devlist; char serial_txt[10]; uint32_t serial; int ret; unsigned int i; (void)options; drvc = di->context; devices = NULL; devc = g_malloc0(sizeof(struct dev_context)); ftdi_init(&devc->ftdic); /* Look for SIGMAs. */ if ((ret = ftdi_usb_find_all(&devc->ftdic, &devlist, USB_VENDOR, USB_PRODUCT)) <= 0) { if (ret < 0) sr_err("ftdi_usb_find_all(): %d", ret); goto free; } /* Make sure it's a version 1 or 2 SIGMA. */ ftdi_usb_get_strings(&devc->ftdic, devlist->dev, NULL, 0, NULL, 0, serial_txt, sizeof(serial_txt)); sscanf(serial_txt, "%x", &serial); if (serial < 0xa6010000 || serial > 0xa602ffff) { sr_err("Only SIGMA and SIGMA2 are supported " "in this version of libsigrok."); goto free; } sr_info("Found ASIX SIGMA - Serial: %s", serial_txt); devc->cur_samplerate = samplerates[0]; devc->period_ps = 0; devc->limit_msec = 0; devc->cur_firmware = -1; devc->num_channels = 0; devc->samples_per_event = 0; devc->capture_ratio = 50; devc->use_triggers = 0; /* Register SIGMA device. */ sdi = g_malloc0(sizeof(struct sr_dev_inst)); sdi->status = SR_ST_INITIALIZING; sdi->vendor = g_strdup(USB_VENDOR_NAME); sdi->model = g_strdup(USB_MODEL_NAME); sdi->driver = di; for (i = 0; i < ARRAY_SIZE(channel_names); i++) sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE, channel_names[i]); devices = g_slist_append(devices, sdi); drvc->instances = g_slist_append(drvc->instances, sdi); sdi->priv = devc; /* We will open the device again when we need it. */ ftdi_list_free(&devlist); return devices; free: ftdi_deinit(&devc->ftdic); g_free(devc); return NULL; }
bool CKMotionIO::RequestedDeviceAvail(char *Reason) { int ftStatus, i, numDevs, list[MAX_BOARDS]; struct ftdi_device_list *devlist, *curdev; bool error; char Manufacturer[128]; //char SerialNumber[16]; char Description[64]; error = false; devlist = NULL; Mutex->Lock(); // fill the list with -1 because driver // leaves the entries for open drivers unchanged for (i=0; i<MAX_BOARDS; i++) list[i]=-1; numDevs = ftStatus = ftdi_usb_find_all(ftdi, &devlist, VENDOR, PRODUCT ); if (ftStatus < 0) { if (Reason) sprintf(Reason,"Failed to enumerate USB devices. %s(%d)",ftdi_get_error_string(ftdi), ftStatus); error = true; } else if (numDevs == 0) { error = true; if (Reason) strcpy(Reason,"No KMotion devices available"); } else if (numDevs > MAX_BOARDS) { error = true; if (Reason) strcpy(Reason,"Too many KMotion devices available"); } if(error){ if(devlist != NULL){ ftdi_list_free(&devlist); } Mutex->Unlock(); return false; } // go through the list and remove any non-dynomotion boards i = 0; for (curdev = devlist; curdev != NULL; i++) { if ((ftStatus = ftdi_usb_get_strings(ftdi, curdev->dev, Manufacturer, 128, Description, 128, NULL, 0)) < 0) { log_info("ftdi_usb_get_strings failed: %d (%s)",ftStatus, ftdi_get_error_string(ftdi)); // FT_Open failed list[i] = -1; // mark as unusable } else { debug("%s\n%s",Manufacturer, Description); if (strstr(Description,"KFLOP")!= NULL || strstr(Description,"KMotion")!= NULL || strstr(Description,"Dynomotion")!= NULL) { //save index list[i] = i; } } curdev = curdev->next; } ftdi_list_free(&devlist); // if USB Location is undefined select the first from // the list that is not already taken if (!BoardIDAssigned) { for (i=0; i<numDevs && !BoardIDAssigned; i++) { if (list[i] != -1) { int k; // make sure nobody is already using this one for (k=0; k<MAX_BOARDS; k++) { if (list[i]==KMotionLocal.KMotionIO[k].USB_Loc_ID) break; } if (k==MAX_BOARDS) { BoardIDAssigned=true; USB_Loc_ID=list[i]; // assign it debug("Board location %d", USB_Loc_ID); } } } if (!BoardIDAssigned) { Mutex->Unlock(); if (Reason) strcpy(Reason,"No KMotion devices available"); return false; } } // user wants a specific usb location // so see if it is available for (i=0; i<numDevs; i++) { if (list[i]==USB_Loc_ID) break; } if (i==numDevs) { Mutex->Unlock(); if (Reason) sprintf(Reason,"KMotion not found on USB Location %08X\n" "Unable to open device",USB_Loc_ID); return false; } Mutex->Unlock(); return true; }
QList <EnttecDMXUSBWidget*> QLCFTDI::widgets() { QList <EnttecDMXUSBWidget*> widgetList; struct ftdi_device_list* list = 0; struct ftdi_context ftdi; ftdi_init(&ftdi); ftdi_usb_find_all(&ftdi, &list, QLCFTDI::VID, QLCFTDI::PID); while (list != NULL) { struct usb_device* dev = list->dev; Q_ASSERT(dev != NULL); char serial[256]; char name[256]; char vendor[256]; ftdi_usb_get_strings(&ftdi, dev, vendor, sizeof(vendor), name, sizeof(name), serial, sizeof(serial)); QString ser(serial); QString ven(vendor); QMap <QString,QVariant> types(typeMap()); if (types.contains(ser) == true) { // Force a widget with a specific serial to either type EnttecDMXUSBWidget::Type type = (EnttecDMXUSBWidget::Type) types[ser].toInt(); switch (type) { case EnttecDMXUSBWidget::OpenTX: widgetList << new EnttecDMXUSBOpen(serial, name); break; case EnttecDMXUSBWidget::ProRX: { EnttecDMXUSBProRX* prorx = new EnttecDMXUSBProRX(serial, name, widgetList.size()); widgetList << prorx; break; } default: case EnttecDMXUSBWidget::ProTX: widgetList << new EnttecDMXUSBProTX(serial, name); break; } } else if (ven.toUpper().contains("FTDI") == true) { /* This is probably an Open DMX USB widget */ widgetList << new EnttecDMXUSBOpen(serial, name, 0); } else { /* This is probably a DMX USB Pro widget in TX mode */ widgetList << new EnttecDMXUSBProTX(serial, name); } list = list->next; } ftdi_deinit(&ftdi); return widgetList; }