@@ -50,16 +50,17 @@ int LpcIsp::copy_names(char * device, char * pio0, char * pio1){
50
50
int LpcIsp::program (const char * filename, int crystal, const char * dev, bool (*progress)(void *,int ,int ), void * context){
51
51
int ret;
52
52
FILE * f;
53
- u8 * image_buffer;
53
+ u8 image_buffer[LPCPHY_RAM_BUFFER_SIZE];
54
+ const int image_page_size = LPCPHY_RAM_BUFFER_SIZE;
54
55
u32 size;
55
56
u32 bytes_read;
56
57
u32 start_address;
57
58
u8 failed;
59
+ u32 bytes_written = 0 ;
58
60
59
61
device = dev;
60
62
61
63
if ( strncmp (dev, " lpc8" , 4 ) == 0 ){
62
- printf (" LPC8xx mode\n " );
63
64
m_phy.set_max_speed (LpcPhy::MAX_SPEED_38400);
64
65
m_phy.set_uuencode (false );
65
66
@@ -79,7 +80,6 @@ int LpcIsp::program(const char * filename, int crystal, const char * dev, bool (
79
80
}
80
81
81
82
sys::Timer::wait_msec (10 );
82
- printf (" Erase device\n " );
83
83
if ( erase_dev () ){
84
84
m_trace.assign (" Erase device" );
85
85
m_trace.error ();
@@ -98,8 +98,6 @@ int LpcIsp::program(const char * filename, int crystal, const char * dev, bool (
98
98
sprintf (m_trace.cdata (), " Image size:%d" , (int )size);
99
99
m_trace.message ();
100
100
} else {
101
- printf (" Failed to open %s\n " , filename);
102
- perror (" Failed to open" );
103
101
m_trace.assign (" Didn't open file" );
104
102
m_trace.error ();
105
103
isplib_error (" Could not open file %s\n " , filename);
@@ -114,31 +112,23 @@ int LpcIsp::program(const char * filename, int crystal, const char * dev, bool (
114
112
}
115
113
116
114
isplib_debug (DEBUG_LEVEL, " File size is %d\n " , (int )size);
117
- printf (" malloc buffer\n " );
118
- image_buffer = (u8 *)malloc ( size );
119
- if (!image_buffer){
120
- isplib_error (" Failed to allocate memory\n " );
121
- m_trace.assign (" Malloc error" );
122
- m_trace.error ();
123
- return -3 ;
124
- }
125
- memset (image_buffer, 0xFF , size);
115
+ memset (image_buffer, 0xFF , image_page_size);
126
116
127
117
f = fopen (filename, " rb" );
128
118
129
119
if ( f != NULL ){
130
- if ( (bytes_read = fread (image_buffer, 1 , size , f)) != size ){
120
+ if ( (bytes_read = fread (image_buffer, 1 , image_page_size , f)) != image_page_size ){
131
121
m_trace.assign (" Failed to read file" );
132
122
m_trace.error ();
133
123
isplib_error (" Could not read file %s (%d of %d bytes read)\n " , filename, bytes_read, size);
134
124
fclose (f);
135
125
return -1 ;
136
126
}
137
- fclose (f);
138
127
} else {
139
128
m_trace.assign (" Failed to open file" );
140
129
m_trace.error ();
141
130
isplib_error (" Could not open file %s to read image\n " , filename);
131
+ fclose (f);
142
132
return -1 ;
143
133
}
144
134
@@ -152,30 +142,57 @@ int LpcIsp::program(const char * filename, int crystal, const char * dev, bool (
152
142
m_trace.assign (" failed to set checksum" );
153
143
m_trace.error ();
154
144
isplib_error (" Device %s is not supported\n " , dev);
145
+ fclose (f);
155
146
return -1 ;
156
147
}
157
148
158
149
m_phy.set_ram_buffer ( lpc_device_get_ram_start (dev) + 0x300 );
159
150
160
151
// Write the program memory
161
152
failed = 0 ;
162
- if ( !write_progmem (image_buffer, start_address, size, progress, context) ){
163
- m_trace.assign (" failed to write image" );
164
- m_trace.error ();
165
- failed = 1 ;
166
- isplib_error (" Failed to write program memory\n " );
167
- return -1 ;
168
- }
153
+ bytes_written = 0 ;
154
+ do {
169
155
156
+ if ( bytes_written > 0 ){
157
+ bytes_read = fread (image_buffer, 1 , image_page_size, f);
158
+ }
159
+
160
+ if ( bytes_read > 0 ){
161
+
162
+ if ( !write_progmem (image_buffer, start_address + bytes_written, bytes_read, 0 , 0 ) ){
163
+ m_trace.assign (" failed to write image" );
164
+ m_trace.error ();
165
+ failed = 1 ;
166
+ isplib_error (" Failed to write program memory\n " );
167
+ fclose (f);
168
+ return -1 ;
169
+ }
170
+
171
+ bytes_written += bytes_read;
172
+ } else {
173
+ break ;
174
+ }
175
+
176
+ if ( progress ){
177
+ if ( progress (context, bytes_written, size) ){
178
+ m_trace.assign (" Aborted" );
179
+ m_trace.warning ();
180
+ return 0 ; // abort requested
181
+ }
182
+ }
183
+
184
+ } while ( bytes_written < size );
170
185
prog_shutdown ();
171
186
172
- if ( !failed ){
187
+ fclose (f);
188
+
189
+ if ( !failed && (bytes_written == size) ){
173
190
isplib_debug (DEBUG_LEVEL, " Device Successfully Programmed\n " );
174
191
} else {
175
192
isplib_error (" Device Failed to program correctly\n " );
193
+ return -1 ;
176
194
}
177
195
178
- free (image_buffer);
179
196
180
197
return 0 ;
181
198
@@ -273,24 +290,27 @@ u32 LpcIsp::read_progmem(void * data, u32 addr, u32 size, bool (*progress)(void*
273
290
}
274
291
275
292
u32 LpcIsp::write_progmem (void * data, u32 addr, u32 size, bool (*progress)(void *,int , int ), void * context){
276
- int buffer_size;
277
293
int bytes_written;
278
294
int page_size;
279
295
int j;
280
296
int sector;
281
297
// char err;
282
298
283
299
// First read the buffer size
284
- buffer_size = LPCPHY_RAM_BUFFER_SIZE;
285
300
bytes_written = 0 ;
286
301
do {
287
302
288
- if ( (int )(size-bytes_written) > buffer_size ) page_size = buffer_size;
289
- else page_size = size-bytes_written;
303
+ if ( (int )(size-bytes_written) > LPCPHY_RAM_BUFFER_SIZE ){
304
+ page_size = LPCPHY_RAM_BUFFER_SIZE;
305
+ } else {
306
+ page_size = size-bytes_written;
307
+ }
290
308
291
309
// Check to see if data is already all 0xFF
292
310
for (j=0 ; j < page_size; j++){
293
- if ( ((unsigned char *)data)[bytes_written+j] != 0xFF ) break ;
311
+ if ( ((unsigned char *)data)[bytes_written+j] != 0xFF ){
312
+ break ;
313
+ }
294
314
}
295
315
296
316
if ( j < page_size ){ // only write if data has non 0xFF values
@@ -300,20 +320,13 @@ u32 LpcIsp::write_progmem(void * data, u32 addr, u32 size, bool (*progress)(void
300
320
&((char *)data)[bytes_written], page_size,
301
321
sector ) != page_size ){
302
322
isplib_error (" writing data at address 0x%04X\n " , (u32 )(addr + bytes_written));
303
- sprintf (m_trace.cdata (), " failed to write 0x%04X " , (u32 )(addr + bytes_written));
323
+ sprintf (m_trace.cdata (), " failed to write 0x%04lX " , (u32 )(addr + bytes_written));
304
324
m_trace.error ();
305
325
return 0 ;
306
326
}
307
327
}
308
328
// delay_ms(2);
309
329
bytes_written+=page_size;
310
- if ( progress ){
311
- if ( progress (context, bytes_written, size) ){
312
- m_trace.assign (" Aborted" );
313
- m_trace.warning ();
314
- return 0 ; // abort requested
315
- }
316
- }
317
330
} while ( bytes_written < (int )size );
318
331
319
332
return bytes_written;
0 commit comments