The wait in mci_WaitForEvent will delay all card transactions.
Fork of EALib by
SPIFI.h@8:fe3cb3fbb64e, 2013-12-11 (annotated)
- 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?
User | Revision | Line number | New 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 |