// ----------------------------------------------------------------------------- /// \file CachedStorage.h /// \brief Generic memory cache // ----------------------------------------------------------------------------- // Micro-Key bv // Industrieweg 28, 9804 TG Noordhorn // Postbus 92, 9800 AB Zuidhorn // The Netherlands // Tel: +31 594 503020 // Fax: +31 594 505825 // Email: support@microkey.nl // Web: www.microkey.nl // ----------------------------------------------------------------------------- /// $Revision$ /// $Author$ /// $Date$ // (c) 2017 Micro-Key bv // ----------------------------------------------------------------------------- #ifndef _CACHEDEEPROM_H_ #define _CACHEDEEPROM_H_ /** * %CachedStorage implementation * \defgroup CachedStorage Package CachedStorage * \ingroup HAL * @{ */ // ----------------------------------------------------------------------------- // Include files // ----------------------------------------------------------------------------- #include #include #include #include "stm32f10x.h" #include "platform.h" // ----------------------------------------------------------------------------- // Constant and macro definitions // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Type definitions. // ----------------------------------------------------------------------------- /** * \class CachedStorage * The CachedStorage struct that can be used as an object */ struct CachedStorage { bool initialized; //!< Flag indicating initialisation status unsigned int pageNumber; //!< The pageNumber of the memory section on //!< which the cache is located. //!< This is usually for FLASH or EEPROM //!< devices and required for PAGE-ERASE //!< functionality. Can be set to any random //!< value if PAGE-ERASE is not necessary size_t cacheSize; //!< The size of the cache in bytes bool dirty; //!< Marker that cache has been updated struct MemoryDevice* memoryDevice; //!< The memory device on which this cache //!< is located uint32_t* storage; //!< Pointer to the cache that is written to //!< read from uint32_t* tempBuffer; //!< Pointer to a temporary buffer for //!< comparison }; // ----------------------------------------------------------------------------- // Function declarations // ----------------------------------------------------------------------------- /** CachedStorage_construct * \briefConstructor for a new cached storage instance * Function makes use of MALLOC * * Created by: mmi * \memberof CachedStorage * * \param self The cache instance * \param[in] memoryDevice The memory device to use on which the * cache is located * \param[in] pageNumber The pageNumber of the memory section on * which the cache is located. * This is usually for FLASH or EEPROM * devices and required for PAGE-ERASE * functionality. Can be set to any random * value if PAGE-ERASE is not necessary * \param[in] cacheSize The size of the cache. * This value is 32bit oriented and * NOT BYTE-WISE. * The memory allocation will internally * re-calculate to bytes * \return ErrorStatus SUCCESS if constructor was successful * ERROR otherwise * * \todo */ ErrorStatus CachedStorage_construct(struct CachedStorage* self, struct MemoryDevice* memoryDevice, unsigned int pageNumber, size_t cacheSize); /** CachedStorage_destruct * \brief Destructor for a cached storage instance * Function makes use of FREE * * Created by: mmi * \memberof CachedStorage * * \param self The cache instance to destruct * \return void * * \todo */ void CachedStorage_destruct(struct CachedStorage* self); /** CachedStorage_writeWord * \brief Function to write a word (32bit) to cache * * Created by: mmi * \memberof CachedStorage * * \param self The cache instance * \param[in] offset Offset within the cache to put the data * \param[in] value The value/data to write * \return void * * \todo */ void CachedStorage_writeWord(struct CachedStorage* self, int offset, uint32_t value); /** CachedStorage_writeBlob * \brief Function to write a blob. * * Function to write a blob (any given format/amount of data) to cache; hence * the void pointer. The function verifies cache boundaries using the offset and * blob size blobsize is 32bit oriented, NOT BYTE * * Created by: mmi * \memberof CachedStorage * * \param self The cache instance * \param offset Offset within the cache to put the data * \param blob Void pointer to the data to be written * \param blobSize sizeof the blob structure. Give in 32bit, * NOT IN BYTES * \return void * * \todo */ void CachedStorage_writeBlob(struct CachedStorage* self, int offset, const void* blob, size_t blobSize); /** CachedStorage_readWord * \brief Function to read a word (32bit) from cache * * Created by: mmi * \memberof CachedStorage * * \param self The cache instance * \param[in] offset Offset within the cache to put the data * * \return uint32_t The read data * * \todo */ uint32_t CachedStorage_readWord(struct CachedStorage* self, int offset); /** CachedStorage_readBlob * \brief Function to read a blob * * Function to read a blob (any given format/amount of data) from cache; hence * the void pointer. * The function verifies cache boundaries using the offset * * Created by: mmi * \memberof CachedStorage * * \param self The cache instance * \param[in] offset Offset within the cache to put the data * * \return void* Void pointer to the blob structure * * \todo */ const void* CachedStorage_readBlob(struct CachedStorage* self, int offset); /** CachedStorage_commit * \brief Function that puts the data from cache to the memory device. * * This function will verify that the content of the cache is actually different * from the conent of the memory location. If data is equal, not write action * will be performed * In case of memory that needs PAGE-ERASE prior to write, the erase function * will be called automatically. * * Created by: mmi * \memberof CachedStorage * * \param self The cache instance * \return void * * \todo */ void CachedStorage_commit(struct CachedStorage* self); #endif /** @} */