//----------------------------------------------------
/**
	\file		atsam4e16e/hw/flash_internal.h
	\ingroup	platform
	\ingroup	cortex-m4

	\brief		Knihovna pro praci s interni flash pameti
				<<< CORTEX M4 >>>

	\author		ConTeK s.r.o., Pavel Bazika
	\version	01.03
	\date		11.11.2009
*/
//----------------------------------------------------
#ifndef _FLASH_INTERNAL_H_
#define _FLASH_INTERNAL_H_		//!< Definice pritomnosti knihovny

//----------------------------------------------------
//!	\brief	Mozne navratove hodnoty

typedef enum _IFLASH_STATUS
{
	FLST_OK,				//!< OK
	FLST_ERROR,				//!< Nespecifikovana chyba
	FLST_UNSUPP_DEVICE,		//!< Nepodporovane zarizeni
	FLST_UNSUPP_FREQ,		//!< Neplatna frekvence
	FLST_INVALID_ADDR,		//!< Neplatna adresa
	FLST_INVALID_KEY,		//!< Neplatny klic
	FLST_VERIFY_ERROR,		//!< Chyba pri verifikaci
	FLST_ACCESS_DENIED,		//!< Zapis do oblasti klicu

	FLST_LOCKED,			//!< Flash modul je zamknuty
	FLST_INVALID_DATA,		//!< Neplatna zapisovana data
	FLST_3VDROP,			//!< Pokles napajeciho napeti
	FLST_CMDFAILED,			//!< Prikaz nebyl proveden
} IFLASH_STATUS;


//----------------------------------------------------
/**
	\brief	Funkce provadi zapis nekolika stranek do flash

	\param	aAddr	Adresa prvni zapisovane stranky (absolutne)
	\param	aSize	Velikost zapisovaneho bloku v bytech
	\param	aBuffer	Data k zapisu

	\return	 Vysledek operace
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashProgPages(uint32_t aAddr, uint32_t aSize, const void * const aBuffer );


//----------------------------------------------------
/**
	\brief	Funkce porovna obsah flash pameti s obsahem bufferu

	\param	aAddr	adresa pocatku proverovane oblasti
	\param	aSize	velikost proverovane oblasti v bytech
	\param	aBuffer	Data k overeni

	\return	Stav vysledku operace (OK, VERIFY_ERROR)
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashVerify(const uint32_t _addr, const uint32_t _size, const void * const _buffer );


//----------------------------------------------------
/**
	\brief	Funkce maze zadanou oblast flashky

	\param	aAddr	Adresa pocatku mazane oblasti
	\param	aSize	Velikost mazane oblasti v bytech

	\return	Stav vysledku operace (OK, INVALID_ADDR)
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashErase(uint32_t aAddr, const uint32_t aSize);


//----------------------------------------------------
/**
	\brief	Funkce provede zamceni stranky pro zapis

	\param	aAddr		Absolutni adresa pocatku zamykane stranky

	\return	Stav vysledku operace (OK, INVALID_ADDR)
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashLockPage(const uint32_t aAddr);


//----------------------------------------------------
/**
	\brief	Funkce provede odemceni stranky pro zapis

	\param	aAddr		Absolutni adresa pocatku odemykane stranky

	\return	Stav vysledku operace (OK, INVALID_ADDR)
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashUnlockPage(const uint32_t aAddr);


//----------------------------------------------------
/**
	\brief	Funkce nastavi urceny GPNVM bit

	\param	Number	Cislo bitu

	\return	Stav vysledku operace (OK, INVALID_ADDR)
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashSetGPNVM(const uint8_t Number);


//----------------------------------------------------
/**
	\brief	Funkce maze urceny GPNVM bit

	\param	Number	Cislo bitu

	\return	Stav vysledku operace (OK, INVALID_ADDR)
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashClearGPNVM(const uint8_t Number);


//----------------------------------------------------
/**
	\brief	Funkce maze data uvnitr 4KB bloku (8 stranek)

	\param	_aAddr	Adresa dat, ktere chceme smazat
	\param	_aSize	Velikost dat

	\return	Stav vysledku operace

	\note	Maximalni velikost mazanych dat je IFLASH_PAGE_SIZE
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashEraseData(uint32_t _aAddr, const uint32_t _aSize);


//----------------------------------------------------
/**
	\brief	Zapis do flash na libovolnou adresu bez predvymazu

	\param	aAddr	Adresa, na kterou se ma zapisovat
	\param	aSize	Pocet bytu k zapisu (musi byt delitelne 4)
	\param	aBuffer	Data k zapisu

	\return	Stav vysledku operace (OK, INVALID_ADDR)

	\note	Data nesmi preshanout hranici stranky
*/
//----------------------------------------------------

IFLASH_STATUS InternalFlashWriteData(const uint32_t aAddr, const uint32_t aSize, const void * const aBuffer);

#endif	// _FLASH_INTERNAL_H_
