diff --git a/libraries/AP_HAL_ChibiOS/Flash.h b/libraries/AP_HAL_ChibiOS/Flash.h new file mode 100644 index 0000000000..0101b7adb0 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/Flash.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include "AP_HAL_ChibiOS_Namespace.h" +#include +#include "hwdef/common/flash.h" + +class ChibiOS::Flash : public AP_HAL::Flash { +public: + uint32_t getpageaddr(uint32_t page) override { return stm32_flash_getpageaddr(page); } + uint32_t getpagesize(uint32_t page) override { return stm32_flash_getpagesize(page); } + uint32_t getnumpages(void) override { return stm32_flash_getnumpages(); } + bool erasepage(uint32_t page) override { + WITH_SEMAPHORE(sem); + return stm32_flash_erasepage(page); } + bool write(uint32_t addr, const void *buf, uint32_t count) override { + WITH_SEMAPHORE(sem); + return stm32_flash_write(addr, buf, count); } + void keep_unlocked(bool set) override { stm32_flash_keep_unlocked(set); } + bool ispageerased(uint32_t page) override { return stm32_flash_ispageerased(page); } + +private: + HAL_Semaphore sem; +}; diff --git a/libraries/AP_HAL_ChibiOS/Storage.cpp b/libraries/AP_HAL_ChibiOS/Storage.cpp index 45666cf78f..cbe987c480 100644 --- a/libraries/AP_HAL_ChibiOS/Storage.cpp +++ b/libraries/AP_HAL_ChibiOS/Storage.cpp @@ -251,9 +251,9 @@ void Storage::_flash_write(uint16_t line) bool Storage::_flash_write_data(uint8_t sector, uint32_t offset, const uint8_t *data, uint16_t length) { #ifdef STORAGE_FLASH_PAGE - size_t base_address = stm32_flash_getpageaddr(_flash_page+sector); + size_t base_address = hal.flash->getpageaddr(_flash_page+sector); for (uint8_t i=0; iwrite(base_address+offset, data, length)) { return true; } hal.scheduler->delay(1); @@ -280,7 +280,7 @@ bool Storage::_flash_write_data(uint8_t sector, uint32_t offset, const uint8_t * */ bool Storage::_flash_read_data(uint8_t sector, uint32_t offset, uint8_t *data, uint16_t length) { - size_t base_address = stm32_flash_getpageaddr(_flash_page+sector); + size_t base_address = hal.flash->getpageaddr(_flash_page+sector); const uint8_t *b = ((const uint8_t *)base_address)+offset; memcpy(data, b, length); return true; @@ -292,7 +292,7 @@ bool Storage::_flash_read_data(uint8_t sector, uint32_t offset, uint8_t *data, u bool Storage::_flash_erase_sector(uint8_t sector) { for (uint8_t i=0; ierasepage(_flash_page+sector)) { return true; } hal.scheduler->delay(1); diff --git a/libraries/AP_HAL_ChibiOS/Storage.h b/libraries/AP_HAL_ChibiOS/Storage.h index be9797c035..aeb0a6ec48 100644 --- a/libraries/AP_HAL_ChibiOS/Storage.h +++ b/libraries/AP_HAL_ChibiOS/Storage.h @@ -63,7 +63,7 @@ private: #ifdef STORAGE_FLASH_PAGE AP_FlashStorage _flash{_buffer, - stm32_flash_getpagesize(STORAGE_FLASH_PAGE), + hal.flash->getpagesize(STORAGE_FLASH_PAGE), FUNCTOR_BIND_MEMBER(&Storage::_flash_write_data, bool, uint8_t, uint32_t, const uint8_t *, uint16_t), FUNCTOR_BIND_MEMBER(&Storage::_flash_read_data, bool, uint8_t, uint32_t, uint8_t *, uint16_t), FUNCTOR_BIND_MEMBER(&Storage::_flash_erase_sector, bool, uint8_t), diff --git a/libraries/AP_HAL_ChibiOS/Util.cpp b/libraries/AP_HAL_ChibiOS/Util.cpp index ece3309a2d..06db0a2f94 100644 --- a/libraries/AP_HAL_ChibiOS/Util.cpp +++ b/libraries/AP_HAL_ChibiOS/Util.cpp @@ -235,7 +235,7 @@ bool Util::flash_bootloader() return false; } - const uint32_t addr = stm32_flash_getpageaddr(0); + const uint32_t addr = hal.flash->getpageaddr(0); if (!memcmp(fw, (const void*)addr, fw_size)) { hal.console->printf("Bootloader up-to-date\n"); free(fw); @@ -243,7 +243,7 @@ bool Util::flash_bootloader() } hal.console->printf("Erasing\n"); - if (!stm32_flash_erasepage(0)) { + if (!hal.flash->erasepage(0)) { hal.console->printf("Erase failed\n"); free(fw); return false; @@ -252,7 +252,7 @@ bool Util::flash_bootloader() const uint8_t max_attempts = 10; for (uint8_t i=0; idisable_interrupts_save(); - bool ok = stm32_flash_write(addr, fw, fw_size); + bool ok = hal.flash->write(addr, fw, fw_size); hal.scheduler->restore_interrupts(context); if (!ok) { hal.console->printf("Flash failed! (attempt=%u/%u)\n",