Skip to content

Commit b80b39f

Browse files
committed
Calculate boot size for ATmega328 based on fuses
1 parent f22aef3 commit b80b39f

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

simavr/sim/sim_interrupts.c

+20-3
Original file line numberDiff line numberDiff line change
@@ -227,16 +227,33 @@ avr_interrupt_reti(
227227
table->running[table->running_ptr-1]->vector : 0);
228228
}
229229

230+
static int bootloader_size_avr328(avr_t *avr)
231+
{
232+
const char efuse = avr->fuse[2];
233+
const char bootsz = (efuse >> 1) & 0x3;
234+
235+
switch (bootsz)
236+
{
237+
case 0:
238+
return 256 * 2;
239+
case 1:
240+
return 512 * 2;
241+
case 2:
242+
return 1024 * 2;
243+
default:
244+
return 2048 * 2;
245+
}
246+
}
247+
230248
static int interrupt_table_offset(avr_t *avr)
231249
{
232250
const int mcucr = _SFR_IO8(0x35);
233251
const int ivsel = 1;
234252
const char interrupt_sector_moved_to_bootloader = avr->data[mcucr] & (1 << ivsel);
235253

236-
const int bootloader_size = 0x800;
237-
254+
const int flash_size = avr->flashend + 1;
238255
if (interrupt_sector_moved_to_bootloader)
239-
return avr->flashend - bootloader_size + 1;
256+
return flash_size - bootloader_size_avr328(avr);
240257

241258
return 0;
242259
}

0 commit comments

Comments
 (0)