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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -0
- data/.travis.yml +3 -3
- data/History.md +8 -0
- data/README.md +1 -0
- data/Rakefile +14 -14
- data/lib/libusb.rb +3 -1
- data/lib/libusb/bos.rb +306 -0
- data/lib/libusb/call.rb +84 -0
- data/lib/libusb/constants.rb +4 -0
- data/lib/libusb/dev_handle.rb +77 -0
- data/lib/libusb/endpoint.rb +20 -0
- data/lib/libusb/ss_companion.rb +69 -0
- data/lib/libusb/transfer.rb +34 -0
- data/lib/libusb/version_gem.rb +1 -1
- data/libusb.gemspec +1 -0
- data/test/test_libusb_bos.rb +118 -0
- data/test/test_libusb_bulk_stream_transfer.rb +50 -0
- data/test/test_libusb_descriptors.rb +29 -0
- data/test/test_libusb_hotplug.rb +1 -1
- data/test/test_libusb_threads.rb +1 -1
- metadata +47 -29
- metadata.gz.sig +1 -0
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
data/.travis.yml
CHANGED
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.
|
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 =>
|
149
|
-
|
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
|
-
|
158
|
-
|
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
|
-
|
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
|
data/lib/libusb/constants.rb
CHANGED
@@ -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
|
|
data/lib/libusb/dev_handle.rb
CHANGED
@@ -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
|
data/lib/libusb/endpoint.rb
CHANGED
@@ -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
|
data/lib/libusb/transfer.rb
CHANGED
@@ -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)
|
data/lib/libusb/version_gem.rb
CHANGED
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"
|
data/test/test_libusb_hotplug.rb
CHANGED
@@ -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"
|
data/test/test_libusb_threads.rb
CHANGED
@@ -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
|
-
|
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.
|
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
|
-
|
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:
|
149
|
+
rubygems_version: 2.4.5
|
132
150
|
signing_key:
|
133
|
-
specification_version:
|
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
|