The wait in mci_WaitForEvent will delay all card transactions.

Dependencies:   FATFileSystem

Fork of EALib by EmbeddedArtists AB

Committer:
dreschpe
Date:
Sun Dec 15 21:58:56 2013 +0000
Revision:
9:da373a015d07
Parent:
8:fe3cb3fbb64e
the wait in mci_WaitForEvent will delay all card transactions.

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