[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-chat] issues with custom bootloader and ATMega32
From: |
Alexander Krause |
Subject: |
Re: [avr-chat] issues with custom bootloader and ATMega32 |
Date: |
Sat, 02 Nov 2013 08:42:03 +0100 |
Hi again,
this week I found the issue.
I've confused the bootloader address again :-(
2048bytes weren't bytes but words. That would be word address 0x3800 and
since gcc uses bytes I have to multiply by 2. So that means, that my
boot address is at 0x7000 and not 0x1C00.
*sighs* I've had the same issue about 1 year ago... so hopefully that
was the last time I confused it.
Regards,
Alex
On Di, 2013-10-29 at 13:46 +0100, Alexander Krause wrote:
> Hi all,
>
> I started to write a bootloader for RS485/ModBus and am stuck for quite
> a while now.
>
> In general I've three issues.
>
> First of all, it seems like my IRQ's are not working when I put the code
> into the boot section.
>
> I've choosen 2048 bytes bootsize, which will start at byte address
> 0x3800 equals word address 0x1C00 .
> Fuses are:
> MCU_LFUSE=0xBE
> MCU_HFUSE=0xD0
>
>
> My program starts like this:
> int __attribute__((noreturn)) main(void) {
> MCUCR = (1 << IVCE);
> MCUCR = (1 << IVSEL);
> ...
>
> So that should work, but It doesn't :-(
>
> Well, since I've to shorten my code as far as possible I simply decided
> to use polling instead of IRQs (saves me the cli, sbi and some other
> things ~100bytes less code).
>
> This raises the question if I can short the bootloaders interrupt table
> somehow? At the moment it looks like this:
> 1c00: 4f c0 rjmp .+158 ; 0x1ca0 <__ctors_end>
> 1c02: 00 00 nop
> 1c04: 5d c0 rjmp .+186 ; 0x1cc0
> <__bad_interrupt>
> 1c06: 00 00 nop
> 1c08: 5b c0 rjmp .+182 ; 0x1cc0
> <__bad_interrupt>
> 1c0a: 00 00 nop
> 1c0c: 59 c0 rjmp .+178 ; 0x1cc0
> <__bad_interrupt>
> 1c0e: 00 00 nop
> 1c10: 57 c0 rjmp .+174 ; 0x1cc0
> <__bad_interrupt>
> 1c12: 00 00 nop
> 1c14: 55 c0 rjmp .+170 ; 0x1cc0
> <__bad_interrupt>
> 1c16: 00 00 nop
> 1c18: 53 c0 rjmp .+166 ; 0x1cc0
> <__bad_interrupt>
> 1c1a: 00 00 nop
> 1c1c: 51 c0 rjmp .+162 ; 0x1cc0
> <__bad_interrupt>
> 1c1e: 00 00 nop
> 1c20: 4f c0 rjmp .+158 ; 0x1cc0
> <__bad_interrupt>
> 1c22: 00 00 nop
> 1c24: 4d c0 rjmp .+154 ; 0x1cc0
> <__bad_interrupt>
> 1c26: 00 00 nop
> 1c28: 4b c0 rjmp .+150 ; 0x1cc0
> <__bad_interrupt>
> 1c2a: 00 00 nop
> 1c2c: 49 c0 rjmp .+146 ; 0x1cc0
> <__bad_interrupt>
> 1c2e: 00 00 nop
> 1c30: 47 c0 rjmp .+142 ; 0x1cc0
> <__bad_interrupt>
> 1c32: 00 00 nop
> 1c34: 45 c0 rjmp .+138 ; 0x1cc0
> <__bad_interrupt>
> 1c36: 00 00 nop
> 1c38: 43 c0 rjmp .+134 ; 0x1cc0
> <__bad_interrupt>
> 1c3a: 00 00 nop
> 1c3c: 41 c0 rjmp .+130 ; 0x1cc0
> <__bad_interrupt>
> 1c3e: 00 00 nop
> 1c40: 3f c0 rjmp .+126 ; 0x1cc0
> <__bad_interrupt>
> 1c42: 00 00 nop
> 1c44: 3d c0 rjmp .+122 ; 0x1cc0
> <__bad_interrupt>
> 1c46: 00 00 nop
> 1c48: 3b c0 rjmp .+118 ; 0x1cc0
> <__bad_interrupt>
> 1c4a: 00 00 nop
> 1c4c: 39 c0 rjmp .+114 ; 0x1cc0
> <__bad_interrupt>
> 1c4e: 00 00 nop
> 1c50: 37 c0 rjmp .+110 ; 0x1cc0
> <__bad_interrupt>
>
>
> Can't I simply tell GCC to not use/generate such a table since there'll
> be no IRQ anyway.
>
>
> The last and biggest issue is that I'm not able to write via the SPM
> features.
>
> I tried this with a minimalistic piece of code:
> void spm_write_page(uint32_t page) {
> uint8_t i;
>
> eeprom_busy_wait();
> boot_page_erase(page);
> boot_spm_busy_wait(); // Wait until the memory is erased.
>
> for (i=0; i<SPM_PAGESIZE; i+=2) {
> boot_page_fill(page + i, i);
> }
>
> boot_page_write(page); // Store buffer in flash page.
> boot_spm_busy_wait(); // Wait until the memory is written.
>
> // Reenable RWW-section again. We need this if we want to jump back
> // to the application after bootloading.
>
> boot_rww_enable();
> }
>
> int __attribute__((noreturn)) main(void) {
> spm_write_page(1);
> while(1);
> }
>
> However, when I dump my Flash there is no valid data in the first page:
> 0000000 ffff ffff ffff ffff ffff ffff ffff ffff
> *
> 0001c00 c04f 0000 c05d 0000 c05b 0000 c059 0000
> 0001c10 c057 0000 c055 0000 c053 0000 c051 0000
> 0001c20 c04f 0000 c04d 0000 c04b 0000 c049 0000
> 0001c30 c047 0000 c045 0000 c043 0000 c041 0000
> 0001c40 c03f 0000 c03d 0000 c03b 0000 c039 0000
>
>
>
> Thanks a lot for reading. I'd be very grateful for any help.
>
>
> Regards,
> Alex
>
>
> _______________________________________________
> AVR-chat mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/avr-chat
>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [avr-chat] issues with custom bootloader and ATMega32,
Alexander Krause <=