source: ISPProgrammer/ISPprog/ISP_Flash.pas

Last change on this file was 363, checked in by chronos, 12 years ago
  • Added: Package ISPProgrammer for in-system programming of various chips. Supports Dallas ISP protocol, Presto, Rabbit RFU and some others Atmel devices.
File size: 6.7 KB
Line 
1unit ISP_Flash;
2
3{$MODE Delphi}
4
5interface
6
7procedure WaitForReadyFlash(adres:integer; value:byte);
8procedure ISPLoadExtendedAddress(adres:integer);
9function ISPReadFlash_MakeRequest(adres:integer; buf:pointer):integer;
10function ISPReadFlash(adres:integer):byte;
11procedure ISPReadFlashPage(adres:integer; dane:pointer);
12procedure ISPWriteFlash(adres:integer; dana:byte);
13procedure ISPWriteFlashPage(adres:integer; dane:pointer);
14procedure ISPWriteProgramPage(adres:integer; value:byte);
15
16implementation
17
18uses DataFlash, Delays, Globals, ISP, MemBuffer, Processors,
19 SerialFlash, SPI;
20
21procedure WaitForReadyFlash(adres:integer; value:byte);
22var
23 b:byte;
24const
25 t1:Int64 = 0;
26begin
27 case Signatures[devicenr].algo_busy of
28 ALGO_BUSY_WAIT:
29 WaitMS(Signatures[devicenr].prog_time);
30
31 ALGO_BUSY_POLL_00FF, ALGO_BUSY_POLL_FF, ALGO_BUSY_POLL_NMSB:
32 begin
33 if value <> $ff then
34 begin
35 WaitMS (1);
36 Tic(t1);
37 repeat
38 b:=ISPReadFlash(adres);
39 until (b = value) or (TocMS(t1) > 100);
40 end
41 else
42 WaitMS(Signatures[devicenr].prog_time);
43 end;
44
45 ALGO_BUSY_POLL_RDYBSY:
46 begin
47 Tic(t1);
48 repeat until (ISPPollReady) or (TocMS(t1) > 100);
49// MainWindow.Caption:=IntToStr(TocMS(t1));
50 end;
51 end;
52end;
53
54procedure ISPLoadExtendedAddress(adres:integer);
55var data:array[0..3] of byte;
56begin
57 data[0] := $4D;
58 data[1] := $00;
59 data[2] := (adres shr 17) and $ff;
60 data[3] := $00;
61 WriteBytes(@data, 4);
62 Sync;
63end;
64
65function ISPReadFlash_MakeRequest(adres:integer; buf:pointer):integer;
66var data:array[0..3] of byte;
67begin
68 Result := 0;
69 if proctype = PROC_TYPE_AVR then
70 begin
71 data[0] := $20 or ((adres and 1) shl 3);
72 data[1] := Hi(word(adres div 2));
73 data[2] := Lo(word(adres div 2));
74 data[3] := 0;
75 Result := 4;
76 end
77 else if (proctype = PROC_TYPE_NEW51) or (proctype = PROC_TYPE_S8253) or
78 (proctype = PROC_TYPE_S2051) then
79 begin
80 data[0] := $20;
81 data[1] := Hi(word(adres));
82 data[2] := Lo(word(adres));
83 data[3] := 0;
84 Result := 4;
85 end
86 else if proctype = PROC_TYPE_OLD51 then
87 begin
88 // AT89S53/8252
89 data[0] := ((adres shr 5) and $f8) or ((adres shr 11) and $04) or $01;
90 data[1] := Lo(word(adres));
91 data[2] := 0;
92 Result := 3;
93 end;
94 Move (data, buf^, Result);
95end;
96
97function ISPReadFlash(adres:integer):byte;
98var
99 data:array[0..3] of byte;
100 len:integer;
101begin
102 Result:=$ff;
103 len:=ISPReadFlash_MakeRequest(adres, @data);
104 if len > 0 then
105 begin
106 WriteBytes(@data, len - 1);
107 Result:=ReadByte;
108 end;
109end;
110
111procedure ISPReadFlashPage(adres:integer; dane:pointer);
112var
113 pagesize, pagemask:integer;
114 data:array[0..7] of byte;
115begin
116 if (proctype = PROC_TYPE_S8253) or (proctype = PROC_TYPE_S2051) or (proctype = PROC_TYPE_NEW51) then
117 begin
118 pagesize:=Signatures[devicenr].fpagesize;
119 pagemask:=pagesize - 1;
120 data[0] := $30;
121 data[1] := Hi(word(adres));
122 if proctype = PROC_TYPE_NEW51 then
123 WriteBytes(@data, 2)
124 else
125 begin
126 data[2] := Lo(word(adres)) and (pagemask xor $ff);
127 WriteBytes(@data, 3);
128 end;
129 ReadBytes(dane, pagesize);
130 end
131 else if proctype = PROC_TYPE_AVR then
132 begin
133 pagesize:=Signatures[devicenr].fpagesize;
134 ISPReadMemoryBlock(BUF_FLASH, adres, dane, pagesize);
135 end
136 else if proctype = PROC_TYPE_DATAFLASH then
137 begin
138 if Signatures[devicenr].algo = ALGO_SERIALFLASH then
139 SerialflashReadFlashPage(adres, dane)
140 else
141 DataflashReadFlashPage(adres, dane);
142 end
143 else if proctype = PROC_TYPE_SERIALFLASH then
144 begin
145 SerialflashReadFlashPage(adres, dane);
146 end;
147end;
148
149procedure ISPWriteFlash(adres:integer; dana:byte);
150var data:array[0..3] of byte;
151begin
152 if proctype = PROC_TYPE_AVR then
153 begin
154 // AVR / ATmega
155 data[0] := $40 or ((adres and 1) shl 3);
156 data[1] := Hi(word(adres div 2));
157 data[2] := Lo(word(adres div 2));
158 data[3] := dana;
159 WriteBytes(@data, 4);
160 Sync;
161 if Signatures[devicenr].algo = ALGO_STD then
162 WaitForReadyFlash(adres, dana);
163 end
164 else if (proctype = PROC_TYPE_NEW51) or (proctype = PROC_TYPE_S8253) or
165 (proctype = PROC_TYPE_S2051) then
166 begin
167 // AT89S51 / AT89S52 / AT89S8253 / AT89S2051 / AT89S4051
168 data[0] := $40;
169 data[1] := Hi(word(adres));
170 data[2] := Lo(word(adres));
171 data[3] := dana;
172 WriteBytes(@data, 4);
173 Sync;
174 WaitForReadyFlash(adres, dana);
175 end
176 else
177 begin
178 // AT89S53 / AT89S8252
179 data[0] := ((adres shr 5) and $f8) or ((adres shr 11) and $04) or $02;
180 data[1] := Lo(word(adres));
181 data[2] := dana;
182 WriteBytes(@data, 3);
183 Sync;
184 WaitForReadyFlash(adres, dana);
185 end;
186end;
187
188procedure ISPWriteFlashPage(adres:integer; dane:pointer);
189var
190 pagesize, pagemask, raddr:integer;
191 data:array[0..3] of byte;
192 ptr:^byte;
193begin
194 if (proctype = PROC_TYPE_S8253) or (proctype = PROC_TYPE_S2051) or (proctype = PROC_TYPE_NEW51) then
195 begin
196 pagesize:=Signatures[devicenr].fpagesize;
197 pagemask:=pagesize - 1;
198 data[0] := $50;
199 data[1] := Hi(word(adres));
200 if proctype = PROC_TYPE_NEW51 then
201 WriteBytes(@data, 2)
202 else
203 begin
204 data[2] := Lo(word(adres)) and (pagemask xor $ff);
205 WriteBytes(@data, 3);
206 end;
207 WriteBytes(dane, pagesize);
208 Sync;
209 WaitMS(Signatures[devicenr].prog_time);
210 end
211 else if proctype = PROC_TYPE_AVR then
212 begin
213 pagesize:=Signatures[devicenr].fpagesize;
214 ptr:=dane;
215 for raddr:=adres to adres + pagesize - 1 do
216 begin
217 // Load Program Memory Page
218 data[0] := $40 or ((raddr and 1) shl 3);
219 data[1] := Hi(word(raddr div 2));
220 data[2] := Lo(word(raddr div 2));
221 data[3] := ptr^;
222 WriteBytes(@data, 4);
223 Inc(ptr);
224 end;
225 // Write Program Memory Page
226 data[0] := $4c;
227 data[1] := Hi(word(adres div 2));
228 data[2] := Lo(word(adres div 2));
229 data[3] := 0;
230 WriteBytes(@data, 4);
231 Sync;
232 ptr:=dane;
233 WaitForReadyFlash(adres, ptr^);
234 end
235 else if proctype = PROC_TYPE_DATAFLASH then
236 begin
237 if Signatures[devicenr].algo = ALGO_SERIALFLASH then
238 SerialflashWriteFlashPage(adres, dane)
239 else
240 DataflashWriteFlashPage(adres, dane);
241 end
242 else if proctype = PROC_TYPE_SERIALFLASH then
243 begin
244 SerialflashWriteFlashPage(adres, dane);
245 end;
246end;
247
248procedure ISPWriteProgramPage(adres:integer; value:byte);
249var data:array[0..3] of byte;
250begin
251 data[0] := $4c;
252 data[1] := Hi(word(adres div 2));
253 data[2] := Lo(word(adres div 2));
254 data[3] := 0;
255 WriteBytes(@data, 4);
256 Sync;
257 WaitForReadyFlash(adres, value);
258end;
259
260end.
Note: See TracBrowser for help on using the repository browser.