Mercurial > hg > minimon
comparison frame-ctrl.py @ 1:111d4bbce605
improving
| author | Peter Meerwald <pmeerw@pmeerw.net> |
|---|---|
| date | Sat, 07 May 2011 19:00:43 +0200 |
| parents | |
| children | bac8ed8d6eb9 |
comparison
equal
deleted
inserted
replaced
| 0:71b9540bdd23 | 1:111d4bbce605 |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 | |
| 3 import os | |
| 4 import struct | |
| 5 import sys | |
| 6 import time | |
| 7 import usb.core | |
| 8 from usb.util import * | |
| 9 | |
| 10 vendorId = 0x04e8 | |
| 11 models = {'SPF-87H': (0x2033, 0x2034), 'SPF-107H': (0x2027, 0x2028) } | |
| 12 | |
| 13 chunkSize = 0x4000 | |
| 14 bufferSize = 0x20000 | |
| 15 | |
| 16 def expect(result, verifyList): | |
| 17 resultList = result.tolist() | |
| 18 if resultList != verifyList: | |
| 19 print >> sys.stderr, "Warning: Expected " + str(verifyList) + " but got " + str(resultList) | |
| 20 | |
| 21 def storageToDisplay(dev): | |
| 22 print "Setting device to display mode" | |
| 23 try: | |
| 24 dev.ctrl_transfer(CTRL_TYPE_STANDARD | CTRL_IN | CTRL_RECIPIENT_DEVICE, 0x06, 0xfe, 0xfe, 254) | |
| 25 except usb.core.USBError as e: | |
| 26 errorStr = str(e) | |
| 27 if errorStr != 'No such device (it may have been disconnected)': | |
| 28 raise e | |
| 29 | |
| 30 def displayModeSetup(dev): | |
| 31 print "Sending setup commands to device" | |
| 32 result = dev.ctrl_transfer(CTRL_TYPE_VENDOR | CTRL_IN | CTRL_RECIPIENT_DEVICE, 0x04, 0x00, 0x00, 1) | |
| 33 expect(result, [ 0x03 ]) | |
| 34 # result = dev.ctrl_transfer(CTRL_TYPE_VENDOR | CTRL_IN | CTRL_RECIPIENT_DEVICE, 0x01, 0x00, 0x00, 2) | |
| 35 # expect(result, [ 0x09, 0x04 ]) | |
| 36 # result = dev.ctrl_transfer(CTRL_TYPE_VENDOR | CTRL_IN | CTRL_RECIPIENT_DEVICE, 0x02, 0x00, 0x00, 1) | |
| 37 # expect(result, [ 0x46 ]) | |
| 38 | |
| 39 def paddedBytes(buf, size): | |
| 40 diff = size - len(buf) | |
| 41 return buf + bytes(b'\x00') * diff | |
| 42 | |
| 43 def chunkyWrite(dev, buf): | |
| 44 pos = 0 | |
| 45 while pos < bufferSize: | |
| 46 dev.write(0x02, buf[pos:pos+chunkSize]) | |
| 47 pos += chunkSize | |
| 48 | |
| 49 def writeImage(dev): | |
| 50 # result = dev.ctrl_transfer(CTRL_TYPE_STANDARD | CTRL_IN | CTRL_RECIPIENT_DEVICE, 0x06, 0x0300, 0x00, 255) | |
| 51 # expect(result, [ 0x04, 0x03, 0x09, 0x04 ]) | |
| 52 | |
| 53 # result = dev.ctrl_transfer(CTRL_TYPE_STANDARD | CTRL_IN | CTRL_RECIPIENT_DEVICE, 0x06, 0x0301, 0x0409, 255) | |
| 54 | |
| 55 if len(sys.argv) < 2 or sys.argv[1] == "-": | |
| 56 content = sys.stdin.read() | |
| 57 else: | |
| 58 f = open(sys.argv[1]) | |
| 59 content = f.read() | |
| 60 f.close() | |
| 61 | |
| 62 size = struct.pack('I', len(content)) | |
| 63 header = b'\xa5\x5a\x09\x04' + size + b'\x46\x00\x00\x00' | |
| 64 | |
| 65 content = header + content | |
| 66 | |
| 67 pos = 0 | |
| 68 while pos < len(content): | |
| 69 buf = paddedBytes(content[pos:pos+bufferSize], bufferSize) | |
| 70 chunkyWrite(dev, buf) | |
| 71 pos += bufferSize | |
| 72 | |
| 73 | |
| 74 # result = dev.ctrl_transfer(CTRL_TYPE_VENDOR | CTRL_IN | CTRL_RECIPIENT_DEVICE, 0x06, 0x00, 0x00, 2) | |
| 75 # expect(result, [ 0x00, 0x00 ]) | |
| 76 | |
| 77 found = False | |
| 78 | |
| 79 for k, v in models.iteritems(): | |
| 80 dev = usb.core.find(idVendor=vendorId, idProduct=v[0]) | |
| 81 if dev: | |
| 82 print "Found " + k + " in storage mode" | |
| 83 storageToDisplay(dev) | |
| 84 time.sleep(1) | |
| 85 dev = usb.core.find(idVendor=vendorId, idProduct=v[1]) | |
| 86 displayModeSetup(dev) | |
| 87 found = True | |
| 88 if not dev: | |
| 89 dev = usb.core.find(idVendor=vendorId, idProduct=v[1]) | |
| 90 if dev: | |
| 91 print "Found " + k + " in display mode" | |
| 92 dev.set_configuration() | |
| 93 writeImage(dev) | |
| 94 found = True | |
| 95 | |
| 96 if not found: | |
| 97 print >> sys.stderr, "No supported devices found" | |
| 98 sys.exit(-1) |
