libusb 0.4.1-x86-mingw32 → 0.5.0-x86-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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b4f2652517795475456e7dfc2dd56e54e6607896
4
+ data.tar.gz: 480f3a4f75a3695e9bde564a53bab6494637f41c
5
+ SHA512:
6
+ metadata.gz: 5c0ae00ef71e1b7d4b70f9c8af804770cc861fe1b06a338e3feb1d5a7eef59588c111bb52d281c21db33c1343fc54c24521644c5a2e68013edd1ba22b358cdd4
7
+ data.tar.gz: e272ea1f14b4c19f54be05b97e0b4a02f7d72bb602558b4e9c9b4d3fe8ae7de48a2e20676abd123be730058c43a2fe2f0e40cb0d5910851d2400db876ebc237c
checksums.yaml.gz.sig ADDED
Binary file
data.tar.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ c�}n�C�� ^flE챐���_o?��-��'U��D^5��'����!j��H�����
2
+ d�\Yh�HD_�U�y��g�hX=�R�-��ɘP����!9
data/.travis.yml CHANGED
@@ -4,7 +4,7 @@ rvm:
4
4
  - "1.9.3"
5
5
  - "2.0.0"
6
6
  - "2.1"
7
- - jruby-18mode # JRuby in 1.8 mode
8
- - jruby-19mode # JRuby in 1.9 mode
9
- - rbx-2.2.6
7
+ - "2.2"
8
+ - jruby
9
+ - rbx
10
10
  script: bundle exec rake travis
data/History.md CHANGED
@@ -1,3 +1,11 @@
1
+ 0.5.0 / 2015-01-08
2
+ ------------------
3
+ * Add support for BOS describtors of libusb-1.0.16
4
+ * Add support for superspeed endpoint companion descriptors of libusb-1.0.16
5
+ * Add support for USB-3.0 bulk streams of libusb-1.0.19
6
+ * Update bundled libusb version to 1.0.19.
7
+ * Update windows cross build to gcc-4.8 and recent rubygems
8
+
1
9
  0.4.1 / 2014-05-17
2
10
  ------------------
3
11
  * Update bundled libusb version to 1.0.18.
data/README.md CHANGED
@@ -18,6 +18,7 @@ Features
18
18
 
19
19
  * Access to descriptors of devices, configurations, interfaces, settings and endpoints
20
20
  * Synchronous and asynchronous communication for bulk, control, interrupt and isochronous transfers
21
+ * Support for USB-3.0 descriptors and bulk streams
21
22
  * Compatibility layer for [ruby-usb](http://www.a-k-r.org/ruby-usb/) (API based on libusb-0.1). See {::USB} for description.
22
23
 
23
24
  Synopsis
data/Rakefile CHANGED
@@ -25,7 +25,7 @@ COMPILE_HOME = Pathname( "./tmp" ).expand_path
25
25
  STATIC_SOURCESDIR = COMPILE_HOME + 'sources'
26
26
 
27
27
  # Fetch tarball from sourceforge
28
- LIBUSB_VERSION = ENV['LIBUSB_VERSION'] || '1.0.18'
28
+ LIBUSB_VERSION = ENV['LIBUSB_VERSION'] || '1.0.19'
29
29
  LIBUSB_SOURCE_URI = URI( "http://downloads.sourceforge.net/project/libusb/libusb-1.0/libusb-#{LIBUSB_VERSION}/libusb-#{LIBUSB_VERSION}.tar.bz2" )
30
30
  LIBUSB_TARBALL = STATIC_SOURCESDIR + File.basename( LIBUSB_SOURCE_URI.path )
31
31
 
@@ -98,6 +98,8 @@ class CrossLibrary < OpenStruct
98
98
 
99
99
  libusb_env = [
100
100
  "CFLAGS='-fno-omit-frame-pointer'",
101
+ "LDFLAGS='-static-libgcc'",
102
+ "CC='#{host_platform}-gcc -static-libgcc'", # hack libtool, since it doesn't support -static-libgcc yet.
101
103
  ]
102
104
 
103
105
  # generate the makefile in a clean build location
@@ -123,17 +125,14 @@ class CrossLibrary < OpenStruct
123
125
 
124
126
  task "libusb_dll:#{ruby_platform}" => libusb_dll
125
127
 
126
- desc "compile static libusb libraries"
127
- task :libusb_dll => "libusb_dll:#{ruby_platform}"
128
-
129
128
  desc 'Cross compile libusb for win32'
130
129
  task :cross => [ "libusb_dll:#{ruby_platform}" ] do |t|
131
- spec = Gem::Specification::load("libusb.gemspec")
132
- spec.instance_variable_set(:"@cache_file", nil) if spec.respond_to?(:cache_file)
130
+ spec = Gem::Specification::load("libusb.gemspec").dup
133
131
  spec.platform = Gem::Platform.new(ruby_platform)
134
- spec.files << "lib/#{File.basename(libusb_dll)}"
135
- spec.files -= `git ls-files ext`.split("\n")
136
132
  spec.extensions = []
133
+ spec.files -= `git ls-files ext`.split("\n")
134
+ spec_text_files = spec.files.dup
135
+ spec.files << "lib/#{File.basename(libusb_dll)}"
137
136
 
138
137
  # Generate a package for this gem
139
138
  pkg = Gem::PackageTask.new(spec) do |pkg|
@@ -145,22 +144,23 @@ class CrossLibrary < OpenStruct
145
144
  end
146
145
 
147
146
  # copy files of the gem to pkg directory
148
- file pkg.package_dir_path => spec.files do
149
- spec.files.each do |fn|
150
- next if fn == "lib/#{File.basename(libusb_dll)}"
147
+ file pkg.package_dir_path => spec_text_files do
148
+ spec_text_files.each do |fn|
151
149
  f = File.join(pkg.package_dir_path, fn)
152
150
  fdir = File.dirname(f)
153
151
  mkdir_p(fdir) if !File.exist?(fdir)
154
152
  rm_f f
155
153
  safe_ln(fn, f)
156
154
  end
157
- end
158
- # copy libusb.dll to pkg directory
159
- file pkg.package_dir_path => [libusb_dll] do
155
+
156
+ # copy libusb.dll to pkg directory
160
157
  f = "#{pkg.package_dir_path}/lib/#{File.basename(libusb_dll)}"
158
+ mkdir_p File.dirname(f)
161
159
  rm_f f
162
160
  safe_ln libusb_dll, f
163
161
  end
162
+
163
+ file "lib/#{File.basename(libusb_dll)}" => [libusb_dll]
164
164
  end
165
165
  end
166
166
  end
data/lib/libusb.rb CHANGED
@@ -25,7 +25,9 @@ module LIBUSB
25
25
  autoload :Endpoint, 'libusb/endpoint'
26
26
  autoload :Interface, 'libusb/interface'
27
27
  autoload :Setting, 'libusb/setting'
28
- %w[ Transfer BulkTransfer ControlTransfer InterruptTransfer IsoPacket IsochronousTransfer ].each do |klass|
28
+ autoload :SsCompanion, 'libusb/ss_companion'
29
+ autoload :Bos, 'libusb/bos'
30
+ %w[ Transfer BulkTransfer BulkStreamTransfer ControlTransfer InterruptTransfer IsoPacket IsochronousTransfer ].each do |klass|
29
31
  autoload klass, 'libusb/transfer'
30
32
  end
31
33
 
data/lib/libusb/bos.rb ADDED
@@ -0,0 +1,306 @@
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 'libusb/call'
17
+
18
+ module LIBUSB
19
+ # A structure representing the Binary Device Object Store (BOS) descriptor.
20
+ # This descriptor is documented in section 9.6.2 of the USB 3.0 specification.
21
+ # All multiple-byte fields are represented in host-endian format.
22
+ class Bos < FFI::ManagedStruct
23
+
24
+ module GenericMethods
25
+ # @return [Integer] Size of this descriptor (in bytes)
26
+ def bLength
27
+ self[:bLength]
28
+ end
29
+
30
+ # @return [Integer] Descriptor type. Will have value LIBUSB::DT_DEVICE_CAPABILITY
31
+ # in this context.
32
+ def bDescriptorType
33
+ self[:bDescriptorType]
34
+ end
35
+
36
+ # @return [Integer] Device Capability type
37
+ def bDevCapabilityType
38
+ self[:bDevCapabilityType]
39
+ end
40
+
41
+ def inspect
42
+ "\#<#{self.class} cap: #{bDevCapabilityType} data: #{dev_capability_data.unpack("H*")[0]}>"
43
+ end
44
+
45
+ # @return [String] Device Capability data (bLength - 3 bytes)
46
+ def dev_capability_data
47
+ pointer.read_bytes(bLength - 3)
48
+ end
49
+ end
50
+
51
+ # A generic representation of a BOS Device Capability descriptor.
52
+ class DeviceCapability < FFI::Struct
53
+ include GenericMethods
54
+
55
+ layout :bLength, :uint8,
56
+ :bDescriptorType, :uint8,
57
+ :bDevCapabilityType, :uint8
58
+
59
+ def initialize( bos, *args)
60
+ # Avoid that the bos struct is GC'ed before this instance
61
+ @bos = bos
62
+ super(*args)
63
+ end
64
+ end
65
+
66
+ # A structure representing the USB 2.0 Extension descriptor
67
+ # This descriptor is documented in section 9.6.2.1 of the USB 3.0 specification.
68
+ # All multiple-byte fields are represented in host-endian format.
69
+ class Usb20Extension < FFI::ManagedStruct
70
+ include GenericMethods
71
+
72
+ layout :bLength, :uint8,
73
+ :bDescriptorType, :uint8,
74
+ :bDevCapabilityType, :uint8,
75
+ :bmAttributes, :uint32
76
+
77
+ # Bitmap encoding of supported device level features.
78
+ # A value of one in a bit location indicates a feature is
79
+ # supported; a value of zero indicates it is not supported.
80
+ # @see Call::Usb20ExtensionAttributes
81
+ def bmAttributes
82
+ self[:bmAttributes]
83
+ end
84
+
85
+ # @return [Boolean] Supports Link Power Management (LPM)
86
+ def bm_lpm_support?
87
+ (bmAttributes & BM_LPM_SUPPORT) != 0
88
+ end
89
+
90
+ def inspect
91
+ attrs = Call::Usb20ExtensionAttributes.to_h.map do |k, v|
92
+ (bmAttributes & v) ? k.to_s : nil
93
+ end
94
+ "\#<#{self.class} #{attrs.compact.join(",")}>"
95
+ end
96
+
97
+ # @private
98
+ def self.release(ptr)
99
+ Call.libusb_free_usb_2_0_extension_descriptor(ptr)
100
+ end
101
+ end
102
+
103
+ # A structure representing the SuperSpeed USB Device Capability descriptor
104
+ # This descriptor is documented in section 9.6.2.2 of the USB 3.0 specification.
105
+ # All multiple-byte fields are represented in host-endian format.
106
+ class SsUsbDeviceCapability < FFI::ManagedStruct
107
+ include GenericMethods
108
+
109
+ layout :bLength, :uint8,
110
+ :bDescriptorType, :uint8,
111
+ :bDevCapabilityType, :uint8,
112
+ :bmAttributes, :uint32,
113
+ :wSpeedSupported, :uint16,
114
+ :bFunctionalitySupport, :uint8,
115
+ :bU1DevExitLat, :uint8,
116
+ :bU2DevExitLat, :uint16
117
+
118
+ # Bitmap encoding of supported device level features.
119
+ # A value of one in a bit location indicates a feature is
120
+ # supported; a value of zero indicates it is not supported.
121
+ #
122
+ # @return [Integer]
123
+ # @see Call::SsUsbDeviceCapabilityAttributes
124
+ def bmAttributes
125
+ self[:bmAttributes]
126
+ end
127
+
128
+ # @return [Boolean] Supports Latency Tolerance Messages (LTM)
129
+ def bm_ltm_support?
130
+ (bmAttributes & BM_LTM_SUPPORT) != 0
131
+ end
132
+
133
+ def inspect
134
+ attrs = Call::SsUsbDeviceCapabilityAttributes.to_h.map do |k,v|
135
+ (bmAttributes & v) != 0 ? k.to_s : nil
136
+ end
137
+ "\#<#{self.class} #{attrs.compact.join(",")} #{supported_speeds.join(",")}>"
138
+ end
139
+
140
+ # Bitmap encoding of the speed supported by this device when
141
+ # operating in SuperSpeed mode.
142
+ #
143
+ # @return [Integer]
144
+ # @see Call::SupportedSpeeds
145
+ def wSpeedSupported
146
+ self[:wSpeedSupported]
147
+ end
148
+
149
+ # @return [Array<Symbol>] speeds supported by this device when
150
+ # operating in SuperSpeed mode {Call::SupportedSpeeds}
151
+ def supported_speeds
152
+ speeds = Call::SupportedSpeeds.to_h.map do |k,v|
153
+ (wSpeedSupported & v) != 0 ? k : nil
154
+ end
155
+ speeds.compact
156
+ end
157
+
158
+ # The lowest speed at which all the functionality supported
159
+ # by the device is available to the user. For example if the
160
+ # device supports all its functionality when connected at
161
+ # full speed and above then it sets this value to 1.
162
+ #
163
+ # 0 - low speed
164
+ # 1 - full speed
165
+ # 2 - high speed
166
+ # 3 - super speed
167
+ # @return [Integer]
168
+ def bFunctionalitySupport
169
+ self[:bFunctionalitySupport]
170
+ end
171
+
172
+ # @return [Integer] U1 Device Exit Latency.
173
+ def bU1DevExitLat
174
+ self[:bU1DevExitLat]
175
+ end
176
+
177
+ # @return [Integer] U2 Device Exit Latency.
178
+ def bU2DevExitLat
179
+ self[:bU2DevExitLat]
180
+ end
181
+
182
+ # @private
183
+ def self.release(ptr)
184
+ Call.libusb_free_ss_usb_device_capability_descriptor(ptr)
185
+ end
186
+ end
187
+
188
+ # A structure representing the Container ID descriptor.
189
+ # This descriptor is documented in section 9.6.2.3 of the USB 3.0 specification.
190
+ # All multiple-byte fields, except UUIDs, are represented in host-endian format.
191
+ class ContainerId < FFI::ManagedStruct
192
+ include GenericMethods
193
+
194
+ layout :bLength, :uint8,
195
+ :bDescriptorType, :uint8,
196
+ :bDevCapabilityType, :uint8,
197
+ :bReserved, :uint8,
198
+ :ContainerID, [:uint8, 16]
199
+
200
+ # Reserved field
201
+ def bReserved
202
+ self[:bReserved]
203
+ end
204
+
205
+ # @return [String] 128 bit UUID
206
+ def container_id
207
+ self[:ContainerID].to_ptr.read_bytes(16)
208
+ end
209
+
210
+ def inspect
211
+ "\#<#{self.class} #{container_id.unpack("H*")[0]}>"
212
+ end
213
+
214
+ # @private
215
+ def self.release(ptr)
216
+ Call.libusb_free_container_id_descriptor(ptr)
217
+ end
218
+ end
219
+
220
+ def initialize( ctx, *args)
221
+ @ctx = ctx
222
+ super(*args)
223
+ end
224
+
225
+ layout :bLength, :uint8,
226
+ :bDescriptorType, :uint8,
227
+ :wTotalLength, :uint16,
228
+ :bNumDeviceCaps, :uint8,
229
+ :dev_capability, [:pointer, 0]
230
+
231
+ # @return [Integer] Size of this descriptor (in bytes)
232
+ def bLength
233
+ self[:bLength]
234
+ end
235
+
236
+ # @return [Integer] Descriptor type. Will have value LIBUSB::DT_BOS LIBUSB_DT_BOS
237
+ # in this context.
238
+ def bDescriptorType
239
+ self[:bDescriptorType]
240
+ end
241
+
242
+ # @return [Integer] Length of this descriptor and all of its sub descriptors
243
+ def wTotalLength
244
+ self[:wTotalLength]
245
+ end
246
+
247
+ # @return [Integer] The number of separate device capability descriptors in
248
+ # the BOS
249
+ def bNumDeviceCaps
250
+ self[:bNumDeviceCaps]
251
+ end
252
+
253
+ # bNumDeviceCap Device Capability Descriptors
254
+ #
255
+ # @return [Array<Bos::DeviceCapability, Bos::Usb20Extension, Bos::SsUsbDeviceCapability, Bos::ContainerId>]
256
+ def device_capabilities
257
+ pp_ext = FFI::MemoryPointer.new :pointer
258
+ caps = []
259
+ # Capabilities are appended to the bos header
260
+ ptr = pointer + offset_of(:dev_capability)
261
+ bNumDeviceCaps.times do
262
+ cap = DeviceCapability.new self, ptr.read_pointer
263
+ case cap.bDevCapabilityType
264
+ when LIBUSB::BT_WIRELESS_USB_DEVICE_CAPABILITY
265
+ # no struct defined in libusb -> use generic DeviceCapability
266
+ when LIBUSB::BT_USB_2_0_EXTENSION
267
+ 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
269
+ when LIBUSB::BT_SS_USB_DEVICE_CAPABILITY
270
+ 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
272
+ when LIBUSB::BT_CONTAINER_ID
273
+ res = Call.libusb_get_container_id_descriptor(@ctx, cap.pointer, pp_ext)
274
+ cap = ContainerId.new(pp_ext.read_pointer) if res==0
275
+ else
276
+ # unknown capability -> use generic DeviceCapability
277
+ end
278
+ ptr += FFI.type_size(:pointer)
279
+ caps << cap
280
+ end
281
+ caps
282
+ end
283
+
284
+ # @return [Array<Symbol>] Types of Capabilities
285
+ #
286
+ # @see Call::BosTypes
287
+ def device_capability_types
288
+ # Capabilities are appended to the bos header
289
+ ptr = pointer + offset_of(:dev_capability)
290
+ bNumDeviceCaps.times.map do
291
+ cap = DeviceCapability.new self, ptr.read_pointer
292
+ ptr += FFI.type_size(:pointer)
293
+ Call::BosTypes.find cap.bDevCapabilityType
294
+ end
295
+ end
296
+
297
+ def inspect
298
+ "\#<#{self.class} #{device_capability_types.join(", ")}>"
299
+ end
300
+
301
+ # @private
302
+ def self.release(ptr)
303
+ Call.libusb_free_bos_descriptor(ptr)
304
+ end
305
+ end
306
+ end
data/lib/libusb/call.rb CHANGED
@@ -81,11 +81,18 @@ module LIBUSB
81
81
  :TRANSFER_ADD_ZERO_PACKET, 1 << 3,
82
82
  ]
83
83
 
84
+ # Values for {Endpoint#transfer_type}.
84
85
  TransferTypes = enum :libusb_transfer_type, [
86
+ # Control endpoint
85
87
  :TRANSFER_TYPE_CONTROL, 0,
88
+ # Isochronous endpoint
86
89
  :TRANSFER_TYPE_ISOCHRONOUS, 1,
90
+ # Bulk endpoint
87
91
  :TRANSFER_TYPE_BULK, 2,
92
+ # Interrupt endpoint
88
93
  :TRANSFER_TYPE_INTERRUPT, 3,
94
+ # Stream endpoint
95
+ :TRANSFER_TYPE_BULK_STREAM, 4,
89
96
  ]
90
97
 
91
98
  StandardRequests = enum :libusb_standard_request, [
@@ -108,15 +115,32 @@ module LIBUSB
108
115
  ]
109
116
 
110
117
  DescriptorTypes = enum :libusb_descriptor_type, [
118
+ # Device descriptor. See {Device}
111
119
  :DT_DEVICE, 0x01,
120
+ # Configuration descriptor. See {Configuration}
112
121
  :DT_CONFIG, 0x02,
122
+ # String descriptor
113
123
  :DT_STRING, 0x03,
124
+ # Interface descriptor. See {Interface}
114
125
  :DT_INTERFACE, 0x04,
126
+ # Endpoint descriptor. See {Endpoint}
115
127
  :DT_ENDPOINT, 0x05,
128
+ # BOS descriptor
129
+ :DT_BOS, 0x0f,
130
+ # Device Capability descriptor
131
+ :DT_DEVICE_CAPABILITY, 0x10,
132
+ # HID descriptor
116
133
  :DT_HID, 0x21,
134
+ # HID report descriptor
117
135
  :DT_REPORT, 0x22,
136
+ # Physical descriptor
118
137
  :DT_PHYSICAL, 0x23,
138
+ # Hub descriptor
119
139
  :DT_HUB, 0x29,
140
+ # SuperSpeed Hub descriptor
141
+ :DT_SUPERSPEED_HUB, 0x2a,
142
+ # SuperSpeed Endpoint Companion descriptor
143
+ :DT_SS_ENDPOINT_COMPANION, 0x30,
120
144
  ]
121
145
 
122
146
  RequestTypes = enum :libusb_request_type, [
@@ -148,6 +172,19 @@ module LIBUSB
148
172
  :SPEED_SUPER, 4,
149
173
  ]
150
174
 
175
+ # Supported speeds (wSpeedSupported) bitfield. Indicates what
176
+ # speeds the device supports.
177
+ SupportedSpeeds = enum :libusb_supported_speed, [
178
+ # Low speed operation supported (1.5MBit/s).
179
+ :LOW_SPEED_OPERATION, 1,
180
+ # Full speed operation supported (12MBit/s).
181
+ :FULL_SPEED_OPERATION, 2,
182
+ # High speed operation supported (480MBit/s).
183
+ :HIGH_SPEED_OPERATION, 4,
184
+ # Superspeed operation supported (5000MBit/s).
185
+ :SUPER_SPEED_OPERATION, 8,
186
+ ]
187
+
151
188
  Capabilities = enum :libusb_capability, [
152
189
  :CAP_HAS_CAPABILITY, 0x0000,
153
190
  # Hotplug support is available on this platform.
@@ -162,6 +199,36 @@ module LIBUSB
162
199
  :CAP_SUPPORTS_DETACH_KERNEL_DRIVER, 0x0101,
163
200
  ]
164
201
 
202
+ # Masks for the bits of the
203
+ # {Bos::Usb20Extension#bmAttributes} field
204
+ # of the USB 2.0 Extension descriptor.
205
+ Usb20ExtensionAttributes = enum :libusb_usb_2_0_extension_attributes, [
206
+ # Supports Link Power Management (LPM)
207
+ :BM_LPM_SUPPORT, 2,
208
+ ]
209
+
210
+ # Masks for the bits of the
211
+ # {Bos::SsUsbDeviceCapability#bmAttributes} field
212
+ # field of the SuperSpeed USB Device Capability descriptor.
213
+ SsUsbDeviceCapabilityAttributes = enum :libusb_ss_usb_device_capability_attributes, [
214
+ # Supports Latency Tolerance Messages (LTM)
215
+ :BM_LTM_SUPPORT, 2,
216
+ ]
217
+
218
+ # USB capability types
219
+ #
220
+ # @see Bos::DeviceCapability
221
+ BosTypes = enum :libusb_bos_type, [
222
+ # Wireless USB device capability
223
+ :BT_WIRELESS_USB_DEVICE_CAPABILITY, 1,
224
+ # USB 2.0 extensions
225
+ :BT_USB_2_0_EXTENSION, 2,
226
+ # SuperSpeed USB device capability
227
+ :BT_SS_USB_DEVICE_CAPABILITY, 3,
228
+ # Container ID type
229
+ :BT_CONTAINER_ID, 4,
230
+ ]
231
+
165
232
  # Since libusb version 1.0.16.
166
233
  #
167
234
  # Hotplug events
@@ -186,6 +253,7 @@ module LIBUSB
186
253
  typedef :pointer, :libusb_context
187
254
  typedef :pointer, :libusb_device
188
255
  typedef :pointer, :libusb_device_handle
256
+ typedef :pointer, :libusb_transfer
189
257
  typedef :int, :libusb_hotplug_callback_handle
190
258
 
191
259
  def self.try_attach_function(method, *args)
@@ -221,6 +289,18 @@ module LIBUSB
221
289
  attach_function 'libusb_get_max_packet_size', [:pointer, :uint8], :int
222
290
  attach_function 'libusb_get_max_iso_packet_size', [:pointer, :uint8], :int
223
291
 
292
+ try_attach_function 'libusb_get_ss_endpoint_companion_descriptor', [:pointer, :pointer, :pointer], :int
293
+ try_attach_function 'libusb_free_ss_endpoint_companion_descriptor', [:pointer], :void
294
+
295
+ try_attach_function 'libusb_get_bos_descriptor', [:libusb_device_handle, :pointer], :int, :blocking=>true
296
+ try_attach_function 'libusb_free_bos_descriptor', [:pointer], :void
297
+ try_attach_function 'libusb_get_usb_2_0_extension_descriptor', [:libusb_context, :pointer, :pointer], :int
298
+ try_attach_function 'libusb_free_usb_2_0_extension_descriptor', [:pointer], :void
299
+ try_attach_function 'libusb_get_ss_usb_device_capability_descriptor', [:libusb_context, :pointer, :pointer], :int
300
+ try_attach_function 'libusb_free_ss_usb_device_capability_descriptor', [:pointer], :void
301
+ try_attach_function 'libusb_get_container_id_descriptor', [:libusb_context, :pointer, :pointer], :int
302
+ try_attach_function 'libusb_free_container_id_descriptor', [:pointer], :void
303
+
224
304
  attach_function 'libusb_open', [:pointer, :pointer], :int
225
305
  attach_function 'libusb_close', [:pointer], :void
226
306
  attach_function 'libusb_get_device', [:libusb_device_handle], :pointer
@@ -234,6 +314,8 @@ module LIBUSB
234
314
  attach_function 'libusb_set_interface_alt_setting', [:libusb_device_handle, :int, :int], :int, :blocking=>true
235
315
  attach_function 'libusb_clear_halt', [:libusb_device_handle, :int], :int, :blocking=>true
236
316
  attach_function 'libusb_reset_device', [:libusb_device_handle], :int, :blocking=>true
317
+ try_attach_function 'libusb_alloc_streams', [:libusb_device_handle, :uint32, :pointer, :int], :int
318
+ try_attach_function 'libusb_free_streams', [:libusb_device_handle, :pointer, :int], :int
237
319
 
238
320
  attach_function 'libusb_kernel_driver_active', [:libusb_device_handle, :int], :int
239
321
  attach_function 'libusb_detach_kernel_driver', [:libusb_device_handle, :int], :int
@@ -246,6 +328,8 @@ module LIBUSB
246
328
  attach_function 'libusb_submit_transfer', [:pointer], :int
247
329
  attach_function 'libusb_cancel_transfer', [:pointer], :int
248
330
  attach_function 'libusb_free_transfer', [:pointer], :void
331
+ try_attach_function 'libusb_transfer_set_stream_id', [:libusb_transfer, :uint32], :void
332
+ try_attach_function 'libusb_transfer_get_stream_id', [:libusb_transfer], :uint32
249
333
 
250
334
  attach_function 'libusb_handle_events', [:libusb_context], :int, :blocking=>true
251
335
  try_attach_function 'libusb_handle_events_completed', [:libusb_context, :pointer], :int, :blocking=>true
@@ -26,6 +26,10 @@ module LIBUSB
26
26
  Call::IsoSyncTypes.to_h.each{|k,v| const_set(k,v) }
27
27
  Call::Speeds.to_h.each{|k,v| const_set(k,v) }
28
28
  Call::Capabilities.to_h.each{|k,v| const_set(k,v) }
29
+ Call::SupportedSpeeds.to_h.each{|k,v| const_set(k,v) }
30
+ Call::Usb20ExtensionAttributes.to_h.each{|k,v| const_set(k,v) }
31
+ Call::SsUsbDeviceCapabilityAttributes.to_h.each{|k,v| const_set(k,v) }
32
+ Call::BosTypes.to_h.each{|k,v| const_set(k,v) }
29
33
  Call::HotplugEvents.to_h.each{|k,v| const_set(k,v) }
30
34
  Call::HotplugFlags.to_h.each{|k,v| const_set(k,v) }
31
35
 
@@ -189,6 +189,54 @@ module LIBUSB
189
189
  LIBUSB.raise_error res, "in libusb_reset_device" if res!=0
190
190
  end
191
191
 
192
+ if Call.respond_to?(:libusb_alloc_streams)
193
+
194
+ # @method alloc_streams
195
+ #
196
+ # Allocate up to num_streams usb bulk streams on the specified endpoints. This
197
+ # function takes an array of endpoints rather then a single endpoint because
198
+ # some protocols require that endpoints are setup with similar stream ids.
199
+ # All endpoints passed in must belong to the same interface.
200
+ #
201
+ # Note this function may return less streams then requested. Also note that the
202
+ # same number of streams are allocated for each endpoint in the endpoint array.
203
+ #
204
+ # Stream id 0 is reserved, and should not be used to communicate with devices.
205
+ # If {alloc_streams} returns with a value of N, you may use stream ids
206
+ # 1 to N.
207
+ #
208
+ # Available since libusb-1.0.19.
209
+ #
210
+ # @param [Fixnum] num_streams number of streams to try to allocate
211
+ # @param [Array<Fixnum>, Array<Endpoint>] endpoints array of endpoints to allocate streams on
212
+ # @return [Fixnum] number of streams allocated
213
+ # @see #free_streams
214
+ # @see BulkStreamTransfer
215
+ def alloc_streams(num_streams, endpoints)
216
+ pEndpoints = endpoints_as_ffi_bytes(endpoints)
217
+ res = Call.libusb_alloc_streams(@pHandle, num_streams, pEndpoints, endpoints.length)
218
+ LIBUSB.raise_error res, "in libusb_alloc_streams" unless res>=0
219
+ res
220
+ end
221
+
222
+ # @method free_streams
223
+ #
224
+ # Free usb bulk streams allocated with {alloc_streams}
225
+ #
226
+ # Note streams are automatically free-ed when releasing an interface.
227
+ #
228
+ # Available since libusb-1.0.19.
229
+ #
230
+ # @param [Array<Fixnum>, Array<Endpoint>] endpoints array of endpoints to free streams on
231
+ # @see #alloc_streams
232
+ def free_streams(endpoints)
233
+ pEndpoints = endpoints_as_ffi_bytes(endpoints)
234
+ res = Call.libusb_free_streams(@pHandle, pEndpoints, endpoints.length)
235
+ LIBUSB.raise_error res, "in libusb_free_streams" unless res>=0
236
+ nil
237
+ end
238
+ end
239
+
192
240
  # Determine if a kernel driver is active on an interface.
193
241
  #
194
242
  # If a kernel driver is active, you cannot claim the interface,
@@ -253,6 +301,26 @@ module LIBUSB
253
301
  end
254
302
  end
255
303
 
304
+ # @private
305
+ if Call.respond_to?(:libusb_get_bos_descriptor)
306
+
307
+ # @method bos
308
+ # Get a Binary Object Store (BOS) descriptor.
309
+ #
310
+ # This is a BLOCKING function, which will send requests to the device.
311
+ #
312
+ # Since libusb version 1.0.16.
313
+ #
314
+ # @return [Bos]
315
+ def bos
316
+ ctx = device.context.instance_variable_get(:@ctx)
317
+ pp_desc = FFI::MemoryPointer.new :pointer
318
+ res = Call.libusb_get_bos_descriptor(@pHandle, pp_desc)
319
+ LIBUSB.raise_error res, "in libusb_get_bos_descriptor" if res!=0
320
+ Bos.new(ctx, pp_desc.read_pointer)
321
+ end
322
+ end
323
+
256
324
  # Perform a USB bulk transfer.
257
325
  #
258
326
  # When called without a block, the transfer is done synchronously - so all events are handled
@@ -473,5 +541,14 @@ module LIBUSB
473
541
  res
474
542
  end
475
543
  end
544
+
545
+ def endpoints_as_ffi_bytes(endpoints)
546
+ pEndpoints = FFI::MemoryPointer.new :char, endpoints.length
547
+ endpoints.each_with_index do |ep, epi|
548
+ ep = ep.bEndpointAddress if ep.respond_to? :bEndpointAddress
549
+ pEndpoints.put_uchar(epi, ep)
550
+ end
551
+ pEndpoints
552
+ end
476
553
  end
477
554
  end
@@ -170,5 +170,25 @@ module LIBUSB
170
170
  t = bEndpointAddress<=>o.bEndpointAddress if t==0
171
171
  t
172
172
  end
173
+
174
+ if Call.respond_to?(:libusb_get_ss_endpoint_companion_descriptor)
175
+
176
+ # @method ss_companion
177
+ # Get the endpoints superspeed endpoint companion descriptor (if any).
178
+ #
179
+ # Since libusb version 1.0.16.
180
+ #
181
+ # @return [SsCompanion]
182
+ def ss_companion
183
+ ep_comp = FFI::MemoryPointer.new :pointer
184
+ res = Call.libusb_get_ss_endpoint_companion_descriptor(
185
+ device.context.instance_variable_get(:@ctx),
186
+ pointer,
187
+ ep_comp
188
+ )
189
+ LIBUSB.raise_error res, "in libusb_get_ss_endpoint_companion_descriptor" if res!=0
190
+ SsCompanion.new ep_comp.read_pointer
191
+ end
192
+ end
173
193
  end
174
194
  end
@@ -0,0 +1,69 @@
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 'libusb/call'
17
+
18
+ module LIBUSB
19
+ # A structure representing the superspeed endpoint companion descriptor.
20
+ #
21
+ # This descriptor is documented in section 9.6.7 of the USB 3.0 specification. All multiple-byte fields are represented in host-endian format.
22
+ class SsCompanion < FFI::ManagedStruct
23
+ layout :bLength, :uint8,
24
+ :bDescriptorType, :uint8,
25
+ :bMaxBurst, :uint8,
26
+ :bmAttributes, :uint8,
27
+ :wBytesPerInterval, :uint16
28
+
29
+ # Size of this descriptor (in bytes)
30
+ def bLength
31
+ self[:bLength]
32
+ end
33
+
34
+ # Descriptor type.
35
+ #
36
+ # Will have value LIBUSB::DT_SS_ENDPOINT_COMPANION in this context.
37
+ def bDescriptorType
38
+ self[:bDescriptorType]
39
+ end
40
+
41
+ # The maximum number of packets the endpoint can send or recieve as part of a burst.
42
+ def bMaxBurst
43
+ self[:bMaxBurst]
44
+ end
45
+
46
+ # In bulk EP: bits 4:0 represents the maximum number of streams the EP supports.
47
+ #
48
+ # In isochronous EP: bits 1:0 represents the Mult - a zero based value that determines the maximum number of packets within a service interval
49
+ def bmAttributes
50
+ self[:bmAttributes]
51
+ end
52
+
53
+ # The total number of bytes this EP will transfer every service interval.
54
+ #
55
+ # valid only for periodic EPs.
56
+ def wBytesPerInterval
57
+ self[:wBytesPerInterval]
58
+ end
59
+
60
+ def inspect
61
+ "\#<#{self.class} burst: #{bMaxBurst} attrs: #{bmAttributes}>"
62
+ end
63
+
64
+ # @private
65
+ def self.release(ptr)
66
+ Call.libusb_free_ss_endpoint_companion_descriptor(ptr)
67
+ end
68
+ end
69
+ end
@@ -203,6 +203,40 @@ module LIBUSB
203
203
  end
204
204
  end
205
205
 
206
+ if Call.respond_to?(:libusb_transfer_get_stream_id)
207
+
208
+ # Transfer class for USB bulk transfers using USB-3.0 streams.
209
+ #
210
+ # @see DevHandle#alloc_streams
211
+ #
212
+ # Available since libusb-1.0.19.
213
+ class BulkStreamTransfer < Transfer
214
+ def initialize(args={})
215
+ @transfer = Call::Transfer.new Call.libusb_alloc_transfer(0)
216
+ @transfer[:type] = TRANSFER_TYPE_BULK_STREAM
217
+ @transfer[:timeout] = 1000
218
+ super
219
+ end
220
+
221
+ # Set a transfers bulk stream id.
222
+ #
223
+ # @param [Fixnum] stream_id the stream id to set
224
+ def stream_id=(v)
225
+ Call.libusb_transfer_set_stream_id(@transfer, v)
226
+ v
227
+ end
228
+
229
+ # Get a transfers bulk stream id.
230
+ #
231
+ # Since version 1.0.19.
232
+ #
233
+ # @return [Fixnum] the stream id for the transfer
234
+ def stream_id
235
+ Call.libusb_transfer_get_stream_id(@transfer)
236
+ end
237
+ end
238
+ end
239
+
206
240
  class ControlTransfer < Transfer
207
241
  def initialize(args={})
208
242
  @transfer = Call::Transfer.new Call.libusb_alloc_transfer(0)
@@ -15,5 +15,5 @@
15
15
 
16
16
  module LIBUSB
17
17
  # Library version of libusb for Ruby
18
- VERSION = "0.4.1"
18
+ VERSION = "0.5.0"
19
19
  end
data/libusb.gemspec CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.homepage = "http://github.com/larskanis/libusb"
11
11
  s.summary = %q{Access USB devices from Ruby via libusb-1.0}
12
12
  s.description = %q{LIBUSB is a Ruby binding that gives Ruby programmers access to arbitrary USB devices}
13
+ s.licenses = ['LGPL-3']
13
14
  s.rdoc_options = %w[--main README.md --charset=UTF-8]
14
15
 
15
16
  s.rubyforge_project = "libusb"
@@ -0,0 +1,118 @@
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 "minitest/autorun"
17
+ require "libusb"
18
+
19
+ class TestLibusbBos < Minitest::Test
20
+ include LIBUSB
21
+
22
+ attr_accessor :usb
23
+
24
+ def setup
25
+ @usb = Context.new
26
+ @usb.debug = 0
27
+ end
28
+
29
+ def test_bos
30
+ did_bos = false
31
+ did_cap = false
32
+ usb.devices.each do |dev|
33
+ # devices with USB version >= 0x201 could support bos
34
+ # devices with USB version >= 0x210 must support bos
35
+ if dev.bcdUSB >= 0x210
36
+ dev.open do |devh|
37
+ bos = devh.bos
38
+ did_bos = true
39
+
40
+ assert_equal 5, bos.bLength
41
+ assert_equal 0x0f, bos.bDescriptorType
42
+ assert_operator 5, :<=, bos.wTotalLength
43
+ assert_operator 0, :<=, bos.bNumDeviceCaps
44
+
45
+ caps = bos.device_capabilities
46
+ assert_equal bos.bNumDeviceCaps, caps.length
47
+ cap_types = bos.device_capability_types
48
+ assert_equal bos.bNumDeviceCaps, cap_types.length
49
+
50
+ cap_types.each do |cap_type|
51
+ assert_operator [
52
+ :BT_WIRELESS_USB_DEVICE_CAPABILITY,
53
+ :BT_USB_2_0_EXTENSION,
54
+ :BT_SS_USB_DEVICE_CAPABILITY,
55
+ :BT_CONTAINER_ID,
56
+ ], :include?, cap_type
57
+ end
58
+
59
+
60
+ caps.each do |cap|
61
+ did_cap = true
62
+
63
+ assert_operator 4, :<=, cap.bLength
64
+ assert_equal LIBUSB::DT_DEVICE_CAPABILITY, cap.bDescriptorType
65
+ assert_kind_of String, cap.dev_capability_data, "should provide binary capability data"
66
+ assert_kind_of String, cap.inspect, "should respond to inspect"
67
+ assert_operator 1, :<=, cap.dev_capability_data.length, "dev_capability_data should be at least one byte"
68
+
69
+ case cap
70
+ when Bos::DeviceCapability
71
+ assert_kind_of Integer, cap.bDevCapabilityType
72
+
73
+ when Bos::Usb20Extension
74
+ assert_equal 2, cap.bDevCapabilityType
75
+ assert_operator 0, :<=, cap.bmAttributes
76
+ assert_operator [true, false], :include?, cap.bm_lpm_support?
77
+
78
+ when Bos::SsUsbDeviceCapability
79
+ assert_equal 3, cap.bDevCapabilityType
80
+ assert_operator 0, :<=, cap.bmAttributes
81
+ assert_operator [true, false], :include?, cap.bm_ltm_support?
82
+ assert_operator 0, :<=, cap.wSpeedSupported
83
+ assert_kind_of Array, cap.supported_speeds
84
+ assert_operator 0, :<=, cap.bFunctionalitySupport
85
+ assert_operator 0, :<=, cap.bU1DevExitLat
86
+ assert_operator 0, :<=, cap.bU2DevExitLat
87
+
88
+ when Bos::ContainerId
89
+ assert_equal 4, cap.bDevCapabilityType
90
+ assert_operator 0, :<=, cap.bReserved
91
+ assert_operator 16, :==, cap.container_id.bytesize, "container_id should be 16 bytes long"
92
+
93
+ else
94
+ refute true, "invalid device capability class"
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ skip "no device with BOS available" unless did_bos
101
+ skip "no device with BOS capability available" unless did_cap
102
+ end
103
+
104
+ def test_no_bos
105
+ did_failing_bos = false
106
+
107
+ # devices with USB version < 0x201 shouldn't support bos
108
+ if dev=usb.devices.find{|dev| dev.bcdUSB < 0x201 }
109
+ dev.open do |devh|
110
+ assert_raises LIBUSB::ERROR_PIPE do
111
+ devh.bos
112
+ end
113
+ did_failing_bos = true
114
+ end
115
+ end
116
+ skip "no device without BOS available" unless did_failing_bos
117
+ end
118
+ end
@@ -0,0 +1,50 @@
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 "minitest/autorun"
17
+ require "libusb"
18
+
19
+ class TestLibusbBulkStreamTransfer < Minitest::Test
20
+ include LIBUSB
21
+
22
+ def setup
23
+ c = Context.new
24
+ begin
25
+ @dev = c.devices.first.open
26
+ rescue LIBUSB::ERROR_ACCESS
27
+ @dev = nil
28
+ skip "error opening device"
29
+ end
30
+ end
31
+
32
+ def teardown
33
+ @dev.close if @dev
34
+ end
35
+
36
+ def test_alloc_streams
37
+ assert_raises(ERROR_NOT_SUPPORTED, "TODO: test with a OS that supports bulk streams and against a real device") do
38
+ nr_allocated = @dev.alloc_streams( 2, @dev.device.endpoints )
39
+ end
40
+
41
+ assert_raises(ERROR_NOT_SUPPORTED) do
42
+ @dev.free_streams( [0x01,0x82] )
43
+ end
44
+ end
45
+
46
+ def test_bulk_stream_transfer
47
+ tr = BulkStreamTransfer.new :dev_handle=>@dev, :stream_id=>123, :buffer=>' '*100
48
+ assert_equal 123, tr.stream_id, "stream_id should match"
49
+ end
50
+ end
@@ -113,6 +113,35 @@ class TestLibusbDescriptors < Minitest::Test
113
113
  end
114
114
  end
115
115
 
116
+ def test_ss_companion
117
+ did_cc_companion = false
118
+ did_failing_cc_companion = false
119
+
120
+ usb.devices.each do |dev|
121
+ dev.endpoints.each do |ep|
122
+ if dev.device_speed == :SPEED_SUPER
123
+ ss = ep.ss_companion
124
+ assert_match(/SsCompanion/, ss.inspect, "SsCompanion#inspect should work")
125
+
126
+ assert_kind_of Integer, ss.bLength
127
+ assert_equal LIBUSB::DT_SS_ENDPOINT_COMPANION, ss.bDescriptorType
128
+ assert_kind_of Integer, ss.bMaxBurst
129
+ assert_kind_of Integer, ss.bmAttributes
130
+ assert_kind_of Integer, ss.wBytesPerInterval
131
+ did_cc_companion = true
132
+ elsif !did_failing_cc_companion
133
+ assert_raises ERROR_NOT_FOUND do
134
+ ep.ss_companion
135
+ end
136
+ did_failing_cc_companion = true
137
+ end
138
+ end
139
+ end
140
+
141
+ skip "no device with cc_companion available" unless did_cc_companion
142
+ skip "no device without cc_companion available" unless did_failing_cc_companion
143
+ end
144
+
116
145
  def test_constants
117
146
  assert_equal 7, CLASS_PRINTER, "Printer class id should be defined"
118
147
  assert_equal 48, ISO_USAGE_TYPE_MASK, "iso usage type should be defined"
@@ -106,7 +106,7 @@ class TestLibusbHotplug < Minitest::Test
106
106
  ctx.handle_events 5000
107
107
  ctx.handle_events 5000
108
108
 
109
- skip if devs.empty? && devs2.empty?
109
+ skip "no hotplug action taken" if devs.empty? && devs2.empty?
110
110
  assert_equal 1, devs.length, "Should be deregistered after the first event"
111
111
  assert_equal 2, devs2.length, "Should have received two events"
112
112
  assert_operator devs2.map(&:last), :include?, :HOTPLUG_EVENT_DEVICE_ARRIVED, "Should have received ARRIVED"
@@ -70,7 +70,7 @@ class TestLibusbThreads < Minitest::Test
70
70
  endpoint = endpoints_in[dev]
71
71
  1.times do
72
72
  st = Time.now
73
- assert_raise LIBUSB::ERROR_TIMEOUT do
73
+ assert_raises LIBUSB::ERROR_TIMEOUT do
74
74
  dev.bulk_transfer(:endpoint=>endpoint, :dataIn=>123, :timeout=>100)
75
75
  end
76
76
  assert_operator Time.now-st, :<, 5
metadata CHANGED
@@ -1,62 +1,76 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libusb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
5
- prerelease:
4
+ version: 0.5.0
6
5
  platform: x86-mingw32
7
6
  authors:
8
7
  - Lars Kanis
9
8
  autorequire:
10
9
  bindir: bin
11
- cert_chain: []
12
- date: 2014-05-17 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDLjCCAhagAwIBAgIBAjANBgkqhkiG9w0BAQUFADA9MQ4wDAYDVQQDDAVrYW5p
14
+ czEXMBUGCgmSJomT8ixkARkWB2NvbWNhcmQxEjAQBgoJkiaJk/IsZAEZFgJkZTAe
15
+ Fw0xNDAyMjYwOTMzMDBaFw0xNTAyMjYwOTMzMDBaMD0xDjAMBgNVBAMMBWthbmlz
16
+ MRcwFQYKCZImiZPyLGQBGRYHY29tY2FyZDESMBAGCgmSJomT8ixkARkWAmRlMIIB
17
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApop+rNmg35bzRugZ21VMGqI6
18
+ HGzPLO4VHYncWn/xmgPU/ZMcZdfj6MzIaZJ/czXyt4eHpBk1r8QOV3gBXnRXEjVW
19
+ 9xi+EdVOkTV2/AVFKThcbTAQGiF/bT1n2M+B1GTybRzMg6hyhOJeGPqIhLfJEpxn
20
+ lJi4+ENAVT4MpqHEAGB8yFoPC0GqiOHQsdHxQV3P3c2OZqG+yJey74QtwA2tLcLn
21
+ Q53c63+VLGsOjODl1yPn/2ejyq8qWu6ahfTxiIlSar2UbwtaQGBDFdb2CXgEufXT
22
+ L7oaPxlmj+Q2oLOfOnInd2Oxop59HoJCQPsg8f921J43NCQGA8VHK6paxIRDLQID
23
+ AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUvgTdT7fe
24
+ x17ugO3IOsjEJwW7KP4wDQYJKoZIhvcNAQEFBQADggEBAFmIAhRT0awqLQN9e4Uv
25
+ ZEk+jUWv4zkb+TWiKFJXlwjPyjGbZY9gVfOwAwMibYOK/t/+57ZzW3d0L12OUwvo
26
+ on84NVvYtIr1/iskJFWFkMoIquAFCdi9p68stSPMQK2XcrJJuRot29fJtropsZBa
27
+ 2cpaNd/sRYdK4oep2usdKifA1lI0hIkPb3r5nLfwG2lAqBH7WZsUICHcTgR0VEbG
28
+ z9Ug5qQp9Uz73xC9YdGvGiuOX53LYobHAR4MWi2xxDlHI+ER8mRz0eY2FUuNu/Wj
29
+ GrqF74zpLl7/KFdHC8VmzwZS18hvDjxeLVuVI2gIGnBInqnlqv05g/l4/1pISh5j
30
+ dS4=
31
+ -----END CERTIFICATE-----
32
+ date: 2015-01-08 00:00:00.000000000 Z
13
33
  dependencies:
14
34
  - !ruby/object:Gem::Dependency
15
35
  name: ffi
16
36
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
37
  requirements:
19
- - - ! '>='
38
+ - - ">="
20
39
  - !ruby/object:Gem::Version
21
40
  version: '1.0'
22
41
  type: :runtime
23
42
  prerelease: false
24
43
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
44
  requirements:
27
- - - ! '>='
45
+ - - ">="
28
46
  - !ruby/object:Gem::Version
29
47
  version: '1.0'
30
48
  - !ruby/object:Gem::Dependency
31
49
  name: rake-compiler
32
50
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
51
  requirements:
35
- - - ! '>='
52
+ - - ">="
36
53
  - !ruby/object:Gem::Version
37
54
  version: '0.6'
38
55
  type: :development
39
56
  prerelease: false
40
57
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
58
  requirements:
43
- - - ! '>='
59
+ - - ">="
44
60
  - !ruby/object:Gem::Version
45
61
  version: '0.6'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: bundler
48
64
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
65
  requirements:
51
- - - ! '>='
66
+ - - ">="
52
67
  - !ruby/object:Gem::Version
53
68
  version: '0'
54
69
  type: :development
55
70
  prerelease: false
56
71
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
72
  requirements:
59
- - - ! '>='
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
76
  description: LIBUSB is a Ruby binding that gives Ruby programmers access to arbitrary
@@ -67,15 +81,17 @@ executables: []
67
81
  extensions: []
68
82
  extra_rdoc_files: []
69
83
  files:
70
- - .gitignore
71
- - .travis.yml
72
- - .yardopts
84
+ - ".gitignore"
85
+ - ".travis.yml"
86
+ - ".yardopts"
73
87
  - COPYING
74
88
  - Gemfile
75
89
  - History.md
76
90
  - README.md
77
91
  - Rakefile
92
+ - lib/libusb-1.0.dll
78
93
  - lib/libusb.rb
94
+ - lib/libusb/bos.rb
79
95
  - lib/libusb/call.rb
80
96
  - lib/libusb/compat.rb
81
97
  - lib/libusb/configuration.rb
@@ -87,10 +103,13 @@ files:
87
103
  - lib/libusb/eventmachine.rb
88
104
  - lib/libusb/interface.rb
89
105
  - lib/libusb/setting.rb
106
+ - lib/libusb/ss_companion.rb
90
107
  - lib/libusb/transfer.rb
91
108
  - lib/libusb/version_gem.rb
92
109
  - lib/libusb/version_struct.rb
93
110
  - libusb.gemspec
111
+ - test/test_libusb_bos.rb
112
+ - test/test_libusb_bulk_stream_transfer.rb
94
113
  - test/test_libusb_capability.rb
95
114
  - test/test_libusb_compat.rb
96
115
  - test/test_libusb_compat_mass_storage.rb
@@ -104,32 +123,31 @@ files:
104
123
  - test/test_libusb_structs.rb
105
124
  - test/test_libusb_threads.rb
106
125
  - test/test_libusb_version.rb
107
- - lib/libusb-1.0.dll
108
126
  homepage: http://github.com/larskanis/libusb
109
- licenses: []
127
+ licenses:
128
+ - LGPL-3
129
+ metadata: {}
110
130
  post_install_message:
111
131
  rdoc_options:
112
- - --main
132
+ - "--main"
113
133
  - README.md
114
- - --charset=UTF-8
134
+ - "--charset=UTF-8"
115
135
  require_paths:
116
136
  - lib
117
137
  required_ruby_version: !ruby/object:Gem::Requirement
118
- none: false
119
138
  requirements:
120
- - - ! '>='
139
+ - - ">="
121
140
  - !ruby/object:Gem::Version
122
141
  version: '0'
123
142
  required_rubygems_version: !ruby/object:Gem::Requirement
124
- none: false
125
143
  requirements:
126
- - - ! '>='
144
+ - - ">="
127
145
  - !ruby/object:Gem::Version
128
146
  version: '0'
129
147
  requirements: []
130
148
  rubyforge_project: libusb
131
- rubygems_version: 1.8.24
149
+ rubygems_version: 2.4.5
132
150
  signing_key:
133
- specification_version: 3
151
+ specification_version: 4
134
152
  summary: Access USB devices from Ruby via libusb-1.0
135
153
  test_files: []
metadata.gz.sig ADDED
@@ -0,0 +1 @@
1
+ pn���A�Z㄃��Zd�&x/���q�`�:8��()��/h����E�vغ��eL�^䙄r