Added SPI speed parameter
Dependents: EasyCAT_LAB_simple EasyCAT_LAB
- The default SPI speed has been set to 27MHz, but it can be configured using the last parameter of the constructor.
- This is an optimization for the EasyCAT LAB , a complete educational and experimental EtherCAT® system, composed of one master and two slaves .
Diff: SPI_TFT_ILI9341.cpp
- Revision:
- 12:1cf4e83eb240
- Parent:
- 11:f94024581a44
--- a/SPI_TFT_ILI9341.cpp Wed May 26 18:42:58 2021 +0000 +++ b/SPI_TFT_ILI9341.cpp Tue Oct 24 23:32:54 2023 +0200 @@ -18,20 +18,90 @@ #include "SPI_TFT_ILI9341.h" #include "mbed.h" -#define BPP 16 // Bits per pixel - + +//#ifdef PARA_TFT + SPI_TFT_ILI9341::SPI_TFT_ILI9341(PinName TFT_D0, PinName TFT_D1, PinName TFT_D2, PinName TFT_D3, + PinName TFT_D4, PinName TFT_D5, PinName TFT_D6, PinName TFT_D7, PinName rd, PinName wr, + PinName cs, PinName dc, PinName res, const char *name) : GraphicsDisplay(name), _cs(cs), _dc(dc), + _TFT_D0(TFT_D0), + _TFT_D1(TFT_D1), + _TFT_D2(TFT_D2), + _TFT_D3(TFT_D3), + _TFT_D4(TFT_D4), + _TFT_D5(TFT_D5), + _TFT_D6(TFT_D6), + _TFT_D7(TFT_D7), + _rd(rd), + _wr(wr), + _res(res), + _spi(D11, D12, D13) +{ + iTypeTFT = PARA_TFT_; + + if(strcmp(name, "PARA") == 0) + { + iTypeTFT = PARA_TFT_; + } + + orientation = 1; + char_x = 0; + char_x = 0; -//extern Serial pc; -//extern DigitalOut xx; // debug !! + _TFT_D0 = 1; + _TFT_D1 = 1; + _TFT_D2 = 1; + _TFT_D3 = 1; + _TFT_D4 = 1; + _TFT_D5 = 1; + _TFT_D6 = 1; + _TFT_D7 = 1; + + _rd = 1; + _wr = 1; + _cs = 1; + _dc = 1; + _res = 1; + + tft_reset(0); +} +//#else SPI_TFT_ILI9341::SPI_TFT_ILI9341(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset, PinName dc, int spiSpeed, const char *name) - : GraphicsDisplay(name), _spi(mosi, miso, sclk), _cs(cs), _dc(dc) + : GraphicsDisplay(name), _spi(mosi, miso, sclk), _cs(cs), _dc(dc), + _TFT_D0(NC), + _TFT_D1(NC), + _TFT_D2(NC), + _TFT_D3(NC), + _TFT_D4(NC), + _TFT_D5(NC), + _TFT_D6(NC), + _TFT_D7(NC), + _rd(NC), + _wr(NC), + _res(NC) { + if(strcmp(name, "SEEED") == 0) + { + iTypeTFT = SEEED_TFT_; + } + + if(strcmp(name, "ADA") == 0) + { + iTypeTFT = ADA_TFT_; + } + orientation = 0; char_x = 0; + char_x = 0; + + _cs = 1; + _dc = 1; + _reset = reset; tft_reset(spiSpeed); } +//#endif + int SPI_TFT_ILI9341::width() { @@ -50,19 +120,20 @@ void SPI_TFT_ILI9341::set_orientation(unsigned int o) { orientation = o; - wr_cmd(0x36); // MEMORY_ACCESS_CONTROL - switch (orientation) { + wr_cmd(0x36); // memory acces control + switch (orientation) + { case 0: - _spi.write(0x48); + wr_dat(0x48); break; case 1: - _spi.write(0x28); + wr_dat(0x28); break; case 2: - _spi.write(0x88); + wr_dat(0x88); break; case 3: - _spi.write(0xE8); + wr_dat(0xE8); break; } _cs = 1; @@ -70,179 +141,208 @@ } -// write command to tft register - -void SPI_TFT_ILI9341::wr_cmd(unsigned char cmd) +void SPI_TFT_ILI9341::wr_cmd(unsigned char cmd) // write command to tft register { _dc = 0; _cs = 0; - _spi.write(cmd); // mbed lib + wr_dat(cmd); _dc = 1; } - void SPI_TFT_ILI9341::wr_dat(unsigned char dat) { - _spi.write(dat); // mbed lib + if (iTypeTFT == PARA_TFT_) //PARA_TFT + { + if (dat & 0x01) + _TFT_D0 = 1; + else + _TFT_D0 = 0; + + if (dat & 0x02) + _TFT_D1 = 1; + else + _TFT_D1 = 0; + + if (dat & 0x04) + _TFT_D2 = 1; + else + _TFT_D2 = 0; + + if (dat & 0x08) + _TFT_D3 = 1; + else + _TFT_D3 = 0; + + if (dat & 0x10) + _TFT_D4 = 1; + else + _TFT_D4 = 0; + + if (dat & 0x20) + _TFT_D5 = 1; + else + _TFT_D5 = 0; + + if (dat & 0x40) + _TFT_D6 = 1; + else + _TFT_D6 = 0; + + if (dat & 0x80) + _TFT_D7 = 1; + else + _TFT_D7 = 0; + + _wr = 0; + _wr = 1; + } + else + { + _spi.write(dat); // mbed lib + } + } - -// the ILI9341 can read - has to be implemented later -// A read will return 0 at the moment - -//unsigned short SPI_TFT_ILI9341::rd_dat (void) -//{ -// unsigned short val = 0; - - //val = _spi.write(0x73ff); /* Dummy read 1 */ - //val = _spi.write(0x0000); /* Read D8..D15 */ -// return (val); -//} - - - -// Init code based on MI0283QT datasheet - -void SPI_TFT_ILI9341::tft_reset(int spiSpeed) +void SPI_TFT_ILI9341::tft_reset(int spiSpeed) // Init TFT { - _spi.format(8,0); // 8 bit spi mode 0 - _spi.frequency(spiSpeed); // SPI clock - _cs = 1; // cs high - _dc = 1; // dc high - if (_reset != NC) - { - DigitalOut rst(_reset); - rst = 0; // display reset - wait_us(50); - rst = 1; // end hardware reset + if (iTypeTFT == PARA_TFT_) //PARA_TFT + { + _res = 0; // display hw reset + wait_us(50); // + _res = 1; // } - #if (MBED_MAJOR_VERSION != 2) - ThisThread::sleep_for(5ms); - #else - wait_ms(5); - #endif - - wr_cmd(0x01); // SW reset - - #if (MBED_MAJOR_VERSION != 2) - ThisThread::sleep_for(5ms); - #else - wait_ms(5); - #endif - - wr_cmd(0x28); // display off + else + { + _spi.format(8,0); // 8 bit spi mode 0 + _spi.frequency(spiSpeed); // SPI clock + if (_reset != NC) + { + DigitalOut _res(_reset); + _res = 0; // display hw reset + wait_us(50); + _res = 1; // + } + } + + ThisThread::sleep_for(5ms); + wr_cmd(0x01); // SW reset + ThisThread::sleep_for(5ms); + wr_cmd(0x28); // display off /* Start Initial Sequence ----------------------------------------------------*/ wr_cmd(0xCF); - _spi.write(0x00); - _spi.write(0x83); - _spi.write(0x30); + wr_dat(0x00); + wr_dat(0x83); + wr_dat(0x30); _cs = 1; wr_cmd(0xED); - _spi.write(0x64); - _spi.write(0x03); - _spi.write(0x12); - _spi.write(0x81); + wr_dat(0x64); + wr_dat(0x03); + wr_dat(0x12); + wr_dat(0x81); _cs = 1; wr_cmd(0xE8); - _spi.write(0x85); - _spi.write(0x01); - _spi.write(0x79); + wr_dat(0x85); + wr_dat(0x01); + wr_dat(0x79); _cs = 1; wr_cmd(0xCB); - _spi.write(0x39); - _spi.write(0x2C); - _spi.write(0x00); - _spi.write(0x34); - _spi.write(0x02); + wr_dat(0x39); + wr_dat(0x2C); + wr_dat(0x00); + wr_dat(0x34); + wr_dat(0x02); _cs = 1; wr_cmd(0xF7); - _spi.write(0x20); + wr_dat(0x20); _cs = 1; wr_cmd(0xEA); - _spi.write(0x00); - _spi.write(0x00); + wr_dat(0x00); + wr_dat(0x00); _cs = 1; wr_cmd(0xC0); // POWER_CONTROL_1 - _spi.write(0x26); + wr_dat(0x26); _cs = 1; wr_cmd(0xC1); // POWER_CONTROL_2 - _spi.write(0x11); + wr_dat(0x11); _cs = 1; wr_cmd(0xC5); // VCOM_CONTROL_1 - _spi.write(0x35); - _spi.write(0x3E); + wr_dat(0x35); + wr_dat(0x3E); _cs = 1; wr_cmd(0xC7); // VCOM_CONTROL_2 - _spi.write(0xBE); + wr_dat(0xBE); _cs = 1; wr_cmd(0x36); // MEMORY_ACCESS_CONTROL - _spi.write(0x48); + wr_dat(0x48); + + wr_dat(0xC8); + _cs = 1; wr_cmd(0x3A); // COLMOD_PIXEL_FORMAT_SET - _spi.write(0x55); // 16 bit pixel + wr_dat(0x55); // 16 bit pixel _cs = 1; wr_cmd(0xB1); // Frame Rate - _spi.write(0x00); - _spi.write(0x1B); + wr_dat(0x00); + wr_dat(0x1B); _cs = 1; wr_cmd(0xF2); // Gamma Function Disable - _spi.write(0x08); + wr_dat(0x08); _cs = 1; wr_cmd(0x26); - _spi.write(0x01); // gamma set for curve 01/2/04/08 + wr_dat(0x01); // gamma set for curve 01/2/04/08 _cs = 1; wr_cmd(0xE0); // positive gamma correction - _spi.write(0x1F); - _spi.write(0x1A); - _spi.write(0x18); - _spi.write(0x0A); - _spi.write(0x0F); - _spi.write(0x06); - _spi.write(0x45); - _spi.write(0x87); - _spi.write(0x32); - _spi.write(0x0A); - _spi.write(0x07); - _spi.write(0x02); - _spi.write(0x07); - _spi.write(0x05); - _spi.write(0x00); + wr_dat(0x1F); + wr_dat(0x1A); + wr_dat(0x18); + wr_dat(0x0A); + wr_dat(0x0F); + wr_dat(0x06); + wr_dat(0x45); + wr_dat(0x87); + wr_dat(0x32); + wr_dat(0x0A); + wr_dat(0x07); + wr_dat(0x02); + wr_dat(0x07); + wr_dat(0x05); + wr_dat(0x00); _cs = 1; wr_cmd(0xE1); // negativ gamma correction - _spi.write(0x00); - _spi.write(0x25); - _spi.write(0x27); - _spi.write(0x05); - _spi.write(0x10); - _spi.write(0x09); - _spi.write(0x3A); - _spi.write(0x78); - _spi.write(0x4D); - _spi.write(0x05); - _spi.write(0x18); - _spi.write(0x0D); - _spi.write(0x38); - _spi.write(0x3A); - _spi.write(0x1F); + wr_dat(0x00); + wr_dat(0x25); + wr_dat(0x27); + wr_dat(0x05); + wr_dat(0x10); + wr_dat(0x09); + wr_dat(0x3A); + wr_dat(0x78); + wr_dat(0x4D); + wr_dat(0x05); + wr_dat(0x18); + wr_dat(0x0D); + wr_dat(0x38); + wr_dat(0x3A); + wr_dat(0x1F); _cs = 1; WindowMax (); @@ -254,55 +354,55 @@ //_cs = 1; wr_cmd(0xB7); // entry mode - _spi.write(0x07); + wr_dat(0x07); _cs = 1; wr_cmd(0xB6); // display function control - _spi.write(0x0A); - _spi.write(0x82); - _spi.write(0x27); - _spi.write(0x00); + wr_dat(0x0A); + wr_dat(0x82); + wr_dat(0x27); + wr_dat(0x00); _cs = 1; wr_cmd(0x11); // sleep out _cs = 1; - #if (MBED_MAJOR_VERSION != 2) - ThisThread::sleep_for(100ms); - #else - wait_ms(100); - #endif + ThisThread::sleep_for(100ms); + + wr_cmd(0x29); // display on + _cs = 1; - wr_cmd(0x29); // display on - _cs = 1; - - #if (MBED_MAJOR_VERSION != 2) - ThisThread::sleep_for(100ms); - #else - wait_ms(100); - #endif + ThisThread::sleep_for(100ms); } void SPI_TFT_ILI9341::pixel(int x, int y, int color) { wr_cmd(0x2A); - _spi.write(x >> 8); - _spi.write(x); + wr_dat(x >> 8); + wr_dat(x); _cs = 1; + wr_cmd(0x2B); - _spi.write(y >> 8); - _spi.write(y); + wr_dat(y >> 8); + wr_dat(y); _cs = 1; - wr_cmd(0x2C); // send pixel - #if defined TARGET_KL25Z // 8 Bit SPI - _spi.write(color >> 8); - _spi.write(color & 0xff); - #else - _spi.format(16,0); // switch to 16 bit Mode 0 - _spi.write(color); // Write D0..D15 - _spi.format(8,0); - #endif + + wr_cmd(0x2C); // send pixel + + if (iTypeTFT == PARA_TFT_) //PARA_TFT + { + wr_dat(color >> 8); + wr_dat(color & 0xff); + + } + else + { // 16 bit SPI transfer + _spi.format(16,0); + _spi.write(color); + _spi.format(8,0); + } + _cs = 1; } @@ -310,17 +410,17 @@ void SPI_TFT_ILI9341::window (unsigned int x, unsigned int y, unsigned int w, unsigned int h) { wr_cmd(0x2A); - _spi.write(x >> 8); - _spi.write(x); - _spi.write((x+w-1) >> 8); - _spi.write(x+w-1); - + wr_dat(x >> 8); + wr_dat(x); + wr_dat((x+w-1) >> 8); + wr_dat(x+w-1); _cs = 1; + wr_cmd(0x2B); - _spi.write(y >> 8); - _spi.write(y); - _spi.write((y+h-1) >> 8); - _spi.write(y+h-1); + wr_dat(y >> 8); + wr_dat(y); + wr_dat((y+h-1) >> 8); + wr_dat(y+h-1); _cs = 1; } @@ -331,26 +431,30 @@ } - void SPI_TFT_ILI9341::cls (void) { int pixel = ( width() * height()); WindowMax(); - wr_cmd(0x2C); // send pixel - #if defined TARGET_KL25Z // 8 Bit SPI - unsigned int i; - for (i = 0; i < ( width() * height()); i++){ - _spi.write(_background >> 8); - _spi.write(_background & 0xff); + wr_cmd(0x2C); // send pixel + + if (iTypeTFT == PARA_TFT_) //PARA_TFT + { + unsigned int i; + for (i = 0; i < ( width() * height()); i++) + { + wr_dat(_background >> 8); + wr_dat(_background & 0xff); } - - #else - _spi.format(16,0); // switch to 16 bit Mode 0 - unsigned int i; - for (i = 0; i < ( width() * height()); i++) - _spi.write(_background); - _spi.format(8,0); - #endif + } + else + { // 16 bit SPI transfer + _spi.format(16,0); + unsigned int i; + for (i = 0; i < ( width() * height()); i++) + _spi.write(_background); + _spi.format(8,0); + } + _cs = 1; } @@ -371,7 +475,6 @@ } if (e2 > x) err += ++x*2+1; } while (x <= 0); - } void SPI_TFT_ILI9341::fillcircle(int x0, int y0, int r, int color) @@ -396,53 +499,68 @@ w = x1 - x0 + 1; window(x0,y,w,1); wr_cmd(0x2C); // send pixel - #if defined TARGET_KL25Z // 8 Bit SPI - int j; - for (j=0; j<w; j++) { - _spi.write(color >> 8); - _spi.write(color & 0xff); + + if (iTypeTFT == PARA_TFT_) //PARA_TFT + { + int j; + for (j=0; j<w; j++) + { + wr_dat(color >> 8); + wr_dat(color & 0xff); + } + + } + else + { // 16 bit SPI transfer + _spi.format(16,0); + int j; + for (j=0; j<w; j++) + { + _spi.write(color); + } + _spi.format(8,0); } - #else - _spi.format(16,0); // switch to 16 bit Mode 0 - int j; - for (j=0; j<w; j++) { - _spi.write(color); - } - _spi.format(8,0); - #endif _cs = 1; + WindowMax(); return; } + void SPI_TFT_ILI9341::vline(int x, int y0, int y1, int color) { int h; h = y1 - y0 + 1; window(x,y0,1,h); wr_cmd(0x2C); // send pixel - #if defined TARGET_KL25Z // 8 Bit SPI - for (int y=0; y<h; y++) { - _spi.write(color >> 8); - _spi.write(color & 0xff); - } - #else - _spi.format(16,0); // switch to 16 bit Mode 0 - for (int y=0; y<h; y++) { - _spi.write(color); + + if (iTypeTFT == PARA_TFT_) //PARA_TFT + { + for (int y=0; y<h; y++) + { + wr_dat(color >> 8); + wr_dat(color & 0xff); + } } - _spi.format(8,0); - #endif + else + { // 16 bit SPI transfer + _spi.format(16,0); + for (int y=0; y<h; y++) + { + _spi.write(color); + } + _spi.format(8,0); + } + _cs = 1; + WindowMax(); return; } - void SPI_TFT_ILI9341::line(int x0, int y0, int x1, int y1, int color) { - //WindowMax(); int dx = 0, dy = 0; int dx_sym = 0, dy_sym = 0; int dx_x2 = 0, dy_x2 = 0; @@ -451,26 +569,31 @@ dx = x1-x0; dy = y1-y0; - if (dx == 0) { /* vertical line */ + if (dx == 0) // vertical line + { if (y1 > y0) vline(x0,y0,y1,color); else vline(x0,y1,y0,color); return; } - if (dx > 0) { + if (dx > 0) + { dx_sym = 1; } else { dx_sym = -1; } - if (dy == 0) { /* horizontal line */ + if (dy == 0) // horizontal line + { if (x1 > x0) hline(x0,x1,y0,color); else hline(x1,x0,y0,color); return; } - if (dy > 0) { + if (dy > 0) + { dy_sym = 1; - } else { + } else + { dy_sym = -1; } @@ -480,28 +603,37 @@ dx_x2 = dx*2; dy_x2 = dy*2; - if (dx >= dy) { + if (dx >= dy) + { di = dy_x2 - dx; - while (x0 != x1) { + while (x0 != x1) + { pixel(x0, y0, color); x0 += dx_sym; - if (di<0) { + if (di<0) + { di += dy_x2; - } else { + } else + { di += dy_x2 - dx_x2; y0 += dy_sym; } } pixel(x0, y0, color); - } else { + } + else + { di = dx_x2 - dy; - while (y0 != y1) { + while (y0 != y1) + { pixel(x0, y0, color); y0 += dy_sym; - if (di < 0) { + if (di < 0) + { di += dx_x2; - } else { + } else + { di += dx_x2 - dy_x2; x0 += dx_sym; } @@ -531,7 +663,6 @@ } - void SPI_TFT_ILI9341::fillrect(int x0, int y0, int x1, int y1, int color) { @@ -540,18 +671,24 @@ int pixel = h * w; window(x0,y0,w,h); wr_cmd(0x2C); // send pixel - #if defined TARGET_KL25Z // 8 Bit SPI - for (int p=0; p<pixel; p++) { - _spi.write(color >> 8); - _spi.write(color & 0xff); - } - #else - _spi.format(16,0); // switch to 16 bit Mode 0 - for (int p=0; p<pixel; p++) { - _spi.write(color); - } - _spi.format(8,0); - #endif + if (iTypeTFT == PARA_TFT_) //PARA_TFT + { + for (int p=0; p<pixel; p++) + { + wr_dat(color >> 8); + wr_dat(color & 0xff); + } + } + else + { // 16 bit SPI transfer + _spi.format(16,0); + for (int p=0; p<pixel; p++) + { + _spi.write(color); + } + _spi.format(8,0); + } + _cs = 1; WindowMax(); return; @@ -565,30 +702,30 @@ } - int SPI_TFT_ILI9341::columns() { return width() / font[1]; } - int SPI_TFT_ILI9341::rows() { return height() / font[2]; } - int SPI_TFT_ILI9341::_putc(int value) { - if (value == '\n') { // new line + if (value == '\n') { // new line char_x = 0; char_y = char_y + font[2]; - if (char_y >= height() - font[2]) { + if (char_y >= height() - font[2]) + { char_y = 0; } - } else { + } + else + { character(char_x, char_y, value); } return value; @@ -609,49 +746,73 @@ vert = font[2]; // get vert size of font bpl = font[3]; // bytes per line - if (char_x + hor > width()) { + if (char_x + hor > width()) + { char_x = 0; char_y = char_y + vert; - if (char_y >= height() - font[2]) { + if (char_y >= height() - font[2]) + { char_y = 0; } } - window(char_x, char_y,hor,vert); // char box - wr_cmd(0x2C); // send pixel - #ifndef TARGET_KL25Z // 16 Bit SPI - _spi.format(16,0); - #endif // switch to 16 bit Mode 0 - zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap - w = zeichen[0]; // width of actual char - for (j=0; j<vert; j++) { // vert line - for (i=0; i<hor; i++) { // horz line + window(char_x, char_y,hor,vert); // char box + wr_cmd(0x2C); // send pixel + + if (iTypeTFT != PARA_TFT_) //#ifndef PARA_TFT + { // 16 Bit SPI transfer + _spi.format(16,0); + } + + zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap + w = zeichen[0]; // width of actual char + for (j=0; j<vert; j++) // vert line + { + for (i=0; i<hor; i++) // horz line + { z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1]; b = 1 << (j & 0x07); - if (( z & b ) == 0x00) { - #ifndef TARGET_KL25Z // 16 Bit SPI - _spi.write(_background); - #else - _spi.write(_background >> 8); - _spi.write(_background & 0xff); - #endif - } else { - #ifndef TARGET_KL25Z // 16 Bit SPI - _spi.write(_foreground); - #else - _spi.write(_foreground >> 8); - _spi.write(_foreground & 0xff); - #endif + if (( z & b ) == 0x00) + { + if (iTypeTFT != PARA_TFT_) //#ifndef PARA_TFT + { // 16 bit SPI transfer + _spi.write(_background); + } + else + { // 8 bit parallel transfer + wr_dat(_background >> 8); + wr_dat(_background & 0xff); + } + } + else + { + if (iTypeTFT != PARA_TFT_) //#ifndef PARA_TFT + { + _spi.write(_foreground); + } + else + { // 8 bit parallel transfer + wr_dat(_foreground >> 8); + wr_dat(_foreground & 0xff); + } } } } _cs = 1; - #ifndef TARGET_KL25Z // 16 Bit SPI - _spi.format(8,0); - #endif + + if (iTypeTFT != PARA_TFT_) //#ifndef PARA_TFT + { + _spi.format(8,0); + } + WindowMax(); - if ((w + 2) < hor) { // x offset to next char + if ((w + 2) < hor) // x offset to next char + { char_x += w + 2; - } else char_x += hor; + } + else + { + char_x += hor; + } } @@ -661,138 +822,60 @@ } - void SPI_TFT_ILI9341::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap) { unsigned int j; int padd; unsigned short *bitmap_ptr = (unsigned short *)bitmap; - #if defined TARGET_KL25Z // 8 Bit SPI + + //#ifdef PARA_TFT // 8 bit parallel transfer unsigned short pix_temp; - #endif + //#endif unsigned int i; - // the lines are padded to multiple of 4 bytes in a bitmap - padd = -1; - do { + padd = -1; // the lines are padded to multiple of 4 bytes in a bitmap + do + { padd ++; - } while (2*(w + padd)%4 != 0); + } + while (2*(w + padd)%4 != 0); window(x, y, w, h); bitmap_ptr += ((h - 1)* (w + padd)); - wr_cmd(0x2C); // send pixel - #ifndef TARGET_KL25Z // 16 Bit SPI - _spi.format(16,0); - #endif // switch to 16 bit Mode 0 - for (j = 0; j < h; j++) { //Lines - for (i = 0; i < w; i++) { // one line - #if defined TARGET_KL25Z // 8 Bit SPI + wr_cmd(0x2C); // send pixel + + if (iTypeTFT != PARA_TFT_) //#ifndef PARA_TFT + { + _spi.format(16,0); + } + + for (j = 0; j < h; j++) //Lines + { + for (i = 0; i < w; i++) // one line + { + if (iTypeTFT == PARA_TFT_) //PARA_TFT + { pix_temp = *bitmap_ptr; - _spi.write(pix_temp >> 8); - _spi.write(pix_temp); + wr_dat(pix_temp >> 8); + wr_dat(pix_temp); bitmap_ptr++; - #else - _spi.write(*bitmap_ptr); // one line + } + else + { // 16 bit SPI transfer + _spi.write(*bitmap_ptr); // one line bitmap_ptr++; - #endif + } } bitmap_ptr -= 2*w; bitmap_ptr -= padd; } _cs = 1; - #ifndef TARGET_KL25Z // 16 Bit SPI - _spi.format(8,0); - #endif + + if (iTypeTFT != PARA_TFT_) //#ifndef PARA_TFT + { + _spi.format(8,0); + } + WindowMax(); } - -// local filesystem is not implemented in kinetis board -#if DEVICE_LOCALFILESYSTEM - -int SPI_TFT_ILI9341::BMP_16(unsigned int x, unsigned int y, const char *Name_BMP) -{ - -#define OffsetPixelWidth 18 -#define OffsetPixelHeigh 22 -#define OffsetFileSize 34 -#define OffsetPixData 10 -#define OffsetBPP 28 - - char filename[50]; - unsigned char BMP_Header[54]; - unsigned short BPP_t; - unsigned int PixelWidth,PixelHeigh,start_data; - unsigned int i,off; - int padd,j; - unsigned short *line; - - // get the filename - LocalFileSystem local("local"); - sprintf(&filename[0],"/local/"); - i=7; - while (*Name_BMP!='\0') { - filename[i++]=*Name_BMP++; - } - - fprintf(stderr, "filename : %s \n\r",filename); - - FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file - if (!Image) { - return(0); // error file not found ! - } - - fread(&BMP_Header[0],1,54,Image); // get the BMP Header - - if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte - fclose(Image); - return(-1); // error no BMP file - } - - BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8); - if (BPP_t != 0x0010) { - fclose(Image); - return(-2); // error no 16 bit BMP - } - - PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24); - PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24); - if (PixelHeigh > height() + y || PixelWidth > width() + x) { - fclose(Image); - return(-3); // to big - } - - start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24); - - line = (unsigned short *) malloc (2 * PixelWidth); // we need a buffer for a line - if (line == NULL) { - return(-4); // error no memory - } - - // the bmp lines are padded to multiple of 4 bytes - padd = -1; - do { - padd ++; - } while ((PixelWidth * 2 + padd)%4 != 0); - - -//fseek(Image, 70 ,SEEK_SET); - window(x, y,PixelWidth ,PixelHeigh); - wr_cmd(0x2C); // send pixel - _spi.format(16,3); // switch to 16 bit Mode 3 - for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up - off = j * (PixelWidth * 2 + padd) + start_data; // start of line - fseek(Image, off ,SEEK_SET); - fread(line,1,PixelWidth * 2,Image); // read a line - slow ! - for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT - _spi.write(line[i]); // one 16 bit pixel - } - } - _cs = 1; - _spi.format(8,3); - free (line); - fclose(Image); - WindowMax(); - return(1); -} -#endif \ No newline at end of file