Ejemplo n.º 1
0
    def close(self):
        """
        Close usb device.

        Arguments: None

        Return: None
        """
        ret = usb.release_interface(self.libusb_handle,self.interface_nr)
        ret = usb.close(self.libusb_handle)
        return
Ejemplo n.º 2
0
    def __init__(self,
                 usb_vendor_id,
                 usb_product_id,
                 usb_bulkout_ep_address,
                 usb_bulkin_ep_address,
                 usb_buffer_out_size,
                 usb_buffer_in_size,
                 usb_serial_number=None):

        self.bulkout_ep_address = usb_bulkout_ep_address
        self.bulkin_ep_address = usb_bulkin_ep_address
        self.buffer_out_size = usb_buffer_out_size
        self.buffer_in_size = usb_buffer_in_size

        """
        Open and initialize usb device.

        Arguments: None

        Return: None.
        """
        usb.init()

        # Get usb busses
        if not usb.get_busses():
            usb.find_busses()
            usb.find_devices()
        busses = usb.get_busses()

        # Find device by IDs
        found = False
        dev_list = []
        for bus in busses:
            for dev in bus.devices:
                if (dev.descriptor.idVendor == usb_vendor_id and
                    dev.descriptor.idProduct == usb_product_id):
                    dev_list.append(dev)
                    found = True
        if not found:
            raise RuntimeError("Cannot find device.")

        if usb_serial_number == None:
            # No serial number specified - take first device
            dev = dev_list[0]
            self.libusb_handle = usb.open(dev)
            self.dev = dev
        else:
            # Try and find device with specified serial number
            found = False
            for dev in dev_list:
                self.dev = dev
                self.libusb_handle = usb.open(dev)
                sn = self.get_serial_number()
                if sn == usb_serial_number:
                    found = True
                    break
                else:
                    ret = usb.close(self.libusb_handle)
            if not found:
                raise RuntimeError("Cannot find device w/ serial number %s."%(usb_serial_number,))

        self.interface_nr = 0
        if hasattr(usb,'get_driver_np'):
            # non-portable libusb function available
            name = usb.get_driver_np(self.libusb_handle,self.interface_nr)
            if name != '':
                debug_print("attached to kernel driver '%s', detaching."%name )
                usb.detach_kernel_driver_np(self.libusb_handle,self.interface_nr)

        if dev.descriptor.bNumConfigurations > 1:
            debug_print("WARNING: more than one configuration, choosing first")

        usb.set_configuration(self.libusb_handle, self.dev.config[0].bConfigurationValue)
        usb.claim_interface(self.libusb_handle, self.interface_nr)

        self.output_buffer = ctypes.create_string_buffer(usb_buffer_out_size)
        self.input_buffer = ctypes.create_string_buffer(usb_buffer_in_size)
        for i in range(usb_buffer_in_size):
            self.input_buffer[i] = chr(0x00)
        for i in range(usb_buffer_out_size):
            self.output_buffer[i] = chr(0x00)

        # Clear any possible halt on the endpoints
        ret = usb.clear_halt(self.libusb_handle,usb_bulkout_ep_address)
        ret = usb.clear_halt(self.libusb_handle,usb_bulkin_ep_address)

        # Buffer position marker for reading from and writing to buffer
        self.output_buffer_pos = 0
        self.input_buffer_pos = 0

        # Set bref function based on python version
        if get_python_vnum() >= BYREF_EXISTS_VNUM:
            self.byref = ctypes.byref
        else:
            self.byref = byref_via_pointer