Subdirectory provided by Embedded Artists

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

Dependents:   lpc4088_displaymodule_hello_world_Sept_2018

Fork of DMSupport by Embedded Artists

Revision:
17:4ea2509445ac
Parent:
13:2c60e28503f8
Child:
20:9df19da50290
--- a/DMBoard.cpp	Fri Jan 02 14:17:03 2015 +0000
+++ b/DMBoard.cpp	Wed Jan 07 14:02:39 2015 +0100
@@ -16,7 +16,7 @@
 
 #include "mbed.h"
 #include "DMBoard.h"
-#include "InternalEEPROM.h"
+#include "BiosEEPROM.h"
 #include "bios.h"
 #include "crc.h"
 
@@ -59,6 +59,17 @@
 static DevNull null("null");
 #endif
 
+/*
+ * Make sure that we reserve at least this amount of RAM for future
+ * expansion of the BIOS. This prevents the user from squeezing out
+ * the last drop of available RAM in his application.
+ */
+#define BIOS_RESERVED_CHUNK  0x1000
+#define BIOS_MAX_SIZE        0x100000
+#ifndef MAX
+  #define MAX(__a, __b) (((__a)>(__b))?(__a):(__b))
+#endif
+
 /******************************************************************************
  * Local variables
  *****************************************************************************/
@@ -94,108 +105,71 @@
   }
 }
 
-DMBoard::BoardError DMBoard::readConfiguration()
-{
-  if (_conf == NULL) {
-    InternalEEPROM mem;
-    mem.init();
-    
-    _confSize = mem.memorySize();
-    _conf = (uint8_t*)malloc(_confSize);
-    if (_conf == NULL) {
-      _confSize = 0;
-      return MemoryError;
-    }
-    mem.read(0, 0, _conf, _confSize);
-    mem.powerDown();
-  }
-#if 0  
-  uint8_t* p = buff;
-  _logger.printf("\n-------\nBEFORE:\n-------\n");
-  for (int i = 0; i < 63; i++) {
-    for (int j = 0; j < 4; j++) {
-      _logger.printf("0x%04x  %02x %02x %02x %02x %02x %02x %02x %02x  %02x %02x %02x %02x %02x %02x %02x %02x\n",
-        i,
-        p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],
-        p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]);
-      p += 16;
-    }
-    _logger.printf("\n");
-  }
-  
-  // find first non-zero page and write to that
-  for (int page = 0; page < mem.numPages(); page++) {
-    bool zeroPage = true;
-    for (int i = 0; i < mem.pageSize(); i++) {
-      if (buff[i + page*mem.pageSize()] != 0) {
-        zeroPage = false;
-        break;
-      }
-    }
-    if (zeroPage) {
-      _logger.printf("Will fill page 0x%04x (%d) with 0x00..0x3f\n", page, page);
-      p = buff;
-      for (int i = 0; i < mem.pageSize(); i++) {
-        *p++ = i;
-      }
-      mem.write(page, 0, buff, mem.pageSize());
-      memset(buff, 0, mem.memorySize());
-      mem.read(0, 0, buff, mem.memorySize());
-      p = buff;
-      _logger.printf("\n-------\nAFTER:\n-------\n");
-      for (int i = 0; i < 63; i++) {
-        for (int j = 0; j < 4; j++) {
-          _logger.printf("0x%04x  %02x %02x %02x %02x %02x %02x %02x %02x  %02x %02x %02x %02x %02x %02x %02x %02x\n",
-            i,
-            p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],
-            p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]);
-          p += 16;
-        }
-        _logger.printf("\n");
-      }
-      break;
-    }
-  }  
-#endif
-  return Ok;
-}
-
 #if defined(DM_BOARD_USE_DISPLAY)
 DMBoard::BoardError DMBoard::readDisplayConfiguration(uint8_t** data, uint32_t* size)
 {
-  BoardError err = readConfiguration();
+  BoardError err = Ok;
+  BiosEEPROM eeprom;
+  file_header_t fh;
+
+  if (_conf != NULL) {
+    *data = _conf;
+    *size = _confSize;
+    return Ok;
+  }      
   do {
-    if (err != Ok) {
+    if (!eeprom.read(0, (char*)&fh, sizeof(file_header_t))) {
+      err = BiosStorageError;
       break;
     }
     
-    file_header_t* fh = (file_header_t*)_conf;
-    if (fh->magic != BIOS_MAGIC) {
+    if (fh.magic != BIOS_MAGIC) {
       err = BiosInvalidError;
       break;
     }
     
-    if (fh->version != BIOS_VER) {
+    if (fh.version != BIOS_VER) {
       err = BiosVersionError;
       break;
     }
     
-    if ((fh->headerSize + fh->size) > _confSize) {
+    if ((fh.headerSize + fh.size) > BIOS_MAX_SIZE) {
       err = BiosInvalidError;
       break;
     }
     
-    uint32_t crc = crc_Buffer((uint32_t*)(&_conf[fh->headerSize]), fh->size/4);
-    if (crc != fh->crc) {
+    _confSize = fh.headerSize + fh.size;
+    _conf = (uint8_t*)malloc(MAX(_confSize,BIOS_RESERVED_CHUNK));
+    if (_conf == NULL) {
+      _confSize = 0;
+      err = MemoryError;
+      break;
+    }
+    
+    if (!eeprom.read(0, (char*)_conf, _confSize)) {
+      err = BiosStorageError;
+      break;
+    }
+    
+    uint32_t crc = crc_Buffer((uint32_t*)(&_conf[fh.headerSize]), fh.size/4);
+    if (crc != fh.crc) {
       err = BiosInvalidError;
       break;
     }
     
     // Bios header has been verified and seems ok
     *data = _conf;
-    *size = fh->headerSize + fh->size;
+    *size = _confSize;
     err = Ok;
   } while (false);
+  
+  if (err != Ok) {
+    if (_conf != NULL) {
+      free(_conf);
+      _conf = NULL;
+      _confSize = 0;
+    }
+  }
 
   return err;
 }
@@ -245,8 +219,6 @@
       }
 #endif
       
-      readConfiguration();
-      
 #if defined(DM_BOARD_USE_DISPLAY)
       if (BiosDisplayAndTouch::instance().initDisplay() != Display::DisplayError_Ok) {
         err = DisplayError;