Exemple #1
0
static int usbdk_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs)
{
	int r = LIBUSB_SUCCESS;
	ULONG i;
	struct discovered_devs *discdevs = NULL;
	ULONG dev_number;
	PUSB_DK_DEVICE_INFO devices;

	if(!usbdk_helper.GetDevicesList(&devices, &dev_number))
		return LIBUSB_ERROR_OTHER;

	for (i = 0; i < dev_number; i++) {
		unsigned long session_id;
		struct libusb_device *dev = NULL;

		if (usbdk_get_session_id_for_device(ctx, &devices[i].ID, &session_id))
			continue;

		dev = usbi_get_device_by_session_id(ctx, session_id);
		if (dev == NULL) {
			dev = usbi_alloc_device(ctx, session_id);
			if (dev == NULL) {
				usbi_err(ctx, "failed to allocate a new device structure");
				continue;
			}

			usbdk_device_init(dev, &devices[i]);
			if (usbdk_device_priv_init(ctx, dev, &devices[i]) != LIBUSB_SUCCESS) {
				libusb_unref_device(dev);
				continue;
			}
		}

		discdevs = discovered_devs_append(*_discdevs, dev);
		libusb_unref_device(dev);
		if (!discdevs) {
			usbi_err(ctx, "cannot append new device to list");
			r = LIBUSB_ERROR_NO_MEM;
			goto func_exit;
		}

		*_discdevs = discdevs;
	}

func_exit:
	usbdk_helper.ReleaseDevicesList(devices);
	return r;
}
Exemple #2
0
bool USBHost::AddNewDevices(std::set<u64>& new_devices, DeviceChangeHooks& hooks,
                            const bool always_add_hooks)
{
#ifdef __LIBUSB__
  if (SConfig::GetInstance().m_usb_passthrough_devices.empty())
    return true;

  if (m_libusb_context)
  {
    libusb_device** list;
    const ssize_t count = libusb_get_device_list(m_libusb_context, &list);
    if (count < 0)
    {
      WARN_LOG(IOS_USB, "Failed to get device list: %s",
               libusb_error_name(static_cast<int>(count)));
      return false;
    }

    for (ssize_t i = 0; i < count; ++i)
    {
      libusb_device* device = list[i];
      libusb_device_descriptor descriptor;
      libusb_get_device_descriptor(device, &descriptor);
      if (!SConfig::GetInstance().IsUSBDeviceWhitelisted(
              {descriptor.idVendor, descriptor.idProduct}))
      {
        libusb_unref_device(device);
        continue;
      }

      auto usb_device = std::make_unique<USB::LibusbDevice>(m_ios, device, descriptor);
      if (!ShouldAddDevice(*usb_device))
      {
        libusb_unref_device(device);
        continue;
      }
      const u64 id = usb_device->GetId();
      new_devices.insert(id);
      if (AddDevice(std::move(usb_device)) || always_add_hooks)
        hooks.emplace(GetDeviceById(id), ChangeEvent::Inserted);
      else
        libusb_unref_device(device);
    }
    libusb_free_device_list(list, 0);
  }
#endif
  return true;
}
ConnectionStatus UsbConnection::usb_disconnect() {
    libusb_close(handler);
    libusb_unref_device (device);
    device = NULL;
    handler = NULL;
    return disconnected;
}
Exemple #4
0
int mcp2200_list_devices(int vendorID, int productID){
	libusb_device **devs;
	device_list_count = 0;
	free_list();
	int cnt = libusb_get_device_list(NULL, &devs);
	if (cnt < 0) return cnt;
	int i;
	for(i=0;i<cnt;i++){
		struct libusb_device_descriptor desc;

		int ok = 0;
		int r = libusb_get_device_descriptor(devs[i], &desc);
		if (r < 0) {
			fprintf(stderr, "failed to get device descriptor");
		} else{
			if (vendorID == desc.idVendor &&
					productID == desc.idProduct &&
					device_list_count < MCP2200_MAX_DEVICE_NUM){
				ok = 1;
			}
		}

		if (ok){
			device_list[device_list_count] = devs[i];
			device_list_count++;
		}else{
			libusb_unref_device(devs[i]);
		}
	}
	libusb_free_device_list(devs, 0);
	return device_list_count;
}
// Release hPortalInstance
void DisconnectPortal(void) {
	libusb_release_interface(g_hPortalHandle,0);
	libusb_unref_device(libusb_get_device(g_hPortalHandle));
	libusb_close(g_hPortalHandle);
	libusb_exit	(g_ctx);

}
Exemple #6
0
USBDevice::~USBDevice()
{
    close();

    libusb_unref_device(m_data->device);
    delete m_data;
}
XN_C_API XnStatus xnUSBIsDevicePresent(XnUInt16 nVendorID, XnUInt16 nProductID, void* pExtraParam, XnBool* pbDevicePresent)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	// make sure library was initialized
	XN_VALIDATE_USB_INIT();
	
	// Validate parameters
	XN_VALIDATE_OUTPUT_PTR(pbDevicePresent);

	*pbDevicePresent = FALSE;
	
	libusb_device* pDevice;
	nRetVal = FindDevice(nVendorID, nProductID, pExtraParam, &pDevice);
	XN_IS_STATUS_OK(nRetVal);
		
	if (pDevice != NULL)
	{
		*pbDevicePresent = TRUE;
		
		// unref device
		libusb_unref_device(pDevice);
	}
	
	return (XN_STATUS_OK);
}
ThreadedUsbReceiver::~ThreadedUsbReceiver() {
  {
    ola::thread::MutexLocker locker(&m_term_mutex);
    m_term = true;
  }
  Join();
  libusb_unref_device(m_usb_device);
}
Exemple #9
0
int 
usb_close(usb_handle * h)
{
	libusb_close(h->handle);
	h->handle = NULL;
	libusb_unref_device(h->dev);
	free(h);
	return (0);
}
Exemple #10
0
static void free_list(){
	if (device_list_count > 0){
		int i;
		for(i=0;i<device_list_count;i++){
			libusb_unref_device(device_list[i]);
		}
	}
	device_list_count = 0;
}
Exemple #11
0
static void discovered_devs_free(struct discovered_devs *discdevs)
{
	size_t i;

	for (i = 0; i < discdevs->len; i++)
		libusb_unref_device(discdevs->devices[i]);

	free(discdevs);
}
Exemple #12
0
USBDevice::~USBDevice()
{
    if (mHandle) {
        libusb_close(mHandle);
    }
    if (mDevice) {
        libusb_unref_device(mDevice);
    }
}
int
LibusbUsbTransport::Close()
{
	libusb_close(h->handle);
	h->handle = NULL;
	libusb_unref_device(h->dev);
	h.reset();
	return (0);
}
Exemple #14
0
Fichier : yusb.c Projet : emmt/yusb
static void ydev_free(void *self)
{
  ydev_instance_t *obj = (ydev_instance_t *)self;
  if (obj->handle != NULL) {
    libusb_close(obj->handle);
  }
  if (obj->device != NULL) {
    libusb_unref_device(obj->device);
  }
}
void
unref_connected_devs(bool remove/*=false*/)
{
  for (std::list<usb_device_t>::iterator it=__connected_arms->begin(); it != __connected_arms->end(); ++it) {
    if( !(*it).connected ) {
      libusb_unref_device((*it).dev);
      if( remove )
        it = __connected_arms->erase(it);
    }
  }
}
Exemple #16
0
void QUsb::qhyccd_free_device_list(qhyccd_device **list)
{
        qhyccd_device **cur = list;
        while (*cur != NULL) {
                libusb_unref_device(*cur);
                cur++;
        }
        if (list) {
                free(list);
        }
}
Exemple #17
0
/**
 * @brief Opens the camera specified by \a dev.
 *
 * @todo This is one of the places where we expose the fact that PTP uses libusb as a backend.
 *       It would be nice if we could let the caller completely ignore the underlying protocol.
 * @param[in] dev The \c libusb_device which specifies which device to connect to.
 * @exception PTP::ERR_ALREADY_OPEN if this \c CameraBase already has an open device.
 * @exception PTP::ERR_CANNOT_CONNECT if we cannot connect to the camera specified.
 * @return true if we successfully connect, false otherwise.
 */
bool CameraBase::open(libusb_device * dev) {
    if(this->handle != NULL) {  // Handle will be non-null if the device is already open
        throw PTP::ERR_ALREADY_OPEN;
        return false;
    }

    int err = libusb_open(dev, &(this->handle));    // Open the device, placing the handle in this->handle
    if(err) {
        throw PTP::ERR_CANNOT_CONNECT;
        return false;
    }
    libusb_unref_device(dev);   // We needed this device refed before we opened it, so we added an extra ref. open adds another ref, so remove one ref
    
    struct libusb_config_descriptor * desc;
    int r = libusb_get_active_config_descriptor(dev, &desc);
    
    if (r < 0) {
        this->usb_error = r;
        return false;
    }
    
    int j, k;
    
    for(j = 0; j < desc->bNumInterfaces; j++) {
        struct libusb_interface interface = desc->interface[j];
        for(k = 0; k < interface.num_altsetting; k++) {
            struct libusb_interface_descriptor altsetting = interface.altsetting[k];
            if(altsetting.bInterfaceClass == 6) { // If this has the PTP interface
                this->intf = &altsetting;
                libusb_claim_interface(this->handle, this->intf->bInterfaceNumber); // Claim the interface -- Needs to be done before I/O operations
                break;
            }
        }
        if(this->intf) break;
    }
    
    
    const struct libusb_endpoint_descriptor * endpoint;
    for(j = 0; j < this->intf->bNumEndpoints; j++) {
        endpoint = &(this->intf->endpoint[j]);
        if((endpoint->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK == LIBUSB_ENDPOINT_IN) &&
            (endpoint->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == LIBUSB_TRANSFER_TYPE_BULK) {
            this->ep_in = endpoint->bEndpointAddress;
        } else if((endpoint->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) {
            this->ep_out = endpoint->bEndpointAddress;
        }
    }
    
    libusb_free_config_descriptor(desc);
    
    // If we haven't detected an error by now, assume that this worked.
    return true;
}
Exemple #18
0
void libusb_free_device_list(libusb_device **list, int unref_devices) {
	libusb_device *dev;
	int i = 0;

	if (unref_devices) {
		for (dev = list[0]; dev != NULL; dev = list[++i]) {
			libusb_unref_device(dev);
		}
	}

	free(list);
}
/*
 * Free the list of devices obtained from the function 'getSOPASDeviceList'.
 */
void SickTimCommonUsb::freeSOPASDeviceList(libusb_device **list)
{
  if (!list)
    return;

  int i = 0;
  struct libusb_device *dev;
  while ((dev = list[i++]) != NULL)
    libusb_unref_device(dev);

  free(list);
}
Exemple #20
0
int luausb_device_gc(lua_State* L)
{
	libusb_device** dev;
	
	dev = (libusb_device**)lua_touserdata(L, 1);
	if (*dev)
	{
		libusb_unref_device(*dev);
		*dev = 0;
	}
	return 0;
}
Exemple #21
0
void
libusb_free_device_list(libusb_device **list, int unref_devices)
{
	int i;

	if (list == NULL)
		return;			/* be NULL safe */

	if (unref_devices) {
		for (i = 0; list[i] != NULL; i++)
			libusb_unref_device(list[i]);
	}
	free(list);
}
/** Internal creator.
 * This gets the actual device-handle, and establishes the USB connection.
 */
void
JacoArm::Create(usb_device_t &dev)
{
  // Get device handle
  if( libusb_open(dev.dev, &__devh) )
    throw KinDrvException("Failed getting usb-device-handle for JacoArm!" );

  // Claim usb interface
  if( libusb_claim_interface(__devh, 0) < 0 )
    throw KinDrvException("Could not claim usb interface 0!");

  dev.connected = true;
  libusb_unref_device(dev.dev);
}
//**********************************************************
//!
//! Release all devices referenced by bdm_usb_findDevices
//!
//!  @return\n
//!       ICP_RC_OK        - success \n
//!
ICP_ErrorType bdm_usb_releaseDevices(void) {

//   print("bdm_usb_releaseDevices() - \n");

   // Unreference all devices
   for(unsigned index=0; index<deviceCount; index++) {
      print("bdm_usb_releaseDevices() - unreferencing #%d\n", index);
      if (bdmDevices[index] != NULL)
         libusb_unref_device(bdmDevices[index]);
      bdmDevices[index] = NULL;
   }
   deviceCount = 0;
   return ICP_RC_OK;
}
Exemple #24
0
static void do_close(struct libusb_context *ctx,
	struct libusb_device_handle *dev_handle)
{
	struct usbi_transfer *itransfer;
	struct usbi_transfer *tmp;

	libusb_lock_events(ctx);

	
	usbi_mutex_lock(&ctx->flying_transfers_lock);

	
	list_for_each_entry_safe(itransfer, tmp, &ctx->flying_transfers, list, struct usbi_transfer) {
		struct libusb_transfer *transfer =
		        USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);

		if (transfer->dev_handle != dev_handle)
			continue;

		if (!(itransfer->flags & USBI_TRANSFER_DEVICE_DISAPPEARED)) {
			usbi_err(ctx, "Device handle closed while transfer was still being processed, but the device is still connected as far as we know");

			if (itransfer->flags & USBI_TRANSFER_CANCELLING)
				usbi_warn(ctx, "A cancellation for an in-flight transfer hasn't completed but closing the device handle");
			else
				usbi_err(ctx, "A cancellation hasn't even been scheduled on the transfer for which the device is closing");
		}

		usbi_mutex_lock(&itransfer->lock);
		list_del(&itransfer->list);
		transfer->dev_handle = NULL;
		usbi_mutex_unlock(&itransfer->lock);

		usbi_dbg("Removed transfer %p from the in-flight list because device handle %p closed",
			 transfer, dev_handle);
	}
	usbi_mutex_unlock(&ctx->flying_transfers_lock);

	libusb_unlock_events(ctx);

	usbi_mutex_lock(&ctx->open_devs_lock);
	list_del(&dev_handle->list);
	usbi_mutex_unlock(&ctx->open_devs_lock);

	usbi_backend->close(dev_handle);
	libusb_unref_device(dev_handle->dev);
	usbi_mutex_destroy(&dev_handle->lock);
	free(dev_handle);
}
Exemple #25
0
UsbDevice *
usbFindDevice (UsbDeviceChooser chooser, void *data) {
  int result;
  UsbDeviceExtension *devx;

  if (!usbContext) {
    if ((result = libusb_init(&usbContext)) != LIBUSB_SUCCESS) {
      usbSetErrno(result, "libusb_init");
      return NULL;
    }
  }

  if (!usbDeviceList) {
    ssize_t count;

    if ((count = libusb_get_device_list(usbContext, &usbDeviceList)) < 0) {
      usbSetErrno(count, "libusb_get_device_list");
      return NULL;
    }

    usbDeviceCount = count;
  }

  if ((devx = malloc(sizeof(*devx)))) {
    libusb_device **libusbDevice = usbDeviceList;
    int deviceCount = usbDeviceCount;

    while (deviceCount) {
      deviceCount -= 1;
      devx->device = *libusbDevice++;
      libusb_ref_device(devx->device);

      devx->handle = NULL;

      {
        UsbDevice *device = usbTestDevice(devx, chooser, data);
        if (device) return device;
      }

      libusb_unref_device(devx->device);
    }

    free(devx);
  } else {
    logMallocError();
  }

  return NULL;
}
Exemple #26
0
int libusb_submit_transfer(struct libusb_transfer *transfer) {
	usbi_transfer *itransfer = (usbi_transfer *)transfer;
	libusb_device_handle *dev_handle = transfer->dev_handle;
	libusb_context *ctx = dev_handle->dev->ctx;
	usbfs_urb *urb = &itransfer->urb;
	int rc;

	if (transfer->type != LIBUSB_TRANSFER_TYPE_BULK ||
		transfer->timeout != 0 || transfer->callback == NULL) {
		return LIBUSB_ERROR_INVALID_PARAM;
	}

	if (itransfer->submitted) {
		return LIBUSB_ERROR_BUSY;
	}

	libusb_ref_device(dev_handle->dev);

	itransfer->submitted = true;

	urb->status = INT32_MIN;
	urb->endpoint = transfer->endpoint;
	urb->buffer = transfer->buffer;
	urb->buffer_length = transfer->length;

	rc = ioctl(dev_handle->pollfd.fd, IOCTL_USBFS_SUBMITURB, urb);

	if (rc < 0) {
		if (errno == ENODEV) {
			rc = LIBUSB_ERROR_NO_DEVICE;
		} else {
			rc = LIBUSB_ERROR_IO;
		}

		itransfer->submitted = false;

		libusb_unref_device(dev_handle->dev);

		usbi_log_error(ctx, "Could not submit %s transfer %p (length: %d): %s (%d)",
		               (LIBUSB_ENDPOINT_IN & transfer->endpoint) != 0 ? "read" : "write",
		               transfer, transfer->length, get_errno_name(errno), errno);

		return rc;
	}

	node_insert_before(&dev_handle->itransfer_sentinel, &itransfer->node);

	return LIBUSB_SUCCESS;
}
Exemple #27
0
void disconnect_devices(void)
{
	struct dfu_if *pdfu;
	struct dfu_if *prev = NULL;

	for (pdfu = dfu_root; pdfu != NULL; pdfu = pdfu->next) {
		free(prev);
		libusb_unref_device(pdfu->dev);
		free(pdfu->alt_name);
		free(pdfu->serial_name);
		prev = pdfu;
	}
	free(prev);
	dfu_root = NULL;
}
Exemple #28
0
static void removeFreespaceDevice(struct FreespaceDevice* device) {
    int i;
    for (i = 0; i < FREESPACE_MAXIMUM_DEVICE_COUNT; i++) {
        if (devices[i] != NULL && devices[i]->id_ == device->id_) {
            if (nextFreeIndex == -1) {
                nextFreeIndex = i;
            }
            libusb_unref_device(device->dev_);
            free(device);
            devices[i] = NULL;
            numDevices--;
            return;
        }
    }
}
Exemple #29
0
void API_EXPORTED libusb_free_device_list(libusb_device **list,
	int unref_devices)
{
	if (!list)
		return;

	if (unref_devices) {
		int i = 0;
		struct libusb_device *dev;

		while ((dev = list[i++]) != NULL)
			libusb_unref_device(dev);
	}
	free(list);
}
Exemple #30
0
void ft232r_scan_free()
{
	if (!ft232r_devinfo_list)
		return;

	struct ft232r_device_info *info;

	for (struct ft232r_device_info **infop = ft232r_devinfo_list; (info = *infop); ++infop) {
		libusb_unref_device(info->libusb_dev);
		free(info->product);
		free(info->serial);
		free(info);
	}
	free(ft232r_devinfo_list);
	ft232r_devinfo_list = NULL;
}