mirror of
https://github.com/ClusterM/fdskey.git
synced 2025-12-16 19:15:54 +01:00
67 lines
2.0 KiB
C
67 lines
2.0 KiB
C
#include <string.h>
|
|
#include <stdio.h>
|
|
#include "servicemenu.h"
|
|
#include "main.h"
|
|
#include "oled.h"
|
|
#include "commit.h"
|
|
|
|
FDSKEY_SERVICE_SETTINGS fdskey_service_settings;
|
|
|
|
void service_settings_load()
|
|
{
|
|
memcpy(&fdskey_service_settings, (void*)SERVICE_SETTINGS_FLASH_OFFSET, sizeof(fdskey_service_settings));
|
|
fdskey_service_settings.sig[sizeof(fdskey_service_settings.sig) - 1] = 0;
|
|
if (strcmp(fdskey_service_settings.sig, SERVICE_SETTINGS_SIGNATURE))
|
|
{
|
|
// config is empty, load defaults
|
|
memset(&fdskey_service_settings, 0, sizeof(fdskey_service_settings));
|
|
strcpy(fdskey_service_settings.sig, SERVICE_SETTINGS_SIGNATURE);
|
|
fdskey_service_settings.oled_controller = OLED_CONTROLLER_SSD1306;
|
|
}
|
|
}
|
|
|
|
HAL_StatusTypeDef write_hardware_version()
|
|
{
|
|
FDSKEY_HARDWARE_VERSION hw;
|
|
HAL_StatusTypeDef r;
|
|
FLASH_EraseInitTypeDef erase_init_struct;
|
|
uint32_t sector_error = 0;
|
|
int i;
|
|
uint64_t buffer[sizeof(hw) / sizeof(uint64_t) + 1];
|
|
|
|
memcpy(&hw, (void*)HARDWARE_VERSION_FLASH_OFFSET, sizeof(hw));
|
|
if (hw.major == 0
|
|
&& hw.minor == 0
|
|
&& hw.suffix == 0
|
|
&& strcmp(hw.bootloader_commit, COMMIT) == 0)
|
|
return HAL_OK;
|
|
|
|
hw.major = 0;
|
|
hw.minor = 0;
|
|
hw.suffix = 0;
|
|
strcpy(hw.bootloader_commit, COMMIT);
|
|
|
|
// unlock flash
|
|
r = HAL_FLASH_Unlock();
|
|
if (r != HAL_OK) return r;
|
|
|
|
// erase flash page
|
|
erase_init_struct.TypeErase = FLASH_TYPEERASE_PAGES;
|
|
erase_init_struct.Banks = ((HARDWARE_VERSION_FLASH_OFFSET - 0x08000000) / FLASH_BANK_SIZE == 0) ? FLASH_BANK_1 : FLASH_BANK_2;
|
|
erase_init_struct.Page = ((HARDWARE_VERSION_FLASH_OFFSET - 0x08000000) / FLASH_PAGE_SIZE) % FLASH_PAGE_NB;
|
|
erase_init_struct.NbPages = 1;
|
|
r = HAL_FLASHEx_Erase(&erase_init_struct, §or_error);
|
|
if (r != HAL_OK) return r;
|
|
|
|
// writing
|
|
memcpy(buffer, &hw, sizeof(hw));
|
|
for (i = 0; i < sizeof(buffer); i += sizeof(uint64_t))
|
|
{
|
|
r = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, HARDWARE_VERSION_FLASH_OFFSET + i, buffer[i / sizeof(uint64_t)]);
|
|
if (r != HAL_OK)
|
|
return r;
|
|
}
|
|
|
|
return HAL_FLASH_Lock();
|
|
}
|