libusb 0.6.3-x64-mingw32 → 0.7.0-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.appveyor.yml +33 -0
- data/.github/workflows/ci.yml +185 -0
- data/.gitignore +1 -0
- data/.travis.yml +17 -10
- data/Gemfile +9 -1
- data/History.md +57 -0
- data/README.md +30 -5
- data/Rakefile +41 -12
- data/lib/libusb/bos.rb +85 -29
- data/lib/libusb/call.rb +192 -16
- data/lib/libusb/configuration.rb +3 -4
- data/lib/libusb/constants.rb +26 -16
- data/lib/libusb/context.rb +195 -45
- data/{test/test_libusb_capability.rb → lib/libusb/context_reference.rb} +20 -5
- data/lib/libusb/dependencies.rb +2 -2
- data/lib/libusb/dev_handle.rb +34 -24
- data/lib/libusb/device.rb +50 -8
- data/lib/libusb/endpoint.rb +3 -2
- data/lib/libusb/eventmachine.rb +8 -4
- data/lib/libusb/gem_helper.rb +9 -6
- data/lib/libusb/libusb_recipe.rb +2 -3
- data/lib/libusb/ss_companion.rb +9 -6
- data/lib/libusb/transfer.rb +48 -7
- data/lib/libusb/version_gem.rb +1 -1
- data/lib/libusb-1.0.dll +0 -0
- data/lib/libusb.rb +106 -18
- data/libusb.gemspec +2 -4
- data/test/{test_libusb_version.rb → test_libusb.rb} +12 -10
- data/test/test_libusb_bos.rb +22 -0
- data/test/test_libusb_bulk_stream_transfer.rb +23 -12
- data/test/test_libusb_context.rb +88 -0
- data/test/test_libusb_descriptors.rb +44 -11
- data/test/test_libusb_gc.rb +15 -0
- data/test/test_libusb_hotplug.rb +3 -1
- data/test/test_libusb_iso_transfer.rb +6 -0
- data/test/test_libusb_mass_storage.rb +6 -6
- data/test/test_libusb_structs.rb +32 -3
- metadata +11 -51
- data/appveyor.yml +0 -37
data/lib/libusb/bos.rb
CHANGED
@@ -19,7 +19,7 @@ module LIBUSB
|
|
19
19
|
# A structure representing the Binary Device Object Store (BOS) descriptor.
|
20
20
|
# This descriptor is documented in section 9.6.2 of the USB 3.0 specification.
|
21
21
|
# All multiple-byte fields are represented in host-endian format.
|
22
|
-
class Bos < FFI::
|
22
|
+
class Bos < FFI::Struct
|
23
23
|
|
24
24
|
module GenericMethods
|
25
25
|
# @return [Integer] Size of this descriptor (in bytes)
|
@@ -39,7 +39,7 @@ module LIBUSB
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def inspect
|
42
|
-
"\#<#{self.class} cap: #{bDevCapabilityType} data: #{dev_capability_data.
|
42
|
+
"\#<#{self.class} cap: #{bDevCapabilityType} data: #{dev_capability_data.unpack1("H*")}>"
|
43
43
|
end
|
44
44
|
|
45
45
|
# @return [String] Device Capability data (bLength - 3 bytes)
|
@@ -66,14 +66,21 @@ module LIBUSB
|
|
66
66
|
# A structure representing the USB 2.0 Extension descriptor
|
67
67
|
# This descriptor is documented in section 9.6.2.1 of the USB 3.0 specification.
|
68
68
|
# All multiple-byte fields are represented in host-endian format.
|
69
|
-
class Usb20Extension < FFI::
|
69
|
+
class Usb20Extension < FFI::Struct
|
70
70
|
include GenericMethods
|
71
|
+
include ContextReference
|
71
72
|
|
72
73
|
layout :bLength, :uint8,
|
73
74
|
:bDescriptorType, :uint8,
|
74
75
|
:bDevCapabilityType, :uint8,
|
75
76
|
:bmAttributes, :uint32
|
76
77
|
|
78
|
+
def initialize(ctx, *args)
|
79
|
+
super(*args)
|
80
|
+
|
81
|
+
register_context(ctx, :libusb_free_usb_2_0_extension_descriptor)
|
82
|
+
end
|
83
|
+
|
77
84
|
# Bitmap encoding of supported device level features.
|
78
85
|
# A value of one in a bit location indicates a feature is
|
79
86
|
# supported; a value of zero indicates it is not supported.
|
@@ -93,28 +100,30 @@ module LIBUSB
|
|
93
100
|
end
|
94
101
|
"\#<#{self.class} #{attrs.compact.join(",")}>"
|
95
102
|
end
|
96
|
-
|
97
|
-
# @private
|
98
|
-
def self.release(ptr)
|
99
|
-
Call.libusb_free_usb_2_0_extension_descriptor(ptr)
|
100
|
-
end
|
101
103
|
end
|
102
104
|
|
103
105
|
# A structure representing the SuperSpeed USB Device Capability descriptor
|
104
106
|
# This descriptor is documented in section 9.6.2.2 of the USB 3.0 specification.
|
105
107
|
# All multiple-byte fields are represented in host-endian format.
|
106
|
-
class SsUsbDeviceCapability < FFI::
|
108
|
+
class SsUsbDeviceCapability < FFI::Struct
|
107
109
|
include GenericMethods
|
110
|
+
include ContextReference
|
108
111
|
|
109
112
|
layout :bLength, :uint8,
|
110
113
|
:bDescriptorType, :uint8,
|
111
114
|
:bDevCapabilityType, :uint8,
|
112
|
-
:bmAttributes, :
|
115
|
+
:bmAttributes, :uint8,
|
113
116
|
:wSpeedSupported, :uint16,
|
114
117
|
:bFunctionalitySupport, :uint8,
|
115
118
|
:bU1DevExitLat, :uint8,
|
116
119
|
:bU2DevExitLat, :uint16
|
117
120
|
|
121
|
+
def initialize(ctx, *args)
|
122
|
+
super(*args)
|
123
|
+
|
124
|
+
register_context(ctx, :libusb_free_ss_usb_device_capability_descriptor)
|
125
|
+
end
|
126
|
+
|
118
127
|
# Bitmap encoding of supported device level features.
|
119
128
|
# A value of one in a bit location indicates a feature is
|
120
129
|
# supported; a value of zero indicates it is not supported.
|
@@ -178,18 +187,14 @@ module LIBUSB
|
|
178
187
|
def bU2DevExitLat
|
179
188
|
self[:bU2DevExitLat]
|
180
189
|
end
|
181
|
-
|
182
|
-
# @private
|
183
|
-
def self.release(ptr)
|
184
|
-
Call.libusb_free_ss_usb_device_capability_descriptor(ptr)
|
185
|
-
end
|
186
190
|
end
|
187
191
|
|
188
192
|
# A structure representing the Container ID descriptor.
|
189
193
|
# This descriptor is documented in section 9.6.2.3 of the USB 3.0 specification.
|
190
194
|
# All multiple-byte fields, except UUIDs, are represented in host-endian format.
|
191
|
-
class ContainerId < FFI::
|
195
|
+
class ContainerId < FFI::Struct
|
192
196
|
include GenericMethods
|
197
|
+
include ContextReference
|
193
198
|
|
194
199
|
layout :bLength, :uint8,
|
195
200
|
:bDescriptorType, :uint8,
|
@@ -197,6 +202,12 @@ module LIBUSB
|
|
197
202
|
:bReserved, :uint8,
|
198
203
|
:ContainerID, [:uint8, 16]
|
199
204
|
|
205
|
+
def initialize(ctx, *args)
|
206
|
+
super(*args)
|
207
|
+
|
208
|
+
register_context(ctx, :libusb_free_container_id_descriptor)
|
209
|
+
end
|
210
|
+
|
200
211
|
# Reserved field
|
201
212
|
def bReserved
|
202
213
|
self[:bReserved]
|
@@ -208,18 +219,65 @@ module LIBUSB
|
|
208
219
|
end
|
209
220
|
|
210
221
|
def inspect
|
211
|
-
"\#<#{self.class} #{container_id.
|
222
|
+
"\#<#{self.class} #{container_id.unpack1("H*")}>"
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
|
227
|
+
# A structure representing a Platform descriptor.
|
228
|
+
# This descriptor is documented in section 9.6.2.4 of the USB 3.2 specification.
|
229
|
+
class PlatformDescriptor < FFI::Struct
|
230
|
+
include GenericMethods
|
231
|
+
include ContextReference
|
232
|
+
|
233
|
+
layout :bLength, :uint8,
|
234
|
+
:bDescriptorType, :uint8,
|
235
|
+
# Capability type. Will have value
|
236
|
+
# libusb_capability_type::LIBUSB_BT_PLATFORM_DESCRIPTOR
|
237
|
+
# LIBUSB_BT_CONTAINER_ID in this context.
|
238
|
+
:bDevCapabilityType, :uint8,
|
239
|
+
# Reserved field
|
240
|
+
:bReserved, :uint8,
|
241
|
+
# 128 bit UUID
|
242
|
+
:PlatformCapabilityUUID, [:uint8, 16],
|
243
|
+
# Capability data (bLength - 20)
|
244
|
+
:CapabilityData, [:uint8, 0]
|
245
|
+
|
246
|
+
def initialize(ctx, *args)
|
247
|
+
super(*args)
|
248
|
+
|
249
|
+
register_context(ctx, :libusb_free_platform_descriptor)
|
250
|
+
end
|
251
|
+
|
252
|
+
# Reserved field
|
253
|
+
def bReserved
|
254
|
+
self[:bReserved]
|
255
|
+
end
|
256
|
+
|
257
|
+
# @return [String] 128 bit UUID
|
258
|
+
def platformCapabilityUUID
|
259
|
+
self[:PlatformCapabilityUUID].to_ptr.read_bytes(16)
|
212
260
|
end
|
213
261
|
|
214
|
-
#
|
215
|
-
|
216
|
-
|
262
|
+
# This is a variable-length field containing data associated with the platform specific capability.
|
263
|
+
# This field may be zero bytes in length.
|
264
|
+
# @return [String]
|
265
|
+
def capabilityData
|
266
|
+
self[:CapabilityData].to_ptr.read_bytes(bLength - 20)
|
267
|
+
end
|
268
|
+
|
269
|
+
def inspect
|
270
|
+
"\#<#{self.class} #{platformCapabilityUUID.unpack1("H*")} (#{capabilityData.unpack1("H*")})>"
|
217
271
|
end
|
218
272
|
end
|
219
273
|
|
220
|
-
|
274
|
+
include ContextReference
|
275
|
+
|
276
|
+
def initialize(ctx, *args)
|
221
277
|
@ctx = ctx
|
222
278
|
super(*args)
|
279
|
+
|
280
|
+
register_context(ctx, :libusb_free_bos_descriptor)
|
223
281
|
end
|
224
282
|
|
225
283
|
layout :bLength, :uint8,
|
@@ -265,13 +323,16 @@ module LIBUSB
|
|
265
323
|
# no struct defined in libusb -> use generic DeviceCapability
|
266
324
|
when LIBUSB::BT_USB_2_0_EXTENSION
|
267
325
|
res = Call.libusb_get_usb_2_0_extension_descriptor(@ctx, cap.pointer, pp_ext)
|
268
|
-
cap = Usb20Extension.new(pp_ext.read_pointer) if res==0
|
326
|
+
cap = Usb20Extension.new(@ctx, pp_ext.read_pointer) if res==0
|
269
327
|
when LIBUSB::BT_SS_USB_DEVICE_CAPABILITY
|
270
328
|
res = Call.libusb_get_ss_usb_device_capability_descriptor(@ctx, cap.pointer, pp_ext)
|
271
|
-
cap = SsUsbDeviceCapability.new(pp_ext.read_pointer) if res==0
|
329
|
+
cap = SsUsbDeviceCapability.new(@ctx, pp_ext.read_pointer) if res==0
|
272
330
|
when LIBUSB::BT_CONTAINER_ID
|
273
331
|
res = Call.libusb_get_container_id_descriptor(@ctx, cap.pointer, pp_ext)
|
274
|
-
cap = ContainerId.new(pp_ext.read_pointer) if res==0
|
332
|
+
cap = ContainerId.new(@ctx, pp_ext.read_pointer) if res==0
|
333
|
+
when LIBUSB::BT_PLATFORM_DESCRIPTOR
|
334
|
+
res = Call.libusb_get_platform_descriptor(@ctx, cap.pointer, pp_ext)
|
335
|
+
cap = PlatformDescriptor.new(@ctx, pp_ext.read_pointer) if res==0
|
275
336
|
else
|
276
337
|
# unknown capability -> use generic DeviceCapability
|
277
338
|
end
|
@@ -297,10 +358,5 @@ module LIBUSB
|
|
297
358
|
def inspect
|
298
359
|
"\#<#{self.class} #{device_capability_types.join(", ")}>"
|
299
360
|
end
|
300
|
-
|
301
|
-
# @private
|
302
|
-
def self.release(ptr)
|
303
|
-
Call.libusb_free_bos_descriptor(ptr)
|
304
|
-
end
|
305
361
|
end
|
306
362
|
end
|
data/lib/libusb/call.rb
CHANGED
@@ -28,7 +28,7 @@ module LIBUSB
|
|
28
28
|
prefix = FFI::Platform::LIBPREFIX.empty? ? 'lib' : FFI::Platform::LIBPREFIX
|
29
29
|
bundled_dll = File.join(root_path, "lib/#{prefix}usb-1.0.#{ext}")
|
30
30
|
bundled_dll_cygwin = File.join(root_path, "bin/#{prefix}usb-1.0.#{ext}")
|
31
|
-
ffi_lib([bundled_dll, bundled_dll_cygwin, "#{prefix}usb-1.0", "#{prefix}usb"])
|
31
|
+
ffi_lib([bundled_dll, bundled_dll_cygwin, "#{prefix}usb-1.0.#{ext}.0", "#{prefix}usb-1.0", "#{prefix}usb"])
|
32
32
|
|
33
33
|
ClassCodes = enum :libusb_class_code, [
|
34
34
|
:CLASS_PER_INTERFACE, 0,
|
@@ -164,12 +164,21 @@ module LIBUSB
|
|
164
164
|
:ISO_SYNC_TYPE_SYNC, 3,
|
165
165
|
]
|
166
166
|
|
167
|
+
# Speed codes. Indicates the speed at which the device is operating.
|
167
168
|
Speeds = enum :libusb_speed, [
|
169
|
+
# The OS doesn't report or know the device speed.
|
168
170
|
:SPEED_UNKNOWN, 0,
|
171
|
+
# The device is operating at low speed (1.5MBit/s).
|
169
172
|
:SPEED_LOW, 1,
|
173
|
+
# The device is operating at full speed (12MBit/s).
|
170
174
|
:SPEED_FULL, 2,
|
175
|
+
# The device is operating at high speed (480MBit/s).
|
171
176
|
:SPEED_HIGH, 3,
|
177
|
+
# The device is operating at super speed (5000MBit/s).
|
172
178
|
:SPEED_SUPER, 4,
|
179
|
+
# The device is operating at super speed plus (10000MBit/s).
|
180
|
+
# Available since libusb-1.0.22
|
181
|
+
:SPEED_SUPER_PLUS, 5,
|
173
182
|
]
|
174
183
|
|
175
184
|
# Supported speeds (wSpeedSupported) bitfield. Indicates what
|
@@ -219,14 +228,23 @@ module LIBUSB
|
|
219
228
|
#
|
220
229
|
# @see Bos::DeviceCapability
|
221
230
|
BosTypes = enum :libusb_bos_type, [
|
222
|
-
# Wireless USB device capability
|
223
|
-
:
|
224
|
-
# USB
|
225
|
-
:
|
226
|
-
|
227
|
-
:
|
228
|
-
#
|
229
|
-
:
|
231
|
+
:BT_WIRELESS_USB_DEVICE_CAPABILITY, 0x01, # Wireless USB device capability
|
232
|
+
:BT_USB_2_0_EXTENSION, 0x02, # USB 2.0 extensions
|
233
|
+
:BT_SS_USB_DEVICE_CAPABILITY, 0x03, # SuperSpeed USB device capability
|
234
|
+
:BT_CONTAINER_ID, 0x04, # Container ID type
|
235
|
+
:BT_PLATFORM_DESCRIPTOR, 0x05, # Platform descriptor
|
236
|
+
:BT_POWER_DELIVERY_CAPABILITY, 0x06, # Defines the various PD Capabilities of this device
|
237
|
+
:BT_BATTERY_INFO_CAPABILITY, 0x07, # Provides information on each battery supported by the device
|
238
|
+
:BT_PD_CONSUMER_PORT_CAPABILITY, 0x08, # The consumer characteristics of a port on the device
|
239
|
+
:BT_PD_PROVIDER_PORT_CAPABILITY, 0x09, # The provider characteristics of a port on the device
|
240
|
+
:BT_SUPERSPEED_PLUS, 0x0A, # Defines the set of SuperSpeed Plus USB specific device level capabilities
|
241
|
+
:BT_PRECISION_TIME_MEASUREMENT, 0x0B, # Precision Time Measurement (PTM) Capability Descriptor
|
242
|
+
:BT_Wireless_USB_Ext, 0x0C, # Defines the set of Wireless USB 1.1-specific device level capabilities
|
243
|
+
:BT_BILLBOARD, 0x0D, # Billboard capability
|
244
|
+
:BT_AUTHENTICATION, 0x0E, # Authentication Capability Descriptor
|
245
|
+
:BT_BILLBOARD_EX, 0x0F, # Billboard Ex capability
|
246
|
+
:BT_CONFIGURATION_SUMMARY, 0x10, # Summarizes configuration information for a function implemented by the device
|
247
|
+
:BT_FWStatus_Capability, 0x11, # Describes the capability to support FWStatus
|
230
248
|
]
|
231
249
|
|
232
250
|
# Since libusb version 1.0.16.
|
@@ -250,23 +268,164 @@ module LIBUSB
|
|
250
268
|
:HOTPLUG_ENUMERATE, 1,
|
251
269
|
]
|
252
270
|
|
271
|
+
# Log message levels.
|
272
|
+
#
|
273
|
+
# - :LOG_LEVEL_NONE (0) : no messages ever printed by the library (default)
|
274
|
+
# - :LOG_LEVEL_ERROR (1) : error messages are printed to stderr
|
275
|
+
# - :LOG_LEVEL_WARNING (2) : warning and error messages are printed to stderr
|
276
|
+
# - :LOG_LEVEL_INFO (3) : informational messages are printed to stderr
|
277
|
+
# - :LOG_LEVEL_DEBUG (4) : debug and informational messages are printed to stderr
|
278
|
+
LogLevels = enum :libusb_log_level, [
|
279
|
+
:LOG_LEVEL_NONE, 0,
|
280
|
+
:LOG_LEVEL_ERROR, 1,
|
281
|
+
:LOG_LEVEL_WARNING, 2,
|
282
|
+
:LOG_LEVEL_INFO, 3,
|
283
|
+
:LOG_LEVEL_DEBUG, 4,
|
284
|
+
]
|
285
|
+
|
286
|
+
# /** \ingroup libusb_lib
|
287
|
+
# * Log callback mode.
|
288
|
+
# *
|
289
|
+
# * Since version 1.0.23, \ref LIBUSB_API_VERSION >= 0x01000107
|
290
|
+
# *
|
291
|
+
# * \see libusb_set_log_cb()
|
292
|
+
# */
|
293
|
+
# enum libusb_log_cb_mode {
|
294
|
+
# /** Callback function handling all log messages. */
|
295
|
+
# LIBUSB_LOG_CB_GLOBAL = (1 << 0),
|
296
|
+
#
|
297
|
+
# /** Callback function handling context related log messages. */
|
298
|
+
# LIBUSB_LOG_CB_CONTEXT = (1 << 1)
|
299
|
+
# };
|
300
|
+
LogCbMode = enum :libusb_log_cb_mode, [
|
301
|
+
:LOG_CB_GLOBAL, (1 << 0),
|
302
|
+
:LOG_CB_CONTEXT, (1 << 1),
|
303
|
+
]
|
304
|
+
|
305
|
+
# Available option values for {Context#set_option}.
|
306
|
+
Options = enum :libusb_option, [
|
307
|
+
# Set the log message verbosity.
|
308
|
+
#
|
309
|
+
# The default level is :LOG_LEVEL_NONE, which means no messages are ever
|
310
|
+
# printed. If you choose to increase the message verbosity level, ensure
|
311
|
+
# that your application does not close the stderr file descriptor.
|
312
|
+
#
|
313
|
+
# You are advised to use level :LOG_LEVEL_WARNING. libusb is conservative
|
314
|
+
# with its message logging and most of the time, will only log messages that
|
315
|
+
# explain error conditions and other oddities. This will help you debug
|
316
|
+
# your software.
|
317
|
+
#
|
318
|
+
# If the +LIBUSB_DEBUG+ environment variable was set when libusb was
|
319
|
+
# initialized, this function does nothing: the message verbosity is fixed
|
320
|
+
# to the value in the environment variable.
|
321
|
+
#
|
322
|
+
# If libusb was compiled without any message logging, this function does
|
323
|
+
# nothing: you'll never get any messages.
|
324
|
+
#
|
325
|
+
# If libusb was compiled with verbose debug message logging, this function
|
326
|
+
# does nothing: you'll always get messages from all levels.
|
327
|
+
:OPTION_LOG_LEVEL, 0,
|
328
|
+
|
329
|
+
# Use the UsbDk backend for a specific context, if available.
|
330
|
+
#
|
331
|
+
# This option should be set immediately after calling {Context.new}, otherwise
|
332
|
+
# unspecified behavior may occur.
|
333
|
+
#
|
334
|
+
# Only valid on Windows.
|
335
|
+
#
|
336
|
+
# Available since libusb-1.0.22.
|
337
|
+
:OPTION_USE_USBDK, 1,
|
338
|
+
|
339
|
+
# Do not scan for devices
|
340
|
+
#
|
341
|
+
# With this option set, libusb will skip scanning devices in
|
342
|
+
# libusb_init_context().
|
343
|
+
#
|
344
|
+
# Hotplug functionality will also be deactivated.
|
345
|
+
#
|
346
|
+
# The option is useful in combination with libusb_wrap_sys_device(),
|
347
|
+
# which can access a device directly without prior device scanning.
|
348
|
+
#
|
349
|
+
# This is typically needed on Android, where access to USB devices
|
350
|
+
# is limited.
|
351
|
+
#
|
352
|
+
# Only valid on Linux. Ignored on all other platforms.
|
353
|
+
:OPTION_NO_DEVICE_DISCOVERY, 2,
|
354
|
+
|
355
|
+
# Set the context log callback functon.
|
356
|
+
#
|
357
|
+
# Set the log callback function either on a context or globally.
|
358
|
+
# This option must be provided a Proc argument or +nil+ to remove the callback.
|
359
|
+
# Using this option with a +nil+ context is equivalent to calling libusb_set_log_cb with mode :LOG_CB_GLOBAL.
|
360
|
+
# Using it with a non- +nil+ context is equivalent to calling libusb_set_log_cb with mode :LOG_CB_CONTEXT.
|
361
|
+
:OPTION_LOG_CB, 3,
|
362
|
+
|
363
|
+
:OPTION_MAX, 4,
|
364
|
+
]
|
365
|
+
|
253
366
|
typedef :pointer, :libusb_context
|
254
367
|
typedef :pointer, :libusb_device
|
255
368
|
typedef :pointer, :libusb_device_handle
|
256
369
|
typedef :pointer, :libusb_transfer
|
257
370
|
typedef :int, :libusb_hotplug_callback_handle
|
258
371
|
|
259
|
-
|
260
|
-
|
261
|
-
|
372
|
+
# /** \ingroup libusb_lib
|
373
|
+
# * Callback function for handling log messages.
|
374
|
+
# * \param ctx the context which is related to the log message, or +nil+ if it
|
375
|
+
# * is a global log message
|
376
|
+
# * \param level the log level, see \ref libusb_log_level for a description
|
377
|
+
# * \param str the log message
|
378
|
+
# *
|
379
|
+
# * Since version 1.0.23, \ref LIBUSB_API_VERSION >= 0x01000107
|
380
|
+
# *
|
381
|
+
# * \see libusb_set_log_cb()
|
382
|
+
# */
|
383
|
+
# typedef void (LIBUSB_CALL *libusb_log_cb)(libusb_context *ctx,
|
384
|
+
# enum libusb_log_level level, const char *str);
|
385
|
+
callback :libusb_log_cb, [:libusb_context, :libusb_log_level, :string], :void
|
386
|
+
|
387
|
+
# @private
|
388
|
+
# /** \ingroup libusb_lib
|
389
|
+
# * Structure used for setting options through \ref libusb_init_context.
|
390
|
+
# *
|
391
|
+
# */
|
392
|
+
# struct libusb_init_option {
|
393
|
+
# /** Which option to set */
|
394
|
+
# enum libusb_option option;
|
395
|
+
# /** An integer value used by the option (if applicable). */
|
396
|
+
# union {
|
397
|
+
# int64_t ival;
|
398
|
+
# libusb_log_cb log_cbval;
|
399
|
+
# } value;
|
400
|
+
# };
|
401
|
+
class InitOptionValue < FFI::Union
|
402
|
+
layout :ival, :int64_t,
|
403
|
+
:log_cbval, :libusb_log_cb
|
404
|
+
end
|
405
|
+
class InitOption < FFI::Struct
|
406
|
+
layout :option, :libusb_option,
|
407
|
+
:value, InitOptionValue
|
408
|
+
end
|
409
|
+
|
410
|
+
class << self
|
411
|
+
private def try_attach_function(method, *args, **kwargs)
|
412
|
+
if ffi_libraries.find{|lib| lib.find_function(method) }
|
413
|
+
attach_function method, *args, **kwargs
|
414
|
+
end
|
262
415
|
end
|
263
416
|
end
|
264
417
|
|
265
418
|
try_attach_function 'libusb_get_version', [], :pointer
|
266
419
|
|
267
420
|
attach_function 'libusb_init', [ :pointer ], :int
|
421
|
+
# int LIBUSB_CALL libusb_init_context(libusb_context **ctx, const struct libusb_init_option options[], int num_options);
|
422
|
+
try_attach_function 'libusb_init_context', [:pointer, :pointer, :int], :int
|
423
|
+
# may be deprecated in the future in favor of libusb_init_context()+libusb_set_option()
|
424
|
+
# void LIBUSB_CALL libusb_set_log_cb(libusb_context *ctx, libusb_log_cb cb, int mode);
|
425
|
+
try_attach_function 'libusb_set_log_cb', [:libusb_context, :libusb_log_cb, :int], :void
|
268
426
|
attach_function 'libusb_exit', [ :pointer ], :void
|
269
|
-
attach_function 'libusb_set_debug', [:pointer, :
|
427
|
+
attach_function 'libusb_set_debug', [:pointer, :libusb_log_level], :void
|
428
|
+
try_attach_function 'libusb_set_option', [:libusb_context, :libusb_option, :varargs], :int
|
270
429
|
try_attach_function 'libusb_has_capability', [:libusb_capability], :int
|
271
430
|
|
272
431
|
attach_function 'libusb_get_device_list', [:pointer, :pointer], :ssize_t
|
@@ -288,6 +447,8 @@ module LIBUSB
|
|
288
447
|
try_attach_function 'libusb_get_device_speed', [:pointer], :libusb_speed
|
289
448
|
attach_function 'libusb_get_max_packet_size', [:pointer, :uint8], :int
|
290
449
|
attach_function 'libusb_get_max_iso_packet_size', [:pointer, :uint8], :int
|
450
|
+
# int API_EXPORTED libusb_get_max_alt_packet_size(libusb_device *dev, int interface_number, int alternate_setting, unsigned char endpoint)
|
451
|
+
try_attach_function 'libusb_get_max_alt_packet_size', [:pointer, :int, :int, :uchar], :int
|
291
452
|
|
292
453
|
try_attach_function 'libusb_get_ss_endpoint_companion_descriptor', [:pointer, :pointer, :pointer], :int
|
293
454
|
try_attach_function 'libusb_free_ss_endpoint_companion_descriptor', [:pointer], :void
|
@@ -300,7 +461,11 @@ module LIBUSB
|
|
300
461
|
try_attach_function 'libusb_free_ss_usb_device_capability_descriptor', [:pointer], :void
|
301
462
|
try_attach_function 'libusb_get_container_id_descriptor', [:libusb_context, :pointer, :pointer], :int
|
302
463
|
try_attach_function 'libusb_free_container_id_descriptor', [:pointer], :void
|
464
|
+
try_attach_function 'libusb_get_platform_descriptor', [:libusb_context, :pointer, :pointer], :int
|
465
|
+
try_attach_function 'libusb_free_platform_descriptor', [:pointer], :void
|
303
466
|
|
467
|
+
# int LIBUSB_CALL libusb_wrap_sys_device(libusb_context *ctx, intptr_t sys_dev, libusb_device_handle **dev_handle);
|
468
|
+
try_attach_function 'libusb_wrap_sys_device', [:libusb_context, :intptr_t, :pointer], :int
|
304
469
|
attach_function 'libusb_open', [:pointer, :pointer], :int
|
305
470
|
attach_function 'libusb_close', [:pointer], :void
|
306
471
|
attach_function 'libusb_get_device', [:libusb_device_handle], :pointer
|
@@ -371,7 +536,7 @@ module LIBUSB
|
|
371
536
|
:wLength, :uint16
|
372
537
|
end
|
373
538
|
|
374
|
-
class Transfer < FFI::
|
539
|
+
class Transfer < FFI::Struct
|
375
540
|
layout :dev_handle, :libusb_device_handle,
|
376
541
|
:flags, :uint8,
|
377
542
|
:endpoint, :uchar,
|
@@ -385,8 +550,19 @@ module LIBUSB
|
|
385
550
|
:buffer, :pointer,
|
386
551
|
:num_iso_packets, :int
|
387
552
|
|
388
|
-
def
|
389
|
-
|
553
|
+
def initialize(*)
|
554
|
+
super
|
555
|
+
|
556
|
+
ptr = pointer
|
557
|
+
def ptr.free_struct(id)
|
558
|
+
Call.libusb_free_transfer(self)
|
559
|
+
return unless @ctx
|
560
|
+
@ctx.unref_context
|
561
|
+
end
|
562
|
+
# The ctx pointer is not yet assigned.
|
563
|
+
# It happens at LIBUSB::Transfer#dev_handle= later on.
|
564
|
+
ptr.instance_variable_set(:@ctx, nil)
|
565
|
+
ObjectSpace.define_finalizer(self, ptr.method(:free_struct))
|
390
566
|
end
|
391
567
|
end
|
392
568
|
|
data/lib/libusb/configuration.rb
CHANGED
@@ -16,8 +16,9 @@
|
|
16
16
|
require 'libusb/call'
|
17
17
|
|
18
18
|
module LIBUSB
|
19
|
-
class Configuration < FFI::
|
19
|
+
class Configuration < FFI::Struct
|
20
20
|
include Comparable
|
21
|
+
include ContextReference
|
21
22
|
|
22
23
|
layout :bLength, :uint8,
|
23
24
|
:bDescriptorType, :uint8,
|
@@ -108,10 +109,8 @@ module LIBUSB
|
|
108
109
|
def initialize(device, *args)
|
109
110
|
@device = device
|
110
111
|
super(*args)
|
111
|
-
end
|
112
112
|
|
113
|
-
|
114
|
-
Call.libusb_free_config_descriptor(ptr)
|
113
|
+
register_context(device.context.instance_variable_get(:@ctx), :libusb_free_config_descriptor)
|
115
114
|
end
|
116
115
|
|
117
116
|
# @return [Device] the device this configuration belongs to.
|
data/lib/libusb/constants.rb
CHANGED
@@ -16,22 +16,29 @@
|
|
16
16
|
require 'libusb/call'
|
17
17
|
|
18
18
|
module LIBUSB
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
19
|
+
[
|
20
|
+
Call::ClassCodes,
|
21
|
+
Call::TransferTypes,
|
22
|
+
Call::StandardRequests,
|
23
|
+
Call::RequestTypes,
|
24
|
+
Call::DescriptorTypes,
|
25
|
+
Call::EndpointDirections,
|
26
|
+
Call::RequestRecipients,
|
27
|
+
Call::IsoSyncTypes,
|
28
|
+
Call::Speeds,
|
29
|
+
Call::Capabilities,
|
30
|
+
Call::SupportedSpeeds,
|
31
|
+
Call::Usb20ExtensionAttributes,
|
32
|
+
Call::SsUsbDeviceCapabilityAttributes,
|
33
|
+
Call::BosTypes,
|
34
|
+
Call::HotplugEvents,
|
35
|
+
Call::HotplugFlags,
|
36
|
+
Call::LogLevels,
|
37
|
+
Call::LogCbMode,
|
38
|
+
Call::Options,
|
39
|
+
].each do |enum|
|
40
|
+
enum.to_h.each{|k,v| const_set(k,v) }
|
41
|
+
end
|
35
42
|
|
36
43
|
# Base class of libusb errors
|
37
44
|
class Error < RuntimeError
|
@@ -46,6 +53,9 @@ module LIBUSB
|
|
46
53
|
end
|
47
54
|
end
|
48
55
|
|
56
|
+
class RemainingReferencesError < Error
|
57
|
+
end
|
58
|
+
|
49
59
|
# @private
|
50
60
|
ErrorClassForResult = {}
|
51
61
|
|