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