diff --git a/Control/firmware/Bootloader/Bootloader/main.c b/Control/firmware/Bootloader/Bootloader/main.c index 89ef9a7..5a3ac0a 100644 --- a/Control/firmware/Bootloader/Bootloader/main.c +++ b/Control/firmware/Bootloader/Bootloader/main.c @@ -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(); diff --git a/Control/firmware/uart_echo/main.c b/Control/firmware/uart_echo/main.c index e6ce520..93f061f 100755 --- a/Control/firmware/uart_echo/main.c +++ b/Control/firmware/uart_echo/main.c @@ -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;