From 5b01cd092634257fddeaf5beec8ae36531d751c8 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 4 Mar 2019 16:38:52 +0000 Subject: [PATCH] [bootloader] - reduce memory footprint - bugfix writing last page git-svn-id: http://moon:8086/svn/projects/HendiControl@56 fda53097-d464-4ada-af97-ba876c37ca34 --- .../Bootloader/Bootloader.componentinfo.xml | 18 +- .../Bootloader/Bootloader/Bootloader.cproj | 180 +++++++++--------- Control/firmware/Bootloader/Bootloader/main.c | 79 ++++---- Control/firmware/Bootloader/Bootloader/srec.h | 4 +- Control/firmware/Bootloader/Bootloader/uart.c | 31 +++ Control/firmware/Bootloader/Bootloader/uart.h | 33 +--- 6 files changed, 181 insertions(+), 164 deletions(-) diff --git a/Control/firmware/Bootloader/Bootloader/Bootloader.componentinfo.xml b/Control/firmware/Bootloader/Bootloader/Bootloader.componentinfo.xml index 46bf771..b002db6 100644 --- a/Control/firmware/Bootloader/Bootloader/Bootloader.componentinfo.xml +++ b/Control/firmware/Bootloader/Bootloader/Bootloader.componentinfo.xml @@ -10,12 +10,12 @@ Atmel 1.2.0 - C:/Program Files (x86)\Atmel\Studio\7.0\Packs + D:/Program Files (x86)\Atmel\Studio\7.0\Packs - C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include + D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\include include C @@ -26,7 +26,7 @@ - C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\include\avr\iom328p.h + D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\include\avr\iom328p.h header C @@ -37,18 +37,18 @@ - C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\templates\main.c + D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\templates\main.c template source C Exe - A/yU8r8q+GTMwpRAe+qmyw== + GD1k8YYhulqRs6FD1B2Hog== templates/main.c Main file (.c) - C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\templates\main.cpp + D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\templates\main.cpp template source C Exe @@ -59,7 +59,7 @@ - C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p + D:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p libraryPrefix GCC @@ -71,8 +71,8 @@ ATmega_DFP - C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.2.209/Atmel.ATmega_DFP.pdsc - 1.2.209 + D:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.2.150/Atmel.ATmega_DFP.pdsc + 1.2.150 true ATmega328P diff --git a/Control/firmware/Bootloader/Bootloader/Bootloader.cproj b/Control/firmware/Bootloader/Bootloader/Bootloader.cproj index 6b65d49..732540b 100644 --- a/Control/firmware/Bootloader/Bootloader/Bootloader.cproj +++ b/Control/firmware/Bootloader/Bootloader/Bootloader.cproj @@ -29,16 +29,16 @@ 1 - - - - - - - - - - + + + + + + + + + + com.atmel.avrdbg.tool.atmelice J41800089261 @@ -58,91 +58,91 @@ - -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p" - True - True - True - True - False - True - True - - - NDEBUG - ARDUINO_NANO=1 - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include - - - Optimize for size (-Os) - True - True - True - - - libm - - - - - .text=0x3800 - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include - - - + -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p" + True + True + True + True + False + True + True + + + NDEBUG + ARDUINO_NANO=1 + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include + + + Optimize for size (-Os) + True + True + True + + + libm + + + + + .text=0x3800 + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include + + + - -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega328p" - True - True - True - True - False - True - True - - - DEBUG - ARDUINO_NANO=1 - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include - - - Optimize debugging experience (-Og) - True - True - Default (-g2) - True - - - libm - - - - - .text=0x3800 - - - - - %24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include - - - Default (-Wa,-g) - + -mmcu=atmega328p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\gcc\dev\atmega328p" + True + True + True + True + False + True + True + + + DEBUG + ARDUINO_NANO=1 + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include + + + Optimize debugging experience (-Og) + True + True + Default (-g2) + True + + + libm + + + + + .text=0x3800 + + + + + %24(PackRepoDir)\atmel\ATmega_DFP\1.2.150\include + + + Default (-Wa,-g) + diff --git a/Control/firmware/Bootloader/Bootloader/main.c b/Control/firmware/Bootloader/Bootloader/main.c index c2261ae..89ef9a7 100644 --- a/Control/firmware/Bootloader/Bootloader/main.c +++ b/Control/firmware/Bootloader/Bootloader/main.c @@ -19,7 +19,7 @@ typedef void(fp_t)(void); fp_t *startApplication = (fp_t*)0x0000; /* Funktionspointer auf 0x0000 */ fp_t *startBootloader = (fp_t*)0x7000; /* Funktionspointer auf 0x7000 */ -#define SPM_PAGESIZE_MASK 0x7F +#define SPM_PAGESIZE_MASK 0x7FUL inline void bootloader_enter() { @@ -46,6 +46,7 @@ typedef enum _eState StateHex, } State; +void erase_page(uint16_t page_addr); void write_page(uint16_t page_addr, uint8_t *buf); void program_page (uint32_t page, uint8_t *buf); @@ -69,13 +70,13 @@ int main(void) uart_init(9600); - uart_puts("Hendi-Control Bootloader\n"); + uart_puts("Hendi-Control Bootloader v1.1\n"); size_t image_size = 0; uint16_t page_addr = 0xFFFF; - int page_isEmpty = 1; size_t hex_buffer_size = 0; int leave_loop = 0; - + int page_is_dirty = 0; + int force_page_erase = 1; do { char c; @@ -117,48 +118,50 @@ int main(void) { case srec_sob: image_size = 0; - page_isEmpty = 1; + init_page(page_buffer, SPM_PAGESIZE); + page_is_dirty = 0; break; + case srec_data: { uint16_t new_page_addr = srec.addr & ~SPM_PAGESIZE_MASK; - if (new_page_addr != page_addr) + if ((new_page_addr != page_addr) || force_page_erase) { - eeprom_busy_wait (); - boot_spm_busy_wait (); - boot_page_erase (new_page_addr); + page_addr = new_page_addr; + force_page_erase = 0; + erase_page(page_addr); } - page_addr = new_page_addr; - if (page_isEmpty) - { - // Begin new page - page_isEmpty = 0; - init_page(page_buffer, SPM_PAGESIZE); - } - int start = srec.addr & SPM_PAGESIZE_MASK; - int i = 0; - int to_write = srec.size; - if ((start + to_write) > SPM_PAGESIZE) - { - to_write = SPM_PAGESIZE - start; - } - for (; i < to_write; i++) + uint16_t start = srec.addr & SPM_PAGESIZE_MASK; + uint16_t i = 0; + for (; i < srec.size; i++) { + if (start == SPM_PAGESIZE) + { + break; + } + page_is_dirty = 1; page_buffer[start++] = srec.data[i]; } // Page buffer is complete -> write to flash - if ((start + i) >= SPM_PAGESIZE) + if (start == SPM_PAGESIZE) { + page_is_dirty = 0; write_page(page_addr, page_buffer); - page_isEmpty = 1; init_page(page_buffer, SPM_PAGESIZE); } + + if (i < srec.size) + { + page_addr += SPM_PAGESIZE; + page_is_dirty = 1; + force_page_erase = 1; + start=0; + } + // Copy remaining data to start of page buffer - start=0; for (; i < srec.size; i++) { - page_isEmpty = 0; page_buffer[start++] = srec.data[i]; } image_size += srec.size; @@ -169,10 +172,14 @@ int main(void) break; case srec_eob: state_next = StateIdle; - if (!page_isEmpty) + if (page_is_dirty) { + if (force_page_erase) + { + erase_page(page_addr); + } write_page(page_addr, page_buffer); - page_isEmpty = 1; + page_is_dirty = 0; } uart_puts("\nImage size: 0x"); print_word(image_size); uart_puts("\n"); /* Reenable RWW-section again. We need this if we want to jump back */ @@ -202,6 +209,14 @@ int main(void) startApplication(); } +void erase_page(uint16_t page_addr) +{ +// uart_puts("ErasePage: "); print_word(page_addr); uart_puts("\n"); + eeprom_busy_wait (); + boot_spm_busy_wait (); + boot_page_erase (page_addr); + +} void write_page(uint16_t page_addr, uint8_t *pPageBuffer) { uint16_t i; @@ -213,10 +228,10 @@ void write_page(uint16_t page_addr, uint8_t *pPageBuffer) { /* Set up little-endian word. */ uint16_t w = *(pPageBuffer++); - w += *(pPageBuffer++) << 8; + uint16_t v = *(pPageBuffer++); + w += v << 8; boot_page_fill (page_addr + i, w); } - boot_page_write (page_addr); /* Store buffer in flash page. */ } diff --git a/Control/firmware/Bootloader/Bootloader/srec.h b/Control/firmware/Bootloader/Bootloader/srec.h index b8032ea..5781294 100644 --- a/Control/firmware/Bootloader/Bootloader/srec.h +++ b/Control/firmware/Bootloader/Bootloader/srec.h @@ -19,8 +19,8 @@ typedef struct _ssrec_t { uint32_t addr; - uint32_t size; - uint32_t type; + uint16_t size; + uint8_t type; uint8_t *data; } srec_t; diff --git a/Control/firmware/Bootloader/Bootloader/uart.c b/Control/firmware/Bootloader/Bootloader/uart.c index 8af2996..1ea1313 100644 --- a/Control/firmware/Bootloader/Bootloader/uart.c +++ b/Control/firmware/Bootloader/Bootloader/uart.c @@ -67,3 +67,34 @@ void uart_puts(char const *str) } } +void print_byte(char byte) +{ + int i; + unsigned char c, nibble; + + for (i=0; i < 2; i++) + { + nibble = (char)((byte >> 4) & 0xF); + byte <<= 4; + + if (nibble < 10) + c = nibble + '0'; + else + c = nibble + 'A' - 10; + + uart_putc(c); + } +} + +void print_word(uint16_t word) +{ + int i; + unsigned char c; + + for (i=0; i < 2; i++) + { + c = (char) (word >> 8); + print_byte(c); + word <<= 8; + } +} diff --git a/Control/firmware/Bootloader/Bootloader/uart.h b/Control/firmware/Bootloader/Bootloader/uart.h index 76476f1..41dbd21 100644 --- a/Control/firmware/Bootloader/Bootloader/uart.h +++ b/Control/firmware/Bootloader/Bootloader/uart.h @@ -20,36 +20,7 @@ void uart_putc(char c); char uart_getc(void); void uart_puts(char const *str); -inline void print_byte(char byte) -{ - int i; - unsigned char c, nibble; - - for (i=0; i < 2; i++) - { - nibble = (char)((byte >> 4) & 0xF); - byte <<= 4; - - if (nibble < 10) - c = nibble + '0'; - else - c = nibble + 'A' - 10; - - uart_putc(c); - } -} - -inline void print_word(uint16_t word) -{ - int i; - unsigned char c; - - for (i=0; i < 2; i++) - { - c = (char) (word >> 8); - print_byte(c); - word <<= 8; - } -} +void print_byte(char byte); +void print_word(uint16_t word); #endif /* UART_H_ */ \ No newline at end of file