]>
Commit | Line | Data |
---|---|---|
1 | # Copyright (C) 2009 Ubixum, Inc. | |
2 | # | |
3 | # This library is free software; you can redistribute it and/or | |
4 | # | |
5 | # modify it under the terms of the GNU Lesser General Public | |
6 | # License as published by the Free Software Foundation; either | |
7 | # version 2.1 of the License, or (at your option) any later version. | |
8 | # | |
9 | # This library is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | # Lesser General Public License for more details. | |
13 | # | |
14 | # You should have received a copy of the GNU Lesser General Public | |
15 | # License along with this library; if not, write to the Free Software | |
16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
17 | ||
18 | import sys | |
19 | from fx2load import * | |
20 | ||
21 | ||
22 | def get_eeprom(addr,length): | |
23 | assert f.isopen() | |
24 | ||
25 | prom_val = ''; | |
26 | while len(prom_val)<length: | |
27 | buf='\x00'*1024 # read 1024 bytes max at a time | |
28 | transfer_len = length-len(prom_val) > 1024 and 1024 or length-len(prom_val) | |
29 | ret=f.do_usb_command ( buf, | |
30 | 0xc0, | |
31 | 0xb1, | |
32 | addr+len(prom_val),0,transfer_len ) | |
33 | if (ret>=0): | |
34 | prom_val += buf[:ret] | |
35 | else: | |
36 | raise Exception("eeprom read didn't work: %d" % ret ) | |
37 | return prom_val | |
38 | ||
39 | ||
40 | def hexchartoint(c): | |
41 | return int(c.encode('hex'),16) | |
42 | ||
43 | ||
44 | def fetch_eeprom(): | |
45 | """ | |
46 | See TRM 3.4.2, 3.4,3. | |
47 | This function dynamically determines how much data to read for c2 eeprom data and downloads | |
48 | the eeprom iic file. | |
49 | """ | |
50 | assert f.isopen() | |
51 | # fetch 1st 8 bytes | |
52 | prom=get_eeprom(0,8) | |
53 | if prom[0] == '\xc0': | |
54 | return prom # c0 blocks are 8 bytes long | |
55 | if prom[0] != '\xc2': raise Exception ( "Envalid eeprom (%s)" % prom[0].encode('hex') ) | |
56 | # the length of the 1st data block is bytes 8,9 (0 based) | |
57 | read_addr=8 | |
58 | while True: | |
59 | size_read = get_eeprom(read_addr,4) # get the data length and start address | |
60 | prom += size_read | |
61 | read_addr+=4 | |
62 | # if this is the end 0x80 0x01 0xe6 0x00, then break | |
63 | if size_read == '\x80\x01\xe6\x00': break | |
64 | # else it is a data block | |
65 | size = (hexchartoint(size_read[0]) << 8) + hexchartoint(size_read[1]) | |
66 | print "Next eeprom data size %d" % size | |
67 | prom += get_eeprom(read_addr,size) | |
68 | read_addr+=size | |
69 | # one last byte | |
70 | prom += get_eeprom(read_addr,1) # should always be 0 | |
71 | assert prom[-1] == '\x00' | |
72 | return prom | |
73 | ||
74 | ||
75 | def set_eeprom(prom): | |
76 | assert f.isopen() | |
77 | bytes_written=0; | |
78 | while bytes_written<len(prom): | |
79 | # attemp 1024 at a time | |
80 | to_write=len(prom)-bytes_written > 1024 and 1024 or len(prom)-bytes_written | |
81 | print "Writing %d Bytes.." % to_write | |
82 | ret=f.do_usb_command(prom[bytes_written:bytes_written+to_write], 0x40,0xb1,bytes_written, 0, to_write, 10000) | |
83 | if ret>0: | |
84 | bytes_written += ret; | |
85 | else: | |
86 | raise Exception ( "eeprom write didn't work: %d" % ret ) | |
87 | ||
88 | ||
89 | if __name__=='__main__': | |
90 | ||
91 | openfx2(0x04b4,0x0083) # vid/pid of eeprom firmware | |
92 |