diff --git a/Control/firmware/Bootloader/Bootloader/Bootloader.cproj b/Control/firmware/Bootloader/Bootloader/Bootloader.cproj
index d2b23df..c214e4c 100644
--- a/Control/firmware/Bootloader/Bootloader/Bootloader.cproj
+++ b/Control/firmware/Bootloader/Bootloader/Bootloader.cproj
@@ -20,26 +20,40 @@
false
true
true
-
+ 0x20000000
true
-
+ exception_table
2
0
- 0
+ 1
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ com.atmel.avrdbg.tool.atmelice
+ J41800089261
+ 0x1E950F
+
+
+
+
+ debugWIRE
+
+ com.atmel.avrdbg.tool.atmelice
+ J41800089261
+ Atmel-ICE
+
+ debugWIRE
@@ -55,6 +69,7 @@
NDEBUG
+ ARDUINO_NANO=1
@@ -71,6 +86,11 @@
libm
+
+
+ .text=0x3C00
+
+
%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include
@@ -93,6 +113,7 @@
DEBUG
+ ARDUINO_NANO=1
@@ -100,7 +121,7 @@
%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include
- Optimize (-O1)
+ Optimize debugging experience (-Og)
True
True
Default (-g2)
@@ -110,6 +131,11 @@
libm
+
+
+ .text=0x3C00
+
+
%24(PackRepoDir)\atmel\ATmega_DFP\1.2.209\include
@@ -120,9 +146,24 @@
+
+ compile
+
compile
+
+ compile
+
+
+ compile
+
+
+ compile
+
+
+ compile
+
\ No newline at end of file
diff --git a/Control/firmware/Bootloader/Bootloader/machine.h b/Control/firmware/Bootloader/Bootloader/machine.h
new file mode 100644
index 0000000..ff8bfa5
--- /dev/null
+++ b/Control/firmware/Bootloader/Bootloader/machine.h
@@ -0,0 +1,21 @@
+/*
+ * machine.h
+ *
+ * Created: 03.03.2019 09:21:56
+ * Author: Jens
+ */
+
+
+#ifndef MACHINE_H_
+#define MACHINE_H_
+
+#if ARDUINO_NANO
+#define F_CPU (16000000UL) // MHz
+#else
+#define F_CPU (18432000UL) // MHz
+#endif
+
+
+
+
+#endif /* MACHINE_H_ */
\ No newline at end of file
diff --git a/Control/firmware/Bootloader/Bootloader/main.c b/Control/firmware/Bootloader/Bootloader/main.c
index 91396f7..7ceedfb 100644
--- a/Control/firmware/Bootloader/Bootloader/main.c
+++ b/Control/firmware/Bootloader/Bootloader/main.c
@@ -5,14 +5,149 @@
* Author : Jens
*/
+#include "machine.h"
+#include
#include
+#include
+#include
+#include
+#include "uart.h"
+#include "srec.h"
-int main(void)
+void (*startApplication)( void ) = 0x0000; /* Funktionspointer auf 0x0000 */
+void (*startBootloader)( void ) = 0x7800; /* Funktionspointer auf 0x0000 */
+
+inline void bootloader_enter()
{
- /* Replace with your application code */
+ /* Interrupt Vektoren verbiegen */
+
+ char sregtemp = SREG;
+ char temp = MCUCR;
+ MCUCR = temp | (1< image_size)
+ image_size = srec.addr + srec.size;
+
+ if (page_isEmpty)
+ {
+ page_isEmpty = 0;
+ page_addr = srec.addr;
+ }
+ uart_puts("SREC.ADDR: "); print_word(srec.addr); uart_puts("\n");
+ }
+ break;
+ case srec_rec:
+ break;
+ case srec_eob:
+ break;
+ case srec_err:
+ startBootloader();
+ break;
+ }
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ if (state_next != state)
+ {
+ uart_puts("State: "); uart_puts(stateStr[state]); uart_puts(" => "); uart_puts(stateStr[state_next]); uart_puts("\n");
+ }
+ state = state_next;
+ uart_putc(c);
+ }
}
+ uart_puts("Exit bootloader!\n");
+
+ bootloader_exit();
}
diff --git a/Control/firmware/Bootloader/Bootloader/srec.c b/Control/firmware/Bootloader/Bootloader/srec.c
new file mode 100644
index 0000000..575c33d
--- /dev/null
+++ b/Control/firmware/Bootloader/Bootloader/srec.c
@@ -0,0 +1,78 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+#include "srec.h"
+
+uint8_t h2i(uint8_t *c)
+{
+ int i;
+ uint8_t t, b = 0;
+
+ for (i=0; i < 2; i++)
+ {
+ t = c[i];
+ if (t >= 'A')
+ t = t - 'A' + 10;
+ else
+ t -= '0';
+
+ b = (b << 4) | t;
+ }
+ return b;
+}
+
+int srec_decode(srec_t *pRec, uint8_t *pBuf, int buflen)
+{
+ uint8_t chksum, byte;
+ int alen, i;
+
+ if (!buflen)
+ return srec_err;
+
+ pRec->type = srec_rec;
+ alen = 0;
+ if ((pBuf[1] > '0') && (pBuf[1] < '4'))
+ {
+ alen = pBuf[1] - '0' + 1;
+ pRec->type = srec_data;
+ }
+ else if ((pBuf[1] >= '7') && (pBuf[1] <= '9'))
+ {
+ alen = 11 - (pBuf[1] - '0');
+ pRec->type = srec_eob;
+ }
+ else if (pBuf[1] == '0')
+ {
+ alen = 2;
+ pRec->type = srec_sob;
+ }
+
+ byte = h2i(&pBuf[2]);
+ pRec->size = byte;
+ chksum = byte;
+
+ pRec->addr = 0;
+ for (i=0; i < alen; i++)
+ {
+ byte = h2i(&pBuf[4+2*i]);
+ pRec->addr = pRec->addr << 8 | byte;
+ chksum += byte;
+ }
+ pRec->size -= (alen+1);
+
+ pRec->data = (uint8_t*) &pBuf[4 + 2*alen];
+ for (i=0; i < (int)pRec->size; i++)
+ {
+ byte = h2i(&pRec->data[2*i]);
+ pRec->data[i] = byte;
+ chksum += byte;
+ }
+ chksum = ~chksum;
+ byte = h2i(&pRec->data[2*i]);
+ if (chksum != byte)
+ return srec_err;
+
+ return pRec->type;
+}
diff --git a/Control/firmware/Bootloader/Bootloader/srec.h b/Control/firmware/Bootloader/Bootloader/srec.h
new file mode 100644
index 0000000..b8032ea
--- /dev/null
+++ b/Control/firmware/Bootloader/Bootloader/srec.h
@@ -0,0 +1,45 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * File: srec.h
+ * Author: jens
+ *
+ * Created on 22. Januar 2017, 14:10
+ */
+
+#ifndef SREC_H
+#define SREC_H
+
+#include
+
+typedef struct _ssrec_t
+{
+ uint32_t addr;
+ uint32_t size;
+ uint32_t type;
+ uint8_t *data;
+
+} srec_t;
+
+enum srec_type
+{
+ srec_err, srec_sob, srec_data, srec_rec, srec_eob
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int srec_decode(srec_t *pRec, uint8_t *pBuf, int buflen);
+int srec_getline(uint8_t *pLine);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SREC_H */
+
diff --git a/Control/firmware/Bootloader/Bootloader/uart.c b/Control/firmware/Bootloader/Bootloader/uart.c
new file mode 100644
index 0000000..020579e
--- /dev/null
+++ b/Control/firmware/Bootloader/Bootloader/uart.c
@@ -0,0 +1,69 @@
+/*
+ * uart.c
+ *
+ * Created: 20.02.2019 20:50:13
+ * Author: jens
+ */
+
+#include
+#include
+
+#include "uart.h"
+
+void uart_init(uint32_t baudrate)
+{
+ uint16_t prescale8 = UART_PRESCALE(baudrate, 8UL);
+ uint16_t prescale16 = UART_PRESCALE(baudrate, 16UL);
+
+ uint32_t baud8 = ((prescale8+1) * 8);
+ uint32_t baud16 = ((prescale16+1) * 16);
+
+ uint32_t err8 = abs(baudrate - baud8);
+ uint32_t err16 = abs(baudrate - baud16);
+
+ uint16_t prescale = prescale16;
+ if (err8 < err16)
+ {
+ prescale = prescale8;
+
+ // Double UART speed
+ UCSR0A |= 1 << U2X0;
+ }
+
+ // Set baud rate
+ UBRR0L = (uint8_t)prescale;
+ UBRR0H = (uint8_t)(prescale >> 8);
+
+ // Enable receiver and transmitter
+ UCSR0B = (1<> 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;
+ }
+}
+
+#endif /* UART_H_ */
\ No newline at end of file