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.
Fork of RA8875 by
Diff: RA8875.cpp
- Revision:
- 79:544eb4964795
- Parent:
- 78:faf49c381591
- Child:
- 80:cc4fab58179c
--- a/RA8875.cpp Sun Dec 28 03:14:35 2014 +0000 +++ b/RA8875.cpp Sun Dec 28 19:55:16 2014 +0000 @@ -70,13 +70,23 @@ #define POLLWAITuSec 10 // Private RawKeyMap for the Keyboard interface -static const uint8_t KeyMap[22] = { +static const uint8_t DefaultKeyMap[22] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 255 }; +static const char * ErrMessages[] = { + "noerror", ///< no errors, command completed successfully + "bad_parameter", ///< one or more parameters are invalid + "file_not_found", ///< specified file could not be found + "not_bmp_format", ///< file is not a .bmp file + "not_ico_format", ///< file is not a .ico file + "not_supported_format", ///< file format is not yet supported + "image_too_big", ///< image is too large for the screen + "not_enough_ram", ///< could not allocate ram for scanline +}; RA8875::RA8875(PinName mosi, PinName miso, PinName sclk, PinName csel, PinName reset, const char *name) : GraphicsDisplay(name) @@ -84,29 +94,103 @@ , cs(csel) , res(reset) { - font = NULL; // no external font, use internal. - select(false); // deselect the display - frequency(RA8875_DEFAULT_SPI_FREQ); // data rate - Reset(); - Power(true); - Backlight_u8(255); - pKeyMap = KeyMap; -#ifdef PERF_METRICS - performance.start(); - ClearPerformance(); -#endif } - //RA8875::~RA8875() //{ //} +RetCode_t RA8875::init(bool poweron, int width, int height, int color_bpp) +{ + INFO("init(%d,%d,%d,%d)", poweron, width, height, color_bpp); + font = NULL; // no external font, use internal. + pKeyMap = DefaultKeyMap; // set default key map + _select(false); // deselect the display + frequency(RA8875_DEFAULT_SPI_FREQ); // data rate + Reset(); + WriteCommand(0x88, 0x0B); // PLLC1 - Phase Lock Loop registers + wait_ms(1); + WriteCommand(0x89, 0x02); + wait_ms(1); + + // System Config Register (SYSR) + if (color_bpp == 16) { + WriteCommand(0x10, 0x0C); // 16-bpp (65K colors) color depth, 8-bit interface + } else { // color_bpp == 8 + WriteCommand(0x10, 0x00); // 8-bpp (256 colors) + } + // Pixel Clock Setting Register (PCSR) + WriteCommand(0x04, 0x82); // PDAT on PCLK falling edge, PCLK = 4 x System Clock + wait_ms(1); + + // Horizontal Settings + WriteCommand(0x14, width/8 - 1); //HDWR//Horizontal Display Width Setting Bit[6:0] + WriteCommand(0x15, 0x02); //HNDFCR//Horizontal Non-Display Period fine tune Bit[3:0] + WriteCommand(0x16, 0x03); //HNDR//Horizontal Non-Display Period Bit[4:0] + WriteCommand(0x17, 0x01); //HSTR//HSYNC Start Position[4:0] + WriteCommand(0x18, 0x03); //HPWR//HSYNC Polarity ,The period width of HSYNC. + + // Vertical Settings + WriteCommand(0x19, (height-1)&0xFF); //VDHR0 //Vertical Display Height Bit [7:0] + WriteCommand(0x1a, (height-1)>>8); //VDHR1 //Vertical Display Height Bit [8] + WriteCommand(0x1b, 0x0F); //VNDR0 //Vertical Non-Display Period Bit [7:0] + WriteCommand(0x1c, 0x00); //VNDR1 //Vertical Non-Display Period Bit [8] + WriteCommand(0x1d, 0x0e); //VSTR0 //VSYNC Start Position[7:0] + WriteCommand(0x1e, 0x06); //VSTR1 //VSYNC Start Position[8] + WriteCommand(0x1f, 0x01); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0] + + if (width >= 800 && height >= 480 && color_bpp > 8) { + WriteCommand(0x20, 0x00); // DPCR - 1-layer mode when the resolution is too high + } else { + WriteCommand(0x20, 0x80); // DPCR - 2-layer mode + } + + // Set display image to Blue on Black as default + window(0,0, width, height); // Initialize to full screen + SetTextCursorControl(); + foreground(Blue); + background(Black); + cls(3); + + Power(poweron); + if (poweron) + Backlight_u8(255); +#ifdef PERF_METRICS + performance.start(); + ClearPerformance(); +#endif + return noerror; +} + + +RetCode_t RA8875::Reset(void) +{ + RetCode_t ret; + + ret = WriteCommand(0x01, 0x01); // Apply Display Off, Reset + wait_ms(2); // no idea if I need to wait, or how long + if (ret == noerror) { + ret = WriteCommand(0x01, 0x00); // Display off, Remove reset + wait_ms(2); // no idea if I need to wait, or how long + } + return ret; +} + + +const char * RA8875::GetErrorMessage(RetCode_t code) +{ + if (code >= LastErrCode) + code = bad_parameter; + return ErrMessages[code]; +} + + uint16_t RA8875::GetDrawingLayer(void) { return (ReadCommand(0x41) & 0x01); } + RetCode_t RA8875::SelectDrawingLayer(uint16_t layer) { unsigned char mwcr1 = ReadCommand(0x41) & ~0x01; // retain all but the currently selected layer @@ -152,6 +236,7 @@ return noerror; } + color_t RA8875::GetBackgroundTransparencyColor(void) { RGBQUAD q; @@ -186,20 +271,23 @@ return WriteCommand(0xF0, value); // INT } + RetCode_t RA8875::SetKeyMap(const uint8_t * CodeList) { pKeyMap = CodeList; return noerror; } + bool RA8875::readable(void) { return (ReadCommand(0xF1) & 0x10); // check KS status - true if kbhit } + uint8_t RA8875::getc(void) { - //#define GETC_DEV + //#define GETC_DEV // for development #ifdef GETC_DEV uint8_t keyCode1, keyCode2; #endif @@ -270,6 +358,7 @@ return key; } + #ifdef PERF_METRICS void RA8875::ClearPerformance() { @@ -278,6 +367,7 @@ idletime_usec = 0; } + void RA8875::RegisterPerformance(method_e method) { unsigned long elapsed = performance.read_us(); @@ -286,11 +376,13 @@ metrics[method] = elapsed; } + void RA8875::CountIdleTime(uint32_t t) { idletime_usec += t; } + void RA8875::ReportPerformance(Serial & pc) { pc.printf("\r\nPerformance Metrics\r\n"); @@ -310,13 +402,13 @@ #else // This should be a little faster, but doesn't work... INFO("WriteCommandW(%02X, %04X)", command, data); - select(true); - spiwrite(0x80); - spiwrite(command); - //spiwrite(0x00); // dummy - spiwrite(data & 0xFF); - spiwrite(data >> 8); - select(false); + _select(true); + _spiwrite(0x80); + _spiwrite(command); + //_spiwrite(0x00); // dummy + _spiwrite(data & 0xFF); + _spiwrite(data >> 8); + _select(false); #endif return noerror; } @@ -324,35 +416,35 @@ RetCode_t RA8875::WriteCommand(unsigned char command, unsigned int data) { - select(true); - spiwrite(0x80); // cmd: write command - spiwrite(command); + _select(true); + _spiwrite(0x80); // cmd: write command + _spiwrite(command); if (data <= 0xFF) { // only if in the valid range - spiwrite(0x00); - spiwrite(data); + _spiwrite(0x00); + _spiwrite(data); } - select(false); + _select(false); return noerror; } RetCode_t RA8875::WriteDataW(uint16_t data) { - select(true); - spiwrite(0x00); // cmd: write data - spiwrite(data & 0xFF); - spiwrite(data >> 8); - select(false); + _select(true); + _spiwrite(0x00); // cmd: write data + _spiwrite(data & 0xFF); + _spiwrite(data >> 8); + _select(false); return noerror; } RetCode_t RA8875::WriteData(unsigned char data) { - select(true); - spiwrite(0x00); - spiwrite(data); - select(false); + _select(true); + _spiwrite(0x00); + _spiwrite(data); + _select(false); return noerror; } @@ -368,10 +460,10 @@ { unsigned char data; - select(true); - spiwrite(0x40); - data = spiread(); - select(false); + _select(true); + _spiwrite(0x40); + data = _spiread(); + _select(false); return data; } @@ -380,11 +472,11 @@ { uint16_t data; - select(true); - spiwrite(0x40); - data = spiread(); - data |= (spiread() << 8); - select(false); + _select(true); + _spiwrite(0x40); + data = _spiread(); + data |= (_spiread() << 8); + _select(false); return data; } @@ -393,13 +485,14 @@ { unsigned char data; - select(true); - spiwrite(0xC0); // These two bits are for the special "Status Read" [STSR] - data = spiread(); - select(false); + _select(true); + _spiwrite(0xC0); // These two bits are for the special "Status Read" [STSR] + data = _spiread(); + _select(false); return data; } + /// @todo add a timeout and return false, but how long /// to wait since some operations can be very long. bool RA8875::_WaitWhileBusy(uint8_t mask) @@ -416,6 +509,7 @@ return false; } + /// @todo add a timeout and return false, but how long /// to wait since some operations can be very long. bool RA8875::_WaitWhileReg(uint8_t reg, uint8_t mask) @@ -433,7 +527,6 @@ } - dim_t RA8875::fontwidth(void) { if (font == NULL) @@ -670,10 +763,10 @@ WriteCommandW(0x2C, y); } else { WriteCommand(0x02); // RA8875 Internal Fonts - select(true); + _select(true); WriteData(c); _WaitWhileBusy(0x80); - select(false); + _select(false); } } return c; @@ -725,13 +818,13 @@ } #else WriteCommand(0x02); - select(true); + _select(true); while (*string != '\0') { WriteData(*string); ++string; _WaitWhileBusy(0x80); } - select(false); + _select(false); #endif } if (font) @@ -848,14 +941,14 @@ WriteCommand(0x40,0x00); // Graphics write mode SetGraphicsCursor(x, y); WriteCommand(0x02); - select(true); - spiwrite(0x00); // Cmd: write data + _select(true); + _spiwrite(0x00); // Cmd: write data while (count--) { - spiwrite(*p >> 8); - spiwrite(*p & 0xFF); + _spiwrite(*p >> 8); + _spiwrite(*p & 0xFF); p++; } - select(false); + _select(false); REGISTERPERFORMANCE(PRF_PIXELSTREAM); return(noerror); } @@ -870,12 +963,12 @@ WriteCommand(0x40,0x00); // Graphics write mode SetGraphicsCursorRead(x, y); WriteCommand(0x02); - select(true); - spiwrite(0x40); // Cmd: read data - spiwrite(0x00); // dummy read - pixel = spiread(); - pixel |= (spiread() << 8); - select(false); + _select(true); + _spiwrite(0x40); // Cmd: read data + _spiwrite(0x00); // dummy read + pixel = _spiread(); + pixel |= (_spiread() << 8); + _select(false); REGISTERPERFORMANCE(PRF_READPIXEL); return pixel; } @@ -890,15 +983,15 @@ WriteCommand(0x40,0x00); // Graphics write mode SetGraphicsCursorRead(x, y); WriteCommand(0x02); - select(true); - spiwrite(0x40); // Cmd: read data - spiwrite(0x00); // dummy read + _select(true); + _spiwrite(0x40); // Cmd: read data + _spiwrite(0x00); // dummy read while (count--) { - pixel = spiread(); - pixel |= (spiread() << 8); + pixel = _spiread(); + pixel |= (_spiread() << 8); *p++ = pixel; } - select(false); + _select(false); REGISTERPERFORMANCE(PRF_READPIXELSTREAM); return noerror; } @@ -1188,17 +1281,6 @@ } -RetCode_t RA8875::Reset(void) -{ - WriteCommand(0x01, 0x01); // Apply Display Off, Reset - wait_ms(2); // no idea if I need to wait, or how long - WriteCommand(0x01, 0x00); // Display off, Remove reset - wait_ms(2); // no idea if I need to wait, or how long - init(RA8875_DISPLAY_WIDTH, RA8875_DISPLAY_HEIGHT, RA8875_COLORDEPTH_BPP); - return noerror; -} - - RetCode_t RA8875::Backlight_u8(unsigned char brightness) { static bool is_enabled = false; @@ -1327,7 +1409,7 @@ /////////////////////////////////////////////////////////////// // Private functions -unsigned char RA8875::spiwrite(unsigned char data) +unsigned char RA8875::_spiwrite(unsigned char data) { unsigned char retval; @@ -1338,7 +1420,7 @@ } -unsigned char RA8875::spiread(void) +unsigned char RA8875::_spiread(void) { unsigned char retval; unsigned char data = 0; @@ -1350,65 +1432,13 @@ } -RetCode_t RA8875::select(bool chipsel) +RetCode_t RA8875::_select(bool chipsel) { cs = (chipsel == true) ? 0 : 1; return noerror; } -RetCode_t RA8875::init(int width, int height, int color_bpp) -{ - Backlight_u8(0); - WriteCommand(0x88, 0x0B); // PLLC1 - Phase Lock Loop registers - wait_ms(1); - WriteCommand(0x89, 0x02); - wait_ms(1); - - // System Config Register (SYSR) - if (color_bpp == 16) { - WriteCommand(0x10, 0x0C); // 16-bpp (65K colors) color depth, 8-bit interface - } else { // color_bpp == 8 - WriteCommand(0x10, 0x00); // 8-bpp (256 colors) - } - // Pixel Clock Setting Register (PCSR) - WriteCommand(0x04, 0x82); // PDAT on PCLK falling edge, PCLK = 4 x System Clock - wait_ms(1); - - // Horizontal Settings - WriteCommand(0x14, width/8 - 1); //HDWR//Horizontal Display Width Setting Bit[6:0] - WriteCommand(0x15, 0x02); //HNDFCR//Horizontal Non-Display Period fine tune Bit[3:0] - WriteCommand(0x16, 0x03); //HNDR//Horizontal Non-Display Period Bit[4:0] - WriteCommand(0x17, 0x01); //HSTR//HSYNC Start Position[4:0] - WriteCommand(0x18, 0x03); //HPWR//HSYNC Polarity ,The period width of HSYNC. - - // Vertical Settings - WriteCommand(0x19, (height-1)&0xFF); //VDHR0 //Vertical Display Height Bit [7:0] - WriteCommand(0x1a, (height-1)>>8); //VDHR1 //Vertical Display Height Bit [8] - WriteCommand(0x1b, 0x0F); //VNDR0 //Vertical Non-Display Period Bit [7:0] - WriteCommand(0x1c, 0x00); //VNDR1 //Vertical Non-Display Period Bit [8] - WriteCommand(0x1d, 0x0e); //VSTR0 //VSYNC Start Position[7:0] - WriteCommand(0x1e, 0x06); //VSTR1 //VSYNC Start Position[8] - WriteCommand(0x1f, 0x01); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0] - - if (width >= 800 && height >= 480 && color_bpp > 8) { - WriteCommand(0x20, 0x00); // DPCR - 1-layer mode when the resolution is too high - } else { - WriteCommand(0x20, 0x80); // DPCR - 2-layer mode - } - - // Set display image to Blue on Black as default - window(0,0, width, height); // Initialize to full screen - SetTextCursorControl(); - foreground(Blue); - background(Black); - SelectDrawingLayer(1); - cls(); - SelectDrawingLayer(0); - cls(); - return noerror; -} - RetCode_t RA8875::PrintScreen(uint16_t layer, loc_t x, loc_t y, dim_t w, dim_t h, const char *Name_BMP) { #if 1 @@ -1426,6 +1456,7 @@ #endif } + RetCode_t RA8875::PrintScreen(loc_t x, loc_t y, dim_t w, dim_t h, const char *Name_BMP) { BITMAPFILEHEADER BMP_Header; @@ -2211,7 +2242,7 @@ display.printf(" (%3d,%3d) => ", pTest[i].x, pTest[i].y); display.line(pTest[i].x-10, pTest[i].y, pTest[i].x+10, pTest[i].y, White); display.line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, White); - while (!display.TouchPanelRead(&x, &y)) + while (!display.TouchPanelA2DFiltered(&x, &y)) wait_ms(20); pSample[i].x = x; pSample[i].y = y; @@ -2219,7 +2250,7 @@ display.line(pTest[i].x, pTest[i].y-10, pTest[i].x, pTest[i].y+10, Black); display.foreground(Blue); display.printf(" (%4d,%4d)\r\n", x,y); - while (display.TouchPanelRead(&x, &y)) + while (display.TouchPanelA2DFiltered(&x, &y)) wait_ms(20); wait(2); } @@ -2244,7 +2275,7 @@ t.start(); do { point_t point = {0, 0}; - if (display.TouchPanelPoint(&point)) { + if (display.TouchPanelReadable(&point)) { display.pixel(point.x, point.y, Red); } } while (t.read_ms() < 30000); @@ -2415,4 +2446,4 @@ } } -#endif // TESTENABLE \ No newline at end of file +#endif // TESTENABLE