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) |