[libhid-discuss] Issues trying to work with USB HID Swipe Reader
George Marshall
echosx at gmail.com
Fri Feb 22 20:50:08 UTC 2008
I've spent the past 2 days attempting to get some form of communication
going with my Magtek Mini swipe reader. I've skimmed over the entire mailing
list archives to see if I could find some answers as well as dozen of
articles on the internet.
Out of all the articles that relate to what I'm attempting to do would have
to be "Development of a User-Space Application for an HID Device, Using
libhid <http://www.linuxjournal.com/article/8145>" over at Linux Journal.
The only real difference is that he is using a bill validator.
So now let me introduce the details...
USB HID Swipe Reader, Technical Reference
Manual<http://www.magtek.com/documentation/public/99875191-11.01.pdf>[PDF]
Here is my Python script that I've been hacking around with to at least get
something out of it. Which has seemed to have been unsuccessful with just
about everything I tried, the only exception being interrupt_read which does
at least clear out the buffer of the swipe reader after a card has been
swiped. Sorry if its really hackish I've been frustrated and decided to take
the brute force route.
swipe_reader.py <http://privatepaste.com/7805xSQbGi>
--------------------------------------------------
#!/usr/bin/env python
import sys
import struct
#~ from libhid import *
from libhid.hidwrap import *
card_encode = {0: 'ISO/ABA', 1: 'AAMVA', 2: 'CADL', 3: 'Blank', 4: 'Other',
5: 'Undetermined', 6: 'None'}
def main():
set_debug(HID_DEBUG_ALL)
set_debug_stream(sys.stderr)
set_usb_debug(0)
hid = Interface(vendor_id=0x0801, product_id=0x0002)
#~ hid.write_identification(sys.stdout)
#~ hid.dump_tree(sys.stdout)
for item1 in xrange(0x00, 0xff):
for item2 in xrange(0x00, 0xff):
try:
hid.set_output_report([0xff000000 + item1, 0xff000000 +
item2], '\x01\x02\x10\x00\x02')
print item1, item2
except:
pass
#~ hid.set_output_report([0xff000001, 0xff000020],
'\x01\x02\x10\x00\x02')
#~ hid.interrupt_read(0xff000001, 5)
#~ hid.get_input_report([0xff000001, 0xff000032], 512)
#~ hid.get_feature_report([0xff000001, 0xff000032], 512)
#~ hid.set_feature_report([0xff000001, 0xff000001], '\x02')
#~ hid.interrupt_read(0xff000001, 512)
#~ for item in xrange(256):
#~ for item2 in xrange(256):
#~ try:
#~ hid.set_output_report([item, item2], chr(0x02))
#~ print '**************', item, item2
#~ hid.get_feature_report([item], 512)
#~ print '**************', item, item2
#~ except:
#~ pass
cleanup()
if __name__ == '__main__':
main()
--------------------------------------------------
Here are a lsusb -vvv <http://privatepaste.com/280Qc0PbZT> and
dump_tree<http://privatepaste.com/f61ycUKlN6> dumps
of the device
lsusb -vvv <http://privatepaste.com/280Qc0PbZT>
--------------------------------------------------
Bus 008 Device 006: ID 0801:0002 Mag-Tek
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x0801 Mag-Tek
idProduct 0x0002
bcdDevice 1.00
iManufacturer 1 Mag-Tek
iProduct 2 USB Swipe Reader
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 34
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Devices
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.00
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 61
Report Descriptor: (length is 61)
Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
(null)
Item(Local ): Usage, data= [ 0x01 ] 1
(null)
Item(Main ): Collection, data= [ 0x01 ] 1
Application
Item(Global): Logical Minimum, data= [ 0x00 ] 0
Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Local ): Usage, data= [ 0x20 ] 32
(null)
Item(Local ): Usage, data= [ 0x21 ] 33
(null)
Item(Local ): Usage, data= [ 0x22 ] 34
(null)
Item(Local ): Usage, data= [ 0x28 ] 40
(null)
Item(Local ): Usage, data= [ 0x29 ] 41
(null)
Item(Local ): Usage, data= [ 0x2a ] 42
(null)
Item(Local ): Usage, data= [ 0x38 ] 56
(null)
Item(Global): Report Count, data= [ 0x07 ] 7
Item(Main ): Input, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Bitfield
Item(Local ): Usage, data= [ 0x30 ] 48
(null)
Item(Global): Report Count, data= [ 0x6e ] 110
Item(Main ): Input, data= [ 0x02 0x01 ] 258
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Buffered Bytes
Item(Local ): Usage, data= [ 0x31 ] 49
(null)
Item(Global): Report Count, data= [ 0x6e ] 110
Item(Main ): Input, data= [ 0x02 0x01 ] 258
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Buffered Bytes
Item(Local ): Usage, data= [ 0x32 ] 50
(null)
Item(Global): Report Count, data= [ 0x6e ] 110
Item(Main ): Input, data= [ 0x02 0x01 ] 258
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Buffered Bytes
Item(Local ): Usage, data= [ 0x20 ] 32
(null)
Item(Global): Report Count, data= [ 0x18 ] 24
Item(Main ): Feature, data= [ 0x02 0x01 ] 258
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Buffered Bytes
Item(Main ): End Collection, data=none
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
Device Status: 0x0000
(Bus Powered)
--------------------------------------------------
More information about the libhid-discuss
mailing list