The wait in mci_WaitForEvent will delay all card transactions.
Fork of EALib by
SPIFI.h@9:da373a015d07, 2013-12-15 (annotated)
- 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?
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 |