diff --git a/README.md b/README.md index d6a5e06..06d7405 100644 Binary files a/README.md and b/README.md differ diff --git a/comlinepar.bas b/comlinepar.bas new file mode 100644 index 0000000..d8e9180 --- /dev/null +++ b/comlinepar.bas @@ -0,0 +1,34 @@ +Dim As String t_param, param(Any) ' temp.-string | string array +Dim As Long num = 1 ' start index for Command() +ReDim param(0) ' initialize dynamic array (start size = 1 element) + +t_param = Command(num) ' get first parameter +If t_param = "" Then ' if first = 'empty' set ERROR + param(num-1) = "no parameter(s) given!" +Else ' no ERROR (aka: OK), store current, get mext + While t_param <> "" ' run until temp.-string = 'empty' + ReDim Preserve param(num-1) ' increase array size (keep data) + param(num-1) = t_param ' assign temporary string to array + num += 1 ' increase param number (to next) + t_param = Command(num) ' get next param (or 'empty') + Wend +End If +' now we have all parameters in the string array: param() + +' just in case, we need a certain number of mandatory param's: +If UBound(param) < 3 Then ' assume: min.-parameters = 4 + ' give user a relevant message and, quit the prog. here +End If + +' show it's content to user ... (even if only: ERROR-MSG) +For i As UInteger = 0 To UBound(param) + ? "array param("; i; ") = "; param(i) +Next +If (num>1) then + Vendor = valint("&h" + param(0)) + Product = valint("&h" + param(1)) +End If +If (num>3) then + sup_out = valint(param(2)) +End If + diff --git a/hidlib.bas b/hidlib.bas new file mode 100644 index 0000000..2d7214f --- /dev/null +++ b/hidlib.bas @@ -0,0 +1,140 @@ +Type multireturn + As long A,B,C +End Type + +'dim as uinteger Vendor = &h154B +'dim as uinteger Product = &hF009 +'dim shared as uinteger Vendor = &h152A +'dim as uinteger Product = &h841d +dim shared as uinteger Vendor = &h04B4 +dim as uinteger Product = &h00F1 +'dim as uinteger Vendor = &h16C0 +'dim as uinteger Product = &h0486 +dim as libusb_device_handle ptr DHandle(10) +dim shared as libusb_device_descriptor desc +dim as libusb_transfer_cb_fn call_back +dim as libusb_config_descriptor ptr Dconfig +dim as integer conf +dim as libusb_device ptr pDevice +dim as libusb_device ptr ptr ppList +dim as integer cnt = 0 +dim as Long returnvalue +dim as Const libusb_interface Ptr inter +dim as Const libusb_interface_descriptor Ptr interdesc +dim shared as Const libusb_endpoint_descriptor Ptr epdesc +dim as libusb_transfer Ptr xfr +dim as uinteger size = 2048 +dim as Ubyte databuffer(size) +dim as Ubyte databuffer_oud1 = 0 +dim as Ubyte databuffer_oud2 = 0 +dim as Ubyte databuffer_oud3 = 0 +dim as Ubyte databuffer_oud4 = 0 +dim as Ubyte ptr dbuf = @databuffer(0) +dim as Ubyte in_endpoint(10) +dim as uinteger in_packsize(10) +dim as Ubyte in_cnt = 0 +dim as Ubyte out_cnt = 0 +dim as Ubyte out_endpoint(10) +dim as uinteger out_packsize(10) +dim as Ubyte counter +dim as multireturn returnvalues +dim as String key +dim as uinteger countbytes = 0 +dim as Ubyte sup_out = 1 + +Declare Function open_device(device as libusb_device ptr) as libusb_device_handle ptr +Declare Function close_device(handle as libusb_device_handle ptr) as long +Declare Function exit_prog(ppList as libusb_device ptr ptr) as long +Declare Function transfer_data(handle as libusb_device_handle ptr, endp as UByte, databuf As UByte Ptr, number as long, timeout As ULong, suppress as UByte) as multireturn +Declare Function bulk_tranfer(handle as libusb_device_handle ptr, endp as UByte, databuf As UByte Ptr, number as long, timeout As ULong, suppress as UByte) as multireturn + +Function open_device(device as libusb_device ptr) as libusb_device_handle ptr + dim as long returnvalue + dim as libusb_device_handle ptr Handle + + returnvalue = libusb_open(device, @Handle) + ? "dev_handle "; Handle + ? "Error Detail "; returnvalue + + ? *(libusb_error_name(returnvalue)) + + returnvalue = libusb_reset_device(Handle) + ? "Error Reset Device "; returnvalue + ? + + If Handle > 0 Then + returnvalue = libusb_kernel_driver_active(Handle, 0) ''check if kernel has attached a driver + ? "Check attached "; returnvalue + If returnvalue > 0 Then ''if so + returnvalue = libusb_detach_kernel_driver(Handle, 0) ''detach it + ? "Detached "; returnvalue + End If + returnvalue = libusb_claim_interface(Handle, 0) ''now we can claim the interface + ? "Claim "; returnvalue + ? + End If + return Handle +End Function + +Function close_device(handle as libusb_device_handle ptr) as long + dim as long returnvalue + + returnvalue = libusb_release_interface(handle, 0) + ? + ? "release :"; returnvalue + libusb_close(handle) + return returnvalue +End Function + +Function exit_prog(ppList as libusb_device ptr ptr) as long +? "ok" +libusb_free_device_list(ppList, 1) +libusb_exit(NULL) +? "end" +return 1 +End Function + +Function print_info()as long +return 1 +End Function + +Function transfer_data(handle as libusb_device_handle ptr, endp as UByte, databuf As UByte Ptr, number as long, timeout As ULong, suppress as UByte) as multireturn + Dim As multireturn returnvalues + dim as long returnvalue + dim as long length = 0 + + returnvalue = libusb_interrupt_transfer(handle, endp, databuf, number, @length, timeout) + + If (suppress = 0) then + ? + ? "returnvalue "; returnvalue + ? *(libusb_error_name(returnvalue)) + End if + + returnvalues.A = length + returnvalues.B = returnvalue + + return returnvalues +End Function + + + +Function bulk_tranfer(handle as libusb_device_handle ptr, endp as UByte, databuf As UByte Ptr, number as long, timeout As ULong, suppress as UByte) as multireturn + + Dim As multireturn returnvalues + dim as long returnvalue + dim as long length = 0 + + returnvalue = libusb_bulk_transfer(handle, endp, databuf, number, @length, timeout) + + If (suppress = 0) then + '? + '? "returnvalue "; returnvalue + '? *(libusb_error_name(returnvalue)) + End if + + returnvalues.A = length + returnvalues.B = returnvalue + + return returnvalues +End Function diff --git a/libusb-1.0.bi b/libusb-1.0.bi new file mode 100644 index 0000000..82d8034 --- /dev/null +++ b/libusb-1.0.bi @@ -0,0 +1,1363 @@ +#Ifndef LIBUSB_H + #define LIBUSB_H + + #Inclib "usb-1.0" + + #Include Once "crt/stdint.bi" + #Include Once "crt/sys/types.bi" + #If Defined(__FB_LINUX__ ) Or Defined(__FB_CYGWIN__) + Type timeval + tv_sec As Long + tv_usec As Long + End Type + #EndIf + + #Include Once "crt/limits.bi" + + #If Defined(__FB_WIN32__) Or Defined(__FB_CYGWIN__) + #Include Once "windows.bi" + #If Defined(interface) + #Undef interface + #EndIf + #If Not Defined(__FB_CYGWIN__) + #Include Once "win/winsock.bi" + #EndIf + #EndIf + + #If Defined(__FB_LINUX__) + #Include Once "crt/sys/socket.bi" + #EndIf + +Dim As ULong libusb_device = 0 + +#define LIBUSB_API_VERSION &h01000105 + +/'' The following is kept for compatibility, but will be deprecated in the future ''/ +#define LIBUSBX_API_VERSION LIBUSB_API_VERSION + +#If Defined(__FB_WIN32__) + #Define LIBUSB_CALL WINAPI + Extern "Windows-MS" +#Else + #Define LIBUSB_CALL + Extern "C" +#EndIf + +Function libusb_cpu_to_le16(x As Const uint16_t) As uint16_t + + Union _tmp + As uint8_t b8(1) + As uint16_t b16 + End Union + Dim _tmp As _tmp + + _tmp.b8(1) = Cast(uint8_t, (x Shr 8)) + _tmp.b8(0) = Cast(uint8_t, (x And &hff)) + Return _tmp.b16 +End Function + +#define libusb_le16_to_cpu libusb_cpu_to_le16 + +Enum libusb_class_code + LIBUSB_CLASS_PER_INTERFACE = 0 + + /''* Audio class ''/ + LIBUSB_CLASS_AUDIO = 1 + + /''* Communications class ''/ + LIBUSB_CLASS_COMM = 2 + + /''* Human Interface Device class ''/ + LIBUSB_CLASS_HID = 3 + + /''* Physical ''/ + LIBUSB_CLASS_PHYSICAL = 5 + + /''* Printer class ''/ + LIBUSB_CLASS_PRINTER = 7 + + /''* Image class ''/ + LIBUSB_CLASS_PTP = 6, /'' legacy name from libusb-0.1 usb.h ''/ + LIBUSB_CLASS_IMAGE = 6 + + /''* Mass storage class ''/ + LIBUSB_CLASS_MASS_STORAGE = 8 + + /''* Hub class ''/ + LIBUSB_CLASS_HUB = 9 + + /''* Data class ''/ + LIBUSB_CLASS_DATA = 10 + + /''* Smart Card ''/ + LIBUSB_CLASS_SMART_CARD = &h0b + + /''* Content Security ''/ + LIBUSB_CLASS_CONTENT_SECURITY = &h0d + + /''* Video ''/ + LIBUSB_CLASS_VIDEO = &h0e, + + /''* Personal Healthcare ''/ + LIBUSB_CLASS_PERSONAL_HEALTHCARE = &h0f + + /''* Diagnostic Device ''/ + LIBUSB_CLASS_DIAGNOSTIC_DEVICE = &hdc + + /''* Wireless class ''/ + LIBUSB_CLASS_WIRELESS = &he0 + + /''* Application class ''/ + LIBUSB_CLASS_APPLICATION = &hfe + + /''* Class is vendor-specific ''/ + LIBUSB_CLASS_VENDOR_SPEC = &hff +End Enum + +/''* \ingroup libusb_desc + * Descriptor types as defined by the USB specification. ''/ +Enum libusb_descriptor_type + /''* Device descriptor. See libusb_device_descriptor. ''/ + LIBUSB_DT_DEVICE = &h01 + + /''* Configuration descriptor. See libusb_config_descriptor. ''/ + LIBUSB_DT_CONFIG = &h02 + + /''* String descriptor ''/ + LIBUSB_DT_STRING = &h03 + + /''* Interface descriptor. See libusb_interface_descriptor. ''/ + LIBUSB_DT_INTERFACE = &h04 + + /''* Endpoint descriptor. See libusb_endpoint_descriptor. ''/ + LIBUSB_DT_ENDPOINT = &h05 + + /''* BOS descriptor ''/ + LIBUSB_DT_BOS = &h0f + + /''* Device Capability descriptor ''/ + LIBUSB_DT_DEVICE_CAPABILITY = &h10 + + /''* HID descriptor ''/ + LIBUSB_DT_HID = &h21 + + /''* HID report descriptor ''/ + LIBUSB_DT_REPORT = &h22 + + /''* Physical descriptor ''/ + LIBUSB_DT_PHYSICAL = &h23 + + /''* Hub descriptor ''/ + LIBUSB_DT_HUB = &h29 + + /''* SuperSpeed Hub descriptor ''/ + LIBUSB_DT_SUPERSPEED_HUB = &h2a + + /''* SuperSpeed Endpoint Companion descriptor ''/ + LIBUSB_DT_SS_ENDPOINT_COMPANION = &h30 +End Enum + +/'' Descriptor sizes per descriptor type ''/ +#define LIBUSB_DT_DEVICE_SIZE 18 +#define LIBUSB_DT_CONFIG_SIZE 9 +#define LIBUSB_DT_INTERFACE_SIZE 9 +#define LIBUSB_DT_ENDPOINT_SIZE 7 +#define LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 /'' Audio extension ''/ +#define LIBUSB_DT_HUB_NONVAR_SIZE 7 +#define LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE 6 +#define LIBUSB_DT_BOS_SIZE 5 +#define LIBUSB_DT_DEVICE_CAPABILITY_SIZE 3 + +/'' BOS descriptor sizes ''/ +#define LIBUSB_BT_USB_2_0_EXTENSION_SIZE 7 +#define LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE 10 +#define LIBUSB_BT_CONTAINER_ID_SIZE 20 + +/'' We unwrap the BOS => define its max size ''/ +#define LIBUSB_DT_BOS_MAX_SIZE ((LIBUSB_DT_BOS_SIZE) + _ + (LIBUSB_BT_USB_2_0_EXTENSION_SIZE) + _ + (LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) + _ + (LIBUSB_BT_CONTAINER_ID_SIZE)) + +#define LIBUSB_ENDPOINT_ADDRESS_MASK &h0f /'' in bEndpointAddress ''/ +#define LIBUSB_ENDPOINT_DIR_MASK &h80 + +Enum libusb_endpoint_direction + /''* In: device-to-host ''/ + LIBUSB_ENDPOINT_IN = &h80 + + /''* Out: host-to-device ''/ + LIBUSB_ENDPOINT_OUT = &h00 +End Enum + +#define LIBUSB_TRANSFER_TYPE_MASK &h03 /'' in bmAttributes ''/ + +Enum libusb_transfer_type + /''* Control endpoint ''/ + LIBUSB_TRANSFER_TYPE_CONTROL = 0 + + /''* Isochronous endpoint ''/ + LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1 + + /''* Bulk endpoint ''/ + LIBUSB_TRANSFER_TYPE_BULK = 2 + + /''* Interrupt endpoint ''/ + LIBUSB_TRANSFER_TYPE_INTERRUPT = 3 + + /''* Stream endpoint ''/ + LIBUSB_TRANSFER_TYPE_BULK_STREAM = 4 +End Enum + +/''* \ingroup libusb_misc + * Standard requests, as defined in table 9-5 of the USB 3.0 specifications ''/ +Enum libusb_standard_request + /''* Request status of the specific recipient ''/ + LIBUSB_REQUEST_GET_STATUS = &h00 + + /''* Clear or disable a specific feature ''/ + LIBUSB_REQUEST_CLEAR_FEATURE = &h01 + + /'' &h02 is reserved ''/ + + /''* Set or enable a specific feature ''/ + LIBUSB_REQUEST_SET_FEATURE = &h03 + + /'' &h04 is reserved ''/ + + /''* Set device address for all future accesses ''/ + LIBUSB_REQUEST_SET_ADDRESS = &h05 + + /''* Get the specified descriptor ''/ + LIBUSB_REQUEST_GET_DESCRIPTOR = &h06 + + /''* Used to update existing descriptors or add new descriptors ''/ + LIBUSB_REQUEST_SET_DESCRIPTOR = &h07 + + /''* Get the current device configuration value ''/ + LIBUSB_REQUEST_GET_CONFIGURATION = &h08 + + /''* Set device configuration ''/ + LIBUSB_REQUEST_SET_CONFIGURATION = &h09 + + /''* Return the selected alternate setting for the specified interface ''/ + LIBUSB_REQUEST_GET_INTERFACE = &h0A + + /''* Select an alternate interface for the specified interface ''/ + LIBUSB_REQUEST_SET_INTERFACE = &h0B + + '' Set then report an endpoint''s synchronization frame ''/ + LIBUSB_REQUEST_SYNCH_FRAME = &h0C + + /''* Sets both the U1 and U2 Exit Latency ''/ + LIBUSB_REQUEST_SET_SEL = &h30 + + /''* Delay from the time a host transmits a packet to the time it is + * received by the device. ''/ + LIBUSB_SET_ISOCH_DELAY = &h31 +End Enum + +Enum libusb_request_type + /''* Standard ''/ + LIBUSB_REQUEST_TYPE_STANDARD = (&h00 Shl 5) + + /''* Class ''/ + LIBUSB_REQUEST_TYPE_CLASS = (&h01 Shl 5) + + /''* Vendor ''/ + LIBUSB_REQUEST_TYPE_VENDOR = (&h02 Shl 5) + + /''* Reserved ''/ + LIBUSB_REQUEST_TYPE_RESERVED = (&h03 Shl 5) +End Enum + +Enum libusb_request_recipient + /''* Device ''/ + LIBUSB_RECIPIENT_DEVICE = &h00 + + /''* Interface ''/ + LIBUSB_RECIPIENT_INTERFACE = &h01 + + /''* Endpoint ''/ + LIBUSB_RECIPIENT_ENDPOINT = &h02 + + /''* Other ''/ + LIBUSB_RECIPIENT_OTHER = &h03 +End Enum + +#define LIBUSB_ISO_SYNC_TYPE_MASK &h0C + +Enum libusb_iso_sync_type + /''* No synchronization ''/ + LIBUSB_ISO_SYNC_TYPE_NONE = 0 + + /''* Asynchronous ''/ + LIBUSB_ISO_SYNC_TYPE_ASYNC = 1 + + /''* Adaptive ''/ + LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2 + + /''* Synchronous ''/ + LIBUSB_ISO_SYNC_TYPE_SYNC = 3 +End Enum + +#define LIBUSB_ISO_USAGE_TYPE_MASK &h30 + +Enum libusb_iso_usage_type + /''* Data endpoint ''/ + LIBUSB_ISO_USAGE_TYPE_DATA = 0 + + /''* Feedback endpoint ''/ + LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1 + + /''* Implicit feedback Data endpoint ''/ + LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2 +End Enum + +Type libusb_device_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + + As uint8_t bDescriptorType + + As uint16_t bcdUSB + + /''* USB-IF class code for the device. See \ref libusb_class_code. ''/ + As uint8_t bDeviceClass + + /''* USB-IF subclass code for the device, qualified by the bDeviceClass + * value ''/ + As uint8_t bDeviceSubClass + + /''* USB-IF protocol code for the device, qualified by the bDeviceClass and + * bDeviceSubClass values ''/ + As uint8_t bDeviceProtocol + + /''* Maximum packet size for endpoint 0 ''/ + As uint8_t bMaxPacketSize0 + + /''* USB-IF vendor ID ''/ + As uint16_t idVendor + + /''* USB-IF product ID ''/ + As uint16_t idProduct + + /''* Device release number in binary-coded decimal ''/ + As uint16_t bcdDevice + + /''* Index of string descriptor describing manufacturer ''/ + As uint8_t iManufacturer + + /''* Index of string descriptor describing product ''/ + As uint8_t iProduct + + /''* Index of string descriptor containing device serial number ''/ + As uint8_t iSerialNumber + + /''* Number of possible configurations ''/ + As uint8_t bNumConfigurations +End Type + +Type libusb_endpoint_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + + As uint8_t bDescriptorType + + As uint8_t bEndpointAddress + + As uint8_t bmAttributes + + /''* Maximum packet size this endpoint is capable of sending/receiving. ''/ + As uint16_t wMaxPacketSize + + /''* Interval for polling endpoint for data transfers. ''/ + As uint8_t bInterval + + /''* For audio devices only: the rate at which synchronization feedback + * is provided. ''/ + As uint8_t bRefresh + + /''* For audio devices only: the address if the synch endpoint ''/ + As uint8_t bSynchAddress + + /''* Extra descriptors. If libusb encounters unknown endpoint descriptors, + * it will store them here, should you wish to parse them. ''/ + As UByte Ptr extra + + /''* Length of the extra descriptors, in bytes. ''/ + As Long extra_length +End Type + +Type libusb_interface_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + + As uint8_t bDescriptorType + + /''* Number of this interface ''/ + As uint8_t bInterfaceNumber + + /''* Value used to select this alternate setting for this interface ''/ + As uint8_t bAlternateSetting + + /''* Number of endpoints used by this interface (excluding the control + * endpoint). ''/ + As uint8_t bNumEndpoints + + /''* USB-IF class code for this interface. See \ref libusb_class_code. ''/ + As uint8_t bInterfaceClass + + /''* USB-IF subclass code for this interface, qualified by the + * bInterfaceClass value ''/ + As uint8_t bInterfaceSubClass + + /''* USB-IF protocol code for this interface, qualified by the + * bInterfaceClass and bInterfaceSubClass values ''/ + As uint8_t bInterfaceProtocol + + /''* Index of string descriptor describing this interface ''/ + As uint8_t iInterface + + As libusb_endpoint_descriptor Ptr endpoint + + As UByte Ptr extra + + /''* Length of the extra descriptors, in bytes. ''/ + As Long extra_length +End Type + +Type libusb_interface + As Const libusb_interface_descriptor Ptr altsetting + + As Long num_altsetting +End Type + +Type libusb_config_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + + As uint8_t bDescriptorType + + /''* Total length of data returned for this configuration ''/ + As uint16_t wTotalLength + + /''* Number of interfaces supported by this configuration ''/ + As uint8_t bNumInterfaces + + /''* Identifier value for this configuration ''/ + As uint8_t bConfigurationValue + + /''* Index of string descriptor describing this configuration ''/ + As uint8_t iConfiguration + + /''* Configuration characteristics ''/ + As uint8_t bmAttributes + + As uint8_t MaxPower + + As Const libusb_interface Ptr interface + As UByte Ptr extra + + /''* Length of the extra descriptors, in bytes. ''/ + As Long extra_length +End Type + +Type libusb_ss_endpoint_companion_descriptor + As uint8_t bLength + + As uint8_t bDescriptorType + + As uint8_t bMaxBurst + + As uint8_t bmAttributes + + As uint16_t wBytesPerInterval +End Type + +#If Defined(__STDC_VERSION__) + #If (__STDC_VERSION__ >= 199901) + #Define __STDC_VERSION_DEF__ + #EndIf +#EndIf + +Type libusb_bos_dev_capability_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + As uint8_t bDescriptorType + /''* Device Capability type ''/ + As uint8_t bDevCapabilityType + /''* Device Capability data (bLength - 3 bytes) ''/ + #If Defined(__STDC_VERSION_DEF__) + As uint8_t dev_capability_data(Any) /'' valid C99 code ''/ + #Else + As uint8_t dev_capability_data(0) /'' non-standard, but usually working code ''/ + #EndIf +End Type + +Type libusb_bos_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + + As uint8_t bDescriptorType + + /''* Length of this descriptor and all of its sub descriptors ''/ + As uint16_t wTotalLength + + /''* The number of separate device capability descriptors in + * the BOS ''/ + As uint8_t bNumDeviceCaps + + /''* bNumDeviceCap Device Capability Descriptors ''/ + #If Defined(__STDC_VERSION_DEF__) + As libusb_bos_dev_capability_descriptor Ptr dev_capability(Any) /'' valid C99 code ''/ + #Else + As libusb_bos_dev_capability_descriptor Ptr dev_capability(0) /'' non-standard, but usually working code ''/ + #EndIf +End Type + +Type libusb_usb_2_0_extension_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + + As uint8_t bDescriptorType + + As uint8_t bDevCapabilityType + + As uint32_t bmAttributes +End Type + +Type libusb_ss_usb_device_capability_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + + As uint8_t bDescriptorType + + As uint8_t bDevCapabilityType + + As uint8_t bmAttributes + + As uint16_t wSpeedSupported + + As uint8_t bFunctionalitySupport + + /''* U1 Device Exit Latency. ''/ + As uint8_t bU1DevExitLat + + /''* U2 Device Exit Latency. ''/ + As uint16_t bU2DevExitLat +End Type + +Type libusb_container_id_descriptor + /''* Size of this descriptor (in bytes) ''/ + As uint8_t bLength + + As uint8_t bDescriptorType + + As uint8_t bDevCapabilityType + + /''* Reserved field ''/ + As uint8_t bReserved + + /''* 128 bit UUID ''/ + As uint8_t ContainerID(16) +End Type + +Type libusb_control_setup + As uint8_t bmRequestType + + As uint8_t bRequest + + /''* Value. Varies according to request ''/ + As uint16_t wValue + + /''* Index. Varies according to request, typically used to pass an index + * or offset ''/ + As uint16_t wIndex + + /''* Number of bytes to transfer ''/ + As uint16_t wLength +End Type +Dim Shared libusb_control_setup As libusb_control_setup + +#define LIBUSB_CONTROL_SETUP_SIZE (SizeOf(libusb_control_setup)) + +/'' libusb ''/ +Type libusb_context As libusb_context +Type libusb_device As libusb_device +Type libusb_device_handle As libusb_device_handle + +/''* \ingroup libusb_lib + * Structure providing the version of the libusb runtime + ''/ +Type libusb_version + /''* Library major version. ''/ + As uint16_t major + + /''* Library minor version. ''/ + ''As Const uint16_t minor + As uint16_t minor + + /''* Library micro version. ''/ + ''As Const uint16_t micro + As uint16_t micro + + /''* Library nano version. ''/ + ''As Const uint16_t nano + As uint16_t nano + + /''* Library release candidate suffix string, e.g. "-rc4". ''/ + ''As Const UByte Ptr rc + As UByte Ptr rc + + /''* For ABI compatibility only. ''/ + As UByte Ptr describe +End Type + +Type libusb_context As libusb_context + +Type libusb_device As libusb_device + + +Type libusb_device_handle As libusb_device_handle + +Enum libusb_speed + ''* The OS doesn''t report or know the device speed. ''/ + LIBUSB_SPEED_UNKNOWN = 0 + + /''* The device is operating at low speed (1.5MBit/s). ''/ + LIBUSB_SPEED_LOW = 1 + + /''* The device is operating at full speed (12MBit/s). ''/ + LIBUSB_SPEED_FULL = 2 + + /''* The device is operating at high speed (480MBit/s). ''/ + LIBUSB_SPEED_HIGH = 3 + + /''* The device is operating at super speed (5000MBit/s). ''/ + LIBUSB_SPEED_SUPER = 4 +End Enum + +Enum libusb_supported_speed + /''* Low speed operation supported (1.5MBit/s). ''/ + LIBUSB_LOW_SPEED_OPERATION = 1 + + /''* Full speed operation supported (12MBit/s). ''/ + LIBUSB_FULL_SPEED_OPERATION = 2 + + /''* High speed operation supported (480MBit/s). ''/ + LIBUSB_HIGH_SPEED_OPERATION = 4 + + /''* Superspeed operation supported (5000MBit/s). ''/ + LIBUSB_SUPER_SPEED_OPERATION = 8 +End Enum + +Enum libusb_usb_2_0_extension_attributes + /''* Supports Link Power Management (LPM) ''/ + LIBUSB_BM_LPM_SUPPORT = 2 +End Enum + +Enum libusb_ss_usb_device_capability_attributes + /''* Supports Latency Tolerance Messages (LTM) ''/ + LIBUSB_BM_LTM_SUPPORT = 2 +End Enum + +/''* \ingroup libusb_dev + * USB capability types + ''/ +Enum libusb_bos_type + /''* Wireless USB device capability ''/ + LIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY = 1 + + /''* USB 2.0 extensions ''/ + LIBUSB_BT_USB_2_0_EXTENSION = 2 + + /''* SuperSpeed USB device capability ''/ + LIBUSB_BT_SS_USB_DEVICE_CAPABILITY = 3 + + /''* Container ID type ''/ + LIBUSB_BT_CONTAINER_ID = 4 +End Enum + +Enum libusb_error + /''* Success (no error) ''/ + LIBUSB_SUCCESS = 0 + + /''* Input/output error ''/ + LIBUSB_ERROR_IO = -1 + + /''* Invalid parameter ''/ + LIBUSB_ERROR_INVALID_PARAM = -2 + + /''* Access denied (insufficient permissions) ''/ + LIBUSB_ERROR_ACCESS = -3 + + /''* No such device (it may have been disconnected) ''/ + LIBUSB_ERROR_NO_DEVICE = -4 + + /''* Entity not found ''/ + LIBUSB_ERROR_NOT_FOUND = -5 + + /''* Resource busy ''/ + LIBUSB_ERROR_BUSY = -6 + + /''* Operation timed out ''/ + LIBUSB_ERROR_TIMEOUT = -7 + + /''* Overflow ''/ + LIBUSB_ERROR_OVERFLOW = -8 + + /''* Pipe error ''/ + LIBUSB_ERROR_PIPE = -9 + + /''* System call interrupted (perhaps due to signal) ''/ + LIBUSB_ERROR_INTERRUPTED = -10 + + /''* Insufficient memory ''/ + LIBUSB_ERROR_NO_MEM = -11 + + /''* Operation not supported or unimplemented on this platform ''/ + LIBUSB_ERROR_NOT_SUPPORTED = -12 + + /'' NB: Remember to update LIBUSB_ERROR_COUNT below as well as the + message strings in strerror.c when adding new error codes here. ''/ + + /''* Other error ''/ + LIBUSB_ERROR_OTHER = -99 +End Enum + +/'' Total number of error codes in enum libusb_error ''/ +#define LIBUSB_ERROR_COUNT 14 + +/''* \ingroup libusb_asyncio + * Transfer status codes ''/ +Enum libusb_transfer_status + /''* Transfer completed without error. Note that this does not indicate + * that the entire amount of requested data was transferred. ''/ + LIBUSB_TRANSFER_COMPLETED + + /''* Transfer failed ''/ + LIBUSB_TRANSFER_ERROR + + /''* Transfer timed out ''/ + LIBUSB_TRANSFER_TIMED_OUT + + /''* Transfer was cancelled ''/ + LIBUSB_TRANSFER_CANCELLED + + /''* For bulk/interrupt endpoints: halt condition detected (endpoint + * stalled). For control endpoints: control request not supported. ''/ + LIBUSB_TRANSFER_STALL + + /''* Device was disconnected ''/ + LIBUSB_TRANSFER_NO_DEVICE + + /''* Device sent more data than requested ''/ + LIBUSB_TRANSFER_OVERFLOW + + /'' NB! Remember to update libusb_error_name() + when adding new status codes here. ''/ +End Enum + +/''* \ingroup libusb_asyncio + * libusb_transfer.flags values ''/ +Enum libusb_transfer_flags + /''* Report short frames as errors ''/ + LIBUSB_TRANSFER_SHORT_NOT_OK = 1 Shl 0 + + LIBUSB_TRANSFER_FREE_BUFFER = 1 Shl 1 + + LIBUSB_TRANSFER_FREE_TRANSFER = 1 Shl 2 + + LIBUSB_TRANSFER_ADD_ZERO_PACKET = 1 Shl 3, +End Enum + +/''* \ingroup libusb_asyncio + * Isochronous packet descriptor. ''/ +Type libusb_iso_packet_descriptor + /''* Length of data to request in this packet ''/ + As ULong length + + /''* Amount of data that was actually transferred ''/ + As ULong actual_length + + /''* Status code for this packet ''/ + As libusb_transfer_status status +End Type + +Type fw_libusb_transfer As libusb_transfer + +Type libusb_transfer_cb_fn As Sub(transfer As fw_libusb_transfer Ptr) + +Type libusb_transfer + /''* Handle of the device that this transfer will be submitted to ''/ + As libusb_device_handle Ptr dev_handle + + /''* A bitwise OR combination of \ref libusb_transfer_flags. ''/ + As uint8_t flags + + /''* Address of the endpoint where this transfer will be sent. ''/ + As UByte endpoint + + /''* Type of the endpoint from \ref libusb_transfer_type ''/ + As UByte Type + + /''* Timeout for this transfer in millseconds. A value of 0 indicates no + * timeout. ''/ + As ULong timeout + + As libusb_transfer_status status + + /''* Length of the data buffer ''/ + As Long length + + As Long actual_length + + As libusb_transfer_cb_fn callback + + /''* User context data to pass to the callback function. ''/ + As Any Ptr user_data + + /''* Data buffer ''/ + As UByte Ptr buffer + + /''* Number of isochronous packets. Only used for I/O with isochronous + * endpoints. ''/ + As Long num_iso_packets + + /''* Isochronous packet descriptors, for isochronous transfers only. ''/ + #If Defined(__STDC_VERSION_DEF__) + As libusb_iso_packet_descriptor iso_packet_desc(Any) /'' valid C99 code ''/ + #Else + As libusb_iso_packet_descriptor iso_packet_desc(0) /'' non-standard, but usually working code ''/ + #EndIf +End Type + +Enum libusb_capability + /''* The libusb_has_capability() API is available. ''/ + LIBUSB_CAP_HAS_CAPABILITY = &h0000 + /''* Hotplug support is available on this platform. ''/ + LIBUSB_CAP_HAS_HOTPLUG = &h0001 + /''* The library can access HID devices without requiring user intervention. + * Note that before being able to actually access an HID device, you may + * still have to call additional libusb functions such as + * \ref libusb_detach_kernel_driver(). ''/ + LIBUSB_CAP_HAS_HID_ACCESS = &h0100 + /''* The library supports detaching of the default USB driver, using + * \ref libusb_detach_kernel_driver(), if one is set by the OS kernel ''/ + LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER = &h0101 +End Enum + +Enum libusb_log_level + LIBUSB_LOG_LEVEL_NONE = 0 + LIBUSB_LOG_LEVEL_ERROR + LIBUSB_LOG_LEVEL_WARNING + LIBUSB_LOG_LEVEL_INFO + LIBUSB_LOG_LEVEL_DEBUG +End Enum + +Declare Function libusb_init(ctx As libusb_context Ptr Ptr) As Long +Declare Sub libusb_exit(ctx As libusb_context Ptr) +Declare Sub libusb_set_debug(ctx As libusb_context Ptr, level As Long) +Declare Function libusb_get_version() As Const libusb_version Ptr +Declare Function libusb_has_capability(capability As uint32_t) As Long +Declare Function libusb_error_name(errcode As Long) As Const ZString Ptr +Declare Function libusb_setlocale(locale As UByte Ptr) As Long +Declare Function libusb_strerror(errcode As Long) As Const ZString Ptr + +Declare Function libusb_get_device_list(ctx As libusb_context Ptr, list As libusb_device Ptr Ptr Ptr) As ssize_t +Declare Sub libusb_free_device_list(list As libusb_device Ptr Ptr, unref_devices As Long) +Declare Function libusb_ref_device(dev As libusb_device Ptr) As libusb_device Ptr +Declare Sub libusb_unref_device(dev As libusb_device Ptr) + +Declare Function libusb_get_configuration( _ + dev As libusb_device_handle Ptr, _ + config As Long Ptr) As Long +Declare Function libusb_get_device_descriptor( _ + dev As libusb_device Ptr, _ + desc As libusb_device_descriptor Ptr) As Long +Declare Function libusb_get_active_config_descriptor( _ + dev As libusb_device Ptr, _ + config As libusb_config_descriptor Ptr Ptr) As Long +Declare Function libusb_get_config_descriptor( _ + dev As libusb_device Ptr, _ + config_index As uint8_t, _ + config As libusb_config_descriptor Ptr Ptr) As Long +Declare Function libusb_get_config_descriptor_by_value( _ + dev As libusb_device Ptr, _ + bConfigurationValue As uint8_t, _ + config As libusb_config_descriptor Ptr Ptr) As Long +Declare Sub libusb_free_config_descriptor(config As libusb_config_descriptor Ptr) +Declare Function libusb_get_ss_endpoint_companion_descriptor( _ + ctx As libusb_context Ptr, _ + endpoint As Const libusb_endpoint_descriptor Ptr, _ + ep_comp As libusb_ss_endpoint_companion_descriptor Ptr Ptr) As Long +Declare Sub libusb_free_ss_endpoint_companion_descriptor( _ + ep_comp As libusb_ss_endpoint_companion_descriptor Ptr) + +Declare Function libusb_get_bos_descriptor( _ + dev_handle As libusb_device_handle Ptr, _ + bos As libusb_bos_descriptor Ptr Ptr) As Long +Declare Sub libusb_free_bos_descriptor(bos As libusb_bos_descriptor Ptr) +Declare Function libusb_get_usb_2_0_extension_descriptor( _ + ctx As libusb_context Ptr, _ + dev_cap As libusb_bos_dev_capability_descriptor Ptr, _ + usb_2_0_extension As libusb_usb_2_0_extension_descriptor Ptr Ptr) As Long +Declare Sub libusb_free_usb_2_0_extension_descriptor(usb_2_0_extension As libusb_usb_2_0_extension_descriptor Ptr) +Declare Function libusb_get_ss_usb_device_capability_descriptor( _ + ctx As libusb_context Ptr, _ + dev_cap As libusb_bos_dev_capability_descriptor Ptr, _ + ss_usb_device_cap As libusb_ss_usb_device_capability_descriptor Ptr Ptr) As Long +Declare Sub libusb_free_ss_usb_device_capability_descriptor(ss_usb_device_cap As libusb_ss_usb_device_capability_descriptor Ptr) +Declare Function libusb_get_container_id_descriptor( _ + ctx As libusb_context Ptr, _ + dev_cap As libusb_bos_dev_capability_descriptor Ptr, _ + container_id As libusb_container_id_descriptor Ptr Ptr) As Long +Declare Sub libusb_free_container_id_descriptor( _ + container_id As libusb_container_id_descriptor Ptr) +Declare Function libusb_get_bus_number(dev As libusb_device Ptr) As uint8_t +Declare Function libusb_get_port_number(dev As libusb_device Ptr) As uint8_t +Declare Function libusb_get_port_numbers( _ + dev As libusb_device Ptr, _ + port_numbers As uint8_t Ptr, _ + port_numbers_len As Long) As Long +''LIBUSB_DEPRECATED_FOR(libusb_get_port_numbers) +Declare Function libusb_get_port_path( _ + ctx As libusb_context Ptr, _ + dev As libusb_device Ptr, _ + path As ZString Ptr, _ + path_length As uint8_t) As Long +Declare Function libusb_get_parent(dev As libusb_device Ptr) As libusb_device Ptr +Declare Function libusb_get_device_address(dev As libusb_device Ptr) As uint8_t +Declare Function libusb_get_device_speed(dev As libusb_device Ptr) As Long +Declare Function libusb_get_max_packet_size( _ + dev As libusb_device Ptr, _ + endpoint As UByte) As Long +Declare Function libusb_get_max_iso_packet_size(dev As libusb_device Ptr, endpoint As UByte) As Long + +Declare Function libusb_open(dev As libusb_device Ptr, dev_handle As libusb_device_handle Ptr Ptr) As Long +Declare Sub libusb_close(dev_handle As libusb_device_handle Ptr) +Declare Function libusb_get_device(dev_handle As libusb_device_handle Ptr) As libusb_device Ptr + +Declare Function libusb_set_configuration( _ + dev_handle As libusb_device_handle Ptr, _ + configuration As Long) As Long +Declare Function libusb_claim_interface( _ + dev_handle As libusb_device_handle Ptr, _ + interface_number As Long) As Long +Declare Function libusb_release_interface( _ + dev_handle As libusb_device_handle Ptr, _ + interface_number As Long) As Long + +Declare Function libusb_open_device_with_vid_pid( _ + ctx As libusb_context Ptr, _ + vendor_id As uint16_t, _ + product_id As uint16_t) As libusb_device_handle Ptr + +Declare Function libusb_set_interface_alt_setting( _ + dev_handle As libusb_device_handle Ptr, _ + interface_number As Long, _ + alternate_setting As Long) As Long +Declare Function libusb_clear_halt( _ + dev_handle As libusb_device_handle Ptr, _ + endpoint As UByte) As Long +Declare Function libusb_reset_device(dev_handle As libusb_device_handle Ptr)As Long + +Declare Function libusb_alloc_streams( _ + dev_handle As libusb_device_handle Ptr, _ + num_streams As uint32_t, _ + endpoints As UByte Ptr, _ + num_endpoints As Long) As Long +Declare Function libusb_free_streams( _ + dev_handle As libusb_device_handle Ptr, _ + endpoints As UByte Ptr, _ + num_endpoints As Long) As Long + +Declare Function libusb_dev_mem_alloc( _ + dev_handle As libusb_device_handle Ptr, _ + length As size_t) As UByte Ptr +Declare Function libusb_dev_mem_free( _ + dev_handle As libusb_device_handle Ptr, _ + buffer As UByte Ptr, _ + length As size_t) As Long + +Declare Function libusb_kernel_driver_active( _ + dev_handle As libusb_device_handle Ptr, _ + interface_number As Long) As Long +Declare Function libusb_detach_kernel_driver( _ + dev_handle As libusb_device_handle Ptr, _ + interface_number As Long) As Long +Declare Function libusb_attach_kernel_driver( _ + dev_handle As libusb_device_handle Ptr, _ + interface_number As Long) As Long +Declare Function libusb_set_auto_detach_kernel_driver( _ + dev_handle As libusb_device_handle Ptr, _ + enable As Long) As Long + +Function libusb_control_transfer_get_data(transfer As libusb_transfer Ptr) As ZString Ptr + Return transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE +End Function + +Function libusb_control_transfer_get_setup(transfer As libusb_transfer Ptr) As libusb_control_setup Ptr + Return Cast(libusb_control_setup Ptr, transfer->buffer) +End Function + +Sub libusb_fill_control_setup( _ + buffer As UByte Ptr, _ + bmRequestType As uint8_t, _ + bRequest As uint8_t, _ + wValue As uint16_t, _ + wIndex As uint16_t, _ + wLength As uint16_t) + Dim As libusb_control_setup Ptr setup + setup = Cast(libusb_control_setup Ptr, buffer) + setup->bmRequestType = bmRequestType + setup->bRequest = bRequest + setup->wValue = libusb_cpu_to_le16(wValue) + setup->wIndex = libusb_cpu_to_le16(wIndex) + setup->wLength = libusb_cpu_to_le16(wLength) +End Sub + +Declare Function libusb_alloc_transfer(iso_packets As Long) As libusb_transfer Ptr +Declare Function libusb_submit_transfer(transfer As libusb_transfer Ptr) As Long +Declare Function libusb_cancel_transfer(transfer As libusb_transfer Ptr) As Long +Declare Sub libusb_free_transfer(transfer As libusb_transfer Ptr) +Declare Sub libusb_transfer_set_stream_id( _ + transfer As libusb_transfer Ptr, _ + stream_id As uint32_t) +Declare Function libusb_transfer_get_stream_id(transfer As libusb_transfer Ptr) As uint32_t + +Sub libusb_fill_control_transfer( _ + transfer As libusb_transfer Ptr, _ + dev_handle As libusb_device_handle Ptr, _ + buffer As UByte Ptr, _ + callback As libusb_transfer_cb_fn, _ + user_data As Any Ptr, _ + timeout As ULong) + + Dim As libusb_control_setup Ptr setup + setup = Cast(libusb_control_setup Ptr, buffer) + transfer->dev_handle = dev_handle + transfer->endpoint = 0 + transfer->Type = LIBUSB_TRANSFER_TYPE_CONTROL + transfer->timeout = timeout + transfer->buffer = buffer + If setup Then + transfer->length = Cast(Long, LIBUSB_CONTROL_SETUP_SIZE + libusb_le16_to_cpu(setup->wLength)) + EndIf + transfer->user_data = user_data + transfer->callback = callback +End Sub + +Sub libusb_fill_bulk_transfer( _ + transfer As libusb_transfer Ptr, _ + dev_handle As libusb_device_handle Ptr, _ + endpoint As UByte, _ + buffer As UByte Ptr, _ + length As Long, _ + callback As libusb_transfer_cb_fn, _ + user_data As Any Ptr, _ + timeout As ULong) + + transfer->dev_handle = dev_handle + transfer->endpoint = endpoint + transfer->Type = LIBUSB_TRANSFER_TYPE_BULK + transfer->timeout = timeout + transfer->buffer = buffer + transfer->length = length + transfer->user_data = user_data + transfer->callback = callback +End Sub + +Sub libusb_fill_bulk_stream_transfer( _ + transfer As libusb_transfer Ptr, _ + dev_handle As libusb_device_handle Ptr, _ + endpoint As UByte, _ + stream_id As uint32_t, _ + buffer As UByte Ptr, _ + length As Long, _ + callback As libusb_transfer_cb_fn, _ + user_data As Any Ptr, _ + timeout As ULong) + + libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, _ + length, callback, user_data, timeout) + transfer->Type = LIBUSB_TRANSFER_TYPE_BULK_STREAM + libusb_transfer_set_stream_id(transfer, stream_id) +End Sub + +Sub libusb_fill_interrupt_transfer( _ + transfer As libusb_transfer Ptr, _ + dev_handle As libusb_device_handle Ptr, _ + endpoint As UByte, _ + buffer As UByte Ptr, _ + length As Long, _ + callback As libusb_transfer_cb_fn, _ + user_data As Any Ptr, _ + timeout As ULong) + + transfer->dev_handle = dev_handle + transfer->endpoint = endpoint + transfer->Type = LIBUSB_TRANSFER_TYPE_INTERRUPT + transfer->timeout = timeout + transfer->buffer = buffer + transfer->length = length + transfer->user_data = user_data + transfer->callback = callback +End Sub + +Sub libusb_fill_iso_transfer( _ + transfer As libusb_transfer Ptr, _ + dev_handle As libusb_device_handle Ptr, _ + endpoint As UByte, _ + buffer As UByte Ptr, _ + length As Long, _ + num_iso_packets As Long, _ + callback As libusb_transfer_cb_fn, _ + user_data As Any Ptr, _ + timeout As ULong) + + transfer->dev_handle = dev_handle + transfer->endpoint = endpoint + transfer->Type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS + transfer->timeout = timeout + transfer->buffer = buffer + transfer->length = length + transfer->num_iso_packets = num_iso_packets + transfer->user_data = user_data + transfer->callback = callback +End Sub + +Sub libusb_set_iso_packet_lengths( _ + transfer As libusb_transfer Ptr, _ + length As ULong) + Dim As Long i + For i = 0 To transfer->num_iso_packets + transfer->iso_packet_desc(i).length = length + Next + +End Sub + +Function libusb_get_iso_packet_buffer( _ + transfer As libusb_transfer Ptr, _ + packet As ULong) As UByte Ptr + + Dim As Long i + Dim As size_t offset = 0 + Dim As Long _packet + + /'' oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. ''/ + If (packet > INT_MAX) Then + Return NULL + EndIf + _packet = Cast(Long, packet) + + If _packet >= transfer->num_iso_packets Then + Return NULL + EndIf + + For i = 0 To _packet + offset += transfer->iso_packet_desc(i).length + Next + + Return transfer->buffer + offset +End Function + +Function libusb_get_iso_packet_buffer_simple( _ + transfer As libusb_transfer Ptr, _ + packet As Long) As UByte Ptr + + Dim As Long _packet + + /'' oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. ''/ + If (packet > INT_MAX) Then + Return NULL + EndIf + _packet = Cast(Long, packet) + + If _packet >= transfer->num_iso_packets Then + Return NULL + EndIf + + Return transfer->buffer + (Cast(Long, transfer->iso_packet_desc(0).length) * _packet) +End Function + +/'' sync I/O ''/ + +Declare Function libusb_control_transfer( _ + dev_handle As libusb_device_handle Ptr, _ + request_type As uint8_t, _ + bRequest As uint8_t, _ + wValue As uint16_t, _ + wIndex As uint16_t, _ + _Data As UByte Ptr, _ + wLength As uint16_t, _ + timeout As ULong) As Long + +Declare Function libusb_bulk_transfer( _ + dev_handle As libusb_device_handle Ptr, _ + endpoint As UByte, _ + _Data As UByte Ptr, _ + length As Long, _ + actual_length As Long Ptr, _ + timeout As ULong) As Long + +Declare Function libusb_interrupt_transfer( _ + dev_handle As libusb_device_handle Ptr, _ + endpoint As UByte, _ + _Data As UByte Ptr, _ + length As Long, _ + actual_length As Long Ptr, _ + timeout As ULong) As Long + +Function libusb_get_descriptor( _ + dev_handle As libusb_device_handle Ptr, _ + desc_type As uint8_t, _ + desc_index As uint8_t, _ + _Data As UByte Ptr, _ + length As Long) As Long + + Return libusb_control_transfer(dev_handle, _ + LIBUSB_ENDPOINT_IN, _ + LIBUSB_REQUEST_GET_DESCRIPTOR, _ + Cast(uint16_t, ((desc_type Shl 8) Or desc_index)), _ + 0, _ + _Data, _ + Cast(uint16_t, length), _ + 1000) +End Function + +Function libusb_get_string_descriptor( _ + dev_handle As libusb_device_handle Ptr, _ + desc_index As uint8_t, _ + langid As uint16_t, _ + _Data As UByte Ptr, _ + length As Long) As Long + + Return libusb_control_transfer(dev_handle, _ + LIBUSB_ENDPOINT_IN, _ + LIBUSB_REQUEST_GET_DESCRIPTOR, _ + Cast(uint16_t,((LIBUSB_DT_STRING Shl 8) Or desc_index)), _ + langid, _ + _Data, _ + Cast(uint16_t, length), _ + 1000) +End Function + +Declare Function libusb_get_string_descriptor_ascii( _ + dev_handle As libusb_device_handle Ptr, _ + desc_index As uint8_t, _ + _Data As UByte Ptr, _ + length As Long) As Long + +/'' polling and timeouts ''/ + +Declare Function libusb_try_lock_events(ctx As libusb_context Ptr) As Long +Declare Sub libusb_lock_events(ctx As libusb_context Ptr) +Declare Sub libusb_unlock_events(ctx As libusb_context Ptr) +Declare Function libusb_event_handling_ok(ctx As libusb_context Ptr) As Long +Declare Function libusb_event_handler_active(ctx As libusb_context Ptr) As Long +Declare Sub libusb_interrupt_event_handler(ctx As libusb_context Ptr) +Declare Sub libusb_lock_event_waiters(ctx As libusb_context Ptr) +Declare Sub libusb_unlock_event_waiters(ctx As libusb_context Ptr) +Declare Function libusb_wait_for_event(ctx As libusb_context Ptr, tv As timeval Ptr) As Long + +Declare Function libusb_handle_events_timeout(ctx As libusb_context Ptr, tv As timeval Ptr) As Long +Declare Function libusb_handle_events_timeout_completed( _ + ctx As libusb_context Ptr, _ + tv As timeval Ptr, _ + completed As Long Ptr) As Long +Declare Function libusb_handle_events(ctx As libusb_context Ptr) As Long +Declare Function libusb_handle_events_completed(ctx As libusb_context Ptr, completed As Long Ptr) As Long +Declare Function libusb_handle_events_locked(ctx As libusb_context Ptr, tv As timeval Ptr) As Long +Declare Function libusb_pollfds_handle_timeouts(ctx As libusb_context Ptr) As Long +Declare Function libusb_get_next_timeout(ctx As libusb_context Ptr, tv As timeval Ptr) As Long + +/''* \ingroup libusb_poll + * File descriptor for polling + ''/ +Type libusb_pollfd + /''* Numeric file descriptor ''/ + As Long fd + + As Short events +End Type + +Type libusb_pollfd_added_cb As Sub(fd As Long, events As Short, user_data As Any Ptr) + +Type libusb_pollfd_removed_cb As Sub(fd As Long, user_data As Any Ptr) + +Declare Function libusb_get_pollfds(ctx As libusb_context Ptr) As Const libusb_pollfd Ptr Ptr +Declare Sub libusb_free_pollfds(pollfds As Const libusb_pollfd Ptr Ptr) +Declare Sub libusb_set_pollfd_notifiers( _ + ctx As libusb_context Ptr, _ + added_cb As libusb_pollfd_added_cb, _ + removed_cb As libusb_pollfd_removed_cb, _ + user_data As Any Ptr) + +Type libusb_hotplug_callback_handle As Long + +/''* \ingroup libusb_hotplug + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= &h01000102 + * + * Flags for hotplug events ''/ + +Enum lusb_hpf + /''* Default value when not using any flags. ''/ + LIBUSB_HOTPLUG_NO_FLAGS = 0 + + /''* Arm the callback and fire it for all matching currently attached devices. ''/ + LIBUSB_HOTPLUG_ENUMERATE = 1 Shl 0 +End Enum + +Type libusb_hotplug_flag As lusb_hpf + +/''* \ingroup libusb_hotplug + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= &h01000102 + * + * Hotplug events ''/ +Enum lusb_hpe + /''* A device has been plugged in and is ready to use ''/ + LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED = &h01 + + /''* A device has left and is no longer available. + * It is the user''s responsibility to call libusb_close on any handle associated with a disconnected device. + * It is safe to call libusb_get_device_descriptor on a device that has left ''/ + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT = &h02 +End Enum + +Type libusb_hotplug_event As lusb_hpe + +/''* \ingroup libusb_hotplug + * Wildcard matching for hotplug events ''/ +#define LIBUSB_HOTPLUG_MATCH_ANY -1 + +Type libusb_hotplug_callback_fn As Function( _ + ctx As libusb_context Ptr, _ + device As libusb_device Ptr, _ + event As libusb_hotplug_event, _ + user_data As Any Ptr) As Long + +Declare Function libusb_hotplug_register_callback( _ + ctx As libusb_context Ptr, _ + events As libusb_hotplug_event, _ + flags As libusb_hotplug_flag, _ + vendor_id As Long, _ + product_id As Long, _ + dev_class As Long, _ + cb_fn As libusb_hotplug_callback_fn, _ + user_data As Any Ptr, _ + callback_handle As libusb_hotplug_callback_handle Ptr) As Long + +Declare Sub libusb_hotplug_deregister_callback( _ + ctx As libusb_context Ptr, _ + callback_handle As libusb_hotplug_callback_handle) + +End Extern +#EndIf \ No newline at end of file