libusb 0.1.2-x86-mingw32 → 0.1.3-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.
- data/History.txt +5 -0
- data/lib/libusb-1.0.dll +0 -0
- data/lib/libusb.rb +276 -32
- data/test/test_libusb_descriptors.rb +45 -0
- data/test/test_libusb_keyboard.rb +50 -0
- metadata +55 -81
data/History.txt
CHANGED
data/lib/libusb-1.0.dll
CHANGED
Binary file
|
data/lib/libusb.rb
CHANGED
@@ -18,7 +18,7 @@ require 'ffi'
|
|
18
18
|
|
19
19
|
|
20
20
|
module LIBUSB
|
21
|
-
VERSION = "0.1.
|
21
|
+
VERSION = "0.1.3"
|
22
22
|
|
23
23
|
module Call
|
24
24
|
extend FFI::Library
|
@@ -235,6 +235,7 @@ module LIBUSB
|
|
235
235
|
Call::RequestRecipients.to_h.each{|k,v| const_set(k,v) }
|
236
236
|
Call::IsoSyncTypes.to_h.each{|k,v| const_set(k,v) }
|
237
237
|
|
238
|
+
# Base class of libusb errors
|
238
239
|
class Error < RuntimeError
|
239
240
|
end
|
240
241
|
ErrorClassForResult = {}
|
@@ -592,6 +593,7 @@ module LIBUSB
|
|
592
593
|
private :actual_length, :actual_buffer
|
593
594
|
end
|
594
595
|
|
596
|
+
# @private
|
595
597
|
class DeviceDescriptor < FFI::Struct
|
596
598
|
include Comparable
|
597
599
|
|
@@ -626,10 +628,61 @@ module LIBUSB
|
|
626
628
|
:extra, :pointer,
|
627
629
|
:extra_length, :int
|
628
630
|
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
631
|
+
# Size of this descriptor (in bytes).
|
632
|
+
def bLength
|
633
|
+
self[:bLength]
|
634
|
+
end
|
635
|
+
|
636
|
+
# Descriptor type (0x02)
|
637
|
+
def bDescriptorType
|
638
|
+
self[:bDescriptorType]
|
639
|
+
end
|
640
|
+
|
641
|
+
# Total length of data returned for this configuration.
|
642
|
+
def wTotalLength
|
643
|
+
self[:wTotalLength]
|
644
|
+
end
|
645
|
+
|
646
|
+
# Number of interfaces supported by this configuration.
|
647
|
+
def bNumInterfaces
|
648
|
+
self[:bNumInterfaces]
|
649
|
+
end
|
650
|
+
|
651
|
+
# Identifier value for this configuration.
|
652
|
+
def bConfigurationValue
|
653
|
+
self[:bConfigurationValue]
|
654
|
+
end
|
655
|
+
|
656
|
+
# Index of string descriptor describing this configuration.
|
657
|
+
def iConfiguration
|
658
|
+
self[:iConfiguration]
|
659
|
+
end
|
660
|
+
|
661
|
+
# Configuration characteristics.
|
662
|
+
#
|
663
|
+
# * Bit 7: Reserved, set to 1. (USB 1.0 Bus Powered)
|
664
|
+
# * Bit 6: Self Powered
|
665
|
+
# * Bit 5: Remote Wakeup
|
666
|
+
# * Bit 4..0: Reserved, set to 0.
|
667
|
+
#
|
668
|
+
# @return [Integer]
|
669
|
+
def bmAttributes
|
670
|
+
self[:bmAttributes]
|
671
|
+
end
|
672
|
+
|
673
|
+
# Maximum power consumption of the USB device from this bus in this configuration when the device is fully opreation.
|
674
|
+
#
|
675
|
+
# @result [Integer] Maximum Power Consumption in 2mA units
|
676
|
+
def maxPower
|
677
|
+
self[:maxPower]
|
678
|
+
end
|
679
|
+
|
680
|
+
# Extra descriptors.
|
681
|
+
#
|
682
|
+
# @return [String]
|
683
|
+
def extra
|
684
|
+
return if self[:extra].null?
|
685
|
+
self[:extra].read_string(self[:extra_length])
|
633
686
|
end
|
634
687
|
|
635
688
|
def initialize(device, *args)
|
@@ -663,15 +716,15 @@ module LIBUSB
|
|
663
716
|
"\#<#{self.class} #{attrs.join(' ')}>"
|
664
717
|
end
|
665
718
|
|
666
|
-
# Return name of
|
719
|
+
# Return name of this configuration as String.
|
667
720
|
def description
|
668
721
|
return @description if defined? @description
|
669
722
|
@description = device.try_string_descriptor_ascii(self.iConfiguration)
|
670
723
|
end
|
671
724
|
|
672
|
-
# Return all interface decriptions of the configuration as Array of
|
725
|
+
# Return all interface decriptions of the configuration as Array of {Setting}s.
|
673
726
|
def settings() self.interfaces.map {|d| d.settings }.flatten end
|
674
|
-
# Return all endpoints of all interfaces of the configuration as Array of
|
727
|
+
# Return all endpoints of all interfaces of the configuration as Array of {Endpoint}s.
|
675
728
|
def endpoints() self.settings.map {|d| d.endpoints }.flatten end
|
676
729
|
|
677
730
|
def <=>(o)
|
@@ -704,9 +757,9 @@ module LIBUSB
|
|
704
757
|
end
|
705
758
|
alias settings alt_settings
|
706
759
|
|
707
|
-
# The Device
|
760
|
+
# The {Device} this Interface belongs to.
|
708
761
|
def device() self.configuration.device end
|
709
|
-
# Return all endpoints of all alternative settings as Array of
|
762
|
+
# Return all endpoints of all alternative settings as Array of {Endpoint}s.
|
710
763
|
def endpoints() self.alt_settings.map {|d| d.endpoints }.flatten end
|
711
764
|
|
712
765
|
def <=>(o)
|
@@ -730,10 +783,57 @@ module LIBUSB
|
|
730
783
|
:extra, :pointer,
|
731
784
|
:extra_length, :int
|
732
785
|
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
786
|
+
# Size of this descriptor (in bytes).
|
787
|
+
def bLength
|
788
|
+
self[:bLength]
|
789
|
+
end
|
790
|
+
|
791
|
+
# Descriptor type (0x04)
|
792
|
+
def bDescriptorType
|
793
|
+
self[:bDescriptorType]
|
794
|
+
end
|
795
|
+
|
796
|
+
# Number of this interface.
|
797
|
+
def bInterfaceNumber
|
798
|
+
self[:bInterfaceNumber]
|
799
|
+
end
|
800
|
+
|
801
|
+
# Value used to select this alternate setting for this interface.
|
802
|
+
def bAlternateSetting
|
803
|
+
self[:bAlternateSetting]
|
804
|
+
end
|
805
|
+
|
806
|
+
# Number of endpoints used by this interface (excluding the control endpoint).
|
807
|
+
def bNumEndpoints
|
808
|
+
self[:bNumEndpoints]
|
809
|
+
end
|
810
|
+
|
811
|
+
# USB-IF class code for this interface.
|
812
|
+
def bInterfaceClass
|
813
|
+
self[:bInterfaceClass]
|
814
|
+
end
|
815
|
+
|
816
|
+
# USB-IF subclass code for this interface, qualified by the {bInterfaceClass} value.
|
817
|
+
def bInterfaceSubClass
|
818
|
+
self[:bInterfaceSubClass]
|
819
|
+
end
|
820
|
+
|
821
|
+
# USB-IF protocol code for this interface, qualified by the {bInterfaceClass} and {bInterfaceSubClass} values.
|
822
|
+
def bInterfaceProtocol
|
823
|
+
self[:bInterfaceProtocol]
|
824
|
+
end
|
825
|
+
|
826
|
+
# Index of string descriptor describing this interface.
|
827
|
+
def iInterface
|
828
|
+
self[:iInterface]
|
829
|
+
end
|
830
|
+
|
831
|
+
# Extra descriptors.
|
832
|
+
#
|
833
|
+
# @return [String]
|
834
|
+
def extra
|
835
|
+
return if self[:extra].null?
|
836
|
+
self[:extra].read_string(self[:extra_length])
|
737
837
|
end
|
738
838
|
|
739
839
|
def initialize(interface, *args)
|
@@ -762,15 +862,15 @@ module LIBUSB
|
|
762
862
|
"\#<#{self.class} #{attrs.join(' ')}>"
|
763
863
|
end
|
764
864
|
|
765
|
-
# Return name of
|
865
|
+
# Return name of this interface as String.
|
766
866
|
def description
|
767
867
|
return @description if defined? @description
|
768
868
|
@description = device.try_string_descriptor_ascii(self.iInterface)
|
769
869
|
end
|
770
870
|
|
771
|
-
# The Device
|
871
|
+
# The {Device} this Setting belongs to.
|
772
872
|
def device() self.interface.configuration.device end
|
773
|
-
# The
|
873
|
+
# The {Configuration} this Setting belongs to.
|
774
874
|
def configuration() self.interface.configuration end
|
775
875
|
|
776
876
|
def <=>(o)
|
@@ -795,10 +895,82 @@ module LIBUSB
|
|
795
895
|
:extra, :pointer,
|
796
896
|
:extra_length, :int
|
797
897
|
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
898
|
+
# Size of Descriptor in Bytes (7 bytes)
|
899
|
+
def bLength
|
900
|
+
self[:bLength]
|
901
|
+
end
|
902
|
+
|
903
|
+
# Descriptor type (0x05)
|
904
|
+
def bDescriptorType
|
905
|
+
self[:bDescriptorType]
|
906
|
+
end
|
907
|
+
|
908
|
+
# The address of the endpoint described by this descriptor.
|
909
|
+
#
|
910
|
+
# * Bits 0..3: Endpoint Number.
|
911
|
+
# * Bits 4..6: Reserved. Set to Zero
|
912
|
+
# * Bits 7: Direction 0 = Out, 1 = In (Ignored for Control Endpoints)
|
913
|
+
#
|
914
|
+
# @return [Integer]
|
915
|
+
def bEndpointAddress
|
916
|
+
self[:bEndpointAddress]
|
917
|
+
end
|
918
|
+
|
919
|
+
# Attributes which apply to the endpoint when it is configured using the {Configuration#bConfigurationValue}.
|
920
|
+
#
|
921
|
+
# * Bits 0..1: Transfer Type
|
922
|
+
# * 00 = Control
|
923
|
+
# * 01 = Isochronous
|
924
|
+
# * 10 = Bulk
|
925
|
+
# * 11 = Interrupt
|
926
|
+
# * Bits 2..7: are reserved. If Isochronous endpoint,
|
927
|
+
# * Bits 3..2: Synchronisation Type (Iso Mode)
|
928
|
+
# * 00 = No Synchonisation
|
929
|
+
# * 01 = Asynchronous
|
930
|
+
# * 10 = Adaptive
|
931
|
+
# * 11 = Synchronous
|
932
|
+
# * Bits 5..4: Usage Type (Iso Mode)
|
933
|
+
# * 00 = Data Endpoint
|
934
|
+
# * 01 = Feedback Endpoint
|
935
|
+
# * 10 = Explicit Feedback Data Endpoint
|
936
|
+
# * 11 = Reserved
|
937
|
+
#
|
938
|
+
# @return [Integer]
|
939
|
+
def bmAttributes
|
940
|
+
self[:bmAttributes]
|
941
|
+
end
|
942
|
+
|
943
|
+
# Maximum Packet Size this endpoint is capable of sending or receiving
|
944
|
+
def wMaxPacketSize
|
945
|
+
self[:wMaxPacketSize]
|
946
|
+
end
|
947
|
+
|
948
|
+
# Interval for polling endpoint data transfers. Value in frame counts.
|
949
|
+
# Ignored for Bulk & Control Endpoints. Isochronous must equal 1 and field
|
950
|
+
# may range from 1 to 255 for interrupt endpoints.
|
951
|
+
#
|
952
|
+
# The interval is respected by the kernel driver, so user mode processes
|
953
|
+
# using libusb don't need to care about it.
|
954
|
+
def bInterval
|
955
|
+
self[:bInterval]
|
956
|
+
end
|
957
|
+
|
958
|
+
# For audio devices only: the rate at which synchronization feedback is provided.
|
959
|
+
def bRefresh
|
960
|
+
self[:bRefresh]
|
961
|
+
end
|
962
|
+
|
963
|
+
# For audio devices only: the address if the synch endpoint.
|
964
|
+
def bSynchAddress
|
965
|
+
self[:bSynchAddress]
|
966
|
+
end
|
967
|
+
|
968
|
+
# Extra descriptors.
|
969
|
+
#
|
970
|
+
# @return [String]
|
971
|
+
def extra
|
972
|
+
return if self[:extra].null?
|
973
|
+
self[:extra].read_string(self[:extra_length])
|
802
974
|
end
|
803
975
|
|
804
976
|
def initialize(setting, *args)
|
@@ -824,11 +996,11 @@ module LIBUSB
|
|
824
996
|
"\#<#{self.class} #{num} #{inout} #{type.join(" ")}>"
|
825
997
|
end
|
826
998
|
|
827
|
-
# The Device
|
999
|
+
# The {Device} this Endpoint belongs to.
|
828
1000
|
def device() self.setting.interface.configuration.device end
|
829
|
-
# The
|
1001
|
+
# The {Configuration} this Endpoint belongs to.
|
830
1002
|
def configuration() self.setting.interface.configuration end
|
831
|
-
# The Interface
|
1003
|
+
# The {Interface} this Endpoint belongs to.
|
832
1004
|
def interface() self.setting.interface end
|
833
1005
|
|
834
1006
|
def <=>(o)
|
@@ -1072,13 +1244,85 @@ module LIBUSB
|
|
1072
1244
|
config
|
1073
1245
|
end
|
1074
1246
|
|
1075
|
-
#
|
1076
|
-
|
1077
|
-
|
1078
|
-
@pDevDesc[member]
|
1079
|
-
end
|
1247
|
+
# Size of the Descriptor in Bytes (18 bytes)
|
1248
|
+
def bLength
|
1249
|
+
@pDevDesc[:bLength]
|
1080
1250
|
end
|
1081
1251
|
|
1252
|
+
# Device Descriptor (0x01)
|
1253
|
+
def bDescriptorType
|
1254
|
+
@pDevDesc[:bDescriptorType]
|
1255
|
+
end
|
1256
|
+
|
1257
|
+
# USB specification release number which device complies too
|
1258
|
+
#
|
1259
|
+
# @return [Integer] in binary-coded decimal
|
1260
|
+
def bcdUSB
|
1261
|
+
@pDevDesc[:bcdUSB]
|
1262
|
+
end
|
1263
|
+
|
1264
|
+
# USB-IF class code for the device (Assigned by USB Org)
|
1265
|
+
#
|
1266
|
+
# * If equal to 0x00, each interface specifies it's own class code
|
1267
|
+
# * If equal to 0xFF, the class code is vendor specified
|
1268
|
+
# * Otherwise field is valid Class Code
|
1269
|
+
def bDeviceClass
|
1270
|
+
@pDevDesc[:bDeviceClass]
|
1271
|
+
end
|
1272
|
+
|
1273
|
+
# USB-IF subclass code for the device, qualified by the {bDeviceClass}
|
1274
|
+
# value (Assigned by USB Org)
|
1275
|
+
def bDeviceSubClass
|
1276
|
+
@pDevDesc[:bDeviceSubClass]
|
1277
|
+
end
|
1278
|
+
|
1279
|
+
# USB-IF protocol code for the device, qualified by the {bDeviceClass}
|
1280
|
+
# and {bDeviceSubClass} values (Assigned by USB Org)
|
1281
|
+
def bDeviceProtocol
|
1282
|
+
@pDevDesc[:bDeviceProtocol]
|
1283
|
+
end
|
1284
|
+
|
1285
|
+
# Maximum Packet Size for Endpoint 0. Valid Sizes are 8, 16, 32, 64
|
1286
|
+
def bMaxPacketSize0
|
1287
|
+
@pDevDesc[:bMaxPacketSize0]
|
1288
|
+
end
|
1289
|
+
|
1290
|
+
# USB-IF vendor ID (Assigned by USB Org)
|
1291
|
+
def idVendor
|
1292
|
+
@pDevDesc[:idVendor]
|
1293
|
+
end
|
1294
|
+
|
1295
|
+
# USB-IF product ID (Assigned by Manufacturer)
|
1296
|
+
def idProduct
|
1297
|
+
@pDevDesc[:idProduct]
|
1298
|
+
end
|
1299
|
+
|
1300
|
+
# Device release number in binary-coded decimal.
|
1301
|
+
def bcdDevice
|
1302
|
+
@pDevDesc[:bcdDevice]
|
1303
|
+
end
|
1304
|
+
|
1305
|
+
# Index of string descriptor describing manufacturer.
|
1306
|
+
def iManufacturer
|
1307
|
+
@pDevDesc[:iManufacturer]
|
1308
|
+
end
|
1309
|
+
|
1310
|
+
# Index of string descriptor describing product.
|
1311
|
+
def iProduct
|
1312
|
+
@pDevDesc[:iProduct]
|
1313
|
+
end
|
1314
|
+
|
1315
|
+
# Index of string descriptor containing device serial number.
|
1316
|
+
def iSerialNumber
|
1317
|
+
@pDevDesc[:iSerialNumber]
|
1318
|
+
end
|
1319
|
+
|
1320
|
+
# Number of Possible Configurations
|
1321
|
+
def bNumConfigurations
|
1322
|
+
@pDevDesc[:bNumConfigurations]
|
1323
|
+
end
|
1324
|
+
|
1325
|
+
|
1082
1326
|
def inspect
|
1083
1327
|
attrs = []
|
1084
1328
|
attrs << "#{self.bus_number}/#{self.device_address}"
|
@@ -1147,13 +1391,13 @@ module LIBUSB
|
|
1147
1391
|
configs
|
1148
1392
|
end
|
1149
1393
|
|
1150
|
-
# Return all interfaces of
|
1394
|
+
# Return all interfaces of this device.
|
1151
1395
|
# @return [Array<Interface>]
|
1152
1396
|
def interfaces() self.configurations.map {|d| d.interfaces }.flatten end
|
1153
|
-
# Return all interface decriptions of
|
1397
|
+
# Return all interface decriptions of this device.
|
1154
1398
|
# @return [Array<Setting>]
|
1155
1399
|
def settings() self.interfaces.map {|d| d.settings }.flatten end
|
1156
|
-
# Return all endpoints of all interfaces of
|
1400
|
+
# Return all endpoints of all interfaces of this device.
|
1157
1401
|
# @return [Array<Endpoint>]
|
1158
1402
|
def endpoints() self.settings.map {|d| d.endpoints }.flatten end
|
1159
1403
|
|
@@ -29,10 +29,36 @@ class TestLibusbDescriptors < Test::Unit::TestCase
|
|
29
29
|
def test_descriptors
|
30
30
|
usb.devices.each do |dev|
|
31
31
|
assert_match(/Device/, dev.inspect, "Device#inspect should work")
|
32
|
+
|
33
|
+
assert_kind_of Integer, dev.bLength
|
34
|
+
assert_equal 1, dev.bDescriptorType
|
35
|
+
assert_kind_of Integer, dev.bcdUSB
|
36
|
+
assert_kind_of Integer, dev.bDeviceClass
|
37
|
+
assert_kind_of Integer, dev.bDeviceSubClass
|
38
|
+
assert_kind_of Integer, dev.bDeviceProtocol
|
39
|
+
assert_kind_of Integer, dev.bMaxPacketSize0
|
40
|
+
assert_kind_of Integer, dev.idVendor
|
41
|
+
assert_kind_of Integer, dev.idProduct
|
42
|
+
assert_kind_of Integer, dev.bcdDevice
|
43
|
+
assert_kind_of Integer, dev.iManufacturer
|
44
|
+
assert_kind_of Integer, dev.iProduct
|
45
|
+
assert_kind_of Integer, dev.iSerialNumber
|
46
|
+
assert_kind_of Integer, dev.bNumConfigurations
|
47
|
+
|
32
48
|
dev.configurations.each do |config_desc|
|
33
49
|
assert_match(/Configuration/, config_desc.inspect, "ConfigDescriptor#inspect should work")
|
34
50
|
assert dev.configurations.include?(config_desc), "Device#configurations should include this one"
|
35
51
|
|
52
|
+
assert_kind_of Integer, config_desc.bLength
|
53
|
+
assert_equal 2, config_desc.bDescriptorType
|
54
|
+
assert_kind_of Integer, config_desc.wTotalLength
|
55
|
+
assert_equal config_desc.interfaces.length, config_desc.bNumInterfaces
|
56
|
+
assert_kind_of Integer, config_desc.bConfigurationValue
|
57
|
+
assert_kind_of Integer, config_desc.iConfiguration
|
58
|
+
assert_kind_of Integer, config_desc.bmAttributes
|
59
|
+
assert_kind_of Integer, config_desc.maxPower
|
60
|
+
assert_kind_of String, config_desc.extra if config_desc.extra
|
61
|
+
|
36
62
|
config_desc.interfaces.each do |interface|
|
37
63
|
assert_match(/Interface/, interface.inspect, "Interface#inspect should work")
|
38
64
|
|
@@ -46,6 +72,17 @@ class TestLibusbDescriptors < Test::Unit::TestCase
|
|
46
72
|
assert config_desc.settings.include?(if_desc), "ConfigDescriptor#settings should include this one"
|
47
73
|
assert interface.alt_settings.include?(if_desc), "Inteerface#alt_settings should include this one"
|
48
74
|
|
75
|
+
assert_kind_of Integer, if_desc.bLength
|
76
|
+
assert_equal 4, if_desc.bDescriptorType
|
77
|
+
assert_kind_of Integer, if_desc.bInterfaceNumber
|
78
|
+
assert_kind_of Integer, if_desc.bAlternateSetting
|
79
|
+
assert_equal if_desc.endpoints.length, if_desc.bNumEndpoints
|
80
|
+
assert_kind_of Integer, if_desc.bInterfaceClass
|
81
|
+
assert_kind_of Integer, if_desc.bInterfaceSubClass
|
82
|
+
assert_kind_of Integer, if_desc.bInterfaceProtocol
|
83
|
+
assert_kind_of Integer, if_desc.iInterface
|
84
|
+
assert_kind_of String, if_desc.extra if if_desc.extra
|
85
|
+
|
49
86
|
if_desc.endpoints.each do |ep|
|
50
87
|
assert_match(/Endpoint/, ep.inspect, "EndpointDescriptor#inspect should work")
|
51
88
|
|
@@ -59,7 +96,15 @@ class TestLibusbDescriptors < Test::Unit::TestCase
|
|
59
96
|
assert_equal config_desc, ep.configuration, "backref should be correct"
|
60
97
|
assert_equal dev, ep.device, "backref should be correct"
|
61
98
|
|
99
|
+
assert_kind_of Integer, ep.bLength
|
100
|
+
assert_equal 5, ep.bDescriptorType
|
101
|
+
assert_kind_of Integer, ep.bEndpointAddress
|
102
|
+
assert_kind_of Integer, ep.bmAttributes
|
62
103
|
assert_operator 0, :<, ep.wMaxPacketSize, "packet size should be > 0"
|
104
|
+
assert_kind_of Integer, ep.bInterval
|
105
|
+
assert_kind_of Integer, ep.bRefresh
|
106
|
+
assert_kind_of Integer, ep.bSynchAddress
|
107
|
+
assert_kind_of String, ep.extra if ep.extra
|
63
108
|
end
|
64
109
|
end
|
65
110
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# This test requires a connected, but not mounted mass storage device with
|
2
|
+
# read/write access allowed. Based on the following specifications:
|
3
|
+
# http://www.usb.org/developers/devclass_docs/usbmassbulk_10.pdf
|
4
|
+
# http://en.wikipedia.org/wiki/SCSI_command
|
5
|
+
#
|
6
|
+
|
7
|
+
require "test/unit"
|
8
|
+
require "libusb"
|
9
|
+
|
10
|
+
class TestLibusbKeyboard < Test::Unit::TestCase
|
11
|
+
include LIBUSB
|
12
|
+
|
13
|
+
attr_accessor :usb
|
14
|
+
attr_accessor :device
|
15
|
+
attr_accessor :dev
|
16
|
+
attr_accessor :endpoint_in
|
17
|
+
attr_accessor :endpoint_out
|
18
|
+
|
19
|
+
def setup
|
20
|
+
@usb = Context.new
|
21
|
+
@usb.debug = 3
|
22
|
+
|
23
|
+
@device = usb.devices( :bDeviceClass=>CLASS_HID, :bDeviceProtocol=>1 ).first
|
24
|
+
abort "no keyboard device found" unless @device
|
25
|
+
|
26
|
+
@endpoint_in = @device.endpoints.find{|ep| ep.bEndpointAddress&ENDPOINT_IN != 0 }.bEndpointAddress
|
27
|
+
@endpoint_out = @device.endpoints.find{|ep| ep.bEndpointAddress&ENDPOINT_IN == 0 }.bEndpointAddress
|
28
|
+
|
29
|
+
@dev = @device.open
|
30
|
+
|
31
|
+
if RUBY_PLATFORM=~/linux/i && dev.kernel_driver_active?(0)
|
32
|
+
dev.detach_kernel_driver(0)
|
33
|
+
end
|
34
|
+
dev.claim_interface(0)
|
35
|
+
|
36
|
+
# clear any pending data
|
37
|
+
dev.clear_halt(endpoint_in)
|
38
|
+
end
|
39
|
+
|
40
|
+
def teardown
|
41
|
+
dev.release_interface(0) if dev
|
42
|
+
dev.close if dev
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_read
|
46
|
+
data_length = 8
|
47
|
+
recv = dev.interrupt_transfer(:endpoint=>endpoint_in, :dataIn=>data_length)
|
48
|
+
p recv
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,80 +1,60 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: libusb
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 2
|
10
|
-
version: 0.1.2
|
11
6
|
platform: x86-mingw32
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Lars Kanis
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-03-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: ffi
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &11949220 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 0
|
32
|
-
version: "1.0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
33
22
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: rake-compiler
|
37
23
|
prerelease: false
|
38
|
-
|
24
|
+
version_requirements: *11949220
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake-compiler
|
27
|
+
requirement: &11947620 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
- 6
|
47
|
-
version: "0.6"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.6'
|
48
33
|
type: :development
|
49
|
-
version_requirements: *id002
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: hoe
|
52
34
|
prerelease: false
|
53
|
-
|
35
|
+
version_requirements: *11947620
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: hoe
|
38
|
+
requirement: &11945960 !ruby/object:Gem::Requirement
|
54
39
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
segments:
|
60
|
-
- 2
|
61
|
-
- 8
|
62
|
-
- 0
|
63
|
-
version: 2.8.0
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '2.12'
|
64
44
|
type: :development
|
65
|
-
|
66
|
-
|
67
|
-
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *11945960
|
47
|
+
description: LIBUSB is a Ruby binding that gives Ruby programmers access to all functionality
|
48
|
+
of libusb, version 1.0
|
49
|
+
email:
|
68
50
|
- kanis@comcard.de
|
69
51
|
executables: []
|
70
|
-
|
71
52
|
extensions: []
|
72
|
-
|
73
|
-
extra_rdoc_files:
|
53
|
+
extra_rdoc_files:
|
74
54
|
- History.txt
|
75
55
|
- Manifest.txt
|
76
56
|
- README.rdoc
|
77
|
-
files:
|
57
|
+
files:
|
78
58
|
- .autotest
|
79
59
|
- .gemtest
|
80
60
|
- COPYING
|
@@ -91,47 +71,41 @@ files:
|
|
91
71
|
- test/test_libusb_iso_transfer.rb
|
92
72
|
- test/test_libusb_mass_storage.rb
|
93
73
|
- test/test_libusb_mass_storage2.rb
|
74
|
+
- test/test_libusb_keyboard.rb
|
94
75
|
- lib/libusb-1.0.dll
|
95
76
|
homepage: http://github.com/larskanis/libusb
|
96
77
|
licenses: []
|
97
|
-
|
98
78
|
post_install_message:
|
99
|
-
rdoc_options:
|
79
|
+
rdoc_options:
|
100
80
|
- --main
|
101
81
|
- README.rdoc
|
102
82
|
- --charset=UTF-8
|
103
|
-
require_paths:
|
83
|
+
require_paths:
|
104
84
|
- lib
|
105
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
86
|
none: false
|
107
|
-
requirements:
|
108
|
-
- -
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
|
111
|
-
|
112
|
-
- 0
|
113
|
-
version: "0"
|
114
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
92
|
none: false
|
116
|
-
requirements:
|
117
|
-
- -
|
118
|
-
- !ruby/object:Gem::Version
|
119
|
-
|
120
|
-
segments:
|
121
|
-
- 0
|
122
|
-
version: "0"
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
123
97
|
requirements: []
|
124
|
-
|
125
98
|
rubyforge_project: libusb
|
126
|
-
rubygems_version: 1.
|
99
|
+
rubygems_version: 1.8.10
|
127
100
|
signing_key:
|
128
101
|
specification_version: 3
|
129
102
|
summary: Access USB devices from Ruby via libusb-1.0
|
130
|
-
test_files:
|
131
|
-
- test/
|
103
|
+
test_files:
|
104
|
+
- test/test_libusb_compat_mass_storage.rb
|
105
|
+
- test/test_libusb_gc.rb
|
132
106
|
- test/test_libusb_iso_transfer.rb
|
133
|
-
- test/test_libusb_mass_storage2.rb
|
134
107
|
- test/test_libusb_descriptors.rb
|
108
|
+
- test/test_libusb_compat.rb
|
109
|
+
- test/test_libusb_keyboard.rb
|
110
|
+
- test/test_libusb_mass_storage2.rb
|
135
111
|
- test/test_libusb_mass_storage.rb
|
136
|
-
- test/test_libusb_compat_mass_storage.rb
|
137
|
-
- test/test_libusb_gc.rb
|