-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwritechip.py
187 lines (94 loc) · 2.58 KB
/
writechip.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
import board as FTDI
import busio as Serial
import digitalio as GPIO
import time
# Variables
block_start = 0
numblocks = 256
page_start = 0x00
numpages = 0x100
data_file = 'urandom-16mb'
# Configuration
CS_pin = FTDI.D7
baudrate = 80000000
# Constants
program = 0x02
disable = 0x04
status = 0x05
enable = 0x06
page_offset = 0x00
lenpages = 0x100
s_write = 0.005
s_latch = 0.015
# instantiation, lock board for use, configure frequency, set CS pin
FT232H = Serial.SPI(FTDI.SCLK, FTDI.MOSI, FTDI.MISO)
while not FT232H.try_lock(): pass
FT232H.configure(baudrate)
CS = GPIO.DigitalInOut(CS_pin)
CS.direction = GPIO.Direction.OUTPUT
response = [0]
busy = 1
lastwrite = None
# main
if input(''.join(['will write "', data_file, '" starting at block ',
str(block_start), ' page ', str(page_start), '...continue? (y/n): '])) != 'y':
quit()
data = open(data_file, 'r+b')
# write loops
for blocknum in range(numblocks):
if lastwrite == True:
break
for pagenum in range(numpages):
# check BUSY
while busy % 2 != 0:
print('BUSY')
response = [0]
CS.value = False
FT232H.write([status])
FT232H.readinto(response)
CS.value = True
busy = response[0]
# prepare payload
payload = list(data.read(lenpages))
# check for end of file
if len(payload) == 0:
lastwrite = True
print('end of file reached!\n\n')
break
# write enable
CS.value = False
FT232H.write([enable])
CS.value = True
time.sleep(s_latch)
# write cycle
block = block_start + blocknum
page = page_start + pagenum
instruction = [program, block, page, page_offset, *payload]
print('writing at:', hex(block), format(page, 'x'), format(page_offset, 'x'))
CS.value = False
FT232H.write(instruction)
CS.value = True
# check BUSY
response = [0]
CS.value = False
FT232H.write([status])
FT232H.readinto(response)
CS.value = True
busy = response[0]
# read status register
time.sleep(s_latch)
response = [0]
CS.value = False
FT232H.write([status])
FT232H.readinto(response)
CS.value = True
register_sum = response[0]
response[0] = hex(response[0])
print('status register 1:')
print(response)
print('\nstatus register 1 sum:')
print(register_sum)
# Close
FT232H.unlock()
data.close()
print('\n\n DONE')