From 5b1dac881e4fa4979e4e5c7f12cf457ce8e93ef1 Mon Sep 17 00:00:00 2001 From: MCUdude Date: Fri, 2 Apr 2021 11:23:36 +0200 Subject: [PATCH] Move check_writable function into optiboot.h/cpp --- avr/libraries/Optiboot_flasher/src/Flash.cpp | 28 +------------- .../Optiboot_flasher/src/optiboot.cpp | 38 +++++++++++++++++++ avr/libraries/Optiboot_flasher/src/optiboot.h | 1 + 3 files changed, 41 insertions(+), 26 deletions(-) diff --git a/avr/libraries/Optiboot_flasher/src/Flash.cpp b/avr/libraries/Optiboot_flasher/src/Flash.cpp index c084d79c2..4fd09a648 100644 --- a/avr/libraries/Optiboot_flasher/src/Flash.cpp +++ b/avr/libraries/Optiboot_flasher/src/Flash.cpp @@ -51,38 +51,14 @@ void Flash::set_far_address(uint32_t address) /** * @brief Checks if the microcontroller contains a bootloader that has flash * writing capabilities. It does so by checking if a spesific number is placed - * at the very end of the flash memory. + * at the very end of the flash memory * * @return true if compatible bootloader is present * @return false if incompatible or no bootloader is present */ bool Flash::check_writable() { - uint8_t content = 0; - // 256kiB flash - #if FLASHEND == 0x3FFFF - content = pgm_read_byte_far(0x3FFFF); - // 128kiB flash - #elif FLASHEND == 0x1FFFF - content = pgm_read_byte_far(0x1FFFF); - //64kiB flash - #elif FLASHEND == 0xFFFF - content = pgm_read_byte(0xFFFF); - // 32kiB flash - #elif FLASHEND == 0x7FFF - content = pgm_read_byte(0x7FFF); - // 16kiB flash - #elif FLASHEND == 0x3FFF - content = pgm_read_byte(0x3FFF); - // 8kiB flash - #elif FLASHEND == 0x1FFF - content = pgm_read_byte(0x1FFF); - #endif - - if(content >= 8) - return true; - else - return false; + return optiboot_check_writable(); } /** diff --git a/avr/libraries/Optiboot_flasher/src/optiboot.cpp b/avr/libraries/Optiboot_flasher/src/optiboot.cpp index 681cbce56..c9954b7ce 100755 --- a/avr/libraries/Optiboot_flasher/src/optiboot.cpp +++ b/avr/libraries/Optiboot_flasher/src/optiboot.cpp @@ -27,6 +27,44 @@ void do_spm_cli(optiboot_addr_t address, uint8_t command, uint16_t data) } +/** + * @brief Checks if the microcontroller contains a bootloader that has flash + * writing capabilities. It does so by checking if a spesific number is placed + * at the very end of the flash memory + * + * @return true if compatible bootloader is present + * @return false if incompatible or no bootloader is present + */ +bool optiboot_check_writable() +{ + uint8_t content = 0; + // 256kiB flash + #if FLASHEND == 0x3FFFF + content = pgm_read_byte_far(0x3FFFF); + // 128kiB flash + #elif FLASHEND == 0x1FFFF + content = pgm_read_byte_far(0x1FFFF); + //64kiB flash + #elif FLASHEND == 0xFFFF + content = pgm_read_byte(0xFFFF); + // 32kiB flash + #elif FLASHEND == 0x7FFF + content = pgm_read_byte(0x7FFF); + // 16kiB flash + #elif FLASHEND == 0x3FFF + content = pgm_read_byte(0x3FFF); + // 8kiB flash + #elif FLASHEND == 0x1FFF + content = pgm_read_byte(0x1FFF); + #endif + + if(content == 8) + return true; + else + return false; +} + + /** * @brief Erase flash page * diff --git a/avr/libraries/Optiboot_flasher/src/optiboot.h b/avr/libraries/Optiboot_flasher/src/optiboot.h index 03e04bf6b..886339b8e 100755 --- a/avr/libraries/Optiboot_flasher/src/optiboot.h +++ b/avr/libraries/Optiboot_flasher/src/optiboot.h @@ -64,6 +64,7 @@ typedef void (*do_spm_t)(uint16_t address, uint8_t command, uint16_t data); void do_spm_cli(optiboot_addr_t address, uint8_t command, uint16_t data); +bool optiboot_check_writable(); void optiboot_page_erase(optiboot_addr_t address); void optiboot_page_fill(optiboot_addr_t address, uint16_t data); void optiboot_page_write(optiboot_addr_t address);