annotate frame-ctrl.py @ 1:111d4bbce605

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

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