furi-hal-flash.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <furi-hal-flash.h>
  2. #include <furi-hal-bt.h>
  3. #include <stm32wbxx.h>
  4. #include <furi.h>
  5. /* Free flash space borders, exported by linker */
  6. extern const void __free_flash_start__;
  7. #define FURI_HAL_FLASH_READ_BLOCK 8
  8. #define FURI_HAL_FLASH_WRITE_BLOCK 8
  9. #define FURI_HAL_FLASH_PAGE_SIZE 4096
  10. #define FURI_HAL_FLASH_CYCLES_COUNT 10000
  11. size_t furi_hal_flash_get_base() {
  12. return FLASH_BASE;
  13. }
  14. size_t furi_hal_flash_get_read_block_size() {
  15. return FURI_HAL_FLASH_READ_BLOCK;
  16. }
  17. size_t furi_hal_flash_get_write_block_size() {
  18. return FURI_HAL_FLASH_WRITE_BLOCK;
  19. }
  20. size_t furi_hal_flash_get_page_size() {
  21. return FURI_HAL_FLASH_PAGE_SIZE;
  22. }
  23. size_t furi_hal_flash_get_cycles_count() {
  24. return FURI_HAL_FLASH_CYCLES_COUNT;
  25. }
  26. const void* furi_hal_flash_get_free_start_address() {
  27. return &__free_flash_start__;
  28. }
  29. const void* furi_hal_flash_get_free_end_address() {
  30. FLASH_OBProgramInitTypeDef pOBInit;
  31. HAL_FLASHEx_OBGetConfig(&pOBInit);
  32. return (const void *)pOBInit.SecureFlashStartAddr;
  33. }
  34. size_t furi_hal_flash_get_free_page_start_address() {
  35. size_t start = (size_t)furi_hal_flash_get_free_start_address();
  36. size_t page_start = start - start % FURI_HAL_FLASH_PAGE_SIZE;
  37. if (page_start != start) {
  38. page_start += FURI_HAL_FLASH_PAGE_SIZE;
  39. }
  40. return page_start;
  41. }
  42. size_t furi_hal_flash_get_free_page_count() {
  43. size_t end = (size_t)furi_hal_flash_get_free_end_address();
  44. size_t page_start = (size_t)furi_hal_flash_get_free_page_start_address();
  45. return (end-page_start) / FURI_HAL_FLASH_PAGE_SIZE;
  46. }
  47. bool furi_hal_flash_erase(uint8_t page, uint8_t count) {
  48. if (!furi_hal_bt_lock_flash(true)) {
  49. return false;
  50. }
  51. FLASH_EraseInitTypeDef erase;
  52. erase.TypeErase = FLASH_TYPEERASE_PAGES;
  53. erase.Page = page;
  54. erase.NbPages = count;
  55. uint32_t error;
  56. HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase, &error);
  57. furi_hal_bt_unlock_flash(true);
  58. return status == HAL_OK;
  59. }
  60. bool furi_hal_flash_write_dword(size_t address, uint64_t data) {
  61. if (!furi_hal_bt_lock_flash(false)) {
  62. return false;
  63. }
  64. HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address, data);
  65. furi_hal_bt_unlock_flash(false);
  66. return status == HAL_OK;
  67. }
  68. bool furi_hal_flash_write_dword_from(size_t address, size_t source_address) {
  69. if (!furi_hal_bt_lock_flash(false)) {
  70. return false;
  71. }
  72. HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FAST, address, source_address);
  73. furi_hal_bt_unlock_flash(false);
  74. return status == HAL_OK;
  75. }