libusb 0.7.0-x64-mingw-ucrt
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 +7 -0
- data/.appveyor.yml +33 -0
- data/.github/workflows/ci.yml +185 -0
- data/.gitignore +9 -0
- data/.travis.yml +26 -0
- data/.yardopts +6 -0
- data/COPYING +165 -0
- data/Gemfile +19 -0
- data/History.md +193 -0
- data/README.md +184 -0
- data/Rakefile +79 -0
- data/lib/libusb/bos.rb +362 -0
- data/lib/libusb/call.rb +622 -0
- data/lib/libusb/compat.rb +376 -0
- data/lib/libusb/configuration.rb +154 -0
- data/lib/libusb/constants.rb +170 -0
- data/lib/libusb/context.rb +576 -0
- data/lib/libusb/context_reference.rb +38 -0
- data/lib/libusb/dependencies.rb +7 -0
- data/lib/libusb/dev_handle.rb +574 -0
- data/lib/libusb/device.rb +407 -0
- data/lib/libusb/endpoint.rb +195 -0
- data/lib/libusb/eventmachine.rb +187 -0
- data/lib/libusb/gem_helper.rb +151 -0
- data/lib/libusb/interface.rb +60 -0
- data/lib/libusb/libusb_recipe.rb +29 -0
- data/lib/libusb/setting.rb +132 -0
- data/lib/libusb/ss_companion.rb +72 -0
- data/lib/libusb/stdio.rb +25 -0
- data/lib/libusb/transfer.rb +418 -0
- data/lib/libusb/version_gem.rb +19 -0
- data/lib/libusb/version_struct.rb +63 -0
- data/lib/libusb-1.0.dll +0 -0
- data/lib/libusb.rb +146 -0
- data/libusb.gemspec +28 -0
- data/test/test_libusb.rb +42 -0
- data/test/test_libusb_bos.rb +140 -0
- data/test/test_libusb_bulk_stream_transfer.rb +61 -0
- data/test/test_libusb_compat.rb +78 -0
- data/test/test_libusb_compat_mass_storage.rb +81 -0
- data/test/test_libusb_context.rb +88 -0
- data/test/test_libusb_descriptors.rb +245 -0
- data/test/test_libusb_event_machine.rb +118 -0
- data/test/test_libusb_gc.rb +52 -0
- data/test/test_libusb_hotplug.rb +129 -0
- data/test/test_libusb_iso_transfer.rb +56 -0
- data/test/test_libusb_mass_storage.rb +268 -0
- data/test/test_libusb_mass_storage2.rb +96 -0
- data/test/test_libusb_structs.rb +87 -0
- data/test/test_libusb_threads.rb +89 -0
- data/wireshark-usb-sniffer.png +0 -0
- metadata +112 -0
data/lib/libusb/call.rb
ADDED
@@ -0,0 +1,622 @@
|
|
1
|
+
# This file is part of Libusb for Ruby.
|
2
|
+
#
|
3
|
+
# Libusb for Ruby is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# Libusb for Ruby is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public License
|
14
|
+
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require 'rubygems'
|
17
|
+
require 'ffi'
|
18
|
+
|
19
|
+
module LIBUSB
|
20
|
+
# C level interface - for internal use only
|
21
|
+
#
|
22
|
+
# All enum codes are available as constants in {LIBUSB} namespace.
|
23
|
+
module Call
|
24
|
+
extend FFI::Library
|
25
|
+
|
26
|
+
root_path = File.expand_path("../../..", __FILE__)
|
27
|
+
ext = FFI::Platform::LIBSUFFIX
|
28
|
+
prefix = FFI::Platform::LIBPREFIX.empty? ? 'lib' : FFI::Platform::LIBPREFIX
|
29
|
+
bundled_dll = File.join(root_path, "lib/#{prefix}usb-1.0.#{ext}")
|
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.#{ext}.0", "#{prefix}usb-1.0", "#{prefix}usb"])
|
32
|
+
|
33
|
+
ClassCodes = enum :libusb_class_code, [
|
34
|
+
:CLASS_PER_INTERFACE, 0,
|
35
|
+
:CLASS_AUDIO, 1,
|
36
|
+
:CLASS_COMM, 2,
|
37
|
+
:CLASS_HID, 3,
|
38
|
+
:CLASS_PRINTER, 7,
|
39
|
+
:CLASS_PTP, 6,
|
40
|
+
:CLASS_MASS_STORAGE, 8,
|
41
|
+
:CLASS_HUB, 9,
|
42
|
+
:CLASS_DATA, 10,
|
43
|
+
:CLASS_WIRELESS, 0xe0,
|
44
|
+
:CLASS_APPLICATION, 0xfe,
|
45
|
+
:CLASS_VENDOR_SPEC, 0xff
|
46
|
+
]
|
47
|
+
|
48
|
+
Errors = enum :libusb_error, [
|
49
|
+
:SUCCESS, 0,
|
50
|
+
:ERROR_IO, -1,
|
51
|
+
:ERROR_INVALID_PARAM, -2,
|
52
|
+
:ERROR_ACCESS, -3,
|
53
|
+
:ERROR_NO_DEVICE, -4,
|
54
|
+
:ERROR_NOT_FOUND, -5,
|
55
|
+
:ERROR_BUSY, -6,
|
56
|
+
:ERROR_TIMEOUT, -7,
|
57
|
+
:ERROR_OVERFLOW, -8,
|
58
|
+
:ERROR_PIPE, -9,
|
59
|
+
:ERROR_INTERRUPTED, -10,
|
60
|
+
:ERROR_NO_MEM, -11,
|
61
|
+
:ERROR_NOT_SUPPORTED, -12,
|
62
|
+
:ERROR_OTHER, -99,
|
63
|
+
]
|
64
|
+
|
65
|
+
# Transfer status codes
|
66
|
+
TransferStatus = enum :libusb_transfer_status, [
|
67
|
+
:TRANSFER_COMPLETED,
|
68
|
+
:TRANSFER_ERROR,
|
69
|
+
:TRANSFER_TIMED_OUT,
|
70
|
+
:TRANSFER_CANCELLED,
|
71
|
+
:TRANSFER_STALL,
|
72
|
+
:TRANSFER_NO_DEVICE,
|
73
|
+
:TRANSFER_OVERFLOW,
|
74
|
+
]
|
75
|
+
|
76
|
+
# libusb_transfer.flags values
|
77
|
+
TransferFlags = enum :libusb_transfer_flags, [
|
78
|
+
:TRANSFER_SHORT_NOT_OK, 1 << 0,
|
79
|
+
:TRANSFER_FREE_BUFFER, 1 << 1,
|
80
|
+
:TRANSFER_FREE_TRANSFER, 1 << 2,
|
81
|
+
:TRANSFER_ADD_ZERO_PACKET, 1 << 3,
|
82
|
+
]
|
83
|
+
|
84
|
+
# Values for {Endpoint#transfer_type}.
|
85
|
+
TransferTypes = enum :libusb_transfer_type, [
|
86
|
+
# Control endpoint
|
87
|
+
:TRANSFER_TYPE_CONTROL, 0,
|
88
|
+
# Isochronous endpoint
|
89
|
+
:TRANSFER_TYPE_ISOCHRONOUS, 1,
|
90
|
+
# Bulk endpoint
|
91
|
+
:TRANSFER_TYPE_BULK, 2,
|
92
|
+
# Interrupt endpoint
|
93
|
+
:TRANSFER_TYPE_INTERRUPT, 3,
|
94
|
+
# Stream endpoint
|
95
|
+
:TRANSFER_TYPE_BULK_STREAM, 4,
|
96
|
+
]
|
97
|
+
|
98
|
+
StandardRequests = enum :libusb_standard_request, [
|
99
|
+
:REQUEST_GET_STATUS, 0x00,
|
100
|
+
:REQUEST_CLEAR_FEATURE, 0x01,
|
101
|
+
:REQUEST_SET_FEATURE, 0x03,
|
102
|
+
:REQUEST_SET_ADDRESS, 0x05,
|
103
|
+
:REQUEST_GET_DESCRIPTOR, 0x06,
|
104
|
+
:REQUEST_SET_DESCRIPTOR, 0x07,
|
105
|
+
:REQUEST_GET_CONFIGURATION, 0x08,
|
106
|
+
:REQUEST_SET_CONFIGURATION, 0x09,
|
107
|
+
:REQUEST_GET_INTERFACE, 0x0A,
|
108
|
+
:REQUEST_SET_INTERFACE, 0x0B,
|
109
|
+
:REQUEST_SYNCH_FRAME, 0x0C,
|
110
|
+
]
|
111
|
+
|
112
|
+
EndpointDirections = enum :libusb_endpoint_direction, [
|
113
|
+
:ENDPOINT_IN, 0x80,
|
114
|
+
:ENDPOINT_OUT, 0x00,
|
115
|
+
]
|
116
|
+
|
117
|
+
DescriptorTypes = enum :libusb_descriptor_type, [
|
118
|
+
# Device descriptor. See {Device}
|
119
|
+
:DT_DEVICE, 0x01,
|
120
|
+
# Configuration descriptor. See {Configuration}
|
121
|
+
:DT_CONFIG, 0x02,
|
122
|
+
# String descriptor
|
123
|
+
:DT_STRING, 0x03,
|
124
|
+
# Interface descriptor. See {Interface}
|
125
|
+
:DT_INTERFACE, 0x04,
|
126
|
+
# Endpoint descriptor. See {Endpoint}
|
127
|
+
:DT_ENDPOINT, 0x05,
|
128
|
+
# BOS descriptor
|
129
|
+
:DT_BOS, 0x0f,
|
130
|
+
# Device Capability descriptor
|
131
|
+
:DT_DEVICE_CAPABILITY, 0x10,
|
132
|
+
# HID descriptor
|
133
|
+
:DT_HID, 0x21,
|
134
|
+
# HID report descriptor
|
135
|
+
:DT_REPORT, 0x22,
|
136
|
+
# Physical descriptor
|
137
|
+
:DT_PHYSICAL, 0x23,
|
138
|
+
# Hub descriptor
|
139
|
+
:DT_HUB, 0x29,
|
140
|
+
# SuperSpeed Hub descriptor
|
141
|
+
:DT_SUPERSPEED_HUB, 0x2a,
|
142
|
+
# SuperSpeed Endpoint Companion descriptor
|
143
|
+
:DT_SS_ENDPOINT_COMPANION, 0x30,
|
144
|
+
]
|
145
|
+
|
146
|
+
RequestTypes = enum :libusb_request_type, [
|
147
|
+
:REQUEST_TYPE_STANDARD, (0x00 << 5),
|
148
|
+
:REQUEST_TYPE_CLASS, (0x01 << 5),
|
149
|
+
:REQUEST_TYPE_VENDOR, (0x02 << 5),
|
150
|
+
:REQUEST_TYPE_RESERVED, (0x03 << 5),
|
151
|
+
]
|
152
|
+
|
153
|
+
RequestRecipients = enum :libusb_request_recipient, [
|
154
|
+
:RECIPIENT_DEVICE, 0x00,
|
155
|
+
:RECIPIENT_INTERFACE, 0x01,
|
156
|
+
:RECIPIENT_ENDPOINT, 0x02,
|
157
|
+
:RECIPIENT_OTHER, 0x03,
|
158
|
+
]
|
159
|
+
|
160
|
+
IsoSyncTypes = enum :libusb_iso_sync_type, [
|
161
|
+
:ISO_SYNC_TYPE_NONE, 0,
|
162
|
+
:ISO_SYNC_TYPE_ASYNC, 1,
|
163
|
+
:ISO_SYNC_TYPE_ADAPTIVE, 2,
|
164
|
+
:ISO_SYNC_TYPE_SYNC, 3,
|
165
|
+
]
|
166
|
+
|
167
|
+
# Speed codes. Indicates the speed at which the device is operating.
|
168
|
+
Speeds = enum :libusb_speed, [
|
169
|
+
# The OS doesn't report or know the device speed.
|
170
|
+
:SPEED_UNKNOWN, 0,
|
171
|
+
# The device is operating at low speed (1.5MBit/s).
|
172
|
+
:SPEED_LOW, 1,
|
173
|
+
# The device is operating at full speed (12MBit/s).
|
174
|
+
:SPEED_FULL, 2,
|
175
|
+
# The device is operating at high speed (480MBit/s).
|
176
|
+
:SPEED_HIGH, 3,
|
177
|
+
# The device is operating at super speed (5000MBit/s).
|
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,
|
182
|
+
]
|
183
|
+
|
184
|
+
# Supported speeds (wSpeedSupported) bitfield. Indicates what
|
185
|
+
# speeds the device supports.
|
186
|
+
SupportedSpeeds = enum :libusb_supported_speed, [
|
187
|
+
# Low speed operation supported (1.5MBit/s).
|
188
|
+
:LOW_SPEED_OPERATION, 1,
|
189
|
+
# Full speed operation supported (12MBit/s).
|
190
|
+
:FULL_SPEED_OPERATION, 2,
|
191
|
+
# High speed operation supported (480MBit/s).
|
192
|
+
:HIGH_SPEED_OPERATION, 4,
|
193
|
+
# Superspeed operation supported (5000MBit/s).
|
194
|
+
:SUPER_SPEED_OPERATION, 8,
|
195
|
+
]
|
196
|
+
|
197
|
+
Capabilities = enum :libusb_capability, [
|
198
|
+
:CAP_HAS_CAPABILITY, 0x0000,
|
199
|
+
# Hotplug support is available on this platform.
|
200
|
+
:CAP_HAS_HOTPLUG, 0x0001,
|
201
|
+
# The library can access HID devices without requiring user intervention.
|
202
|
+
# Note that before being able to actually access an HID device, you may
|
203
|
+
# still have to call additional libusb functions such as
|
204
|
+
# {DevHandle#detach_kernel_driver}.
|
205
|
+
:CAP_HAS_HID_ACCESS, 0x0100,
|
206
|
+
# The library supports detaching of the default USB driver, using
|
207
|
+
# {DevHandle#detach_kernel_driver}, if one is set by the OS kernel.
|
208
|
+
:CAP_SUPPORTS_DETACH_KERNEL_DRIVER, 0x0101,
|
209
|
+
]
|
210
|
+
|
211
|
+
# Masks for the bits of the
|
212
|
+
# {Bos::Usb20Extension#bmAttributes} field
|
213
|
+
# of the USB 2.0 Extension descriptor.
|
214
|
+
Usb20ExtensionAttributes = enum :libusb_usb_2_0_extension_attributes, [
|
215
|
+
# Supports Link Power Management (LPM)
|
216
|
+
:BM_LPM_SUPPORT, 2,
|
217
|
+
]
|
218
|
+
|
219
|
+
# Masks for the bits of the
|
220
|
+
# {Bos::SsUsbDeviceCapability#bmAttributes} field
|
221
|
+
# field of the SuperSpeed USB Device Capability descriptor.
|
222
|
+
SsUsbDeviceCapabilityAttributes = enum :libusb_ss_usb_device_capability_attributes, [
|
223
|
+
# Supports Latency Tolerance Messages (LTM)
|
224
|
+
:BM_LTM_SUPPORT, 2,
|
225
|
+
]
|
226
|
+
|
227
|
+
# USB capability types
|
228
|
+
#
|
229
|
+
# @see Bos::DeviceCapability
|
230
|
+
BosTypes = enum :libusb_bos_type, [
|
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
|
248
|
+
]
|
249
|
+
|
250
|
+
# Since libusb version 1.0.16.
|
251
|
+
#
|
252
|
+
# Hotplug events
|
253
|
+
HotplugEvents = enum :libusb_hotplug_event, [
|
254
|
+
# A device has been plugged in and is ready to use.
|
255
|
+
:HOTPLUG_EVENT_DEVICE_ARRIVED, 0x01,
|
256
|
+
|
257
|
+
# A device has left and is no longer available.
|
258
|
+
# It is the user's responsibility to call libusb_close on any handle associated with a disconnected device.
|
259
|
+
# It is safe to call libusb_get_device_descriptor on a device that has left.
|
260
|
+
:HOTPLUG_EVENT_DEVICE_LEFT, 0x02,
|
261
|
+
]
|
262
|
+
|
263
|
+
# Since libusb version 1.0.16.
|
264
|
+
#
|
265
|
+
# Flags for hotplug events */
|
266
|
+
HotplugFlags = enum :libusb_hotplug_flag, [
|
267
|
+
# Arm the callback and fire it for all matching currently attached devices.
|
268
|
+
:HOTPLUG_ENUMERATE, 1,
|
269
|
+
]
|
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
|
+
|
366
|
+
typedef :pointer, :libusb_context
|
367
|
+
typedef :pointer, :libusb_device
|
368
|
+
typedef :pointer, :libusb_device_handle
|
369
|
+
typedef :pointer, :libusb_transfer
|
370
|
+
typedef :int, :libusb_hotplug_callback_handle
|
371
|
+
|
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
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
try_attach_function 'libusb_get_version', [], :pointer
|
419
|
+
|
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
|
426
|
+
attach_function 'libusb_exit', [ :pointer ], :void
|
427
|
+
attach_function 'libusb_set_debug', [:pointer, :libusb_log_level], :void
|
428
|
+
try_attach_function 'libusb_set_option', [:libusb_context, :libusb_option, :varargs], :int
|
429
|
+
try_attach_function 'libusb_has_capability', [:libusb_capability], :int
|
430
|
+
|
431
|
+
attach_function 'libusb_get_device_list', [:pointer, :pointer], :ssize_t
|
432
|
+
attach_function 'libusb_free_device_list', [:pointer, :int], :void
|
433
|
+
attach_function 'libusb_ref_device', [:pointer], :pointer
|
434
|
+
attach_function 'libusb_unref_device', [:pointer], :void
|
435
|
+
|
436
|
+
attach_function 'libusb_get_device_descriptor', [:pointer, :pointer], :int
|
437
|
+
attach_function 'libusb_get_active_config_descriptor', [:pointer, :pointer], :int
|
438
|
+
attach_function 'libusb_get_config_descriptor', [:pointer, :uint8, :pointer], :int
|
439
|
+
attach_function 'libusb_get_config_descriptor_by_value', [:pointer, :uint8, :pointer], :int
|
440
|
+
attach_function 'libusb_free_config_descriptor', [:pointer], :void
|
441
|
+
attach_function 'libusb_get_bus_number', [:pointer], :uint8
|
442
|
+
try_attach_function 'libusb_get_port_number', [:pointer], :uint8
|
443
|
+
try_attach_function 'libusb_get_parent', [:pointer], :pointer
|
444
|
+
try_attach_function 'libusb_get_port_path', [:pointer, :pointer, :pointer, :uint8], :uint8
|
445
|
+
try_attach_function 'libusb_get_port_numbers', [:pointer, :pointer, :uint8], :uint8
|
446
|
+
attach_function 'libusb_get_device_address', [:pointer], :uint8
|
447
|
+
try_attach_function 'libusb_get_device_speed', [:pointer], :libusb_speed
|
448
|
+
attach_function 'libusb_get_max_packet_size', [:pointer, :uint8], :int
|
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
|
452
|
+
|
453
|
+
try_attach_function 'libusb_get_ss_endpoint_companion_descriptor', [:pointer, :pointer, :pointer], :int
|
454
|
+
try_attach_function 'libusb_free_ss_endpoint_companion_descriptor', [:pointer], :void
|
455
|
+
|
456
|
+
try_attach_function 'libusb_get_bos_descriptor', [:libusb_device_handle, :pointer], :int, blocking: true
|
457
|
+
try_attach_function 'libusb_free_bos_descriptor', [:pointer], :void
|
458
|
+
try_attach_function 'libusb_get_usb_2_0_extension_descriptor', [:libusb_context, :pointer, :pointer], :int
|
459
|
+
try_attach_function 'libusb_free_usb_2_0_extension_descriptor', [:pointer], :void
|
460
|
+
try_attach_function 'libusb_get_ss_usb_device_capability_descriptor', [:libusb_context, :pointer, :pointer], :int
|
461
|
+
try_attach_function 'libusb_free_ss_usb_device_capability_descriptor', [:pointer], :void
|
462
|
+
try_attach_function 'libusb_get_container_id_descriptor', [:libusb_context, :pointer, :pointer], :int
|
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
|
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
|
469
|
+
attach_function 'libusb_open', [:pointer, :pointer], :int
|
470
|
+
attach_function 'libusb_close', [:pointer], :void
|
471
|
+
attach_function 'libusb_get_device', [:libusb_device_handle], :pointer
|
472
|
+
|
473
|
+
attach_function 'libusb_set_configuration', [:libusb_device_handle, :int], :int, blocking: true
|
474
|
+
attach_function 'libusb_claim_interface', [:libusb_device_handle, :int], :int
|
475
|
+
attach_function 'libusb_release_interface', [:libusb_device_handle, :int], :int, blocking: true
|
476
|
+
|
477
|
+
attach_function 'libusb_open_device_with_vid_pid', [:pointer, :int, :int], :pointer
|
478
|
+
|
479
|
+
attach_function 'libusb_set_interface_alt_setting', [:libusb_device_handle, :int, :int], :int, blocking: true
|
480
|
+
attach_function 'libusb_clear_halt', [:libusb_device_handle, :int], :int, blocking: true
|
481
|
+
attach_function 'libusb_reset_device', [:libusb_device_handle], :int, blocking: true
|
482
|
+
try_attach_function 'libusb_alloc_streams', [:libusb_device_handle, :uint32, :pointer, :int], :int
|
483
|
+
try_attach_function 'libusb_free_streams', [:libusb_device_handle, :pointer, :int], :int
|
484
|
+
try_attach_function 'libusb_dev_mem_alloc', [:libusb_device_handle, :size_t], :pointer
|
485
|
+
try_attach_function 'libusb_dev_mem_free', [:libusb_device_handle, :pointer, :size_t], :int
|
486
|
+
|
487
|
+
attach_function 'libusb_kernel_driver_active', [:libusb_device_handle, :int], :int
|
488
|
+
attach_function 'libusb_detach_kernel_driver', [:libusb_device_handle, :int], :int
|
489
|
+
attach_function 'libusb_attach_kernel_driver', [:libusb_device_handle, :int], :int
|
490
|
+
try_attach_function 'libusb_set_auto_detach_kernel_driver', [:libusb_device_handle, :int], :int
|
491
|
+
|
492
|
+
attach_function 'libusb_get_string_descriptor_ascii', [:pointer, :uint8, :pointer, :int], :int
|
493
|
+
|
494
|
+
attach_function 'libusb_alloc_transfer', [:int], :pointer
|
495
|
+
attach_function 'libusb_submit_transfer', [:pointer], :int
|
496
|
+
attach_function 'libusb_cancel_transfer', [:pointer], :int
|
497
|
+
attach_function 'libusb_free_transfer', [:pointer], :void
|
498
|
+
try_attach_function 'libusb_transfer_set_stream_id', [:libusb_transfer, :uint32], :void
|
499
|
+
try_attach_function 'libusb_transfer_get_stream_id', [:libusb_transfer], :uint32
|
500
|
+
|
501
|
+
attach_function 'libusb_handle_events', [:libusb_context], :int, blocking: true
|
502
|
+
try_attach_function 'libusb_handle_events_completed', [:libusb_context, :pointer], :int, blocking: true
|
503
|
+
attach_function 'libusb_handle_events_timeout', [:libusb_context, :pointer], :int, blocking: true
|
504
|
+
try_attach_function 'libusb_handle_events_timeout_completed', [:libusb_context, :pointer, :pointer], :int, blocking: true
|
505
|
+
try_attach_function 'libusb_interrupt_event_handler', [:libusb_context], :void
|
506
|
+
|
507
|
+
callback :libusb_pollfd_added_cb, [:int, :short, :pointer], :void
|
508
|
+
callback :libusb_pollfd_removed_cb, [:int, :pointer], :void
|
509
|
+
|
510
|
+
attach_function 'libusb_get_pollfds', [:libusb_context], :pointer
|
511
|
+
attach_function 'libusb_get_next_timeout', [:libusb_context, :pointer], :int
|
512
|
+
attach_function 'libusb_set_pollfd_notifiers', [:libusb_context, :libusb_pollfd_added_cb, :libusb_pollfd_removed_cb, :pointer], :void
|
513
|
+
try_attach_function 'libusb_free_pollfds', [:pointer], :void
|
514
|
+
|
515
|
+
callback :libusb_transfer_cb_fn, [:pointer], :void
|
516
|
+
|
517
|
+
callback :libusb_hotplug_callback_fn, [:libusb_context, :libusb_device, :libusb_hotplug_event, :pointer], :int
|
518
|
+
try_attach_function 'libusb_hotplug_register_callback', [
|
519
|
+
:libusb_context, :libusb_hotplug_event, :libusb_hotplug_flag,
|
520
|
+
:int, :int, :int, :libusb_hotplug_callback_fn,
|
521
|
+
:pointer, :pointer], :int
|
522
|
+
try_attach_function 'libusb_hotplug_deregister_callback', [:libusb_context, :libusb_hotplug_callback_handle], :void
|
523
|
+
|
524
|
+
class IsoPacketDescriptor < FFI::Struct
|
525
|
+
layout :length, :uint,
|
526
|
+
:actual_length, :uint,
|
527
|
+
:status, :libusb_transfer_status
|
528
|
+
end
|
529
|
+
|
530
|
+
# Setup packet for control transfers.
|
531
|
+
class ControlSetup < FFI::Struct
|
532
|
+
layout :bmRequestType, :uint8,
|
533
|
+
:bRequest, :uint8,
|
534
|
+
:wValue, :uint16,
|
535
|
+
:wIndex, :uint16,
|
536
|
+
:wLength, :uint16
|
537
|
+
end
|
538
|
+
|
539
|
+
class Transfer < FFI::Struct
|
540
|
+
layout :dev_handle, :libusb_device_handle,
|
541
|
+
:flags, :uint8,
|
542
|
+
:endpoint, :uchar,
|
543
|
+
:type, :uchar,
|
544
|
+
:timeout, :uint,
|
545
|
+
:status, :libusb_transfer_status,
|
546
|
+
:length, :int,
|
547
|
+
:actual_length, :int,
|
548
|
+
:callback, :libusb_transfer_cb_fn,
|
549
|
+
:user_data, :pointer,
|
550
|
+
:buffer, :pointer,
|
551
|
+
:num_iso_packets, :int
|
552
|
+
|
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))
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
569
|
+
class DeviceDescriptor < FFI::Struct
|
570
|
+
include Comparable
|
571
|
+
|
572
|
+
layout :bLength, :uint8,
|
573
|
+
:bDescriptorType, :uint8,
|
574
|
+
:bcdUSB, :uint16,
|
575
|
+
:bDeviceClass, :uint8,
|
576
|
+
:bDeviceSubClass, :uint8,
|
577
|
+
:bDeviceProtocol, :uint8,
|
578
|
+
:bMaxPacketSize0, :uint8,
|
579
|
+
:idVendor, :uint16,
|
580
|
+
:idProduct, :uint16,
|
581
|
+
:bcdDevice, :uint16,
|
582
|
+
:iManufacturer, :uint8,
|
583
|
+
:iProduct, :uint8,
|
584
|
+
:iSerialNumber, :uint8,
|
585
|
+
:bNumConfigurations, :uint8
|
586
|
+
end
|
587
|
+
|
588
|
+
class Timeval < FFI::Struct
|
589
|
+
layout :tv_sec, :long,
|
590
|
+
:tv_usec, :long
|
591
|
+
|
592
|
+
# set timeval to the number of milliseconds
|
593
|
+
# @param [Fixnum] value
|
594
|
+
def in_ms=(value)
|
595
|
+
self[:tv_sec], self[:tv_usec] = (value*1000).divmod(1000000)
|
596
|
+
end
|
597
|
+
|
598
|
+
# get the number of milliseconds in timeval
|
599
|
+
# @return [Fixnum]
|
600
|
+
def in_ms
|
601
|
+
self[:tv_sec]*1000 + self[:tv_usec]/1000
|
602
|
+
end
|
603
|
+
|
604
|
+
# set timeval to the number of seconds
|
605
|
+
# @param [Numeric] value
|
606
|
+
def in_s=(value)
|
607
|
+
self[:tv_sec], self[:tv_usec] = (value*1000000).divmod(1000000)
|
608
|
+
end
|
609
|
+
|
610
|
+
# get the number of seconds in timeval
|
611
|
+
# @return [Float]
|
612
|
+
def in_s
|
613
|
+
self[:tv_sec] + self[:tv_usec]/1000000.0
|
614
|
+
end
|
615
|
+
end
|
616
|
+
|
617
|
+
class Pollfd < FFI::Struct
|
618
|
+
layout :fd, :int,
|
619
|
+
:events, :short
|
620
|
+
end
|
621
|
+
end
|
622
|
+
end
|