Mistake on this page?
Report an issue in GitHub or email us
HeapBlockDevice.h
1 /* mbed Microcontroller Library
2  * Copyright (c) 2017-2020 ARM Limited
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 /** \addtogroup storage */
19 /** @{*/
20 
21 #ifndef MBED_MEM_BLOCK_DEVICE_H
22 #define MBED_MEM_BLOCK_DEVICE_H
23 
24 #include "BlockDevice.h"
25 #include "platform/mbed_assert.h"
26 #include <string.h>
27 #include <stdlib.h>
28 
29 namespace mbed {
30 
31 /** Lazily allocated heap-backed block device
32  *
33  * Useful for simulating a block device and tests
34  *
35  * @code
36  * #include "mbed.h"
37  * #include "HeapBlockDevice.h"
38  *
39  * #define BLOCK_SIZE 512
40  *
41  * HeapBlockDevice bd(2048, BLOCK_SIZE); // 2048 bytes with a block size of 512 bytes
42  * uint8_t block[BLOCK_SIZE] = "Hello World!\n";
43  *
44  * int main() {
45  * bd.init();
46  * bd.erase(0, BLOCK_SIZE);
47  * bd.program(block, 0, BLOCK_SIZE);
48  * bd.read(block, 0, BLOCK_SIZE);
49  * printf("%s", block);
50  * bd.deinit();
51  * }
52  * @endcode
53  */
54 class HeapBlockDevice : public BlockDevice {
55 public:
56 
57  /** Lifetime of the memory block device
58  *
59  * @param size Size of the Block Device in bytes
60  * @param block Block size in bytes. Minimum read, program, and erase sizes are
61  * configured to this value
62  */
63  HeapBlockDevice(bd_size_t size, bd_size_t block = 512);
64  /** Lifetime of the memory block device
65  *
66  * @param size Size of the Block Device in bytes
67  * @param read Minimum read size required in bytes
68  * @param program Minimum program size required in bytes
69  * @param erase Minimum erase size required in bytes
70  */
71  HeapBlockDevice(bd_size_t size, bd_size_t read, bd_size_t program, bd_size_t erase);
72  virtual ~HeapBlockDevice();
73 
74  /** Initialize a block device
75  *
76  * @return 0 on success or a negative error code on failure
77  */
78  virtual int init();
79 
80  /** Deinitialize a block device
81  *
82  * @return 0 on success or a negative error code on failure
83  */
84  virtual int deinit();
85 
86  /** Read blocks from a block device
87  *
88  * @param buffer Buffer to read blocks into
89  * @param addr Address of block to begin reading from
90  * @param size Size to read in bytes, must be a multiple of read block size
91  * @return 0 on success, negative error code on failure
92  */
93  virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
94 
95  /** Program blocks to a block device
96  *
97  * The blocks must have been erased prior to being programmed
98  *
99  * @param buffer Buffer of data to write to blocks
100  * @param addr Address of block to begin writing to
101  * @param size Size to write in bytes, must be a multiple of program block size
102  * @return 0 on success, negative error code on failure
103  */
104  virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
105 
106  /** Erase blocks on a block device
107  *
108  * The state of an erased block is undefined until it has been programmed
109  *
110  * @param addr Address of block to begin erasing
111  * @param size Size to erase in bytes, must be a multiple of erase block size
112  * @return 0 on success, negative error code on failure
113  */
114  virtual int erase(bd_addr_t addr, bd_size_t size);
115 
116  /** Get the size of a readable block
117  *
118  * @return Size of a readable block in bytes
119  */
120  virtual bd_size_t get_read_size() const;
121 
122  /** Get the size of a programmable block
123  *
124  * @return Size of a programmable block in bytes
125  */
126  virtual bd_size_t get_program_size() const;
127 
128  /** Get the size of an erasable block
129  *
130  * @return Size of an erasable block in bytes
131  */
132  virtual bd_size_t get_erase_size() const;
133 
134  /** Get the size of an erasable block given address
135  *
136  * @param addr Address within the erasable block
137  * @return Size of an erasable block in bytes
138  * @note Must be a multiple of the program size
139  */
140  virtual bd_size_t get_erase_size(bd_addr_t addr) const;
141 
142  /** Get the total size of the underlying device
143  *
144  * @return Size of the underlying device in bytes
145  */
146  virtual bd_size_t size() const;
147 
148  /** Get the BlockDevice class type.
149  *
150  * @return A string represent the BlockDevice class type.
151  */
152  virtual const char *get_type() const;
153 
154 private:
155  bd_size_t _read_size;
156  bd_size_t _program_size;
157  bd_size_t _erase_size;
158  bd_size_t _count;
159  uint8_t **_blocks;
160  uint32_t _init_ref_count;
161  bool _is_initialized;
162 };
163 
164 } // namespace mbed
165 
166 // Added "using" for backwards compatibility
167 #ifndef MBED_NO_GLOBAL_USING_DIRECTIVE
169 #endif
170 
171 #endif
172 
173 /** @}*/
virtual int read(void *buffer, bd_addr_t addr, bd_size_t size)
Read blocks from a block device.
Lazily allocated heap-backed block device.
virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size)
Program blocks to a block device.
HeapBlockDevice(bd_size_t size, bd_size_t block=512)
Lifetime of the memory block device.
A hardware device capable of writing and reading blocks.
Definition: BlockDevice.h:48
virtual const char * get_type() const
Get the BlockDevice class type.
virtual int deinit()
Deinitialize a block device.
virtual int erase(bd_addr_t addr, bd_size_t size)
Erase blocks on a block device.
virtual bd_size_t get_program_size() const
Get the size of a programmable block.
virtual bd_size_t size() const
Get the total size of the underlying device.
virtual bd_size_t get_erase_size() const
Get the size of an erasable block.
virtual int init()
Initialize a block device.
virtual bd_size_t get_read_size() const
Get the size of a readable block.
Definition: ATHandler.h:46
Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.