t

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

Fork of DMSupport by Embedded Artists

Revision:
0:6b68dac0d986
Child:
2:887c6b45e7fa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DMBoard.cpp	Fri Nov 21 11:42:51 2014 +0000
@@ -0,0 +1,275 @@
+/*
+ *  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.
+ */
+
+#include "mbed.h"
+#include "DMBoard.h"
+#include "InternalEEPROM.h"
+
+#if defined(DM_BOARD_USE_TOUCH)
+  #include "AR1021.h"
+#endif
+
+/******************************************************************************
+ * Defines and typedefs
+ *****************************************************************************/
+
+/******************************************************************************
+ * Local variables
+ *****************************************************************************/
+
+/******************************************************************************
+ * Private Functions
+ *****************************************************************************/
+
+DMBoard::DMBoard() : 
+    _initialized(false),
+#if defined(DM_BOARD_USE_MCI_FS)
+    _mcifs("mci", P4_16),
+#endif
+#if defined(DM_BOARD_USE_QSPI_FS)
+    _qspifs("qspi"),
+#endif
+#if defined(DM_BOARD_USE_TOUCH)
+    _touch(NULL),
+#endif
+    _buzzer(P1_5),
+    _button(p23),
+    _led1(LED1),
+    _led2(LED2),
+    _led3(LED3),
+    _led4(LED4)
+{
+}
+
+DMBoard::~DMBoard()
+{
+  if (_touch != NULL) {
+    delete _touch;
+    _touch = NULL;
+  }
+}
+
+DMBoard::BoardError DMBoard::readConfiguration()
+{
+  InternalEEPROM mem;
+  mem.init();
+  
+  uint8_t* buff = (uint8_t*)malloc(mem.memorySize());
+  mem.read(0, 0, buff, mem.memorySize());
+  mem.powerDown();
+#if 0  
+  uint8_t* p = buff;
+  printf("\n-------\nBEFORE:\n-------\n");
+  for (int i = 0; i < 63; i++) {
+    for (int j = 0; j < 4; j++) {
+      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;
+    }
+    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) {
+      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;
+      printf("\n-------\nAFTER:\n-------\n");
+      for (int i = 0; i < 63; i++) {
+        for (int j = 0; j < 4; j++) {
+          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;
+        }
+        printf("\n");
+      }
+      break;
+    }
+  }  
+#endif
+  return Ok;
+}
+
+#if defined(DM_BOARD_USE_DISPLAY)
+DMBoard::BoardError DMBoard::readDisplayConfiguration(uint8_t** data, uint32_t* size)
+{
+  uint32_t allocsize = 17*sizeof(uint32_t);
+  uint32_t* stuff = (uint32_t*)malloc(allocsize);
+  if (stuff == NULL) {
+    return MemoryError;
+  }
+#if defined(DM_BOARD_USE_4_3_DISPLAY_TMP)
+  // Temporary setup, for a 4.3" display
+
+  stuff[ 0] = 40,    //horizontalBackPorch == HSYNC back porch
+  stuff[ 1] = 5,     //horizontalFrontPorch == HSYNC front porch
+  stuff[ 2] = 2,     //hsync  ==  HSYNC width
+  stuff[ 3] = 480,   //width == Horizontal active area
+  stuff[ 4] = 8,     //verticalBackPorch == VSYNC back porch
+  stuff[ 5] = 8,     //verticalFrontPorch == VSYNC front porch
+  stuff[ 6] = 2,     //vsync == VSYNC width
+  stuff[ 7] = 272,   //height == Vertical display area
+  stuff[ 8] = false,
+  stuff[ 9] = false,
+  stuff[10] = true,
+  stuff[11] = true,
+  stuff[12] = 1,
+  stuff[13] = Display::Resolution_16bit_rgb565;
+  stuff[14] = 9000000, //clock or 0 for external
+  stuff[15] = 0,       //LcdController::Tft,
+  stuff[16] = false;
+#else
+  // Temporary setup, for a 5" rogin display
+
+  stuff[ 0] = 46,    //horizontalBackPorch == HSYNC back porch
+  stuff[ 1] = 20,    //horizontalFrontPorch == HSYNC front porch
+  stuff[ 2] = 2,     //hsync  ==  HSYNC width
+  stuff[ 3] = 800,   //width == Horizontal active area
+  stuff[ 4] = 23,    //verticalBackPorch == VSYNC back porch
+  stuff[ 5] = 10,    //verticalFrontPorch == VSYNC front porch
+  stuff[ 6] = 3,     //vsync == VSYNC width
+  stuff[ 7] = 480,   //height == Vertical display area
+  stuff[ 8] = false,
+  stuff[ 9] = false,
+  stuff[10] = true,
+  stuff[11] = true,
+  stuff[12] = 1,
+  stuff[13] = Display::Resolution_16bit_rgb565;
+  stuff[14] = 30000000, //clock or 0 for external
+  stuff[15] = 0,        //LcdController::Tft,
+  stuff[16] = false;
+#endif  
+  *data = (uint8_t*)&(stuff[0]);
+  *size = allocsize;
+
+  return Ok;
+}
+#endif
+
+/******************************************************************************
+ * Public Functions
+ *****************************************************************************/
+
+DMBoard::BoardError DMBoard::init()
+{
+  BoardError err = Ok;
+  if (!_initialized) {
+    do {
+      // Turn off the buzzer
+      _buzzer.period_ms(1);
+      _buzzer = 0;
+      
+      // Make sure the button is configured correctly
+      _button.mode(PullUp);
+    
+      // Turn off all LEDs
+      _led1 = 1;
+      _led2 = 1;
+      _led3 = 0;
+      _led4 = 0;
+
+#if defined(DM_BOARD_USE_QSPI) && !defined(DM_BOARD_USE_QSPI_FS)
+      if (SPIFI::instance().init() != SPIFI::Ok) {
+        err = SpifiError;
+        break;
+      }
+#endif
+      
+#if defined(DM_BOARD_USE_FAST_UART)
+      // This works because both the default serial (used by printf) and the s instance
+      // (used by s.printf) would use the same underlying UART code so setting the baudrate
+      // in one affects the other.
+      Serial s(USBTX, USBRX);
+      s.baud(115200);
+#endif
+
+      readConfiguration();
+      
+#if defined(DM_BOARD_USE_DISPLAY)
+      if (Display::instance().init() != Display::Ok) {
+        err = DisplayError;
+        break;
+      }
+#endif
+      
+#if defined(DM_BOARD_USE_TOUCH)
+      //if (... configuration says AR1021...) {
+        _touch = new AR1021(P2_27, P2_26, P2_22, P2_23, P2_25);
+        if (!_touch->init(Display::instance().width(), Display::instance().height())) {
+          err = TouchError;
+          break;
+        }
+      //}
+#endif
+
+      
+      _initialized = true;
+    } while(0);
+  }
+  return err;
+}
+
+void DMBoard::setLED(int led, bool on)
+{
+  switch(led) {
+    case 1:
+      _led1 = (on ? 0 : 1);
+      break;
+    case 2:
+      _led2 = (on ? 0 : 1);
+      break;
+    case 3:
+      _led3 = (on ? 1 : 0);
+      break;
+    case 4:
+      _led4 = (on ? 1 : 0);
+      break;
+  }
+}
+
+void DMBoard::buzzer(float value)
+{
+  if (value < 0) {
+    value = 0;
+  } else if (value > 1) {
+    value = 1;
+  }
+  _buzzer = value;
+}
+
+bool DMBoard::buttonPressed()
+{ 
+  return _button.read() == 0;
+}
+