- use fancy short pulse heartbeat led flashing

- bootloader now checks BSEL

git-svn-id: http://moon:8086/svn/projects/HendiControl@153 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
2019-03-29 22:04:02 +00:00
parent a7a46940b5
commit 7be8b7f51d
2 changed files with 135 additions and 116 deletions
+127 -115
View File
@@ -58,6 +58,14 @@ void init_page(uint8_t *pPageBuffer, size_t size)
}
}
int port_init()
{
DDRB = 0x00;
DDRD = 0x40;
PORTD = 0x00;
return (PINB0 == 1);
}
int main(void)
{
uint8_t page_buffer[SPM_PAGESIZE];
@@ -66,142 +74,146 @@ int main(void)
State state_next;
srec_t srec;
cli();
bootloader_enter();
uart_init(9600);
uart_puts("Hendi-Control Bootloader v1.1\n");
size_t image_size = 0;
uint16_t page_addr = 0xFFFF;
size_t hex_buffer_size = 0;
int leave_loop = 0;
int page_is_dirty = 0;
int force_page_erase = 1;
do
{
char c;
if ((c = uart_getc()))
int bsel = port_init();
if (bsel)
{
uart_init(9600);
uart_puts("Hendi-Control Bootloader v1.1\n");
size_t image_size = 0;
uint16_t page_addr = 0xFFFF;
size_t hex_buffer_size = 0;
int leave_loop = 0;
int page_is_dirty = 0;
int force_page_erase = 1;
do
{
char C = toupper(c);
state_next = state;
switch(state)
char c;
if ((c = uart_getc()))
{
case StateIdle:
if (C == 'S')
char C = toupper(c);
state_next = state;
switch(state)
{
hex_buffer_size = 0;
state_next = StateHex;
hex_buffer[hex_buffer_size++] = C;
}
if (C == 'R')
{
startBootloader();
}
if (C == 'Q')
{
leave_loop = 1;
}
break;
case StateHex:
if(((C != 0x0D) && (C != 0x0A)))
{
hex_buffer[hex_buffer_size++] = C;
}
else
{
int srec_state = srec_decode(&srec, hex_buffer, hex_buffer_size);
hex_buffer_size = 0;
switch(srec_state)
case StateIdle:
if (C == 'S')
{
case srec_sob:
image_size = 0;
init_page(page_buffer, SPM_PAGESIZE);
page_is_dirty = 0;
break;
case srec_data:
hex_buffer_size = 0;
state_next = StateHex;
hex_buffer[hex_buffer_size++] = C;
}
if (C == 'R')
{
startBootloader();
}
if (C == 'Q')
{
leave_loop = 1;
}
break;
case StateHex:
if(((C != 0x0D) && (C != 0x0A)))
{
hex_buffer[hex_buffer_size++] = C;
}
else
{
int srec_state = srec_decode(&srec, hex_buffer, hex_buffer_size);
hex_buffer_size = 0;
switch(srec_state)
{
uint16_t new_page_addr = srec.addr & ~SPM_PAGESIZE_MASK;
if ((new_page_addr != page_addr) || force_page_erase)
{
page_addr = new_page_addr;
force_page_erase = 0;
erase_page(page_addr);
}
case srec_sob:
image_size = 0;
init_page(page_buffer, SPM_PAGESIZE);
page_is_dirty = 0;
break;
uint16_t start = srec.addr & SPM_PAGESIZE_MASK;
uint16_t i = 0;
for (; i < srec.size; i++)
case srec_data:
{
uint16_t new_page_addr = srec.addr & ~SPM_PAGESIZE_MASK;
if ((new_page_addr != page_addr) || force_page_erase)
{
page_addr = new_page_addr;
force_page_erase = 0;
erase_page(page_addr);
}
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 == SPM_PAGESIZE)
{
break;
page_is_dirty = 0;
write_page(page_addr, page_buffer);
init_page(page_buffer, SPM_PAGESIZE);
}
page_is_dirty = 1;
page_buffer[start++] = srec.data[i];
}
// Page buffer is complete -> write to flash
if (start == SPM_PAGESIZE)
{
page_is_dirty = 0;
write_page(page_addr, page_buffer);
init_page(page_buffer, SPM_PAGESIZE);
}
if (i < srec.size)
{
page_addr += SPM_PAGESIZE;
page_is_dirty = 1;
force_page_erase = 1;
start=0;
}
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
for (; i < srec.size; i++)
{
page_buffer[start++] = srec.data[i];
// Copy remaining data to start of page buffer
for (; i < srec.size; i++)
{
page_buffer[start++] = srec.data[i];
}
image_size += srec.size;
uart_putc('.');
}
image_size += srec.size;
uart_putc('.');
}
break;
case srec_rec:
break;
case srec_eob:
state_next = StateIdle;
if (page_is_dirty)
{
if (force_page_erase)
break;
case srec_rec:
break;
case srec_eob:
state_next = StateIdle;
if (page_is_dirty)
{
erase_page(page_addr);
if (force_page_erase)
{
erase_page(page_addr);
}
write_page(page_addr, page_buffer);
page_is_dirty = 0;
}
write_page(page_addr, page_buffer);
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 */
/* to the application after bootloading. */
boot_rww_enable ();
break;
case srec_err:
startBootloader();
break;
}
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 */
/* to the application after bootloading. */
boot_rww_enable ();
break;
case srec_err:
startBootloader();
break;
}
}
break;
break;
default:
break;
default:
break;
}
state = state_next;
}
state = state_next;
}
} while (!leave_loop);
uart_puts("Exit bootloader!\n\n");
} while (!leave_loop);
uart_puts("Exit bootloader!\n\n");
}
bootloader_exit();
+8 -1
View File
@@ -206,8 +206,15 @@ int main(void)
{
case TIMER_GENERAL:
{
timer_start(timer_id, TIMER_SW_DELAY_MS(500));
hb_state = !hb_state;
if (hb_state)
{
timer_start(timer_id, TIMER_SW_DELAY_MS(50));
}
else
{
timer_start(timer_id, TIMER_SW_DELAY_MS(950));
}
portSet(Led_HB, hb_state);
}
break;