Lazily allocated heap-backed block device. When writing data of ROM address, heap memory is not used.

Dependents:   GR-PEACH-webcam GR-PEACH_DR_STRANGE_VR_GAME GR-Boards_WebCamera

Committer:
dkato
Date:
Tue May 16 04:24:46 2017 +0000
Revision:
0:3e16bac28356
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:3e16bac28356 1 /* mbed Microcontroller Library
dkato 0:3e16bac28356 2 * Copyright (c) 2017 ARM Limited
dkato 0:3e16bac28356 3 *
dkato 0:3e16bac28356 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
dkato 0:3e16bac28356 5 * of this software and associated documentation files (the "Software"), to deal
dkato 0:3e16bac28356 6 * in the Software without restriction, including without limitation the rights
dkato 0:3e16bac28356 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
dkato 0:3e16bac28356 8 * copies of the Software, and to permit persons to whom the Software is
dkato 0:3e16bac28356 9 * furnished to do so, subject to the following conditions:
dkato 0:3e16bac28356 10 *
dkato 0:3e16bac28356 11 * The above copyright notice and this permission notice shall be included in
dkato 0:3e16bac28356 12 * all copies or substantial portions of the Software.
dkato 0:3e16bac28356 13 *
dkato 0:3e16bac28356 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dkato 0:3e16bac28356 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dkato 0:3e16bac28356 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dkato 0:3e16bac28356 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dkato 0:3e16bac28356 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dkato 0:3e16bac28356 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
dkato 0:3e16bac28356 20 * SOFTWARE.
dkato 0:3e16bac28356 21 */
dkato 0:3e16bac28356 22 #ifndef MBED_ROM_RAM_BLOCK_DEVICE_H
dkato 0:3e16bac28356 23 #define MBED_ROM_RAM_BLOCK_DEVICE_H
dkato 0:3e16bac28356 24
dkato 0:3e16bac28356 25 #include "BlockDevice.h"
dkato 0:3e16bac28356 26 #include "mbed.h"
dkato 0:3e16bac28356 27
dkato 0:3e16bac28356 28
dkato 0:3e16bac28356 29 /** Lazily allocated heap-backed block device
dkato 0:3e16bac28356 30 *
dkato 0:3e16bac28356 31 * When writing data of ROM address, heap memory is not used
dkato 0:3e16bac28356 32 * Useful for simulating a block device and tests
dkato 0:3e16bac28356 33 *
dkato 0:3e16bac28356 34 * @code
dkato 0:3e16bac28356 35 * #include "mbed.h"
dkato 0:3e16bac28356 36 * #include "RomRamBlockDevice.h"
dkato 0:3e16bac28356 37 *
dkato 0:3e16bac28356 38 * RomRamBlockDevice bd(2048, 512); // 2048 bytes with a block size of 512 bytes
dkato 0:3e16bac28356 39 * uint8_t block[512] = "Hello World!\n";
dkato 0:3e16bac28356 40 *
dkato 0:3e16bac28356 41 * int main() {
dkato 0:3e16bac28356 42 * bd.SetRomAddr(0x18000000, 0x1FFFFFFF); // ROM Address 0x18000000 - 0x1FFFFFFF
dkato 0:3e16bac28356 43 * bd.init();
dkato 0:3e16bac28356 44 * bd.program(block, 0);
dkato 0:3e16bac28356 45 * bd.read(block, 0);
dkato 0:3e16bac28356 46 * printf("%s", block);
dkato 0:3e16bac28356 47 * bd.deinit();
dkato 0:3e16bac28356 48 * }
dkato 0:3e16bac28356 49 */
dkato 0:3e16bac28356 50 class RomRamBlockDevice : public BlockDevice
dkato 0:3e16bac28356 51 {
dkato 0:3e16bac28356 52 public:
dkato 0:3e16bac28356 53
dkato 0:3e16bac28356 54 /** Lifetime of the memory block device
dkato 0:3e16bac28356 55 */
dkato 0:3e16bac28356 56 RomRamBlockDevice(bd_size_t size, bd_size_t block=512);
dkato 0:3e16bac28356 57 RomRamBlockDevice(bd_size_t size, bd_size_t read, bd_size_t program, bd_size_t erase);
dkato 0:3e16bac28356 58 virtual ~RomRamBlockDevice();
dkato 0:3e16bac28356 59
dkato 0:3e16bac28356 60 /** Set the ROM address range
dkato 0:3e16bac28356 61 *
dkato 0:3e16bac28356 62 * When writing data of ROM address, heap memory is not used
dkato 0:3e16bac28356 63 *
dkato 0:3e16bac28356 64 * @param rom_start_addr Rom start address
dkato 0:3e16bac28356 65 * @param rom_end_addr Rom end address
dkato 0:3e16bac28356 66 */
dkato 0:3e16bac28356 67 void SetRomAddr(uint32_t rom_start_addr, uint32_t rom_end_addr);
dkato 0:3e16bac28356 68
dkato 0:3e16bac28356 69 /** Initialize a block device
dkato 0:3e16bac28356 70 *
dkato 0:3e16bac28356 71 * @return 0 on success or a negative error code on failure
dkato 0:3e16bac28356 72 */
dkato 0:3e16bac28356 73 virtual int init();
dkato 0:3e16bac28356 74
dkato 0:3e16bac28356 75 /** Deinitialize a block device
dkato 0:3e16bac28356 76 *
dkato 0:3e16bac28356 77 * @return 0 on success or a negative error code on failure
dkato 0:3e16bac28356 78 */
dkato 0:3e16bac28356 79 virtual int deinit();
dkato 0:3e16bac28356 80
dkato 0:3e16bac28356 81 /** Read blocks from a block device
dkato 0:3e16bac28356 82 *
dkato 0:3e16bac28356 83 * @param buffer Buffer to read blocks into
dkato 0:3e16bac28356 84 * @param addr Address of block to begin reading from
dkato 0:3e16bac28356 85 * @param size Size to read in bytes, must be a multiple of read block size
dkato 0:3e16bac28356 86 * @return 0 on success, negative error code on failure
dkato 0:3e16bac28356 87 */
dkato 0:3e16bac28356 88 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
dkato 0:3e16bac28356 89
dkato 0:3e16bac28356 90 /** Program blocks to a block device
dkato 0:3e16bac28356 91 *
dkato 0:3e16bac28356 92 * The blocks must have been erased prior to being programmed
dkato 0:3e16bac28356 93 *
dkato 0:3e16bac28356 94 * @param buffer Buffer of data to write to blocks
dkato 0:3e16bac28356 95 * @param addr Address of block to begin writing to
dkato 0:3e16bac28356 96 * @param size Size to write in bytes, must be a multiple of program block size
dkato 0:3e16bac28356 97 * @return 0 on success, negative error code on failure
dkato 0:3e16bac28356 98 */
dkato 0:3e16bac28356 99 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
dkato 0:3e16bac28356 100
dkato 0:3e16bac28356 101 /** Erase blocks on a block device
dkato 0:3e16bac28356 102 *
dkato 0:3e16bac28356 103 * The state of an erased block is undefined until it has been programmed
dkato 0:3e16bac28356 104 *
dkato 0:3e16bac28356 105 * @param addr Address of block to begin erasing
dkato 0:3e16bac28356 106 * @param size Size to erase in bytes, must be a multiple of erase block size
dkato 0:3e16bac28356 107 * @return 0 on success, negative error code on failure
dkato 0:3e16bac28356 108 */
dkato 0:3e16bac28356 109 virtual int erase(bd_addr_t addr, bd_size_t size);
dkato 0:3e16bac28356 110
dkato 0:3e16bac28356 111 /** Get the size of a readable block
dkato 0:3e16bac28356 112 *
dkato 0:3e16bac28356 113 * @return Size of a readable block in bytes
dkato 0:3e16bac28356 114 */
dkato 0:3e16bac28356 115 virtual bd_size_t get_read_size() const;
dkato 0:3e16bac28356 116
dkato 0:3e16bac28356 117 /** Get the size of a programable block
dkato 0:3e16bac28356 118 *
dkato 0:3e16bac28356 119 * @return Size of a programable block in bytes
dkato 0:3e16bac28356 120 */
dkato 0:3e16bac28356 121 virtual bd_size_t get_program_size() const;
dkato 0:3e16bac28356 122
dkato 0:3e16bac28356 123 /** Get the size of a eraseable block
dkato 0:3e16bac28356 124 *
dkato 0:3e16bac28356 125 * @return Size of a eraseable block in bytes
dkato 0:3e16bac28356 126 */
dkato 0:3e16bac28356 127 virtual bd_size_t get_erase_size() const;
dkato 0:3e16bac28356 128
dkato 0:3e16bac28356 129 /** Get the total size of the underlying device
dkato 0:3e16bac28356 130 *
dkato 0:3e16bac28356 131 * @return Size of the underlying device in bytes
dkato 0:3e16bac28356 132 */
dkato 0:3e16bac28356 133 virtual bd_size_t size() const;
dkato 0:3e16bac28356 134
dkato 0:3e16bac28356 135 private:
dkato 0:3e16bac28356 136 bd_size_t _read_size;
dkato 0:3e16bac28356 137 bd_size_t _program_size;
dkato 0:3e16bac28356 138 bd_size_t _erase_size;
dkato 0:3e16bac28356 139 bd_size_t _count;
dkato 0:3e16bac28356 140 uint8_t **_blocks;
dkato 0:3e16bac28356 141 uint32_t _rom_start;
dkato 0:3e16bac28356 142 uint32_t _rom_end;
dkato 0:3e16bac28356 143
dkato 0:3e16bac28356 144 bool isRomAddress(const uint8_t *address);
dkato 0:3e16bac28356 145 };
dkato 0:3e16bac28356 146
dkato 0:3e16bac28356 147
dkato 0:3e16bac28356 148 #endif