t

Dependencies:   DM_FATFileSystem DM_HttpServer DM_USBHost EthernetInterface USBDevice mbed-rpc mbed-rtos

Fork of DMSupport by Embedded Artists

Revision:
0:6b68dac0d986
Child:
17:4ea2509445ac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Memory/InternalEEPROM.h	Fri Nov 21 11:42:51 2014 +0000
@@ -0,0 +1,114 @@
+/*
+ *  Copyright 2014 Embedded Artists AB
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+#ifndef INTERNAL_EEPROM_H
+#define INTERNAL_EEPROM_H
+
+#include "mbed.h"
+
+/**
+ * Internal EEPROM Example
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "InternalEEPROM.h"
+ *
+ * int main(void) {
+ *    InternalEEPROM mem;
+ *
+ *    err = SPIFI::instance().init();
+ *    if (err != SPIFI::Ok) {
+ *        printf("Failed to initialize SPIFI, error %d\n", err);
+ *    }
+ *    
+ *    // Write "Hello World!" into the first bytes of the SPIFI
+ *    char buff[20] = "Hello World!";
+ *    err = SPIFI::instance().program(0, strlen(buff)+1, buff, SPIFI::EraseAsRequired);
+ *    if (err != SPIFI::Ok) {
+ *        printf("Failed to write to SPIFI, error %d\n", err);
+ *    }
+ *
+ *    // Now verify that it can be read
+ *    if (memcmp((char*)SPIFI::SpifiMemBase, buff, strlen(buff)+1) == 0) {
+ *        printf("Readback from memory OK: '%s'\n", SPIFI::SpifiMemBase);
+ *    } else {
+ *        printf("Spifi does not contain the correct data!\n");
+ *    }
+ * }
+ * @endcode
+ */
+class InternalEEPROM {
+public:
+    
+    enum Constants {
+        EEPROM_MEMORY_SIZE = 4032,
+        EEPROM_PAGE_SIZE   =   64,
+        EEPROM_NUM_PAGES   = EEPROM_MEMORY_SIZE/EEPROM_PAGE_SIZE,
+    };
+  
+    InternalEEPROM();
+    ~InternalEEPROM();
+
+    /** Initializes the SPIFI ROM driver making the content of the external serial flash available
+     *
+     *  @returns
+     *       Ok on success
+     *       An error code on failure
+     */
+    void init();
+    
+    void powerDown();
+    
+    int read(uint32_t pageAddr, uint32_t pageOffset, uint8_t* data, uint32_t size);
+    int write(uint32_t pageAddr, uint32_t pageOffset, const uint8_t* data, uint32_t size);
+    void erasePage(uint32_t pageAddr);
+  
+    /** Returns the size (in bytes) of the internal EEPROM
+     *
+     *  @returns
+     *       The size in bytes
+     */
+    uint32_t memorySize() { return EEPROM_MEMORY_SIZE; }
+  
+    /** Returns the size of a page (in bytes) of the internal EEPROM
+     *
+     *  @returns
+     *       The page size in bytes
+     */
+    uint32_t pageSize() { return EEPROM_PAGE_SIZE; }
+  
+    /** Returns the number of pages in the internal EEPROM
+     *
+     *  @returns
+     *       The number of pages
+     */
+    uint32_t numPages() { return EEPROM_NUM_PAGES; }
+  
+private:
+
+    bool _initialized;
+    
+    void powerUp();
+    void clearInterrupt(uint32_t mask);
+    void waitForInterrupt(uint32_t mask);
+    void setAddr(uint32_t pageAddr, uint32_t pageOffset);
+    void setCmd(uint32_t cmd);
+    void readPage(uint32_t pageAddr, uint32_t pageOffset, uint8_t* buf, uint32_t size);
+    void writePage(uint32_t pageAddr, uint32_t pageOffset, const uint8_t* buf, uint32_t size);
+    void eraseOrProgramPage(uint32_t pageAddr);
+};
+
+#endif