/*
 * flash.h
 *
 * Universal FLASH Library v1.1
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 *
 * Copyright (c) 2023 Georgy Moshkin <https://georgymoshkin.com>
 * All rights reserved.
 *
 * Changelog:
 *
 * v1.0 (2026-3-31)
 *   - Initial release
 *
 */

#ifndef SRC_FLASH_H_
#define SRC_FLASH_H_

#include "main.h"
#include "string.h"

#if defined(STM32H7)
	#define USE_SECTORS
#endif

#define REGION_BOOTLOADER		0
#define REGION_SETTINGS			1
#define REGION_APPLICATION		2
#define REGION_PRECONFIGURED	3


#define FLASH_OPERATION_OK		0
#define FLASH_OPERATION_ERROR	1

#define FLAG_APPLICATION	0x1234
#define FLAG_BOOTLOADER		0x5555

extern uint32_t flash_address_current;
extern uint32_t flash_size_total;

extern uint32_t flash_size_bootloader;
extern uint32_t flash_size_settings;
extern uint32_t flash_size_application;

extern uint32_t flash_address_bootloader;
extern uint32_t flash_address_settings;
extern uint32_t flash_address_application;

extern uint32_t backup_register_get();
extern void backup_register_set(uint32_t reg_val);

extern void flash_calculate_sizes();

extern void flash_region_run(uint32_t flash_region);

extern void flash_region_select(uint8_t flash_region);
extern uint8_t flash_region_write(void *src32);
extern uint8_t flash_region_read(void *dst32);
extern void flash_region_erase_and_select(uint8_t erase_region);

extern void flash_write_32bytes(uint32_t addr, uint8_t bytes[32]);

extern uint32_t backup_register_get();
extern void backup_register_set(uint32_t reg_val);

#endif /* SRC_FLASH_H_ */
