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)

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.