/** @file bkp_regs.h
 * Module defining the Backup (bkp) domain registers.
 *
 * Mainly made to be used by the bkp module. It is recommanded to go through
 * the functions provided by that module instead of directly using the registers
 * defined here.
 */

#ifndef _BKP_REGS_H_
#define _BKP_REGS_H_

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

#include "stdint.h"


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

#define BKP_BASE_ADDRESS 0x40006C00
#define RCC_BASE_ADDRESS 0x40021020
#define RTC_BASE_ADDRESS 0x40002800

union BKP_DR {
	struct {
		uint32_t D:16;
		uint32_t reserved1:16;
	};
	uint32_t word;
};

union BKP_RTCCR {
	struct {
		uint32_t CAL:7;
		uint32_t CCO:1;
		uint32_t ASOE:1;
		uint32_t ASOS:1;
		uint32_t reserved1:22;
	};
	uint32_t word;
};

union BKP_CR {
	struct {
		uint32_t TPE:1;
		uint32_t TPAL:1;
		uint32_t reserved1:30;
	};
	uint32_t word;
};

union BKP_CSR {
	struct {
		uint32_t CTE:1;
		uint32_t CTI:1;
		uint32_t TPIE:1;
		uint32_t reserved1:5;
		uint32_t TEF:1;
		uint32_t TIF:1;
		uint32_t reserved2:22;
	};
	uint32_t word;
};

struct BKP {
	uint32_t reserved1;
	union BKP_DR DR[20];
	union BKP_RTCCR RTCCR;
	union BKP_CR CR;
	union BKP_CSR CSR;
};


union RCC_BDCR {
	struct {
		uint32_t LSEON:1;
		uint32_t LSERDY:1;
		uint32_t LSEBYP:1;
		uint32_t reserved1:5;
		uint32_t RTCSEL:2;
		uint32_t reserved2:5;
		uint32_t RTCEN:1;
		uint32_t BDRST:1;
		uint32_t reserved3:15;
	};
	uint32_t word;
};

struct RCC {
	union RCC_BDCR BDCR;
};


union RTC_CRH {
	struct {
		uint32_t SECIE:1;
		uint32_t ALRIE:1;
		uint32_t OWIE:1;
		uint32_t reserved1:29;
	};
	uint32_t word;
};

union RTC_CRL {
	struct {
		uint32_t SECF:1;
		uint32_t ALRF:1;
		uint32_t OWF:1;
		uint32_t RSF:1;
		uint32_t CNF:1;
		uint32_t RTOFF:1;
		uint32_t reserved1:26;
	};
	uint32_t word;
};

union RTC_PRLH {
	struct {
		uint32_t PRL:4;
		uint32_t reserved1:28;
	};
	uint32_t word;
};

union RTC_PRLL {
	struct {
		uint32_t PRL:16;
		uint32_t reserved1:16;
	};
	uint32_t word;
};

union RTC_DIVH {
	struct {
		uint32_t RTC_DIV:4;
		uint32_t reserved1:28;
	};
	uint32_t word;
};

union RTC_DIVL {
	struct {
		uint32_t RTC_DIV:16;
		uint32_t reserved1:16;
	};
	uint32_t word;
};

union RTC_CNTH {
	struct {
		uint32_t RTC_CNT:16;
		uint32_t reserved1:16;
	};
	uint32_t word;
};

union RTC_CNTL {
	struct {
		uint32_t RTC_CNT:16;
		uint32_t reserved1:16;
	};
	uint32_t word;
};

union RTC_ALRH {
	struct {
		uint32_t RTC_ALR:16;
		uint32_t reserved1:16;
	};
	uint32_t word;
};

union RTC_ALRL {
	struct {
		uint32_t RTC_ALR:16;
		uint32_t reserved1:16;
	};
	uint32_t word;
};

struct RTC {
	union RTC_CRH CRH;
	union RTC_CRL CRL;
	union RTC_PRLH PRLH;
	union RTC_PRLL PRLL;
	union RTC_DIVH DIVH;
	union RTC_DIVL DIVL;
	union RTC_CNTH CNTH;
	union RTC_CNTL CNTL;
	union RTC_ALRH ALRH;
	union RTC_ALRL ALRL;
};


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

#endif //_BKP_REGS_H_

