RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
Parent:
0:38ceb79fef03
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1 /* mbed Microcontroller Library
kevman 0:38ceb79fef03 2 * Copyright (c) 2017 ARM Limited
kevman 0:38ceb79fef03 3 *
kevman 0:38ceb79fef03 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
kevman 0:38ceb79fef03 5 * of this software and associated documentation files (the "Software"), to deal
kevman 0:38ceb79fef03 6 * in the Software without restriction, including without limitation the rights
kevman 0:38ceb79fef03 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
kevman 0:38ceb79fef03 8 * copies of the Software, and to permit persons to whom the Software is
kevman 0:38ceb79fef03 9 * furnished to do so, subject to the following conditions:
kevman 0:38ceb79fef03 10 *
kevman 0:38ceb79fef03 11 * The above copyright notice and this permission notice shall be included in
kevman 0:38ceb79fef03 12 * all copies or substantial portions of the Software.
kevman 0:38ceb79fef03 13 *
kevman 0:38ceb79fef03 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kevman 0:38ceb79fef03 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kevman 0:38ceb79fef03 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kevman 0:38ceb79fef03 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kevman 0:38ceb79fef03 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kevman 0:38ceb79fef03 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
kevman 0:38ceb79fef03 20 * SOFTWARE.
kevman 0:38ceb79fef03 21 */
kevman 0:38ceb79fef03 22 #ifndef MBED_MBR_BLOCK_DEVICE_H
kevman 0:38ceb79fef03 23 #define MBED_MBR_BLOCK_DEVICE_H
kevman 0:38ceb79fef03 24
kevman 0:38ceb79fef03 25 #include "BlockDevice.h"
kevman 0:38ceb79fef03 26
kevman 0:38ceb79fef03 27
kevman 0:38ceb79fef03 28 /** Additional error codes used for MBR records
kevman 0:38ceb79fef03 29 */
kevman 0:38ceb79fef03 30 enum {
kevman 0:38ceb79fef03 31 BD_ERROR_INVALID_MBR = -3101,
kevman 0:38ceb79fef03 32 BD_ERROR_INVALID_PARTITION = -3102,
kevman 0:38ceb79fef03 33 };
kevman 0:38ceb79fef03 34
kevman 0:38ceb79fef03 35
kevman 0:38ceb79fef03 36 /** Block device for managing a Master Boot Record
kevman 0:38ceb79fef03 37 * https://en.wikipedia.org/wiki/Master_boot_record
kevman 0:38ceb79fef03 38 *
kevman 0:38ceb79fef03 39 * Here is an example of partitioning a heap backed block device
kevman 0:38ceb79fef03 40 * @code
kevman 0:38ceb79fef03 41 * #include "mbed.h"
kevman 0:38ceb79fef03 42 * #include "HeapBlockDevice.h"
kevman 0:38ceb79fef03 43 * #include "MBRBlockDevice.h"
kevman 0:38ceb79fef03 44 *
kevman 0:38ceb79fef03 45 * // Create a block device with 64 blocks of size 512
kevman 0:38ceb79fef03 46 * HeapBlockDevice mem(64*512, 512);
kevman 0:38ceb79fef03 47 *
kevman 0:38ceb79fef03 48 * // Partition into two partitions with ~half the blocks
kevman 0:38ceb79fef03 49 * MBRBlockDevice::partition(&mem, 1, 0x83, 0*512, 32*512);
kevman 0:38ceb79fef03 50 * MBRBlockDevice::partition(&mem, 2, 0x83, 32*512);
kevman 0:38ceb79fef03 51 *
kevman 0:38ceb79fef03 52 * // Create a block device that maps to the first 32 blocks (excluding MBR block)
kevman 0:38ceb79fef03 53 * MBRBlockDevice part1(&mem, 1);
kevman 0:38ceb79fef03 54 *
kevman 0:38ceb79fef03 55 * // Create a block device that maps to the last 32 blocks
kevman 0:38ceb79fef03 56 * MBRBlockDevice part2(&mem, 2);
kevman 0:38ceb79fef03 57 * @endcode
kevman 0:38ceb79fef03 58 *
kevman 0:38ceb79fef03 59 * Here is a more realistic example where the MBRBlockDevice is used
kevman 0:38ceb79fef03 60 * to partition a region of space on an SD card. When plugged into a computer,
kevman 0:38ceb79fef03 61 * the partitions will be recognized appropriately.
kevman 0:38ceb79fef03 62 * @code
kevman 0:38ceb79fef03 63 * #include "mbed.h"
kevman 0:38ceb79fef03 64 * #include "SDBlockDevice.h"
kevman 0:38ceb79fef03 65 * #include "MBRBlockDevice.h"
kevman 0:38ceb79fef03 66 * #include "FATFileSystem.h"
kevman 0:38ceb79fef03 67 *
kevman 0:38ceb79fef03 68 * // Create an SD card
kevman 0:38ceb79fef03 69 * SDBlockDevice sd(s0, s1, s2, s3);
kevman 0:38ceb79fef03 70 *
kevman 0:38ceb79fef03 71 * // Create a partition with 1 GB of space
kevman 0:38ceb79fef03 72 * MBRBlockDevice::partition(&sd, 1, 0x83, 0, 1024*1024);
kevman 0:38ceb79fef03 73 *
kevman 0:38ceb79fef03 74 * // Create the block device that represents the partition
kevman 0:38ceb79fef03 75 * MBRBlockDevice part1(&sd, 1);
kevman 0:38ceb79fef03 76 *
kevman 0:38ceb79fef03 77 * // Format the partition with a FAT filesystem
kevman 0:38ceb79fef03 78 * FATFileSystem::format(&part1);
kevman 0:38ceb79fef03 79 *
kevman 0:38ceb79fef03 80 * // Create the FAT filesystem instance, files can now be written to
kevman 0:38ceb79fef03 81 * // the FAT filesystem in partition 1
kevman 0:38ceb79fef03 82 * FATFileSystem fat("fat", &part1);
kevman 0:38ceb79fef03 83 * @endcode
kevman 0:38ceb79fef03 84 *
kevman 0:38ceb79fef03 85 * @note
kevman 0:38ceb79fef03 86 * The MBR partition table is relatively limited:
kevman 0:38ceb79fef03 87 * - At most 4 partitions are supported
kevman 0:38ceb79fef03 88 * - Extended partitions are currently not supported and will error during init
kevman 0:38ceb79fef03 89 */
kevman 0:38ceb79fef03 90 class MBRBlockDevice : public BlockDevice
kevman 0:38ceb79fef03 91 {
kevman 0:38ceb79fef03 92 public:
kevman 0:38ceb79fef03 93 /** Format the MBR to contain the following partition
kevman 0:38ceb79fef03 94 *
kevman 0:38ceb79fef03 95 * @param bd Block device to partition
kevman 0:38ceb79fef03 96 * @param part Partition to use, 1-4
kevman 0:38ceb79fef03 97 * @param type 8-bit partition type to identitfy partition's contents
kevman 0:38ceb79fef03 98 * @param start Start block address to map to block 0 of partition,
kevman 0:38ceb79fef03 99 * negative addresses are calculated from the end of the
kevman 0:38ceb79fef03 100 * underlying block devices. Block 0 is implicitly ignored
kevman 0:38ceb79fef03 101 * from the range to store the MBR.
kevman 0:38ceb79fef03 102 * @return 0 on success or a negative error code on failure
kevman 0:38ceb79fef03 103 * @note This is the same as partition(bd, part, type, start, bd->size())
kevman 0:38ceb79fef03 104 */
kevman 0:38ceb79fef03 105 static int partition(BlockDevice *bd, int part, uint8_t type, bd_addr_t start);
kevman 0:38ceb79fef03 106
kevman 0:38ceb79fef03 107 /** Format the MBR to contain the following partition
kevman 0:38ceb79fef03 108 *
kevman 0:38ceb79fef03 109 * @param bd Block device to partition
kevman 0:38ceb79fef03 110 * @param part Partition to use, 1-4
kevman 0:38ceb79fef03 111 * @param type 8-bit partition type to identitfy partition's contents
kevman 0:38ceb79fef03 112 * @param start Start block address to map to block 0 of partition,
kevman 0:38ceb79fef03 113 * negative addresses are calculated from the end of the
kevman 0:38ceb79fef03 114 * underlying block devices. Block 0 is implicitly ignored
kevman 0:38ceb79fef03 115 * from the range to store the MBR.
kevman 0:38ceb79fef03 116 * @param stop End block address to mark the end of the partition,
kevman 0:38ceb79fef03 117 * this block is not mapped, negative addresses are calculated
kevman 0:38ceb79fef03 118 * from the end of the underlying block device.
kevman 0:38ceb79fef03 119 * @return 0 on success or a negative error code on failure
kevman 0:38ceb79fef03 120 */
kevman 0:38ceb79fef03 121 static int partition(BlockDevice *bd, int part, uint8_t type, bd_addr_t start, bd_addr_t stop);
kevman 0:38ceb79fef03 122
kevman 0:38ceb79fef03 123 /** Lifetime of the block device
kevman 0:38ceb79fef03 124 *
kevman 0:38ceb79fef03 125 * @param bd Block device to back the MBRBlockDevice
kevman 0:38ceb79fef03 126 * @param part Partition to use, 1-4
kevman 0:38ceb79fef03 127 */
kevman 0:38ceb79fef03 128 MBRBlockDevice(BlockDevice *bd, int part);
kevman 0:38ceb79fef03 129
kevman 0:38ceb79fef03 130 /** Lifetime of the block device
kevman 0:38ceb79fef03 131 */
kevman 0:38ceb79fef03 132 virtual ~MBRBlockDevice() {};
kevman 0:38ceb79fef03 133
kevman 0:38ceb79fef03 134 /** Initialize a block device
kevman 0:38ceb79fef03 135 *
kevman 0:38ceb79fef03 136 * @return 0 on success or a negative error code on failure
kevman 0:38ceb79fef03 137 */
kevman 0:38ceb79fef03 138 virtual int init();
kevman 0:38ceb79fef03 139
kevman 0:38ceb79fef03 140 /** Deinitialize a block device
kevman 0:38ceb79fef03 141 *
kevman 0:38ceb79fef03 142 * @return 0 on success or a negative error code on failure
kevman 0:38ceb79fef03 143 */
kevman 0:38ceb79fef03 144 virtual int deinit();
kevman 0:38ceb79fef03 145
kevman 0:38ceb79fef03 146 /** Ensure data on storage is in sync with the driver
kevman 0:38ceb79fef03 147 *
kevman 0:38ceb79fef03 148 * @return 0 on success or a negative error code on failure
kevman 0:38ceb79fef03 149 */
kevman 0:38ceb79fef03 150 virtual int sync();
kevman 0:38ceb79fef03 151
kevman 0:38ceb79fef03 152 /** Read blocks from a block device
kevman 0:38ceb79fef03 153 *
kevman 0:38ceb79fef03 154 * @param buffer Buffer to read blocks into
kevman 0:38ceb79fef03 155 * @param addr Address of block to begin reading from
kevman 0:38ceb79fef03 156 * @param size Size to read in bytes, must be a multiple of read block size
kevman 0:38ceb79fef03 157 * @return 0 on success, negative error code on failure
kevman 0:38ceb79fef03 158 */
kevman 0:38ceb79fef03 159 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
kevman 0:38ceb79fef03 160
kevman 0:38ceb79fef03 161 /** Program blocks to a block device
kevman 0:38ceb79fef03 162 *
kevman 0:38ceb79fef03 163 * The blocks must have been erased prior to being programmed
kevman 0:38ceb79fef03 164 *
kevman 0:38ceb79fef03 165 * @param buffer Buffer of data to write to blocks
kevman 0:38ceb79fef03 166 * @param addr Address of block to begin writing to
kevman 0:38ceb79fef03 167 * @param size Size to write in bytes, must be a multiple of program block size
kevman 0:38ceb79fef03 168 * @return 0 on success, negative error code on failure
kevman 0:38ceb79fef03 169 */
kevman 0:38ceb79fef03 170 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
kevman 0:38ceb79fef03 171
kevman 0:38ceb79fef03 172 /** Erase blocks on a block device
kevman 0:38ceb79fef03 173 *
kevman 0:38ceb79fef03 174 * The state of an erased block is undefined until it has been programmed,
kevman 0:38ceb79fef03 175 * unless get_erase_value returns a non-negative byte value
kevman 0:38ceb79fef03 176 *
kevman 0:38ceb79fef03 177 * @param addr Address of block to begin erasing
kevman 0:38ceb79fef03 178 * @param size Size to erase in bytes, must be a multiple of erase block size
kevman 0:38ceb79fef03 179 * @return 0 on success, negative error code on failure
kevman 0:38ceb79fef03 180 */
kevman 0:38ceb79fef03 181 virtual int erase(bd_addr_t addr, bd_size_t size);
kevman 0:38ceb79fef03 182
kevman 0:38ceb79fef03 183 /** Get the size of a readable block
kevman 0:38ceb79fef03 184 *
kevman 0:38ceb79fef03 185 * @return Size of a readable block in bytes
kevman 0:38ceb79fef03 186 */
kevman 0:38ceb79fef03 187 virtual bd_size_t get_read_size() const;
kevman 0:38ceb79fef03 188
kevman 0:38ceb79fef03 189 /** Get the size of a programmable block
kevman 0:38ceb79fef03 190 *
kevman 0:38ceb79fef03 191 * @return Size of a programmable block in bytes
kevman 0:38ceb79fef03 192 * @note Must be a multiple of the read size
kevman 0:38ceb79fef03 193 */
kevman 0:38ceb79fef03 194 virtual bd_size_t get_program_size() const;
kevman 0:38ceb79fef03 195
kevman 0:38ceb79fef03 196 /** Get the size of an erasable block
kevman 0:38ceb79fef03 197 *
kevman 0:38ceb79fef03 198 * @return Size of an erasable block in bytes
kevman 0:38ceb79fef03 199 * @note Must be a multiple of the program size
kevman 0:38ceb79fef03 200 */
kevman 0:38ceb79fef03 201 virtual bd_size_t get_erase_size() const;
kevman 0:38ceb79fef03 202
kevman 0:38ceb79fef03 203 /** Get the size of an erasable block given address
kevman 0:38ceb79fef03 204 *
kevman 0:38ceb79fef03 205 * @param addr Address within the erasable block
kevman 0:38ceb79fef03 206 * @return Size of an erasable block in bytes
kevman 0:38ceb79fef03 207 * @note Must be a multiple of the program size
kevman 0:38ceb79fef03 208 */
kevman 0:38ceb79fef03 209 virtual bd_size_t get_erase_size(bd_addr_t addr) const;
kevman 0:38ceb79fef03 210
kevman 0:38ceb79fef03 211 /** Get the value of storage when erased
kevman 0:38ceb79fef03 212 *
kevman 0:38ceb79fef03 213 * If get_erase_value returns a non-negative byte value, the underlying
kevman 0:38ceb79fef03 214 * storage is set to that value when erased, and storage containing
kevman 0:38ceb79fef03 215 * that value can be programmed without another erase.
kevman 0:38ceb79fef03 216 *
kevman 0:38ceb79fef03 217 * @return The value of storage when erased, or -1 if you can't
kevman 0:38ceb79fef03 218 * rely on the value of erased storage
kevman 0:38ceb79fef03 219 */
kevman 0:38ceb79fef03 220 virtual int get_erase_value() const;
kevman 0:38ceb79fef03 221
kevman 0:38ceb79fef03 222 /** Get the total size of the underlying device
kevman 0:38ceb79fef03 223 *
kevman 0:38ceb79fef03 224 * @return Size of the underlying device in bytes
kevman 0:38ceb79fef03 225 */
kevman 0:38ceb79fef03 226 virtual bd_size_t size() const;
kevman 0:38ceb79fef03 227
kevman 0:38ceb79fef03 228 /** Get the offset of the partition on the underlying block device
kevman 0:38ceb79fef03 229 * @return Offset of the partition on the underlying device
kevman 0:38ceb79fef03 230 */
kevman 0:38ceb79fef03 231 virtual bd_addr_t get_partition_start() const;
kevman 0:38ceb79fef03 232
kevman 0:38ceb79fef03 233 /** Get size of partition on underlying block device
kevman 0:38ceb79fef03 234 * @return Size of the partition on the underlying device
kevman 0:38ceb79fef03 235 */
kevman 0:38ceb79fef03 236 virtual bd_addr_t get_partition_stop() const;
kevman 0:38ceb79fef03 237
kevman 0:38ceb79fef03 238 /** Get 8-bit type of the partition
kevman 0:38ceb79fef03 239 * @return 8-bit type of partition assigned during format
kevman 0:38ceb79fef03 240 */
kevman 0:38ceb79fef03 241 virtual uint8_t get_partition_type() const;
kevman 0:38ceb79fef03 242
kevman 0:38ceb79fef03 243 /** Get the partition number
kevman 0:38ceb79fef03 244 * @return The partition number, 1-4
kevman 0:38ceb79fef03 245 */
kevman 0:38ceb79fef03 246 virtual int get_partition_number() const;
kevman 0:38ceb79fef03 247
kevman 0:38ceb79fef03 248 protected:
kevman 0:38ceb79fef03 249 BlockDevice *_bd;
kevman 0:38ceb79fef03 250 bd_size_t _offset;
kevman 0:38ceb79fef03 251 bd_size_t _size;
kevman 0:38ceb79fef03 252 uint8_t _type;
kevman 0:38ceb79fef03 253 uint8_t _part;
kevman 0:38ceb79fef03 254 uint32_t _init_ref_count;
kevman 0:38ceb79fef03 255 bool _is_initialized;
kevman 0:38ceb79fef03 256 };
kevman 0:38ceb79fef03 257
kevman 0:38ceb79fef03 258
kevman 0:38ceb79fef03 259 #endif