Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DM_FATFileSystem EthernetInterface HTTPClient mbed-rtos mbed-src
Fork of DMSupport by
Diff: DMBoard.cpp
- Revision:
- 0:6b68dac0d986
- Child:
- 2:887c6b45e7fa
diff -r 000000000000 -r 6b68dac0d986 DMBoard.cpp
--- /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;
+}
+
