libusb 0.6.3-x86-mingw32 → 0.7.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|