@@ -68,32 +68,34 @@ def init(self, sck_pin, mosi_pin, miso_pin, rst_pin):
68
68
self ._rst .value = True
69
69
70
70
71
- def verify_sig (self , chip ):
71
+ def verify_sig (self , chip , verbose = False ):
72
72
"""
73
73
Verify that the chip is connected properly, responds to commands,
74
74
and has the correct signature. Returns True/False based on success
75
75
"""
76
76
self .begin ()
77
77
sig = self .read_signature ()
78
78
self .end ()
79
- #print("Signature: ", [hex(i) for i in sig])
79
+ if verbose :
80
+ print ("Found signature: %s" % [hex (i ) for i in sig ])
80
81
if sig != chip ['sig' ]:
81
82
return False
82
83
return True
83
84
84
- def program_file (self , chip , file_name , verbose = False ):
85
+ def program_file (self , chip , file_name , verbose = False , verify = True ):
85
86
"""
86
87
Perform a chip erase and program from a file that
87
- contains Intel HEX data. Does not verify the memory post-write!
88
+ contains Intel HEX data. Returns true on verify-success, False on
89
+ verify-failure. If 'verify' is False, return will always be True
88
90
"""
89
91
if not self .verify_sig (chip ):
90
92
raise RuntimeError ("Signature read failure" )
91
93
92
- self .begin ()
93
94
if verbose :
94
95
print ("Erasing chip...." )
95
96
self .erase_chip ()
96
97
98
+ self .begin ()
97
99
hexfile = open (file_name , 'r' )
98
100
99
101
page_size = chip ['page_size' ]
@@ -114,8 +116,27 @@ def program_file(self, chip, file_name, verbose=False):
114
116
print ("Programming page @ $%04X" % (page_addr ))
115
117
#print("From HEX file: ", page_buffer)
116
118
self ._flash_page (bytearray (page_buffer ), page_addr , page_size )
119
+
120
+ if not verify :
121
+ continue
122
+
123
+ if verbose :
124
+ print ("Verifying page @ $%04X" % page_addr )
125
+ read_buffer = bytearray (page_size )
126
+ self .read (page_addr , read_buffer )
127
+ #print("From memory: ", read_buffer)
128
+
129
+ if page_buffer != read_buffer :
130
+ if verbose :
131
+ # pylint: disable=line-too-long
132
+ print ("Verify fail at address %04X\n Page should be: %s\n But contains: %s" % (page_addr , page_buffer , read_buffer ))
133
+ # pylint: enable=line-too-long
134
+ self .end ()
135
+ return False
136
+
117
137
hexfile .close ()
118
138
self .end ()
139
+ return True
119
140
120
141
def verify_file (self , chip , file_name , verbose = False ):
121
142
"""
@@ -195,6 +216,16 @@ def verify_fuses(self, chip, low=None, high=None, ext=None, lock=None):
195
216
return False
196
217
return True
197
218
219
+
220
+ def erase_chip (self ):
221
+ """
222
+ Fully erases the chip.
223
+ """
224
+ self .begin ()
225
+ self ._transaction ((0xAC , 0x80 , 0 , 0 ))
226
+ self ._busy_wait ()
227
+ self .end ()
228
+
198
229
#################### Mid level
199
230
200
231
def begin (self ):
@@ -223,8 +254,9 @@ def read_signature(self):
223
254
Requires calling begin() beforehand to put in programming mode.
224
255
"""
225
256
# signature is last byte of two transactions:
226
- sig = [self ._transaction ((0x30 , 0 , 0x01 , 0 ))[2 ]]
227
- sig .append (self ._transaction ((0x30 , 0 , 0x02 , 0 ))[2 ])
257
+ sig = []
258
+ for i in range (3 ):
259
+ sig .append (self ._transaction ((0x30 , 0 , i , 0 ))[2 ])
228
260
return sig
229
261
230
262
def read (self , addr , read_buffer ):
@@ -242,14 +274,6 @@ def read(self, addr, read_buffer):
242
274
read_buffer [i * 2 ] = low
243
275
read_buffer [i * 2 + 1 ] = high
244
276
245
- def erase_chip (self ):
246
- """
247
- Fully erases the chip.
248
- Requires calling begin() beforehand to put in programming mode.
249
- """
250
- self ._transaction ((0xAC , 0x80 , 0 , 0 ))
251
- self ._busy_wait ()
252
-
253
277
#################### Low level
254
278
def _flash_word (self , addr , low , high ):
255
279
self ._transaction ((0x40 , addr >> 8 , addr , low ))
0 commit comments