mbed-os5 only for TYBLE16
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
Diff: features/storage/blockdevice/BufferedBlockDevice.h
- Revision:
- 0:5b88d5760320
diff -r 000000000000 -r 5b88d5760320 features/storage/blockdevice/BufferedBlockDevice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/features/storage/blockdevice/BufferedBlockDevice.h Tue Dec 17 23:23:45 2019 +0000 @@ -0,0 +1,197 @@ +/* mbed Microcontroller Library + * Copyright (c) 2018 ARM Limited + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** \addtogroup storage */ +/** @{*/ + +#ifndef MBED_BUFFERED_BLOCK_DEVICE_H +#define MBED_BUFFERED_BLOCK_DEVICE_H + +#include "BlockDevice.h" + +namespace mbed { + +/** Block device for allowing minimal read and program sizes (of 1) for the underlying BD, + * using a buffer on the heap. + */ +class BufferedBlockDevice : public BlockDevice { +public: + /** Lifetime of a memory-buffered block device wrapping an underlying block device + * + * @param bd Block device to back the BufferedBlockDevice + */ + BufferedBlockDevice(BlockDevice *bd); + + /** Lifetime of the memory-buffered block device + */ + virtual ~BufferedBlockDevice(); + + /** Initialize a buffered-memory block device and its underlying block device + * + * @return 0 on success or a negative error code on failure + */ + virtual int init(); + + /** Deinitialize the buffered-memory block device and its underlying block device + * + * @return 0 on success or a negative error code on failure + */ + virtual int deinit(); + + /** Ensure that data on the underlying storage block device is in sync with the + * memory-buffered block device + * + * @return 0 on success or a negative error code on failure + */ + virtual int sync(); + + /** Read blocks from the memory-buffered block device + * + * @param buffer Buffer to read blocks into + * @param addr Address of block to begin reading from + * @param size Size to read in bytes, must be a multiple of read block size + * @return 0 on success, negative error code on failure + */ + virtual int read(void *buffer, bd_addr_t addr, bd_size_t size); + + /** Program data to the memory-buffered block device + * + * The write address blocks must be erased prior to being programmed. + * + * @param buffer Buffer of data to write to blocks + * @param addr Address of block to begin writing to + * @param size Size to write in bytes, must be a multiple of program block size + * @return 0 on success, negative error code on failure + */ + virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size); + + /** Erase blocks from the memory-buffered block device + * + * The state of an erased block is undefined until it has been programmed, + * unless get_erase_value returns a non-negative byte value. + * + * @param addr Address of block to begin erasing + * @param size Size to erase in bytes, must be a multiple of erase block size + * @return 0 on success, negative error code on failure + */ + virtual int erase(bd_addr_t addr, bd_size_t size); + + /** Mark blocks as no longer in use + * + * This function provides a hint to the underlying block device that a region of blocks + * is no longer in use and may be erased without side effects. Erase must still be called + * before programming, but trimming allows flash-translation-layers to schedule erases when + * the device is not busy. + * + * @param addr Address of block to mark as unused + * @param size Size to mark as unused in bytes, must be a multiple of erase block size + * @return 0 on success, negative error code on failure + */ + virtual int trim(bd_addr_t addr, bd_size_t size); + + /** Get the size of a readable block + * + * @return Size of a readable block in bytes + */ + virtual bd_size_t get_read_size() const; + + /** Get the size of a programmable block + * + * @return Size of a programmable block in bytes + * @note Must be a multiple of the read size + */ + virtual bd_size_t get_program_size() const; + + /** Get the size of an erasable block + * + * @return Size of an erasable block in bytes + * @note Must be a multiple of the program size + */ + virtual bd_size_t get_erase_size() const; + + /** Get the size of an erasable block of a given address + * + * @param addr Address within the erasable block + * @return Size of an erasable block in bytes + * @note Must be a multiple of the program size + */ + virtual bd_size_t get_erase_size(bd_addr_t addr) const; + + /** Get the value of storage data after being erased + * + * If get_erase_value returns a non-negative byte value, the underlying + * storage is set to that value when erased, and storage containing + * that value can be programmed without another erase. + * + * @return The value of storage when erased, or -1 if you can't + * rely on the value of erased storage + */ + virtual int get_erase_value() const; + + /** Get the total size of the underlying device + * + * @return Size of the underlying device in bytes + */ + virtual bd_size_t size() const; + + /** Get the underlying BlockDevice class type + * + * @return A string representing the underlying BlockDevice class type + */ + virtual const char *get_type() const; + +protected: + BlockDevice *_bd; + bd_size_t _bd_program_size; + bd_size_t _bd_read_size; + bd_size_t _bd_size; + bd_size_t _write_cache_addr; + bool _write_cache_valid; + uint8_t *_write_cache; + uint8_t *_read_buf; + uint32_t _init_ref_count; + bool _is_initialized; + +#if !(DOXYGEN_ONLY) + /** Flush data in cache + * + * @return 0 on success or a negative error code on failure + */ + int flush(); + + /** Invalidate write cache + * + * @return none + */ + void invalidate_write_cache(); +#endif //#if !(DOXYGEN_ONLY) +}; +} // namespace mbed + +// Added "using" for backwards compatibility +#ifndef MBED_NO_GLOBAL_USING_DIRECTIVE +using mbed::BufferedBlockDevice; +#endif + +#endif + +/** @}*/