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