The wait in mci_WaitForEvent will delay all card transactions.

Dependencies:   FATFileSystem

Fork of EALib by EmbeddedArtists AB

Committer:
embeddedartists
Date:
Wed Dec 11 12:16:40 2013 +0000
Revision:
8:fe3cb3fbb64e
Extracted SPIFI initialization code from QSPIFileSystem into new SPIFI class to allow spifi to be used without having to use the file system.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 8:fe3cb3fbb64e 1
embeddedartists 8:fe3cb3fbb64e 2 #ifndef SPIFI_H
embeddedartists 8:fe3cb3fbb64e 3 #define SPIFI_H
embeddedartists 8:fe3cb3fbb64e 4
embeddedartists 8:fe3cb3fbb64e 5 #include "mbed.h"
embeddedartists 8:fe3cb3fbb64e 6 #include "spifi_rom_api.h"
embeddedartists 8:fe3cb3fbb64e 7
embeddedartists 8:fe3cb3fbb64e 8 /**
embeddedartists 8:fe3cb3fbb64e 9 * SPIFI Example
embeddedartists 8:fe3cb3fbb64e 10 *
embeddedartists 8:fe3cb3fbb64e 11 * @code
embeddedartists 8:fe3cb3fbb64e 12 * #include "mbed.h"
embeddedartists 8:fe3cb3fbb64e 13 * #include "SPIFI.h"
embeddedartists 8:fe3cb3fbb64e 14 *
embeddedartists 8:fe3cb3fbb64e 15 * int main(void) {
embeddedartists 8:fe3cb3fbb64e 16 * SPIFI::SpifiError err;
embeddedartists 8:fe3cb3fbb64e 17 *
embeddedartists 8:fe3cb3fbb64e 18 * err = SPIFI::instance().init();
embeddedartists 8:fe3cb3fbb64e 19 * if (err != SPIFI::Ok) {
embeddedartists 8:fe3cb3fbb64e 20 * printf("Failed to initialize SPIFI, error %d\n", err);
embeddedartists 8:fe3cb3fbb64e 21 * }
embeddedartists 8:fe3cb3fbb64e 22 *
embeddedartists 8:fe3cb3fbb64e 23 * // Write "Hello World!" into the first bytes of the SPIFI
embeddedartists 8:fe3cb3fbb64e 24 * char buff[20] = "Hello World!";
embeddedartists 8:fe3cb3fbb64e 25 * err = SPIFI::instance().program(0, strlen(buff)+1, buff, SPIFI::EraseAsRequired);
embeddedartists 8:fe3cb3fbb64e 26 * if (err != SPIFI::Ok) {
embeddedartists 8:fe3cb3fbb64e 27 * printf("Failed to write to SPIFI, error %d\n", err);
embeddedartists 8:fe3cb3fbb64e 28 * }
embeddedartists 8:fe3cb3fbb64e 29 *
embeddedartists 8:fe3cb3fbb64e 30 * // Now verify that it can be read
embeddedartists 8:fe3cb3fbb64e 31 * if (memcmp((char*)SPIFI::SpifiMemBase, buff, strlen(buff)+1) == 0) {
embeddedartists 8:fe3cb3fbb64e 32 * printf("Readback from memory OK: '%s'\n", SPIFI::SpifiMemBase);
embeddedartists 8:fe3cb3fbb64e 33 * } else {
embeddedartists 8:fe3cb3fbb64e 34 * printf("Spifi does not contain the correct data!\n");
embeddedartists 8:fe3cb3fbb64e 35 * }
embeddedartists 8:fe3cb3fbb64e 36 * }
embeddedartists 8:fe3cb3fbb64e 37 * @endcode
embeddedartists 8:fe3cb3fbb64e 38 */
embeddedartists 8:fe3cb3fbb64e 39 class SPIFI {
embeddedartists 8:fe3cb3fbb64e 40 public:
embeddedartists 8:fe3cb3fbb64e 41
embeddedartists 8:fe3cb3fbb64e 42 enum Constants {
embeddedartists 8:fe3cb3fbb64e 43 SpifiMemBase = 0x28000000
embeddedartists 8:fe3cb3fbb64e 44 };
embeddedartists 8:fe3cb3fbb64e 45
embeddedartists 8:fe3cb3fbb64e 46 enum Options {
embeddedartists 8:fe3cb3fbb64e 47 ForceErase = (0<<2),
embeddedartists 8:fe3cb3fbb64e 48 EraseAsRequired = (1<<2),
embeddedartists 8:fe3cb3fbb64e 49 CallerErase = (1<<3)
embeddedartists 8:fe3cb3fbb64e 50 };
embeddedartists 8:fe3cb3fbb64e 51
embeddedartists 8:fe3cb3fbb64e 52 enum SpifiError {
embeddedartists 8:fe3cb3fbb64e 53 Ok = 0,
embeddedartists 8:fe3cb3fbb64e 54 Uninitialized = 1,
embeddedartists 8:fe3cb3fbb64e 55 Verification = 2,
embeddedartists 8:fe3cb3fbb64e 56 SameAddress = 3,
embeddedartists 8:fe3cb3fbb64e 57 UnknownError = 4,
embeddedartists 8:fe3cb3fbb64e 58 InternalError = 0x20002,
embeddedartists 8:fe3cb3fbb64e 59 Timeout = 0x20003,
embeddedartists 8:fe3cb3fbb64e 60 OperandError = 0x20004,
embeddedartists 8:fe3cb3fbb64e 61 Status = 0x20005,
embeddedartists 8:fe3cb3fbb64e 62 ExtDeviceId = 0x20006,
embeddedartists 8:fe3cb3fbb64e 63 DeviceId = 0x20007,
embeddedartists 8:fe3cb3fbb64e 64 DeviceType = 0x20008,
embeddedartists 8:fe3cb3fbb64e 65 Manufacturer = 0x20009,
embeddedartists 8:fe3cb3fbb64e 66 InvalidJDECId = 0x2000A,
embeddedartists 8:fe3cb3fbb64e 67 EraseConflict = 0x2000B,
embeddedartists 8:fe3cb3fbb64e 68 };
embeddedartists 8:fe3cb3fbb64e 69
embeddedartists 8:fe3cb3fbb64e 70 enum Device {
embeddedartists 8:fe3cb3fbb64e 71 Spansion_S25FL032, /* Manufacturer: 0x01, devType: 0x02, devID: 0x15 */
embeddedartists 8:fe3cb3fbb64e 72 Winbond_W25Q64FV, /* Manufacturer: 0xEF, devType: 0x40, devID: 0x17 */
embeddedartists 8:fe3cb3fbb64e 73 UnknownDevice
embeddedartists 8:fe3cb3fbb64e 74 };
embeddedartists 8:fe3cb3fbb64e 75
embeddedartists 8:fe3cb3fbb64e 76 static SPIFI& instance()
embeddedartists 8:fe3cb3fbb64e 77 {
embeddedartists 8:fe3cb3fbb64e 78 static SPIFI singleton;
embeddedartists 8:fe3cb3fbb64e 79 return singleton;
embeddedartists 8:fe3cb3fbb64e 80 }
embeddedartists 8:fe3cb3fbb64e 81
embeddedartists 8:fe3cb3fbb64e 82
embeddedartists 8:fe3cb3fbb64e 83 /** Initializes the SPIFI ROM driver making the content of the external serial flash available
embeddedartists 8:fe3cb3fbb64e 84 *
embeddedartists 8:fe3cb3fbb64e 85 * @returns
embeddedartists 8:fe3cb3fbb64e 86 * Ok on success
embeddedartists 8:fe3cb3fbb64e 87 * An error code on failure
embeddedartists 8:fe3cb3fbb64e 88 */
embeddedartists 8:fe3cb3fbb64e 89 SpifiError init();
embeddedartists 8:fe3cb3fbb64e 90
embeddedartists 8:fe3cb3fbb64e 91 /** Returns the detected external serial flash
embeddedartists 8:fe3cb3fbb64e 92 *
embeddedartists 8:fe3cb3fbb64e 93 * @returns
embeddedartists 8:fe3cb3fbb64e 94 * The detected device or UnknownDevice
embeddedartists 8:fe3cb3fbb64e 95 */
embeddedartists 8:fe3cb3fbb64e 96 Device device() { return _device; }
embeddedartists 8:fe3cb3fbb64e 97
embeddedartists 8:fe3cb3fbb64e 98 /** Returns the size (in bytes) of the external serial flash
embeddedartists 8:fe3cb3fbb64e 99 *
embeddedartists 8:fe3cb3fbb64e 100 * @returns
embeddedartists 8:fe3cb3fbb64e 101 * The size in bytes
embeddedartists 8:fe3cb3fbb64e 102 */
embeddedartists 8:fe3cb3fbb64e 103 uint32_t memorySize() { return _memorySize; }
embeddedartists 8:fe3cb3fbb64e 104
embeddedartists 8:fe3cb3fbb64e 105 /** Returns the size of an erase block (in bytes) on the external serial flash
embeddedartists 8:fe3cb3fbb64e 106 *
embeddedartists 8:fe3cb3fbb64e 107 * @returns
embeddedartists 8:fe3cb3fbb64e 108 * The erase block size in bytes
embeddedartists 8:fe3cb3fbb64e 109 */
embeddedartists 8:fe3cb3fbb64e 110 uint32_t eraseBlockSize() { return _eraseBlockSize; }
embeddedartists 8:fe3cb3fbb64e 111
embeddedartists 8:fe3cb3fbb64e 112 /** Returns the address where the verifcation failed. Use only after a Verification error code
embeddedartists 8:fe3cb3fbb64e 113 * has been retured from one of the other functions
embeddedartists 8:fe3cb3fbb64e 114 *
embeddedartists 8:fe3cb3fbb64e 115 * @returns
embeddedartists 8:fe3cb3fbb64e 116 * The address to where the program or erase operation failed
embeddedartists 8:fe3cb3fbb64e 117 */
embeddedartists 8:fe3cb3fbb64e 118 uint32_t getVerificationErrorAddr() { return _verError; }
embeddedartists 8:fe3cb3fbb64e 119
embeddedartists 8:fe3cb3fbb64e 120 /** Used by the QSPIFileSystem class to get access to all spifi internal data.
embeddedartists 8:fe3cb3fbb64e 121 *
embeddedartists 8:fe3cb3fbb64e 122 * @param initData The parameter returned by spifi_init
embeddedartists 8:fe3cb3fbb64e 123 * @param romPtr The location of the SPIFI ROM driver in memory
embeddedartists 8:fe3cb3fbb64e 124 */
embeddedartists 8:fe3cb3fbb64e 125 void internalData(SPIFIobj** initData, const SPIFI_RTNS** romPtr) { *initData = _romData; *romPtr = _spifi; }
embeddedartists 8:fe3cb3fbb64e 126
embeddedartists 8:fe3cb3fbb64e 127 /** Copies len data from src to dest. This function will split len > 256 into writes of 256 bytes each.
embeddedartists 8:fe3cb3fbb64e 128 *
embeddedartists 8:fe3cb3fbb64e 129 * Programming means that a bit can either be left at 0, or programmed from 1 to 0. Changing bits from 0 to 1 requires an erase operation.
embeddedartists 8:fe3cb3fbb64e 130 * While bits can be individually programmed from 1 to 0, erasing bits from 0 to 1 must be done in larger chunks (manufacturer dependant
embeddedartists 8:fe3cb3fbb64e 131 * but typically 4Kbyte to 64KByte at a time).
embeddedartists 8:fe3cb3fbb64e 132 *
embeddedartists 8:fe3cb3fbb64e 133 * Specify how/when erasing is done with the options parameter:
embeddedartists 8:fe3cb3fbb64e 134 *
embeddedartists 8:fe3cb3fbb64e 135 * - ForceErase causes len bytes to be erased starting at dest. If a scratch buffer (must be the size of an erase block) is
embeddedartists 8:fe3cb3fbb64e 136 * provided then only the len bytes will be erased. If no scratch buffer is provided then the erase block surrounding
embeddedartists 8:fe3cb3fbb64e 137 * dest will be erased.
embeddedartists 8:fe3cb3fbb64e 138 *
embeddedartists 8:fe3cb3fbb64e 139 * - EraseAsRequired tests if the destination can be written to without erasing. If it can then no erasing is done. If it
embeddedartists 8:fe3cb3fbb64e 140 * can't then behaviour is the same as if ForceErase was specified.
embeddedartists 8:fe3cb3fbb64e 141 *
embeddedartists 8:fe3cb3fbb64e 142 * - CallerErase tests if the destination can be written to without erasing. If it can then a data is written. If it
embeddedartists 8:fe3cb3fbb64e 143 * can't then an error code is returned and nothing is written.
embeddedartists 8:fe3cb3fbb64e 144 *
embeddedartists 8:fe3cb3fbb64e 145 * Scratch should be NULL or the address of an area of RAM that the SPIFI driver can use
embeddedartists 8:fe3cb3fbb64e 146 * to save data during erase operations. If provided, the scratch area should be as large
embeddedartists 8:fe3cb3fbb64e 147 * as the smallest erase size that is available throughout the serial flash device. If scratch
embeddedartists 8:fe3cb3fbb64e 148 * is NULL (zero) and an erase is necessary, any bytes in the first erase block before dest
embeddedartists 8:fe3cb3fbb64e 149 * are left in erased state (all ones), as are any bytes in the last erase block after dest + len
embeddedartists 8:fe3cb3fbb64e 150 *
embeddedartists 8:fe3cb3fbb64e 151 * @param dest Address to write to, highest byte must be 0x00 or 0x28 as in 0x28000000
embeddedartists 8:fe3cb3fbb64e 152 * @param len Number of bytes to write
embeddedartists 8:fe3cb3fbb64e 153 * @param src Data to write
embeddedartists 8:fe3cb3fbb64e 154 * @param options How to handle content of destination
embeddedartists 8:fe3cb3fbb64e 155 * @param verify Should all writes be verified or not
embeddedartists 8:fe3cb3fbb64e 156 * @param scratch Used with ForceErase and EraseAsRequired option to preserve content of flash outside of
embeddedartists 8:fe3cb3fbb64e 157 * written area. Size of buffer must be at least the size of one erase block.
embeddedartists 8:fe3cb3fbb64e 158 *
embeddedartists 8:fe3cb3fbb64e 159 * @returns
embeddedartists 8:fe3cb3fbb64e 160 * Ok on success
embeddedartists 8:fe3cb3fbb64e 161 * An error code on failure
embeddedartists 8:fe3cb3fbb64e 162 */
embeddedartists 8:fe3cb3fbb64e 163 SpifiError program(uint32_t dest, unsigned len, char* src, Options options, bool verify=false, char* scratch=NULL);
embeddedartists 8:fe3cb3fbb64e 164
embeddedartists 8:fe3cb3fbb64e 165 /** Erases the content of the memory at the specified address
embeddedartists 8:fe3cb3fbb64e 166 *
embeddedartists 8:fe3cb3fbb64e 167 * Scratch should be NULL or the address of an area of RAM that the SPIFI driver can use
embeddedartists 8:fe3cb3fbb64e 168 * to save data during erase operations. If provided, the scratch area should be as large
embeddedartists 8:fe3cb3fbb64e 169 * as the smallest erase size that is available throughout the serial flash device. If scratch
embeddedartists 8:fe3cb3fbb64e 170 * is NULL (zero) and an erase is necessary, any bytes in the first erase block before dest
embeddedartists 8:fe3cb3fbb64e 171 * are left in erased state (all ones), as are any bytes in the last erase block after dest + len
embeddedartists 8:fe3cb3fbb64e 172 *
embeddedartists 8:fe3cb3fbb64e 173 * @param dest Address to start erasing at, highest byte must be 0x00 or 0x28 as in 0x28000000
embeddedartists 8:fe3cb3fbb64e 174 * @param len Number of bytes to erase
embeddedartists 8:fe3cb3fbb64e 175 * @param verify Should the erased area be verified to make sure it is all 0xff
embeddedartists 8:fe3cb3fbb64e 176 * @param scratch Used to preserve content of flash outside of erased area.
embeddedartists 8:fe3cb3fbb64e 177 * Size of buffer must be at least the size of one erase block.
embeddedartists 8:fe3cb3fbb64e 178 *
embeddedartists 8:fe3cb3fbb64e 179 * @returns
embeddedartists 8:fe3cb3fbb64e 180 * Ok on success
embeddedartists 8:fe3cb3fbb64e 181 * An error code on failure
embeddedartists 8:fe3cb3fbb64e 182 */
embeddedartists 8:fe3cb3fbb64e 183 SpifiError erase(uint32_t dest, unsigned len, char* src, bool verify=false, char* scratch=NULL);
embeddedartists 8:fe3cb3fbb64e 184
embeddedartists 8:fe3cb3fbb64e 185
embeddedartists 8:fe3cb3fbb64e 186 private:
embeddedartists 8:fe3cb3fbb64e 187
embeddedartists 8:fe3cb3fbb64e 188 uint32_t _verError;
embeddedartists 8:fe3cb3fbb64e 189
embeddedartists 8:fe3cb3fbb64e 190 bool _initialized;
embeddedartists 8:fe3cb3fbb64e 191
embeddedartists 8:fe3cb3fbb64e 192 Device _device;
embeddedartists 8:fe3cb3fbb64e 193 uint32_t _memorySize;
embeddedartists 8:fe3cb3fbb64e 194 uint32_t _eraseBlockSize;
embeddedartists 8:fe3cb3fbb64e 195
embeddedartists 8:fe3cb3fbb64e 196 SPIFIobj* _romData;
embeddedartists 8:fe3cb3fbb64e 197 const SPIFI_RTNS* _spifi;
embeddedartists 8:fe3cb3fbb64e 198
embeddedartists 8:fe3cb3fbb64e 199 char _addrConflictBuff[256];
embeddedartists 8:fe3cb3fbb64e 200
embeddedartists 8:fe3cb3fbb64e 201 explicit SPIFI();
embeddedartists 8:fe3cb3fbb64e 202 // hide copy constructor
embeddedartists 8:fe3cb3fbb64e 203 SPIFI(const SPIFI&);
embeddedartists 8:fe3cb3fbb64e 204 // hide assign operator
embeddedartists 8:fe3cb3fbb64e 205 SPIFI& operator=(const SPIFI&);
embeddedartists 8:fe3cb3fbb64e 206 ~SPIFI();
embeddedartists 8:fe3cb3fbb64e 207
embeddedartists 8:fe3cb3fbb64e 208 SpifiError translateError(int err, bool verify = false);
embeddedartists 8:fe3cb3fbb64e 209 };
embeddedartists 8:fe3cb3fbb64e 210
embeddedartists 8:fe3cb3fbb64e 211 #endif
embeddedartists 8:fe3cb3fbb64e 212