Shows how to use a display, the onboard SD Card and the onboard SPI Flash. Requires a display module with direct Arduino pinning

Dependencies:   DmTftLibrary SDFileSystem mbed

Committer:
displaymodule
Date:
Tue May 20 15:41:11 2014 +0000
Revision:
1:76ec0e6dfe81
Parent:
0:3ecd25651727
Child:
2:a77053c4f5cc
Removed code for displays requiring an adapter to work as that code is moved into the dm_sdcard_with_adapter project.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
displaymodule 0:3ecd25651727 1 /**********************************************************************************************
displaymodule 0:3ecd25651727 2 Copyright (c) 2014 DisplayModule. All rights reserved.
displaymodule 0:3ecd25651727 3
displaymodule 0:3ecd25651727 4 Redistribution and use of this source code, part of this source code or any compiled binary
displaymodule 0:3ecd25651727 5 based on this source code is permitted as long as the above copyright notice and following
displaymodule 0:3ecd25651727 6 disclaimer is retained.
displaymodule 0:3ecd25651727 7
displaymodule 0:3ecd25651727 8 DISCLAIMER:
displaymodule 0:3ecd25651727 9 THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES
displaymodule 0:3ecd25651727 10 NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE.
displaymodule 0:3ecd25651727 11 ********************************************************************************************/
displaymodule 0:3ecd25651727 12
displaymodule 0:3ecd25651727 13 /******************************************************************************
displaymodule 0:3ecd25651727 14 * Includes
displaymodule 0:3ecd25651727 15 *****************************************************************************/
displaymodule 0:3ecd25651727 16
displaymodule 0:3ecd25651727 17 #include "mbed.h"
displaymodule 0:3ecd25651727 18
displaymodule 0:3ecd25651727 19 #include "DmTftIli9341.h"
displaymodule 0:3ecd25651727 20 #include "DmTftSsd2119.h"
displaymodule 0:3ecd25651727 21 #include "DmTouch.h"
displaymodule 0:3ecd25651727 22
displaymodule 0:3ecd25651727 23 #include "W25Q16BV.h"
displaymodule 0:3ecd25651727 24 #include "DmDrawBmpBase.h"
displaymodule 0:3ecd25651727 25 #include "SDFileSystem.h"
displaymodule 0:3ecd25651727 26
displaymodule 0:3ecd25651727 27 /******************************************************************************
displaymodule 0:3ecd25651727 28 * Typedefs and defines
displaymodule 0:3ecd25651727 29 *****************************************************************************/
displaymodule 0:3ecd25651727 30
displaymodule 0:3ecd25651727 31 #define log(...) printf(__VA_ARGS__)
displaymodule 0:3ecd25651727 32 //#define log(...)
displaymodule 0:3ecd25651727 33
displaymodule 0:3ecd25651727 34 #define DM_PIN_SPI_MOSI D11
displaymodule 0:3ecd25651727 35 #define DM_PIN_SPI_MISO D12
displaymodule 0:3ecd25651727 36 #define DM_PIN_SPI_SCLK D13
displaymodule 0:3ecd25651727 37
displaymodule 0:3ecd25651727 38 #define DM_PIN_CS_TOUCH D4
displaymodule 0:3ecd25651727 39 #define DM_PIN_CS_TFT D10
displaymodule 0:3ecd25651727 40 #define DM_PIN_CS_SDCARD D8
displaymodule 0:3ecd25651727 41 #define DM_PIN_CS_FLASH D6
displaymodule 0:3ecd25651727 42
displaymodule 0:3ecd25651727 43 /******************************************************************************
displaymodule 0:3ecd25651727 44 * Local variables
displaymodule 0:3ecd25651727 45 *****************************************************************************/
displaymodule 0:3ecd25651727 46
displaymodule 0:3ecd25651727 47 DmTftIli9341 tft; /* DM_TFT28_105 */
displaymodule 0:3ecd25651727 48 //DmTftSsd2119 tft; /* DM_TFT35_107 */
displaymodule 0:3ecd25651727 49
displaymodule 0:3ecd25651727 50 DmTouch touch(DmTouch::DM_TFT28_105);
displaymodule 0:3ecd25651727 51 //DmTouch touch(DmTouch::DM_TFT35_107);
displaymodule 0:3ecd25651727 52
displaymodule 0:3ecd25651727 53 SDFileSystem sd(DM_PIN_SPI_MOSI, DM_PIN_SPI_MISO, DM_PIN_SPI_SCLK, DM_PIN_CS_SDCARD, "sd"); // mosi,miso,clk,cs
displaymodule 0:3ecd25651727 54 W25Q16BV flash(DM_PIN_SPI_MOSI, DM_PIN_SPI_MISO, DM_PIN_SPI_SCLK, DM_PIN_CS_FLASH); // mosi,miso,clk,cs
displaymodule 0:3ecd25651727 55
displaymodule 0:3ecd25651727 56 DigitalInOut csTouch(DM_PIN_CS_TOUCH, PIN_OUTPUT, PullUp, 1);
displaymodule 0:3ecd25651727 57 DigitalInOut csDisplay(DM_PIN_CS_TFT, PIN_OUTPUT, PullUp, 1);
displaymodule 0:3ecd25651727 58 DigitalInOut csSDCard(DM_PIN_CS_SDCARD, PIN_OUTPUT, PullUp, 1);
displaymodule 0:3ecd25651727 59 DigitalInOut csFlash(DM_PIN_CS_FLASH, PIN_OUTPUT, PullUp, 1);
displaymodule 0:3ecd25651727 60
displaymodule 1:76ec0e6dfe81 61
displaymodule 0:3ecd25651727 62 /******************************************************************************
displaymodule 0:3ecd25651727 63 * Global variables
displaymodule 0:3ecd25651727 64 *****************************************************************************/
displaymodule 0:3ecd25651727 65
displaymodule 0:3ecd25651727 66 /******************************************************************************
displaymodule 0:3ecd25651727 67 * Local functions
displaymodule 0:3ecd25651727 68 *****************************************************************************/
displaymodule 0:3ecd25651727 69
displaymodule 0:3ecd25651727 70 static bool sdcardReader(uint32_t userData, uint8_t* data, int offset, int numBytes) {
displaymodule 0:3ecd25651727 71 FILE* fp = (FILE*)userData;
displaymodule 0:3ecd25651727 72 fseek(fp, offset, SEEK_SET);
displaymodule 0:3ecd25651727 73 fread(data, 1, numBytes, fp);
displaymodule 0:3ecd25651727 74 return true;
displaymodule 0:3ecd25651727 75 }
displaymodule 0:3ecd25651727 76
displaymodule 0:3ecd25651727 77 static bool spiFlashReader(uint32_t userData, uint8_t* data, int offset, int numBytes) {
displaymodule 0:3ecd25651727 78 W25Q16BV* spiFlash = (W25Q16BV*)userData;
displaymodule 0:3ecd25651727 79 spiFlash->readStream(offset, (char*)data, numBytes);
displaymodule 0:3ecd25651727 80 return true;
displaymodule 0:3ecd25651727 81 }
displaymodule 0:3ecd25651727 82
displaymodule 0:3ecd25651727 83 static void copyImageToSPIFlash(const char* fname) {
displaymodule 0:3ecd25651727 84 FILE* fp = fopen(fname, "r");
displaymodule 0:3ecd25651727 85 int num, offset;
displaymodule 0:3ecd25651727 86 uint8_t buff[128];
displaymodule 0:3ecd25651727 87
displaymodule 0:3ecd25651727 88 do {
displaymodule 0:3ecd25651727 89 if (fp == NULL) {
displaymodule 0:3ecd25651727 90 log("Failed to open %s, so assuming SPI flash is correct\n", fname);
displaymodule 0:3ecd25651727 91 break;
displaymodule 0:3ecd25651727 92 }
displaymodule 0:3ecd25651727 93
displaymodule 0:3ecd25651727 94 // simple comparison of first 64 bytes in file and SPI flash
displaymodule 0:3ecd25651727 95 // to avoid having to write to the flash on every boot
displaymodule 0:3ecd25651727 96 num = fread(buff, 1, 64, fp);
displaymodule 0:3ecd25651727 97 if (num == 64) {
displaymodule 0:3ecd25651727 98 flash.readStream(0, (char*)&buff[64], 64);
displaymodule 0:3ecd25651727 99 if (memcmp(buff, &buff[64], 64) == 0) {
displaymodule 0:3ecd25651727 100 log("SPI flash content propably correct, not replacing it\n");
displaymodule 0:3ecd25651727 101 break;
displaymodule 0:3ecd25651727 102 }
displaymodule 0:3ecd25651727 103 }
displaymodule 0:3ecd25651727 104
displaymodule 0:3ecd25651727 105 log("Found %s, erasing SPI flash\n", fname);
displaymodule 0:3ecd25651727 106 flash.chipErase();
displaymodule 0:3ecd25651727 107
displaymodule 0:3ecd25651727 108 log("Copying %s to SPI flash\n", fname);
displaymodule 0:3ecd25651727 109 offset = 0;
displaymodule 0:3ecd25651727 110 while ((num = fread(buff, 1, 128, fp)) > 0) {
displaymodule 0:3ecd25651727 111 flash.writeStream(offset, (char*)buff, num);
displaymodule 0:3ecd25651727 112 offset+=num;
displaymodule 0:3ecd25651727 113 }
displaymodule 0:3ecd25651727 114 log("Done. Wrote %d bytes to SPI flash\n", offset);
displaymodule 0:3ecd25651727 115
displaymodule 0:3ecd25651727 116 } while(false);
displaymodule 0:3ecd25651727 117
displaymodule 0:3ecd25651727 118 if (fp != NULL) {
displaymodule 0:3ecd25651727 119 fclose(fp);
displaymodule 0:3ecd25651727 120 }
displaymodule 0:3ecd25651727 121 }
displaymodule 0:3ecd25651727 122
displaymodule 0:3ecd25651727 123 /******************************************************************************
displaymodule 0:3ecd25651727 124 * Main
displaymodule 0:3ecd25651727 125 *****************************************************************************/
displaymodule 0:3ecd25651727 126
displaymodule 0:3ecd25651727 127 int main() {
displaymodule 0:3ecd25651727 128 DmDrawBmpBase bmp;
displaymodule 0:3ecd25651727 129 const char* fname = "/sd/logop565.bmp";
displaymodule 0:3ecd25651727 130
displaymodule 0:3ecd25651727 131 copyImageToSPIFlash(fname);
displaymodule 0:3ecd25651727 132
displaymodule 0:3ecd25651727 133 log("init tft \r\n");
displaymodule 0:3ecd25651727 134 tft.init();
displaymodule 0:3ecd25651727 135
displaymodule 0:3ecd25651727 136 while (true) {
displaymodule 0:3ecd25651727 137 log("Drawing from SD card (%s) ...\n", fname);
displaymodule 0:3ecd25651727 138 FILE *fp = fopen(fname, "r");
displaymodule 0:3ecd25651727 139 if (fp != NULL) {
displaymodule 0:3ecd25651727 140 bmp.drawBitmap(tft, 0, 0, sdcardReader, (uint32_t)fp);
displaymodule 0:3ecd25651727 141 fclose(fp);
displaymodule 0:3ecd25651727 142 } else {
displaymodule 0:3ecd25651727 143 log("failed to open file\n");
displaymodule 1:76ec0e6dfe81 144 log("Skipping SDCard reading as it is unsupported\n");
displaymodule 1:76ec0e6dfe81 145 tft.drawStringCentered(0, 0, tft.width(), tft.height(), "SD Card Unsupported!");
displaymodule 0:3ecd25651727 146 }
displaymodule 0:3ecd25651727 147
displaymodule 0:3ecd25651727 148 wait_ms(3000);
displaymodule 0:3ecd25651727 149 tft.clearScreen(RED);
displaymodule 0:3ecd25651727 150 wait_ms(1000);
displaymodule 0:3ecd25651727 151
displaymodule 0:3ecd25651727 152 log("Attempting to decode image from SPI flash...\n");
displaymodule 1:76ec0e6dfe81 153 if (!bmp.drawBitmap(tft, 0, 0, spiFlashReader, (uint32_t)&flash)) {
displaymodule 1:76ec0e6dfe81 154 log("Skipping SPI Flash reading as it is unsupported\n");
displaymodule 1:76ec0e6dfe81 155 tft.drawStringCentered(0, 0, tft.width(), tft.height(), "SPI Flash Unsupported!");
displaymodule 1:76ec0e6dfe81 156 }
displaymodule 0:3ecd25651727 157
displaymodule 0:3ecd25651727 158 wait_ms(3000);
displaymodule 0:3ecd25651727 159 tft.clearScreen(GREEN);
displaymodule 0:3ecd25651727 160 wait_ms(1000);
displaymodule 0:3ecd25651727 161 }
displaymodule 0:3ecd25651727 162 }