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) 2018 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 #ifndef MBED_RSPIF_BLOCK_DEVICE_H
kevman 2:7aab896b1a3b 17 #define MBED_RSPIF_BLOCK_DEVICE_H
kevman 2:7aab896b1a3b 18
kevman 2:7aab896b1a3b 19 #include "SPI.h"
kevman 2:7aab896b1a3b 20 #include "DigitalOut.h"
kevman 2:7aab896b1a3b 21 #include "BlockDevice.h"
kevman 2:7aab896b1a3b 22
kevman 2:7aab896b1a3b 23 /** Reduced BlockDevice for SPI based flash devices
kevman 2:7aab896b1a3b 24 * *Should only be used by Boot Loader*
kevman 2:7aab896b1a3b 25 *
kevman 2:7aab896b1a3b 26 * @code
kevman 2:7aab896b1a3b 27 * // Here's an example using the SPI flash device on K82F
kevman 2:7aab896b1a3b 28 * #include "mbed.h"
kevman 2:7aab896b1a3b 29 * #include "SPIFReducedBlockDevice.h"
kevman 2:7aab896b1a3b 30 *
kevman 2:7aab896b1a3b 31 * // Create flash device on SPI bus with PTE5 as chip select
kevman 2:7aab896b1a3b 32 * SPIFReducedBlockDevice rspif(PTE2, PTE4, PTE1, PTE5);
kevman 2:7aab896b1a3b 33 *
kevman 2:7aab896b1a3b 34 * int main() {
kevman 2:7aab896b1a3b 35 * printf("reduced spif test\n");
kevman 2:7aab896b1a3b 36 *
kevman 2:7aab896b1a3b 37 * // Initialize the Reduced SPI flash device and print the memory layout
kevman 2:7aab896b1a3b 38 * rspif.init();
kevman 2:7aab896b1a3b 39 * printf("rspif size: %llu\n", rspif.size());
kevman 2:7aab896b1a3b 40 * printf("rspif read size: %llu\n", rspif.get_read_size());
kevman 2:7aab896b1a3b 41 * printf("rspif program size: %llu\n", rspif.get_program_size());
kevman 2:7aab896b1a3b 42 * printf("rspif erase size: %llu\n", rspif.get_erase_size());
kevman 2:7aab896b1a3b 43 *
kevman 2:7aab896b1a3b 44 * // Write "Hello World!" to the first block
kevman 2:7aab896b1a3b 45 * char *buffer = (char*)malloc(rspif.get_erase_size());
kevman 2:7aab896b1a3b 46 * sprintf(buffer, "Hello World!\n");
kevman 2:7aab896b1a3b 47 * rspif.erase(0, rspif.get_erase_size());
kevman 2:7aab896b1a3b 48 * rspif.program(buffer, 0, rspif.get_erase_size());
kevman 2:7aab896b1a3b 49 *
kevman 2:7aab896b1a3b 50 * // Read back what was stored
kevman 2:7aab896b1a3b 51 * rspif.read(buffer, 0, rspif.get_erase_size());
kevman 2:7aab896b1a3b 52 * printf("%s", buffer);
kevman 2:7aab896b1a3b 53 *
kevman 2:7aab896b1a3b 54 * // Deinitialize the device
kevman 2:7aab896b1a3b 55 * rspif.deinit();
kevman 2:7aab896b1a3b 56 * }
kevman 2:7aab896b1a3b 57 * @endcode
kevman 2:7aab896b1a3b 58 */
kevman 2:7aab896b1a3b 59 class SPIFReducedBlockDevice : public BlockDevice {
kevman 2:7aab896b1a3b 60 public:
kevman 2:7aab896b1a3b 61 /** Creates a SPIFReducedBlockDevice on a SPI bus specified by pins
kevman 2:7aab896b1a3b 62 *
kevman 2:7aab896b1a3b 63 * @param mosi SPI master out, slave in pin
kevman 2:7aab896b1a3b 64 * @param miso SPI master in, slave out pin
kevman 2:7aab896b1a3b 65 * @param sclk SPI clock pin
kevman 2:7aab896b1a3b 66 * @param csel SPI chip select pin
kevman 2:7aab896b1a3b 67 * @param freq Clock speed of the SPI bus (defaults to 40MHz)
kevman 2:7aab896b1a3b 68 */
kevman 2:7aab896b1a3b 69 SPIFReducedBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName csel, int freq = 40000000);
kevman 2:7aab896b1a3b 70
kevman 2:7aab896b1a3b 71 /** Initialize a block device
kevman 2:7aab896b1a3b 72 *
kevman 2:7aab896b1a3b 73 * @return 0 on success or a negative error code on failure
kevman 2:7aab896b1a3b 74 */
kevman 2:7aab896b1a3b 75 virtual int init();
kevman 2:7aab896b1a3b 76
kevman 2:7aab896b1a3b 77 /** Deinitialize a block device
kevman 2:7aab896b1a3b 78 *
kevman 2:7aab896b1a3b 79 * @return 0 on success or a negative error code on failure
kevman 2:7aab896b1a3b 80 */
kevman 2:7aab896b1a3b 81 virtual int deinit();
kevman 2:7aab896b1a3b 82
kevman 2:7aab896b1a3b 83 /** Read blocks from a block device
kevman 2:7aab896b1a3b 84 *
kevman 2:7aab896b1a3b 85 * @param buffer Buffer to write blocks to
kevman 2:7aab896b1a3b 86 * @param addr Address of block to begin reading from
kevman 2:7aab896b1a3b 87 * @param size Size to read in bytes, must be a multiple of read block size
kevman 2:7aab896b1a3b 88 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 89 */
kevman 2:7aab896b1a3b 90 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
kevman 2:7aab896b1a3b 91
kevman 2:7aab896b1a3b 92 /** Program blocks to a block device
kevman 2:7aab896b1a3b 93 *
kevman 2:7aab896b1a3b 94 * The blocks must have been erased prior to being programmed
kevman 2:7aab896b1a3b 95 *
kevman 2:7aab896b1a3b 96 * @param buffer Buffer of data to write to blocks
kevman 2:7aab896b1a3b 97 * @param addr Address of block to begin writing to
kevman 2:7aab896b1a3b 98 * @param size Size to write in bytes, must be a multiple of program block size
kevman 2:7aab896b1a3b 99 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 100 */
kevman 2:7aab896b1a3b 101 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
kevman 2:7aab896b1a3b 102
kevman 2:7aab896b1a3b 103 /** Erase blocks on a block device
kevman 2:7aab896b1a3b 104 *
kevman 2:7aab896b1a3b 105 * The state of an erased block is undefined until it has been programmed
kevman 2:7aab896b1a3b 106 *
kevman 2:7aab896b1a3b 107 * @param addr Address of block to begin erasing
kevman 2:7aab896b1a3b 108 * @param size Size to erase in bytes, must be a multiple of erase block size
kevman 2:7aab896b1a3b 109 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 110 */
kevman 2:7aab896b1a3b 111 virtual int erase(bd_addr_t addr, bd_size_t size);
kevman 2:7aab896b1a3b 112
kevman 2:7aab896b1a3b 113 /** Get the size of a readable block
kevman 2:7aab896b1a3b 114 *
kevman 2:7aab896b1a3b 115 * @return Size of a readable block in bytes
kevman 2:7aab896b1a3b 116 */
kevman 2:7aab896b1a3b 117 virtual bd_size_t get_read_size() const;
kevman 2:7aab896b1a3b 118
kevman 2:7aab896b1a3b 119 /** Get the size of a programable block
kevman 2:7aab896b1a3b 120 *
kevman 2:7aab896b1a3b 121 * @return Size of a programable block in bytes
kevman 2:7aab896b1a3b 122 * @note Must be a multiple of the read size
kevman 2:7aab896b1a3b 123 */
kevman 2:7aab896b1a3b 124 virtual bd_size_t get_program_size() const;
kevman 2:7aab896b1a3b 125
kevman 2:7aab896b1a3b 126 /** Get the size of a eraseable block
kevman 2:7aab896b1a3b 127 *
kevman 2:7aab896b1a3b 128 * @return Size of a eraseable block in bytes
kevman 2:7aab896b1a3b 129 * @note Must be a multiple of the program size
kevman 2:7aab896b1a3b 130 */
kevman 2:7aab896b1a3b 131 virtual bd_size_t get_erase_size() const;
kevman 2:7aab896b1a3b 132
kevman 2:7aab896b1a3b 133 /** Get the size of a eraseable block
kevman 2:7aab896b1a3b 134 *
kevman 2:7aab896b1a3b 135 * @param addr Address of block to query erase size
kevman 2:7aab896b1a3b 136 * @return Size of a eraseable block in bytes
kevman 2:7aab896b1a3b 137 * @note Must be a multiple of the program size
kevman 2:7aab896b1a3b 138 */
kevman 2:7aab896b1a3b 139 virtual bd_size_t get_erase_size(bd_addr_t addr) const;
kevman 2:7aab896b1a3b 140
kevman 2:7aab896b1a3b 141 /** Get the value of storage byte after it was erased
kevman 2:7aab896b1a3b 142 *
kevman 2:7aab896b1a3b 143 * If get_erase_value returns a non-negative byte value, the underlying
kevman 2:7aab896b1a3b 144 * storage is set to that value when erased, and storage containing
kevman 2:7aab896b1a3b 145 * that value can be programmed without another erase.
kevman 2:7aab896b1a3b 146 *
kevman 2:7aab896b1a3b 147 * @return The value of storage when erased, or -1 if you can't
kevman 2:7aab896b1a3b 148 * rely on the value of erased storage
kevman 2:7aab896b1a3b 149 */
kevman 2:7aab896b1a3b 150 virtual int get_erase_value() const;
kevman 2:7aab896b1a3b 151
kevman 2:7aab896b1a3b 152 /** Get the total size of the underlying device
kevman 2:7aab896b1a3b 153 *
kevman 2:7aab896b1a3b 154 * @return Size of the underlying device in bytes
kevman 2:7aab896b1a3b 155 */
kevman 2:7aab896b1a3b 156 virtual bd_size_t size() const;
kevman 2:7aab896b1a3b 157
kevman 2:7aab896b1a3b 158 private:
kevman 2:7aab896b1a3b 159 // Master side hardware
kevman 2:7aab896b1a3b 160 mbed::SPI _spi;
kevman 2:7aab896b1a3b 161 mbed::DigitalOut _cs;
kevman 2:7aab896b1a3b 162
kevman 2:7aab896b1a3b 163 // Device configuration discovered through sfdp
kevman 2:7aab896b1a3b 164 bd_size_t _size;
kevman 2:7aab896b1a3b 165
kevman 2:7aab896b1a3b 166 // Internal functions
kevman 2:7aab896b1a3b 167 int _wren();
kevman 2:7aab896b1a3b 168 int _sync();
kevman 2:7aab896b1a3b 169 void _cmdread(uint8_t op, uint32_t addrc, uint32_t retc,
kevman 2:7aab896b1a3b 170 uint32_t addr, uint8_t *rets);
kevman 2:7aab896b1a3b 171 void _cmdwrite(uint8_t op, uint32_t addrc, uint32_t argc,
kevman 2:7aab896b1a3b 172 uint32_t addr, const uint8_t *args);
kevman 2:7aab896b1a3b 173 };
kevman 2:7aab896b1a3b 174 #endif