Skip to content
Snippets Groups Projects
Commit 359d2b15 authored by mfenner's avatar mfenner
Browse files

Bootloader modified: hex added , LED and message improvements

parent d47b0a2e
No related branches found
No related tags found
No related merge requests found
No preview for this file type
This diff is collapsed.
This diff is collapsed.
...@@ -18,6 +18,17 @@ uint8_t page[FLASH_PAGE_SIZE] = {0}; ...@@ -18,6 +18,17 @@ uint8_t page[FLASH_PAGE_SIZE] = {0};
uint8_t checksum = 0; uint8_t checksum = 0;
uint8_t handshake = 0; uint8_t handshake = 0;
void welcome_led_blink()
{
uint8_t i;
for (i=0; i<50; i++)
{
ioport_toggle_pin(MMC_LED);
_delay_ms(20);
}
}
void start_firmware() void start_firmware()
{ {
void (*app_start)( void ) = APP_SECTION_START; // Set up function pointer to RESET vector. void (*app_start)( void ) = APP_SECTION_START; // Set up function pointer to RESET vector.
...@@ -42,9 +53,10 @@ void start_bootloader() ...@@ -42,9 +53,10 @@ void start_bootloader()
switch (state) switch (state)
{ {
case INIT: case INIT:
if (eeprom_read_upgrade() == false) if (eeprom_check_magic_byte_invalid() == false)
{ {
usart_putchar(USART_SERIAL, eeprom_read_byte(EEPROM_ADDR_FWUPGRADE)); printString("Starting application...\r\n");
usart_putchar(USART_SERIAL, eeprom_read_byte(EEPROM_ADDR_MAGICBYTE));
start_firmware(); start_firmware();
} }
state = HANDSHAKE; state = HANDSHAKE;
...@@ -52,7 +64,7 @@ void start_bootloader() ...@@ -52,7 +64,7 @@ void start_bootloader()
/////////////////////////////////////// ///////////////////////////////////////
case HANDSHAKE: case HANDSHAKE:
printString("Waiting for firmware upload...\r\n");
do do
{ {
usart_serial_getchar(USART_SERIAL, &chr); usart_serial_getchar(USART_SERIAL, &chr);
...@@ -189,21 +201,21 @@ void checksum_add_byte(uint8_t byte) ...@@ -189,21 +201,21 @@ void checksum_add_byte(uint8_t byte)
void eeprom_write_upgrade( void ) void eeprom_write_upgrade( void )
{ {
eeprom_write_byte(EEPROM_ADDR_FWUPGRADE, EEPROM_FWUPGRADE_VALUE); eeprom_write_byte(EEPROM_ADDR_MAGICBYTE, EEPROM_FWUPGRADE_VALUE);
} }
void eeprom_write_ready( void ) void eeprom_write_ready( void )
{ {
eeprom_write_byte(EEPROM_ADDR_FWUPGRADE, EEPROM_FWREADY_VALUE); eeprom_write_byte(EEPROM_ADDR_MAGICBYTE, EEPROM_FWREADY_VALUE);
_delay_ms(40); _delay_ms(40);
} }
bool eeprom_read_upgrade( void ) bool eeprom_check_magic_byte_invalid( void )
{ {
//return false; //return false;
// return true; // return true;
//usart_putchar(USART_SERIAL, eeprom_read_byte((EEPROM_ADDR_FWUPGRADE))); //usart_putchar(USART_SERIAL, eeprom_read_byte((EEPROM_ADDR_MAGICBYTE)));
return eeprom_read_byte(EEPROM_ADDR_FWUPGRADE) != EEPROM_FWREADY_VALUE; return eeprom_read_byte(EEPROM_ADDR_MAGICBYTE) != EEPROM_FWREADY_VALUE;
} }
bool read_compare_checksum(void) bool read_compare_checksum(void)
...@@ -215,12 +227,12 @@ bool read_compare_checksum(void) ...@@ -215,12 +227,12 @@ bool read_compare_checksum(void)
void eeprom_write_upgrade_started( void ) void eeprom_write_upgrade_started( void )
{ {
eeprom_write_byte(EEPROM_ADDR_FWUPGRADE, EEPROM_FWUPGRADE_STARTED); eeprom_write_byte(EEPROM_ADDR_MAGICBYTE, EEPROM_FWUPGRADE_STARTED);
} }
bool eeprom_is_pending( void ) bool eeprom_is_pending( void )
{ {
uint8_t value = eeprom_read_byte(EEPROM_ADDR_FWUPGRADE); uint8_t value = eeprom_read_byte(EEPROM_ADDR_MAGICBYTE);
return (value == EEPROM_FWUPGRADE_STARTED) || return (value == EEPROM_FWUPGRADE_STARTED) ||
(value != EEPROM_FWREADY_VALUE && value != EEPROM_FWUPGRADE_VALUE); (value != EEPROM_FWREADY_VALUE && value != EEPROM_FWUPGRADE_VALUE);
} }
...@@ -28,7 +28,7 @@ extern BootloaderState state; ...@@ -28,7 +28,7 @@ extern BootloaderState state;
#define BOOTLDR_ERR_MAX 20 #define BOOTLDR_ERR_MAX 20
#define EEPROM_ADDR_FWUPGRADE (uint8_t *) 63 #define EEPROM_ADDR_MAGICBYTE (uint8_t *) 63
#define EEPROM_FWUPGRADE_VALUE (uint8_t) 0x56 #define EEPROM_FWUPGRADE_VALUE (uint8_t) 0x56
#define EEPROM_FWREADY_VALUE (uint8_t) 0x55 #define EEPROM_FWREADY_VALUE (uint8_t) 0x55
#define EEPROM_FWUPGRADE_STARTED (uint8_t) 0x44 #define EEPROM_FWUPGRADE_STARTED (uint8_t) 0x44
...@@ -38,9 +38,10 @@ void start_firmware(void); ...@@ -38,9 +38,10 @@ void start_firmware(void);
void eeprom_write_upgrade(void); void eeprom_write_upgrade(void);
void eeprom_write_upgrade_started(void); void eeprom_write_upgrade_started(void);
void eeprom_write_ready(void); void eeprom_write_ready(void);
bool eeprom_read_upgrade(void); bool eeprom_check_magic_byte_invalid(void);
bool eeprom_is_pending(void); bool eeprom_is_pending(void);
void checksum_add_byte(uint8_t byte); void checksum_add_byte(uint8_t byte);
bool read_compare_checksum(void); bool read_compare_checksum(void);
void welcome_led_blink(void);
#endif /* BOOTLOADER_H_ */ #endif /* BOOTLOADER_H_ */
\ No newline at end of file
...@@ -27,9 +27,11 @@ ...@@ -27,9 +27,11 @@
*/ */
#include <asf.h> #include <asf.h>
#include <util/delay.h> #include <util/delay.h>
#include <stdio.h>
#include "usart_lib.h" #include "usart_lib.h"
#include "timer_lib.h" #include "timer_lib.h"
#include "bootloader.h" #include "bootloader.h"
#include "version.h"
#include <ccp.h> #include <ccp.h>
int main (void) int main (void)
{ {
...@@ -49,10 +51,13 @@ int main (void) ...@@ -49,10 +51,13 @@ int main (void)
pmic_init(); pmic_init();
pmic_set_scheduling(PMIC_SCH_FIXED_PRIORITY);//PMIC_SCH_ROUND_ROBIN); pmic_set_scheduling(PMIC_SCH_FIXED_PRIORITY);//PMIC_SCH_ROUND_ROBIN);
cpu_irq_enable(); cpu_irq_enable();
usart_init(); usart_init();
printString("Bootloader\r\n"); welcome_led_blink();
ioport_toggle_pin(MMC_LED);
char message[256];
sprintf(message,"Bootloader V%2d.%2d\r\n",SVN_REVISION_MAJOR,SVN_REVISION_MINOR);
printString(message);
start_bootloader(); start_bootloader();
//reset processor //reset processor
//ccp_write_io((void *)&RST.CTRL, RST_SWRST_bm); //ccp_write_io((void *)&RST.CTRL, RST_SWRST_bm);
......
...@@ -50,7 +50,7 @@ static void tc_overflow_callback(void) //100 ms ...@@ -50,7 +50,7 @@ static void tc_overflow_callback(void) //100 ms
sec_counter++; sec_counter++;
idle_counter++; idle_counter++;
timer_100ms_flag = true; timer_100ms_flag = true;
if(sec_counter == 10) if(sec_counter == LED_BLINK_PERIOD)
{ {
ioport_toggle_pin(MMC_LED); ioport_toggle_pin(MMC_LED);
sec_counter = 0; sec_counter = 0;
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#define TIMER_LIB_H_ #define TIMER_LIB_H_
#define INACTIVITY_BEFORE_RESET_S 20 #define INACTIVITY_BEFORE_RESET_S 20
#define LED_BLINK_PERIOD 18
extern volatile bool timer_100ms_flag; extern volatile bool timer_100ms_flag;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment