/** @file flash_regs.h
 * Module defining flash memory interface registers.
 *
 * Mainly made to be used by the rcc module. It is recommanded to go through
 * the functions provided by that module instead of directly using the registers
 * defined here.
 */

#ifndef _FLASH_REGS_H_
#define _FLASH_REGS_H_

//--includes--------------------------------------------------------------------

#include "reg.h"

#include "stdint.h"


//--type definitions------------------------------------------------------------

#define FLASH_BASE_ADDRESS 0x40022000

union FLASH_ACR {
	struct __attribute__((packed)) {
		uint32_t LATENCY:3;
		uint32_t HLFCYA:1;
		uint32_t PRFTBE:1;
		uint32_t PRFTBS:1;
		uint32_t reserved1:26;
	};
	uint32_t word;
};

#define FLASH_ACR_LATENCY	reg_def(0,  3)
#define FLASH_ACR_HLFCYA	reg_def(3,  1)
#define FLASH_ACR_PRFTBE	reg_def(4,  1)
#define FLASH_ACR_PRFTBS	reg_def(5,  1)
#define FLASH_ACR_reserved1 reg_def(6, 26)

union FLASH_KEYR {
	struct __attribute__((packed)) {
		uint32_t reserved1; //TODO
	};
	uint32_t word;
};

union FLASH_OPTKEYR {
	struct __attribute__((packed)) {
		uint32_t reserved1; //TODO
	};
	uint32_t word;
};

union FLASH_SR {
	struct __attribute__((packed)) {
		uint32_t reserved1; //TODO
	};
	uint32_t word;
};

union FLASH_CR {
	struct __attribute__((packed)) {
		uint32_t reserved1; //TODO
	};
	uint32_t word;
};

union FLASH_AR {
	struct __attribute__((packed)) {
		uint32_t reserved1; //TODO
	};
	uint32_t word;
};

union FLASH_OBR {
	struct __attribute__((packed)) {
		uint32_t reserved1; //TODO
	};
	uint32_t word;
};

union FLASH_WRPR {
	struct __attribute__((packed)) {
		uint32_t reserved1; //TODO
	};
	uint32_t word;
};

struct __attribute__((packed)) FLASH {
	union FLASH_ACR ACR;
	union FLASH_KEYR KEYR;
	union FLASH_OPTKEYR OPTKEYR;
	union FLASH_SR SR;
	union FLASH_CR CR;
	union FLASH_AR AR;
	uint32_t reserved1;
	union FLASH_OBR OBR;
	union FLASH_WRPR WRPR;
};


//--functions-------------------------------------------------------------------

#endif //_FLASH_REGS_H_

