RTC auf true

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 2:7aab896b1a3b 1 /* mbed Microcontroller Library
kevman 2:7aab896b1a3b 2 * Copyright (c) 2016 ARM Limited
kevman 2:7aab896b1a3b 3 *
kevman 2:7aab896b1a3b 4 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 2:7aab896b1a3b 5 * you may not use this file except in compliance with the License.
kevman 2:7aab896b1a3b 6 * You may obtain a copy of the License at
kevman 2:7aab896b1a3b 7 *
kevman 2:7aab896b1a3b 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 2:7aab896b1a3b 9 *
kevman 2:7aab896b1a3b 10 * Unless required by applicable law or agreed to in writing, software
kevman 2:7aab896b1a3b 11 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 2:7aab896b1a3b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 2:7aab896b1a3b 13 * See the License for the specific language governing permissions and
kevman 2:7aab896b1a3b 14 * limitations under the License.
kevman 2:7aab896b1a3b 15 */
kevman 2:7aab896b1a3b 16
kevman 2:7aab896b1a3b 17 #ifndef MBED_DATAFLASH_BLOCK_DEVICE_H
kevman 2:7aab896b1a3b 18 #define MBED_DATAFLASH_BLOCK_DEVICE_H
kevman 2:7aab896b1a3b 19
kevman 2:7aab896b1a3b 20 #include <mbed.h>
kevman 2:7aab896b1a3b 21 #include "BlockDevice.h"
kevman 2:7aab896b1a3b 22
kevman 2:7aab896b1a3b 23
kevman 2:7aab896b1a3b 24 /** BlockDevice for DataFlash flash devices
kevman 2:7aab896b1a3b 25 *
kevman 2:7aab896b1a3b 26 * @code
kevman 2:7aab896b1a3b 27 * // Here's an example using the AT45DB on the K64F
kevman 2:7aab896b1a3b 28 * #include "mbed.h"
kevman 2:7aab896b1a3b 29 * #include "DataFlashBlockDevice.h"
kevman 2:7aab896b1a3b 30 *
kevman 2:7aab896b1a3b 31 * // Create DataFlash on SPI bus with PTE5 as chip select
kevman 2:7aab896b1a3b 32 * DataFlashBlockDevice dataflash(PTE2, PTE4, PTE1, PTE5);
kevman 2:7aab896b1a3b 33 *
kevman 2:7aab896b1a3b 34 * // Create DataFlash on SPI bus with PTE6 as write-protect
kevman 2:7aab896b1a3b 35 * DataFlashBlockDevice dataflash2(PTE2, PTE4, PTE1, PTE5, PTE6);
kevman 2:7aab896b1a3b 36 *
kevman 2:7aab896b1a3b 37 * int main() {
kevman 2:7aab896b1a3b 38 * printf("dataflash test\n");
kevman 2:7aab896b1a3b 39 *
kevman 2:7aab896b1a3b 40 * // Initialize the SPI flash device and print the memory layout
kevman 2:7aab896b1a3b 41 * dataflash.init();
kevman 2:7aab896b1a3b 42 * printf("dataflash size: %llu\n", dataflash.size());
kevman 2:7aab896b1a3b 43 * printf("dataflash read size: %llu\n", dataflash.get_read_size());
kevman 2:7aab896b1a3b 44 * printf("dataflash program size: %llu\n", dataflash.get_program_size());
kevman 2:7aab896b1a3b 45 * printf("dataflash erase size: %llu\n", dataflash.get_erase_size());
kevman 2:7aab896b1a3b 46 *
kevman 2:7aab896b1a3b 47 * // Write "Hello World!" to the first block
kevman 2:7aab896b1a3b 48 * char *buffer = (char*)malloc(dataflash.get_erase_size());
kevman 2:7aab896b1a3b 49 * sprintf(buffer, "Hello World!\n");
kevman 2:7aab896b1a3b 50 * dataflash.erase(0, dataflash.get_erase_size());
kevman 2:7aab896b1a3b 51 * dataflash.program(buffer, 0, dataflash.get_erase_size());
kevman 2:7aab896b1a3b 52 *
kevman 2:7aab896b1a3b 53 * // Read back what was stored
kevman 2:7aab896b1a3b 54 * dataflash.read(buffer, 0, dataflash.get_erase_size());
kevman 2:7aab896b1a3b 55 * printf("%s", buffer);
kevman 2:7aab896b1a3b 56 *
kevman 2:7aab896b1a3b 57 * // Deinitialize the device
kevman 2:7aab896b1a3b 58 * dataflash.deinit();
kevman 2:7aab896b1a3b 59 * }
kevman 2:7aab896b1a3b 60 * @endcode
kevman 2:7aab896b1a3b 61 */
kevman 2:7aab896b1a3b 62 class DataFlashBlockDevice : public BlockDevice {
kevman 2:7aab896b1a3b 63 public:
kevman 2:7aab896b1a3b 64 /** Creates a DataFlashBlockDevice on a SPI bus specified by pins
kevman 2:7aab896b1a3b 65 *
kevman 2:7aab896b1a3b 66 * @param mosi SPI master out, slave in pin
kevman 2:7aab896b1a3b 67 * @param miso SPI master in, slave out pin
kevman 2:7aab896b1a3b 68 * @param sclk SPI clock pin
kevman 2:7aab896b1a3b 69 * @param csel SPI chip select pin
kevman 2:7aab896b1a3b 70 * @param nowp GPIO not-write-protect
kevman 2:7aab896b1a3b 71 * @param freq Clock speed of the SPI bus (defaults to 40MHz)
kevman 2:7aab896b1a3b 72 */
kevman 2:7aab896b1a3b 73 DataFlashBlockDevice(PinName mosi,
kevman 2:7aab896b1a3b 74 PinName miso,
kevman 2:7aab896b1a3b 75 PinName sclk,
kevman 2:7aab896b1a3b 76 PinName csel,
kevman 2:7aab896b1a3b 77 int freq = 40000000,
kevman 2:7aab896b1a3b 78 PinName nowp = NC);
kevman 2:7aab896b1a3b 79
kevman 2:7aab896b1a3b 80 /** Initialize a block device
kevman 2:7aab896b1a3b 81 *
kevman 2:7aab896b1a3b 82 * @return 0 on success or a negative error code on failure
kevman 2:7aab896b1a3b 83 */
kevman 2:7aab896b1a3b 84 virtual int init();
kevman 2:7aab896b1a3b 85
kevman 2:7aab896b1a3b 86 /** Deinitialize a block device
kevman 2:7aab896b1a3b 87 *
kevman 2:7aab896b1a3b 88 * @return 0 on success or a negative error code on failure
kevman 2:7aab896b1a3b 89 */
kevman 2:7aab896b1a3b 90 virtual int deinit();
kevman 2:7aab896b1a3b 91
kevman 2:7aab896b1a3b 92 /** Read blocks from a block device
kevman 2:7aab896b1a3b 93 *
kevman 2:7aab896b1a3b 94 * @param buffer Buffer to write blocks to
kevman 2:7aab896b1a3b 95 * @param addr Address of block to begin reading from
kevman 2:7aab896b1a3b 96 * @param size Size to read in bytes, must be a multiple of read block size
kevman 2:7aab896b1a3b 97 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 98 */
kevman 2:7aab896b1a3b 99 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
kevman 2:7aab896b1a3b 100
kevman 2:7aab896b1a3b 101 /** Program blocks to a block device
kevman 2:7aab896b1a3b 102 *
kevman 2:7aab896b1a3b 103 * The blocks must have been erased prior to being programmed
kevman 2:7aab896b1a3b 104 *
kevman 2:7aab896b1a3b 105 * @param buffer Buffer of data to write to blocks
kevman 2:7aab896b1a3b 106 * @param addr Address of block to begin writing to
kevman 2:7aab896b1a3b 107 * @param size Size to write in bytes, must be a multiple of program block size
kevman 2:7aab896b1a3b 108 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 109 */
kevman 2:7aab896b1a3b 110 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
kevman 2:7aab896b1a3b 111
kevman 2:7aab896b1a3b 112 /** Erase blocks on a block device
kevman 2:7aab896b1a3b 113 *
kevman 2:7aab896b1a3b 114 * The state of an erased block is undefined until it has been programmed
kevman 2:7aab896b1a3b 115 *
kevman 2:7aab896b1a3b 116 * @param addr Address of block to begin erasing
kevman 2:7aab896b1a3b 117 * @param size Size to erase in bytes, must be a multiple of erase block size
kevman 2:7aab896b1a3b 118 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 119 */
kevman 2:7aab896b1a3b 120 virtual int erase(bd_addr_t addr, bd_size_t size);
kevman 2:7aab896b1a3b 121
kevman 2:7aab896b1a3b 122 /** Get the size of a readable block
kevman 2:7aab896b1a3b 123 *
kevman 2:7aab896b1a3b 124 * @return Size of a readable block in bytes
kevman 2:7aab896b1a3b 125 */
kevman 2:7aab896b1a3b 126 virtual bd_size_t get_read_size() const;
kevman 2:7aab896b1a3b 127
kevman 2:7aab896b1a3b 128 /** Get the size of a programable block
kevman 2:7aab896b1a3b 129 *
kevman 2:7aab896b1a3b 130 * @return Size of a programable block in bytes
kevman 2:7aab896b1a3b 131 * @note Must be a multiple of the read size
kevman 2:7aab896b1a3b 132 */
kevman 2:7aab896b1a3b 133 virtual bd_size_t get_program_size() const;
kevman 2:7aab896b1a3b 134
kevman 2:7aab896b1a3b 135 /** Get the size of a eraseable block
kevman 2:7aab896b1a3b 136 *
kevman 2:7aab896b1a3b 137 * @return Size of a eraseable block in bytes
kevman 2:7aab896b1a3b 138 * @note Must be a multiple of the program size
kevman 2:7aab896b1a3b 139 */
kevman 2:7aab896b1a3b 140 virtual bd_size_t get_erase_size() const;
kevman 2:7aab896b1a3b 141
kevman 2:7aab896b1a3b 142 /** Get the size of an erasable block given address
kevman 2:7aab896b1a3b 143 *
kevman 2:7aab896b1a3b 144 * @param addr Address within the erasable block
kevman 2:7aab896b1a3b 145 * @return Size of an erasable block in bytes
kevman 2:7aab896b1a3b 146 * @note Must be a multiple of the program size
kevman 2:7aab896b1a3b 147 */
kevman 2:7aab896b1a3b 148 virtual bd_size_t get_erase_size(bd_addr_t addr) const;
kevman 2:7aab896b1a3b 149
kevman 2:7aab896b1a3b 150 /** Get the total size of the underlying device
kevman 2:7aab896b1a3b 151 *
kevman 2:7aab896b1a3b 152 * @return Size of the underlying device in bytes
kevman 2:7aab896b1a3b 153 */
kevman 2:7aab896b1a3b 154 virtual bd_size_t size() const;
kevman 2:7aab896b1a3b 155
kevman 2:7aab896b1a3b 156 private:
kevman 2:7aab896b1a3b 157 // Master side hardware
kevman 2:7aab896b1a3b 158 SPI _spi;
kevman 2:7aab896b1a3b 159 DigitalOut _cs;
kevman 2:7aab896b1a3b 160 DigitalOut _nwp;
kevman 2:7aab896b1a3b 161
kevman 2:7aab896b1a3b 162 // Device configuration
kevman 2:7aab896b1a3b 163 uint32_t _device_size;
kevman 2:7aab896b1a3b 164 uint16_t _page_size;
kevman 2:7aab896b1a3b 165 uint16_t _block_size;
kevman 2:7aab896b1a3b 166 bool _is_initialized;
kevman 2:7aab896b1a3b 167 uint32_t _init_ref_count;
kevman 2:7aab896b1a3b 168
kevman 2:7aab896b1a3b 169 // Internal functions
kevman 2:7aab896b1a3b 170 uint16_t _get_register(uint8_t opcode);
kevman 2:7aab896b1a3b 171 void _write_command(uint32_t command, const uint8_t *buffer, uint32_t size);
kevman 2:7aab896b1a3b 172 void _write_enable(bool enable);
kevman 2:7aab896b1a3b 173 int _sync(void);
kevman 2:7aab896b1a3b 174 int _write_page(const uint8_t *buffer, uint32_t addr, uint32_t offset, uint32_t size);
kevman 2:7aab896b1a3b 175 uint32_t _translate_address(bd_addr_t addr);
kevman 2:7aab896b1a3b 176
kevman 2:7aab896b1a3b 177 // Mutex for thread safety
kevman 2:7aab896b1a3b 178 mutable PlatformMutex _mutex;
kevman 2:7aab896b1a3b 179 };
kevman 2:7aab896b1a3b 180
kevman 2:7aab896b1a3b 181
kevman 2:7aab896b1a3b 182 #endif /* MBED_DATAFLASH_BLOCK_DEVICE_H */