Library to control a Graphics TFT connected to 4-wire SPI - revised for the Raio RA8875 Display Controller.

Dependents:   FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more

Fork of SPI_TFT by Peter Drescher

See Components - RA8875 Based Display

Enhanced touch-screen support - where it previous supported both the Resistive Touch and Capacitive Touch based on the FT5206 Touch Controller, now it also has support for the GSL1680 Touch Controller.

Offline Help Manual (Windows chm)

/media/uploads/WiredHome/ra8875.zip.bin (download, rename to .zip and unzip)

Committer:
WiredHome
Date:
Sun Jan 12 17:40:32 2014 +0000
Revision:
19:3f82c1161fd2
Child:
20:6e2e4a8372eb
Initial commit - mostly working (not Triangles, Externals Fonts). Not ready for other users.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 19:3f82c1161fd2 1 /// RA8875 Display Controller Library.
WiredHome 19:3f82c1161fd2 2 ///
WiredHome 19:3f82c1161fd2 3 /// This is being created for a specific display from buydisplay.com,
WiredHome 19:3f82c1161fd2 4 /// which is 480 x xxx. It has other attributes (like display controller
WiredHome 19:3f82c1161fd2 5 /// managed backlight brightness. So, there are expectations and some
WiredHome 19:3f82c1161fd2 6 /// defined constants based on that specific display.
WiredHome 19:3f82c1161fd2 7 ///
WiredHome 19:3f82c1161fd2 8 #include "RA8875.h"
WiredHome 19:3f82c1161fd2 9
WiredHome 19:3f82c1161fd2 10 //#define DEBUG "RAIO"
WiredHome 19:3f82c1161fd2 11 // ...
WiredHome 19:3f82c1161fd2 12 // INFO("Stuff to show %d", var); // new-line is automatically appended
WiredHome 19:3f82c1161fd2 13 //
WiredHome 19:3f82c1161fd2 14 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 19:3f82c1161fd2 15 #define INFO(x, ...) std::printf("[INF %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 19:3f82c1161fd2 16 #define WARN(x, ...) std::printf("[WRN %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 19:3f82c1161fd2 17 #define ERR(x, ...) std::printf("[ERR %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 19:3f82c1161fd2 18 #else
WiredHome 19:3f82c1161fd2 19 #define INFO(x, ...)
WiredHome 19:3f82c1161fd2 20 #define WARN(x, ...)
WiredHome 19:3f82c1161fd2 21 #define ERR(x, ...)
WiredHome 19:3f82c1161fd2 22 #endif
WiredHome 19:3f82c1161fd2 23
WiredHome 19:3f82c1161fd2 24
WiredHome 19:3f82c1161fd2 25 #define RA8875_DISPLAY_WIDTH 480
WiredHome 19:3f82c1161fd2 26 #define RA8875_DISPLAY_HEIGHT 272
WiredHome 19:3f82c1161fd2 27
WiredHome 19:3f82c1161fd2 28 /// @TODO what is the size?
WiredHome 19:3f82c1161fd2 29 /// If we're using the built-in font, read it from the chip.
WiredHome 19:3f82c1161fd2 30 /// If we're using a custom font, get it from the font metrics.
WiredHome 19:3f82c1161fd2 31 const int size_x = 16;
WiredHome 19:3f82c1161fd2 32 const int size_y = 16;
WiredHome 19:3f82c1161fd2 33
WiredHome 19:3f82c1161fd2 34
WiredHome 19:3f82c1161fd2 35 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 36 #define PERFORMANCE_RESET performance.reset()
WiredHome 19:3f82c1161fd2 37 #define REGISTERPERFORMANCE(a) RegisterPerformance(a)
WiredHome 19:3f82c1161fd2 38 static const char *metricsName[] =
WiredHome 19:3f82c1161fd2 39 {
WiredHome 19:3f82c1161fd2 40 "Point", "Line", "Rectangle", "Rounded Rectangle", "Triangle", "Circle", "Ellipse"
WiredHome 19:3f82c1161fd2 41 };
WiredHome 19:3f82c1161fd2 42 #else
WiredHome 19:3f82c1161fd2 43 #define PERFORMANCE_RESET
WiredHome 19:3f82c1161fd2 44 #define REGISTERPERFORMANCE(a)
WiredHome 19:3f82c1161fd2 45 #endif
WiredHome 19:3f82c1161fd2 46
WiredHome 19:3f82c1161fd2 47 // When it is going to poll a register for completion, how many
WiredHome 19:3f82c1161fd2 48 // uSec should it wait between each polling activity.
WiredHome 19:3f82c1161fd2 49 #define POLLWAITuSec 10
WiredHome 19:3f82c1161fd2 50
WiredHome 19:3f82c1161fd2 51
WiredHome 19:3f82c1161fd2 52 RA8875::RA8875(PinName mosi, PinName miso, PinName sclk, PinName csel, PinName reset, const char *name)
WiredHome 19:3f82c1161fd2 53 : spi(mosi, miso, sclk)
WiredHome 19:3f82c1161fd2 54 , cs(csel)
WiredHome 19:3f82c1161fd2 55 , res(reset)
WiredHome 19:3f82c1161fd2 56 , GraphicsDisplay(name)
WiredHome 19:3f82c1161fd2 57 {
WiredHome 19:3f82c1161fd2 58 font = NULL; // no external font, use internal.
WiredHome 19:3f82c1161fd2 59 select(false); // deselect the display
WiredHome 19:3f82c1161fd2 60 frequency(RA8875_DEFAULT_SPI_FREQ); // data rate
WiredHome 19:3f82c1161fd2 61 init();
WiredHome 19:3f82c1161fd2 62 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 63 performance.start();
WiredHome 19:3f82c1161fd2 64 ClearPerformance();
WiredHome 19:3f82c1161fd2 65 #endif
WiredHome 19:3f82c1161fd2 66 }
WiredHome 19:3f82c1161fd2 67
WiredHome 19:3f82c1161fd2 68 //RA8875::~RA8875()
WiredHome 19:3f82c1161fd2 69 //{
WiredHome 19:3f82c1161fd2 70 //}
WiredHome 19:3f82c1161fd2 71
WiredHome 19:3f82c1161fd2 72 #ifdef PERF_METRICS
WiredHome 19:3f82c1161fd2 73 void RA8875::ClearPerformance()
WiredHome 19:3f82c1161fd2 74 {
WiredHome 19:3f82c1161fd2 75 for (int i=0; i<METRICCOUNT; i++)
WiredHome 19:3f82c1161fd2 76 metrics[i] = 0;
WiredHome 19:3f82c1161fd2 77 }
WiredHome 19:3f82c1161fd2 78
WiredHome 19:3f82c1161fd2 79 void RA8875::RegisterPerformance(method_e method)
WiredHome 19:3f82c1161fd2 80 {
WiredHome 19:3f82c1161fd2 81 unsigned long elapsed = performance.read_us();
WiredHome 19:3f82c1161fd2 82
WiredHome 19:3f82c1161fd2 83 if (method < METRICCOUNT && elapsed > metrics[method])
WiredHome 19:3f82c1161fd2 84 metrics[method] = elapsed;
WiredHome 19:3f82c1161fd2 85 }
WiredHome 19:3f82c1161fd2 86
WiredHome 19:3f82c1161fd2 87 void RA8875::ReportPerformance()
WiredHome 19:3f82c1161fd2 88 {
WiredHome 19:3f82c1161fd2 89 for (int i=0; i<METRICCOUNT; i++) {
WiredHome 19:3f82c1161fd2 90 printf("%10d uS %s\r\n", metrics[i], metricsName[i]);
WiredHome 19:3f82c1161fd2 91 }
WiredHome 19:3f82c1161fd2 92 }
WiredHome 19:3f82c1161fd2 93 #endif
WiredHome 19:3f82c1161fd2 94
WiredHome 19:3f82c1161fd2 95 RetCode_t RA8875::WriteCommand(unsigned char command, unsigned int data)
WiredHome 19:3f82c1161fd2 96 {
WiredHome 19:3f82c1161fd2 97 select(true);
WiredHome 19:3f82c1161fd2 98 spiwrite(0x80);
WiredHome 19:3f82c1161fd2 99 spiwrite(command);
WiredHome 19:3f82c1161fd2 100 if (data <= 0xFF) { // only if in the valid range
WiredHome 19:3f82c1161fd2 101 spiwrite(0x00);
WiredHome 19:3f82c1161fd2 102 spiwrite(data);
WiredHome 19:3f82c1161fd2 103 }
WiredHome 19:3f82c1161fd2 104 select(false);
WiredHome 19:3f82c1161fd2 105 return noerror;
WiredHome 19:3f82c1161fd2 106 }
WiredHome 19:3f82c1161fd2 107
WiredHome 19:3f82c1161fd2 108 RetCode_t RA8875::WriteData(unsigned char data)
WiredHome 19:3f82c1161fd2 109 {
WiredHome 19:3f82c1161fd2 110 select(true);
WiredHome 19:3f82c1161fd2 111 spiwrite(0x00);
WiredHome 19:3f82c1161fd2 112 spiwrite(data);
WiredHome 19:3f82c1161fd2 113 select(false);
WiredHome 19:3f82c1161fd2 114 return noerror;
WiredHome 19:3f82c1161fd2 115 }
WiredHome 19:3f82c1161fd2 116
WiredHome 19:3f82c1161fd2 117 unsigned char RA8875::ReadCommand(unsigned char command)
WiredHome 19:3f82c1161fd2 118 {
WiredHome 19:3f82c1161fd2 119 WriteCommand(command);
WiredHome 19:3f82c1161fd2 120 return ReadData();
WiredHome 19:3f82c1161fd2 121 }
WiredHome 19:3f82c1161fd2 122
WiredHome 19:3f82c1161fd2 123 unsigned char RA8875::ReadData(void)
WiredHome 19:3f82c1161fd2 124 {
WiredHome 19:3f82c1161fd2 125 unsigned char data;
WiredHome 19:3f82c1161fd2 126
WiredHome 19:3f82c1161fd2 127 select(true);
WiredHome 19:3f82c1161fd2 128 spiwrite(0x40);
WiredHome 19:3f82c1161fd2 129 data = spiread();
WiredHome 19:3f82c1161fd2 130 select(false);
WiredHome 19:3f82c1161fd2 131 return data;
WiredHome 19:3f82c1161fd2 132 }
WiredHome 19:3f82c1161fd2 133
WiredHome 19:3f82c1161fd2 134 unsigned char RA8875::ReadStatus(void)
WiredHome 19:3f82c1161fd2 135 {
WiredHome 19:3f82c1161fd2 136 unsigned char data;
WiredHome 19:3f82c1161fd2 137
WiredHome 19:3f82c1161fd2 138 select(true);
WiredHome 19:3f82c1161fd2 139 spiwrite(0xC0);
WiredHome 19:3f82c1161fd2 140 data = spiread();
WiredHome 19:3f82c1161fd2 141 select(false);
WiredHome 19:3f82c1161fd2 142 return data;
WiredHome 19:3f82c1161fd2 143 }
WiredHome 19:3f82c1161fd2 144
WiredHome 19:3f82c1161fd2 145 unsigned int RA8875::fontwidth(void)
WiredHome 19:3f82c1161fd2 146 {
WiredHome 19:3f82c1161fd2 147 if (font == NULL)
WiredHome 19:3f82c1161fd2 148 return size_x;
WiredHome 19:3f82c1161fd2 149 else
WiredHome 19:3f82c1161fd2 150 return width() / font[1];
WiredHome 19:3f82c1161fd2 151 }
WiredHome 19:3f82c1161fd2 152
WiredHome 19:3f82c1161fd2 153 unsigned int RA8875::fontheight(void)
WiredHome 19:3f82c1161fd2 154 {
WiredHome 19:3f82c1161fd2 155 if (font == NULL)
WiredHome 19:3f82c1161fd2 156 return size_y;
WiredHome 19:3f82c1161fd2 157 else
WiredHome 19:3f82c1161fd2 158 return height() / font[2];
WiredHome 19:3f82c1161fd2 159 }
WiredHome 19:3f82c1161fd2 160
WiredHome 19:3f82c1161fd2 161 RetCode_t RA8875::locate(unsigned int x, unsigned int y)
WiredHome 19:3f82c1161fd2 162 {
WiredHome 19:3f82c1161fd2 163 return SetTextCursor(x * fontwidth(), y * fontheight());
WiredHome 19:3f82c1161fd2 164 }
WiredHome 19:3f82c1161fd2 165
WiredHome 19:3f82c1161fd2 166 int RA8875::columns(void)
WiredHome 19:3f82c1161fd2 167 {
WiredHome 19:3f82c1161fd2 168 return width() / fontwidth();
WiredHome 19:3f82c1161fd2 169 }
WiredHome 19:3f82c1161fd2 170
WiredHome 19:3f82c1161fd2 171 int RA8875::rows(void)
WiredHome 19:3f82c1161fd2 172 {
WiredHome 19:3f82c1161fd2 173 return height() / fontheight();
WiredHome 19:3f82c1161fd2 174 }
WiredHome 19:3f82c1161fd2 175
WiredHome 19:3f82c1161fd2 176 int RA8875::width(void)
WiredHome 19:3f82c1161fd2 177 {
WiredHome 19:3f82c1161fd2 178 return RA8875_DISPLAY_WIDTH;
WiredHome 19:3f82c1161fd2 179 }
WiredHome 19:3f82c1161fd2 180
WiredHome 19:3f82c1161fd2 181 int RA8875::height(void)
WiredHome 19:3f82c1161fd2 182 {
WiredHome 19:3f82c1161fd2 183 return RA8875_DISPLAY_HEIGHT;
WiredHome 19:3f82c1161fd2 184 }
WiredHome 19:3f82c1161fd2 185
WiredHome 19:3f82c1161fd2 186 RetCode_t RA8875::SetTextCursor(unsigned int x, unsigned int y)
WiredHome 19:3f82c1161fd2 187 {
WiredHome 19:3f82c1161fd2 188 WriteCommand(0x2A, x & 0xFF);
WiredHome 19:3f82c1161fd2 189 WriteCommand(0x2B, x >> 8);
WiredHome 19:3f82c1161fd2 190 WriteCommand(0x2C, y & 0xFF);
WiredHome 19:3f82c1161fd2 191 WriteCommand(0x2D, y >> 8);
WiredHome 19:3f82c1161fd2 192 INFO("SetTextCursor(%d,%d)", x,y);
WiredHome 19:3f82c1161fd2 193 return noerror;
WiredHome 19:3f82c1161fd2 194 }
WiredHome 19:3f82c1161fd2 195
WiredHome 19:3f82c1161fd2 196 RetCode_t RA8875::SetTextFont(RA8875::font_t font)
WiredHome 19:3f82c1161fd2 197 {
WiredHome 19:3f82c1161fd2 198 if (/*font >= RA8875::ISO8859_1 && */ font <= RA8875::ISO8859_4) {
WiredHome 19:3f82c1161fd2 199 WriteCommand(0x21, (unsigned int)(font));
WiredHome 19:3f82c1161fd2 200 return noerror;
WiredHome 19:3f82c1161fd2 201 } else {
WiredHome 19:3f82c1161fd2 202 return bad_parameter;
WiredHome 19:3f82c1161fd2 203 }
WiredHome 19:3f82c1161fd2 204 }
WiredHome 19:3f82c1161fd2 205
WiredHome 19:3f82c1161fd2 206 RetCode_t RA8875::SetTextFontControl(fill_t fillit,
WiredHome 19:3f82c1161fd2 207 RA8875::font_angle_t angle,
WiredHome 19:3f82c1161fd2 208 RA8875::HorizontalScale hScale,
WiredHome 19:3f82c1161fd2 209 RA8875::VerticalScale vScale,
WiredHome 19:3f82c1161fd2 210 RA8875::alignment_t alignment)
WiredHome 19:3f82c1161fd2 211 {
WiredHome 19:3f82c1161fd2 212 if (hScale >= 1 && hScale <= 4 &&
WiredHome 19:3f82c1161fd2 213 vScale >= 1 && vScale <= 4) {
WiredHome 19:3f82c1161fd2 214 unsigned char x = 0;
WiredHome 19:3f82c1161fd2 215
WiredHome 19:3f82c1161fd2 216 if (alignment == align_full)
WiredHome 19:3f82c1161fd2 217 x |= 0x80;
WiredHome 19:3f82c1161fd2 218 if (fillit == NOFILL)
WiredHome 19:3f82c1161fd2 219 x |= 0x40;
WiredHome 19:3f82c1161fd2 220 if (angle == rotated)
WiredHome 19:3f82c1161fd2 221 x |= 0x10;
WiredHome 19:3f82c1161fd2 222 x |= ((hScale - 1) << 2);
WiredHome 19:3f82c1161fd2 223 x |= ((vScale - 1) << 0);
WiredHome 19:3f82c1161fd2 224 WriteCommand(0x22, x);
WiredHome 19:3f82c1161fd2 225 return noerror;
WiredHome 19:3f82c1161fd2 226 } else {
WiredHome 19:3f82c1161fd2 227 return bad_parameter;
WiredHome 19:3f82c1161fd2 228 }
WiredHome 19:3f82c1161fd2 229 }
WiredHome 19:3f82c1161fd2 230
WiredHome 19:3f82c1161fd2 231 RetCode_t RA8875::SetTextFontSize(RA8875::HorizontalScale hScale, RA8875::VerticalScale vScale)
WiredHome 19:3f82c1161fd2 232 {
WiredHome 19:3f82c1161fd2 233 unsigned char reg = ReadCommand(0x22);
WiredHome 19:3f82c1161fd2 234
WiredHome 19:3f82c1161fd2 235 if (hScale >= 1 && hScale <= 4 && vScale >= 1 && vScale <= 4) {
WiredHome 19:3f82c1161fd2 236 reg &= 0xF0; // keep the high nibble as is.
WiredHome 19:3f82c1161fd2 237 reg |= ((hScale - 1) << 2);
WiredHome 19:3f82c1161fd2 238 reg |= ((vScale - 1) << 0);
WiredHome 19:3f82c1161fd2 239 WriteCommand(0x22, reg);
WiredHome 19:3f82c1161fd2 240 return noerror;
WiredHome 19:3f82c1161fd2 241 } else {
WiredHome 19:3f82c1161fd2 242 return bad_parameter;
WiredHome 19:3f82c1161fd2 243 }
WiredHome 19:3f82c1161fd2 244 }
WiredHome 19:3f82c1161fd2 245
WiredHome 19:3f82c1161fd2 246 int RA8875::_putc(int c)
WiredHome 19:3f82c1161fd2 247 {
WiredHome 19:3f82c1161fd2 248 if (c) {
WiredHome 19:3f82c1161fd2 249 if (c == '\r') {
WiredHome 19:3f82c1161fd2 250 unsigned int x;
WiredHome 19:3f82c1161fd2 251 x = ReadCommand(0x30) | (ReadCommand(0x31) << 8); // Left edge of active window
WiredHome 19:3f82c1161fd2 252 WriteCommand(0x2A, x & 0xFF);
WiredHome 19:3f82c1161fd2 253 WriteCommand(0x2B, x >> 8);
WiredHome 19:3f82c1161fd2 254 } else if (c == '\n') {
WiredHome 19:3f82c1161fd2 255 unsigned int y;
WiredHome 19:3f82c1161fd2 256 y = ReadCommand(0x2C) | (ReadCommand(0x2D) << 8); // current y location
WiredHome 19:3f82c1161fd2 257 y += fontheight();
WiredHome 19:3f82c1161fd2 258 if (y > height()) // @TODO > active window, then scroll?
WiredHome 19:3f82c1161fd2 259 y = 0;
WiredHome 19:3f82c1161fd2 260 WriteCommand(0x2C, y & 0xFF);
WiredHome 19:3f82c1161fd2 261 WriteCommand(0x2D, y >> 8);
WiredHome 19:3f82c1161fd2 262 } else {
WiredHome 19:3f82c1161fd2 263 if (font == NULL) {
WiredHome 19:3f82c1161fd2 264 WriteCommand(0x40,0x80);
WiredHome 19:3f82c1161fd2 265 WriteCommand(0x02);
WiredHome 19:3f82c1161fd2 266 select(true);
WiredHome 19:3f82c1161fd2 267 WriteData(c);
WiredHome 19:3f82c1161fd2 268 while (ReadStatus() & 0x80)
WiredHome 19:3f82c1161fd2 269 wait_us(POLLWAITuSec); // Chk_Busy();
WiredHome 19:3f82c1161fd2 270 select(false);
WiredHome 19:3f82c1161fd2 271 } else {
WiredHome 19:3f82c1161fd2 272 unsigned int x = (ReadCommand(0x2A) | (ReadCommand(0x2B) << 8)) / fontwidth();
WiredHome 19:3f82c1161fd2 273 unsigned int y = (ReadCommand(0x2C) | (ReadCommand(0x2D) << 8)) / fontheight();
WiredHome 19:3f82c1161fd2 274 character(x,y,c);
WiredHome 19:3f82c1161fd2 275 }
WiredHome 19:3f82c1161fd2 276 // @TODO right of active window, then wrap?
WiredHome 19:3f82c1161fd2 277 }
WiredHome 19:3f82c1161fd2 278 }
WiredHome 19:3f82c1161fd2 279 return c;
WiredHome 19:3f82c1161fd2 280 }
WiredHome 19:3f82c1161fd2 281
WiredHome 19:3f82c1161fd2 282 void RA8875::puts(unsigned int x, unsigned int y, const char * string)
WiredHome 19:3f82c1161fd2 283 {
WiredHome 19:3f82c1161fd2 284 SetTextCursor(x,y);
WiredHome 19:3f82c1161fd2 285 puts(string);
WiredHome 19:3f82c1161fd2 286 }
WiredHome 19:3f82c1161fd2 287
WiredHome 19:3f82c1161fd2 288 void RA8875::puts(const char * string)
WiredHome 19:3f82c1161fd2 289 {
WiredHome 19:3f82c1161fd2 290 if (*string != '\0') {
WiredHome 19:3f82c1161fd2 291 INFO("puts(%s)", string);
WiredHome 19:3f82c1161fd2 292 #if 1
WiredHome 19:3f82c1161fd2 293 while (*string) { // @TODO calling individual _putc is slower... anything to do?
WiredHome 19:3f82c1161fd2 294 _putc(*string++);
WiredHome 19:3f82c1161fd2 295 }
WiredHome 19:3f82c1161fd2 296 #else
WiredHome 19:3f82c1161fd2 297 WriteCommand(0x40,0x80); // Put display into text mode
WiredHome 19:3f82c1161fd2 298 WriteCommand(0x02);
WiredHome 19:3f82c1161fd2 299 select(true);
WiredHome 19:3f82c1161fd2 300 while (*string != '\0') {
WiredHome 19:3f82c1161fd2 301 WriteData(*string);
WiredHome 19:3f82c1161fd2 302 ++string;
WiredHome 19:3f82c1161fd2 303 while (ReadStatus() & 0x80)
WiredHome 19:3f82c1161fd2 304 wait_us(POLLWAITuSec); // Chk_Busy();
WiredHome 19:3f82c1161fd2 305 }
WiredHome 19:3f82c1161fd2 306 select(false);
WiredHome 19:3f82c1161fd2 307 #endif
WiredHome 19:3f82c1161fd2 308 }
WiredHome 19:3f82c1161fd2 309 }
WiredHome 19:3f82c1161fd2 310
WiredHome 19:3f82c1161fd2 311 RetCode_t RA8875::SetMemoryCursor(unsigned int x, unsigned int y)
WiredHome 19:3f82c1161fd2 312
WiredHome 19:3f82c1161fd2 313 {
WiredHome 19:3f82c1161fd2 314 WriteCommand(0x46, x & 0xFF);
WiredHome 19:3f82c1161fd2 315 WriteCommand(0x47, x >> 8);
WiredHome 19:3f82c1161fd2 316 WriteCommand(0x48, y & 0xFF);
WiredHome 19:3f82c1161fd2 317 WriteCommand(0x49, y >> 8);
WiredHome 19:3f82c1161fd2 318 return noerror;
WiredHome 19:3f82c1161fd2 319 }
WiredHome 19:3f82c1161fd2 320
WiredHome 19:3f82c1161fd2 321 RetCode_t RA8875::SetWindow(unsigned int x, unsigned int y, unsigned int width, unsigned int height)
WiredHome 19:3f82c1161fd2 322 {
WiredHome 19:3f82c1161fd2 323 WriteCommand(0x30, x & 0xFF); // HSAW0
WiredHome 19:3f82c1161fd2 324 WriteCommand(0x31, x >> 8); // HSAW1
WiredHome 19:3f82c1161fd2 325 WriteCommand(0x32, y & 0xFF); // VSAW0
WiredHome 19:3f82c1161fd2 326 WriteCommand(0x33, y >> 8); // VSAW1
WiredHome 19:3f82c1161fd2 327 WriteCommand(0x34, (x+width-1) & 0xFF); // HEAW0
WiredHome 19:3f82c1161fd2 328 WriteCommand(0x35, (x+width-1) >> 8); // HEAW1
WiredHome 19:3f82c1161fd2 329 WriteCommand(0x36, (y+height-1) & 0xFF); // VEAW0
WiredHome 19:3f82c1161fd2 330 WriteCommand(0x37, (y+height-1) >> 8); // VEAW1
WiredHome 19:3f82c1161fd2 331 return noerror;
WiredHome 19:3f82c1161fd2 332 }
WiredHome 19:3f82c1161fd2 333
WiredHome 19:3f82c1161fd2 334 RetCode_t RA8875::cls(void)
WiredHome 19:3f82c1161fd2 335 {
WiredHome 19:3f82c1161fd2 336 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 337 clsw(FULLWINDOW);
WiredHome 19:3f82c1161fd2 338 REGISTERPERFORMANCE(PRF_CLS);
WiredHome 19:3f82c1161fd2 339 return noerror;
WiredHome 19:3f82c1161fd2 340 }
WiredHome 19:3f82c1161fd2 341
WiredHome 19:3f82c1161fd2 342 RetCode_t RA8875::clsw(RA8875::Region_t region)
WiredHome 19:3f82c1161fd2 343 {
WiredHome 19:3f82c1161fd2 344 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 345 WriteCommand(0x8E, (region == ACTIVEWINDOW) ? 0xC0 : 0x80);
WiredHome 19:3f82c1161fd2 346 while (ReadCommand(0x8E) & 0x80)
WiredHome 19:3f82c1161fd2 347 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 348 REGISTERPERFORMANCE(PRF_CLS);
WiredHome 19:3f82c1161fd2 349 return noerror;
WiredHome 19:3f82c1161fd2 350 }
WiredHome 19:3f82c1161fd2 351
WiredHome 19:3f82c1161fd2 352 RetCode_t RA8875::pixel(unsigned int x, unsigned int y, color_t color)
WiredHome 19:3f82c1161fd2 353 {
WiredHome 19:3f82c1161fd2 354 foreground(color);
WiredHome 19:3f82c1161fd2 355 return pixel(x,y);
WiredHome 19:3f82c1161fd2 356 }
WiredHome 19:3f82c1161fd2 357
WiredHome 19:3f82c1161fd2 358 RetCode_t RA8875::pixel(unsigned int x, unsigned int y)
WiredHome 19:3f82c1161fd2 359 {
WiredHome 19:3f82c1161fd2 360 RetCode_t ret;
WiredHome 19:3f82c1161fd2 361
WiredHome 19:3f82c1161fd2 362 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 363 #if 1
WiredHome 19:3f82c1161fd2 364 color_t color = GetForeColor();
WiredHome 19:3f82c1161fd2 365 WriteCommand(0x40,0x00); // Graphics write mode
WiredHome 19:3f82c1161fd2 366 SetMemoryCursor(x, y);
WiredHome 19:3f82c1161fd2 367 WriteCommand(0x02); //start data write
WiredHome 19:3f82c1161fd2 368 WriteData(color & 0xFF);
WiredHome 19:3f82c1161fd2 369 WriteData(color >> 8);
WiredHome 19:3f82c1161fd2 370 ret = noerror;
WiredHome 19:3f82c1161fd2 371 #else
WiredHome 19:3f82c1161fd2 372 // There isn't actually a set pixel function that I found
WiredHome 19:3f82c1161fd2 373 // so we'll emulate it as we can.
WiredHome 19:3f82c1161fd2 374 ret = line(x,y, x,y);
WiredHome 19:3f82c1161fd2 375 #endif
WiredHome 19:3f82c1161fd2 376 REGISTERPERFORMANCE(PRF_DRAWPOINT);
WiredHome 19:3f82c1161fd2 377 return ret;
WiredHome 19:3f82c1161fd2 378 }
WiredHome 19:3f82c1161fd2 379
WiredHome 19:3f82c1161fd2 380 RetCode_t RA8875::line(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, color_t color)
WiredHome 19:3f82c1161fd2 381 {
WiredHome 19:3f82c1161fd2 382 foreground(color);
WiredHome 19:3f82c1161fd2 383 return line(x1,y1,x2,y2);
WiredHome 19:3f82c1161fd2 384 }
WiredHome 19:3f82c1161fd2 385
WiredHome 19:3f82c1161fd2 386 RetCode_t RA8875::line(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
WiredHome 19:3f82c1161fd2 387 {
WiredHome 19:3f82c1161fd2 388 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 389 WriteCommand(0x91, x1 & 0xFF);
WiredHome 19:3f82c1161fd2 390 WriteCommand(0x92, x1 >> 8);
WiredHome 19:3f82c1161fd2 391 WriteCommand(0x93, y1 & 0xFF);
WiredHome 19:3f82c1161fd2 392 WriteCommand(0x94, y1 >> 8);
WiredHome 19:3f82c1161fd2 393 WriteCommand(0x95, x2 & 0xFF);
WiredHome 19:3f82c1161fd2 394 WriteCommand(0x96, x2 >> 8);
WiredHome 19:3f82c1161fd2 395 WriteCommand(0x97, y2 & 0xFF);
WiredHome 19:3f82c1161fd2 396 WriteCommand(0x98, y2 >> 8);
WiredHome 19:3f82c1161fd2 397
WiredHome 19:3f82c1161fd2 398 unsigned char drawCmd = 0x00; // Line
WiredHome 19:3f82c1161fd2 399 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 400 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 401 while (ReadCommand(0x90) & 0x80) // await completion.
WiredHome 19:3f82c1161fd2 402 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 403 REGISTERPERFORMANCE(PRF_DRAWLINE);
WiredHome 19:3f82c1161fd2 404 return noerror;
WiredHome 19:3f82c1161fd2 405 }
WiredHome 19:3f82c1161fd2 406
WiredHome 19:3f82c1161fd2 407 RetCode_t RA8875::fillrect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 408 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 409 {
WiredHome 19:3f82c1161fd2 410 return rect(x1,y1,x2,y2,color,fillit);
WiredHome 19:3f82c1161fd2 411 }
WiredHome 19:3f82c1161fd2 412
WiredHome 19:3f82c1161fd2 413 RetCode_t RA8875::rect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 414 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 415 {
WiredHome 19:3f82c1161fd2 416 foreground(color);
WiredHome 19:3f82c1161fd2 417 return rect(x1,y1,x2,y2,fillit);
WiredHome 19:3f82c1161fd2 418 }
WiredHome 19:3f82c1161fd2 419
WiredHome 19:3f82c1161fd2 420 RetCode_t RA8875::rect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 421 fill_t fillit)
WiredHome 19:3f82c1161fd2 422 {
WiredHome 19:3f82c1161fd2 423 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 424 if (x1 == x2 && y1 == y2) {
WiredHome 19:3f82c1161fd2 425 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 426 } else if (x1 == x2) {
WiredHome 19:3f82c1161fd2 427 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 428 } else if (y1 == y2) {
WiredHome 19:3f82c1161fd2 429 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 430 } else {
WiredHome 19:3f82c1161fd2 431 WriteCommand(0x91, x1 & 0xFF);
WiredHome 19:3f82c1161fd2 432 WriteCommand(0x92, x1 >> 8);
WiredHome 19:3f82c1161fd2 433 WriteCommand(0x93, y1 & 0xFF);
WiredHome 19:3f82c1161fd2 434 WriteCommand(0x94, y1 >> 8);
WiredHome 19:3f82c1161fd2 435 WriteCommand(0x95, x2 & 0xFF);
WiredHome 19:3f82c1161fd2 436 WriteCommand(0x96, x2 >> 8);
WiredHome 19:3f82c1161fd2 437 WriteCommand(0x97, y2 & 0xFF);
WiredHome 19:3f82c1161fd2 438 WriteCommand(0x98, y2 >> 8);
WiredHome 19:3f82c1161fd2 439
WiredHome 19:3f82c1161fd2 440 unsigned char drawCmd = 0x10; // Rectangle
WiredHome 19:3f82c1161fd2 441 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 442 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 443 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 444 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 445 while (ReadCommand(0x90) & 0x80) // await completion.
WiredHome 19:3f82c1161fd2 446 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 447 }
WiredHome 19:3f82c1161fd2 448 REGISTERPERFORMANCE(PRF_DRAWRECTANGLE);
WiredHome 19:3f82c1161fd2 449 return noerror;
WiredHome 19:3f82c1161fd2 450 }
WiredHome 19:3f82c1161fd2 451
WiredHome 19:3f82c1161fd2 452 RetCode_t RA8875::fillroundrect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 453 unsigned int radius1, unsigned int radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 454 {
WiredHome 19:3f82c1161fd2 455 foreground(color);
WiredHome 19:3f82c1161fd2 456 return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 457 }
WiredHome 19:3f82c1161fd2 458
WiredHome 19:3f82c1161fd2 459 RetCode_t RA8875::roundrect(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 460 unsigned int radius1, unsigned int radius2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 461 {
WiredHome 19:3f82c1161fd2 462 foreground(color);
WiredHome 19:3f82c1161fd2 463 return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
WiredHome 19:3f82c1161fd2 464 }
WiredHome 19:3f82c1161fd2 465
WiredHome 19:3f82c1161fd2 466 RetCode_t RA8875::roundrect(unsigned int x1, unsigned int y1 ,unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 467 unsigned int radius1, unsigned int radius2, fill_t fillit)
WiredHome 19:3f82c1161fd2 468 {
WiredHome 19:3f82c1161fd2 469 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 470
WiredHome 19:3f82c1161fd2 471 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 472 if (x1 == x2 && y1 == y2) {
WiredHome 19:3f82c1161fd2 473 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 474 } else if (x1 == x2) {
WiredHome 19:3f82c1161fd2 475 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 476 } else if (y1 == y2) {
WiredHome 19:3f82c1161fd2 477 line(x1, y1, x2, y2);
WiredHome 19:3f82c1161fd2 478 } else {
WiredHome 19:3f82c1161fd2 479 WriteCommand(0x91, x1 & 0xFF);
WiredHome 19:3f82c1161fd2 480 WriteCommand(0x92, x1 >> 8);
WiredHome 19:3f82c1161fd2 481 WriteCommand(0x93, y1 & 0xFF);
WiredHome 19:3f82c1161fd2 482 WriteCommand(0x94, y1 >> 8);
WiredHome 19:3f82c1161fd2 483 WriteCommand(0x95, x2 & 0xFF);
WiredHome 19:3f82c1161fd2 484 WriteCommand(0x96, x2 >> 8);
WiredHome 19:3f82c1161fd2 485 WriteCommand(0x97, y2 & 0xFF);
WiredHome 19:3f82c1161fd2 486 WriteCommand(0x98, y2 >> 8);
WiredHome 19:3f82c1161fd2 487
WiredHome 19:3f82c1161fd2 488 //while (r && r > (x2 - x1) || r > (y2 - y1))
WiredHome 19:3f82c1161fd2 489 // r--;
WiredHome 19:3f82c1161fd2 490 WriteCommand(0xA1, radius1 & 0xFF);
WiredHome 19:3f82c1161fd2 491 WriteCommand(0xA2, radius1 >> 8);
WiredHome 19:3f82c1161fd2 492 WriteCommand(0xA3, radius2 & 0xFF);
WiredHome 19:3f82c1161fd2 493 WriteCommand(0xA4, radius2 >> 8);
WiredHome 19:3f82c1161fd2 494
WiredHome 19:3f82c1161fd2 495 unsigned char drawCmd = 0x20; // Rounded Rectangle
WiredHome 19:3f82c1161fd2 496 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 497 drawCmd |= 0x40;
WiredHome 19:3f82c1161fd2 498 WriteCommand(0xA0, drawCmd);
WiredHome 19:3f82c1161fd2 499 WriteCommand(0xA0, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 500 while (ReadCommand(0xA0) & 0x80) { // await completion.
WiredHome 19:3f82c1161fd2 501 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 502 }
WiredHome 19:3f82c1161fd2 503 }
WiredHome 19:3f82c1161fd2 504 REGISTERPERFORMANCE(PRF_DRAWROUNDEDRECTANGLE);
WiredHome 19:3f82c1161fd2 505 return ret;
WiredHome 19:3f82c1161fd2 506 }
WiredHome 19:3f82c1161fd2 507
WiredHome 19:3f82c1161fd2 508 RetCode_t RA8875::triangle(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 509 unsigned int x3, unsigned int y3, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 510 {
WiredHome 19:3f82c1161fd2 511 foreground(color);
WiredHome 19:3f82c1161fd2 512 return triangle(x1,y1,x2,y2,x3,y3,color,fillit);
WiredHome 19:3f82c1161fd2 513 }
WiredHome 19:3f82c1161fd2 514
WiredHome 19:3f82c1161fd2 515 RetCode_t RA8875::filltriangle(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 516 unsigned int x3, unsigned int y3, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 517 {
WiredHome 19:3f82c1161fd2 518 foreground(color);
WiredHome 19:3f82c1161fd2 519 return triangle(x1,y1,x2,y2,x3,y3,color,fillit);
WiredHome 19:3f82c1161fd2 520 }
WiredHome 19:3f82c1161fd2 521
WiredHome 19:3f82c1161fd2 522 RetCode_t RA8875::triangle(unsigned int x1, unsigned int y1 ,unsigned int x2, unsigned int y2,
WiredHome 19:3f82c1161fd2 523 unsigned int x3, unsigned int y3, fill_t fillit)
WiredHome 19:3f82c1161fd2 524 {
WiredHome 19:3f82c1161fd2 525 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 526
WiredHome 19:3f82c1161fd2 527 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 528 if (x1 == x2 && y1 == y2 && x1 == x3 && y1 == y3) {
WiredHome 19:3f82c1161fd2 529 pixel(x1, y1);
WiredHome 19:3f82c1161fd2 530 } else {
WiredHome 19:3f82c1161fd2 531 WriteCommand(0x91, x1 & 0xFF);
WiredHome 19:3f82c1161fd2 532 WriteCommand(0x92, x1 >> 8);
WiredHome 19:3f82c1161fd2 533 WriteCommand(0x93, y1 & 0xFF);
WiredHome 19:3f82c1161fd2 534 WriteCommand(0x94, y1 >> 8);
WiredHome 19:3f82c1161fd2 535
WiredHome 19:3f82c1161fd2 536 WriteCommand(0x95, x2 & 0xFF);
WiredHome 19:3f82c1161fd2 537 WriteCommand(0x96, x2 >> 8);
WiredHome 19:3f82c1161fd2 538 WriteCommand(0x97, y2 & 0xFF);
WiredHome 19:3f82c1161fd2 539 WriteCommand(0x98, y2 >> 8);
WiredHome 19:3f82c1161fd2 540
WiredHome 19:3f82c1161fd2 541 WriteCommand(0xA9, x3 & 0xFF);
WiredHome 19:3f82c1161fd2 542 WriteCommand(0xAA, x3 >> 8);
WiredHome 19:3f82c1161fd2 543 WriteCommand(0xAB, y3 & 0xFF);
WiredHome 19:3f82c1161fd2 544 WriteCommand(0xAC, y3 >> 8);
WiredHome 19:3f82c1161fd2 545
WiredHome 19:3f82c1161fd2 546 unsigned char drawCmd = 0x01; // Triangle
WiredHome 19:3f82c1161fd2 547 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 548 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 549 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 550 WriteCommand(0x90, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 551 while (ReadCommand(0x90) & 0x80) // await completion.
WiredHome 19:3f82c1161fd2 552 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 553 }
WiredHome 19:3f82c1161fd2 554 REGISTERPERFORMANCE(PRF_DRAWTRIANGLE);
WiredHome 19:3f82c1161fd2 555 return ret;
WiredHome 19:3f82c1161fd2 556 }
WiredHome 19:3f82c1161fd2 557
WiredHome 19:3f82c1161fd2 558 RetCode_t RA8875::circle(unsigned int x, unsigned int y, unsigned int radius,
WiredHome 19:3f82c1161fd2 559 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 560 {
WiredHome 19:3f82c1161fd2 561 foreground(color);
WiredHome 19:3f82c1161fd2 562 return circle(x,y,radius,fillit);
WiredHome 19:3f82c1161fd2 563 }
WiredHome 19:3f82c1161fd2 564
WiredHome 19:3f82c1161fd2 565 RetCode_t RA8875::fillcircle(unsigned int x, unsigned int y, unsigned int radius,
WiredHome 19:3f82c1161fd2 566 color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 567 {
WiredHome 19:3f82c1161fd2 568 foreground(color);
WiredHome 19:3f82c1161fd2 569 return circle(x,y,radius,fillit);
WiredHome 19:3f82c1161fd2 570 }
WiredHome 19:3f82c1161fd2 571
WiredHome 19:3f82c1161fd2 572 RetCode_t RA8875::circle(unsigned int x, unsigned int y, unsigned int radius, fill_t fillit)
WiredHome 19:3f82c1161fd2 573 {
WiredHome 19:3f82c1161fd2 574 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 575
WiredHome 19:3f82c1161fd2 576 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 577 if (radius <= 0) {
WiredHome 19:3f82c1161fd2 578 ret = bad_parameter;
WiredHome 19:3f82c1161fd2 579 } else if (radius == 1) {
WiredHome 19:3f82c1161fd2 580 pixel(x,y);
WiredHome 19:3f82c1161fd2 581 } else {
WiredHome 19:3f82c1161fd2 582 WriteCommand(0x99, x & 0xFF);
WiredHome 19:3f82c1161fd2 583 WriteCommand(0x9a, x >> 8);
WiredHome 19:3f82c1161fd2 584 WriteCommand(0x9b, y & 0xFF);
WiredHome 19:3f82c1161fd2 585 WriteCommand(0x9c, y >> 8);
WiredHome 19:3f82c1161fd2 586 WriteCommand(0x9d, radius & 0xFF);
WiredHome 19:3f82c1161fd2 587
WiredHome 19:3f82c1161fd2 588 unsigned char drawCmd = 0x00; // Circle
WiredHome 19:3f82c1161fd2 589 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 590 drawCmd |= 0x20;
WiredHome 19:3f82c1161fd2 591 WriteCommand(0x90, drawCmd);
WiredHome 19:3f82c1161fd2 592 WriteCommand(0x90, 0x40 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 593 while (ReadCommand(0x90) & 0x40) // await completion.
WiredHome 19:3f82c1161fd2 594 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 595 }
WiredHome 19:3f82c1161fd2 596 REGISTERPERFORMANCE(PRF_DRAWCIRCLE);
WiredHome 19:3f82c1161fd2 597 return ret;
WiredHome 19:3f82c1161fd2 598 }
WiredHome 19:3f82c1161fd2 599
WiredHome 19:3f82c1161fd2 600 RetCode_t RA8875::ellipse(unsigned int x, unsigned int y, unsigned int R1, unsigned int R2, color_t color, fill_t fillit)
WiredHome 19:3f82c1161fd2 601 {
WiredHome 19:3f82c1161fd2 602 foreground(color);
WiredHome 19:3f82c1161fd2 603 return ellipse(x,y,R1,R2,fillit);
WiredHome 19:3f82c1161fd2 604 }
WiredHome 19:3f82c1161fd2 605
WiredHome 19:3f82c1161fd2 606 RetCode_t RA8875::ellipse(unsigned int x, unsigned int y, unsigned int R1, unsigned int R2, fill_t fillit)
WiredHome 19:3f82c1161fd2 607 {
WiredHome 19:3f82c1161fd2 608 RetCode_t ret = noerror;
WiredHome 19:3f82c1161fd2 609
WiredHome 19:3f82c1161fd2 610 PERFORMANCE_RESET;
WiredHome 19:3f82c1161fd2 611 if (R1 <= 0 || R2 <= 0) {
WiredHome 19:3f82c1161fd2 612 ; // do nothing
WiredHome 19:3f82c1161fd2 613 } else if (R1 == 1 && R2 == 1) {
WiredHome 19:3f82c1161fd2 614 pixel(x, y);
WiredHome 19:3f82c1161fd2 615 } else {
WiredHome 19:3f82c1161fd2 616 WriteCommand(0xA5, x & 0xFF);
WiredHome 19:3f82c1161fd2 617 WriteCommand(0xA6, x >> 8);
WiredHome 19:3f82c1161fd2 618 WriteCommand(0xA7, y & 0xFF);
WiredHome 19:3f82c1161fd2 619 WriteCommand(0xA8, y >> 8);
WiredHome 19:3f82c1161fd2 620 WriteCommand(0xA1, R1 & 0xFF);
WiredHome 19:3f82c1161fd2 621 WriteCommand(0xA2, R1 >> 8);
WiredHome 19:3f82c1161fd2 622 WriteCommand(0xA3, R2 & 0xFF);
WiredHome 19:3f82c1161fd2 623 WriteCommand(0xA4, R2 >> 8);
WiredHome 19:3f82c1161fd2 624
WiredHome 19:3f82c1161fd2 625 unsigned char drawCmd = 0x00; // Ellipse
WiredHome 19:3f82c1161fd2 626 if (fillit == FILL)
WiredHome 19:3f82c1161fd2 627 drawCmd |= 0x40;
WiredHome 19:3f82c1161fd2 628 WriteCommand(0xA0, drawCmd);
WiredHome 19:3f82c1161fd2 629 WriteCommand(0xA0, 0x80 + drawCmd); // Start drawing.
WiredHome 19:3f82c1161fd2 630 while (ReadCommand(0xA0) & 0x80) // await completion.
WiredHome 19:3f82c1161fd2 631 wait_us(POLLWAITuSec);
WiredHome 19:3f82c1161fd2 632 }
WiredHome 19:3f82c1161fd2 633 REGISTERPERFORMANCE(PRF_DRAWELLIPSE);
WiredHome 19:3f82c1161fd2 634 return ret;
WiredHome 19:3f82c1161fd2 635 }
WiredHome 19:3f82c1161fd2 636
WiredHome 19:3f82c1161fd2 637
WiredHome 19:3f82c1161fd2 638 RetCode_t RA8875::frequency(unsigned long Hz)
WiredHome 19:3f82c1161fd2 639 {
WiredHome 19:3f82c1161fd2 640 spi.frequency(Hz);
WiredHome 19:3f82c1161fd2 641 // __ ___
WiredHome 19:3f82c1161fd2 642 // Clock ___A Rising edge latched
WiredHome 19:3f82c1161fd2 643 // ___ ____
WiredHome 19:3f82c1161fd2 644 // Data ___X____
WiredHome 19:3f82c1161fd2 645 spi.format(8, 3); // 8 bits and clock to data phase 0
WiredHome 19:3f82c1161fd2 646 init();
WiredHome 19:3f82c1161fd2 647 return noerror;
WiredHome 19:3f82c1161fd2 648 }
WiredHome 19:3f82c1161fd2 649
WiredHome 19:3f82c1161fd2 650 RetCode_t RA8875::Power(bool on)
WiredHome 19:3f82c1161fd2 651 {
WiredHome 19:3f82c1161fd2 652 WriteCommand(0x01, (on) ? 0x80 : 0x00);
WiredHome 19:3f82c1161fd2 653 return noerror;
WiredHome 19:3f82c1161fd2 654 }
WiredHome 19:3f82c1161fd2 655
WiredHome 19:3f82c1161fd2 656 RetCode_t RA8875::Reset(void)
WiredHome 19:3f82c1161fd2 657 {
WiredHome 19:3f82c1161fd2 658 WriteCommand(0x01, 0x01); // Apply Display Off, Reset
WiredHome 19:3f82c1161fd2 659 wait_ms(2); // no idea if I need to wait, or how long
WiredHome 19:3f82c1161fd2 660 WriteCommand(0x01, 0x00); // Display off, Remove reset
WiredHome 19:3f82c1161fd2 661 wait_ms(2); // no idea if I need to wait, or how long
WiredHome 19:3f82c1161fd2 662 init();
WiredHome 19:3f82c1161fd2 663 return noerror;
WiredHome 19:3f82c1161fd2 664 }
WiredHome 19:3f82c1161fd2 665
WiredHome 19:3f82c1161fd2 666
WiredHome 19:3f82c1161fd2 667 RetCode_t RA8875::Backlight_u8(unsigned char brightness)
WiredHome 19:3f82c1161fd2 668 {
WiredHome 19:3f82c1161fd2 669 static bool is_enabled = false;
WiredHome 19:3f82c1161fd2 670 if (brightness == 0) {
WiredHome 19:3f82c1161fd2 671 WriteCommand(0x8a); // Disable the PWM
WiredHome 19:3f82c1161fd2 672 WriteData(0x00);
WiredHome 19:3f82c1161fd2 673 is_enabled = false;
WiredHome 19:3f82c1161fd2 674 } else if (!is_enabled) {
WiredHome 19:3f82c1161fd2 675 WriteCommand(0x8a); // Enable the PWM
WiredHome 19:3f82c1161fd2 676 WriteData(0x80);
WiredHome 19:3f82c1161fd2 677 WriteCommand(0x8a); // Not sure why this is needed, but following the pattern
WiredHome 19:3f82c1161fd2 678 WriteData(0x81); // open PWM (SYS_CLK / 2 as best I can tell)
WiredHome 19:3f82c1161fd2 679 is_enabled = true;
WiredHome 19:3f82c1161fd2 680 }
WiredHome 19:3f82c1161fd2 681 WriteCommand(0x8b, brightness); // Brightness parameter 0xff-0x00
WiredHome 19:3f82c1161fd2 682 return noerror;
WiredHome 19:3f82c1161fd2 683 }
WiredHome 19:3f82c1161fd2 684
WiredHome 19:3f82c1161fd2 685 RetCode_t RA8875::Backlight(float brightness)
WiredHome 19:3f82c1161fd2 686 {
WiredHome 19:3f82c1161fd2 687 unsigned char b;
WiredHome 19:3f82c1161fd2 688
WiredHome 19:3f82c1161fd2 689 if (brightness > 1.0)
WiredHome 19:3f82c1161fd2 690 b = 255;
WiredHome 19:3f82c1161fd2 691 else if (brightness < 0)
WiredHome 19:3f82c1161fd2 692 b = 0;
WiredHome 19:3f82c1161fd2 693 else
WiredHome 19:3f82c1161fd2 694 b = (unsigned char)(brightness * 255);
WiredHome 19:3f82c1161fd2 695 return Backlight_u8(b);
WiredHome 19:3f82c1161fd2 696 }
WiredHome 19:3f82c1161fd2 697
WiredHome 19:3f82c1161fd2 698
WiredHome 19:3f82c1161fd2 699 RetCode_t RA8875::set_font(const unsigned char * _font)
WiredHome 19:3f82c1161fd2 700 {
WiredHome 19:3f82c1161fd2 701 font = _font;
WiredHome 19:3f82c1161fd2 702 return noerror; // trusting them, but we could put some checks in here...
WiredHome 19:3f82c1161fd2 703 }
WiredHome 19:3f82c1161fd2 704
WiredHome 19:3f82c1161fd2 705 RetCode_t RA8875::background(color_t color)
WiredHome 19:3f82c1161fd2 706 {
WiredHome 19:3f82c1161fd2 707 WriteCommand(0x60, (color>>11)); // BGCR0
WiredHome 19:3f82c1161fd2 708 WriteCommand(0x61, (unsigned char)(color>>5)); // BGCR0
WiredHome 19:3f82c1161fd2 709 WriteCommand(0x62, (unsigned char)(color)); // BGCR0
WiredHome 19:3f82c1161fd2 710 return noerror;
WiredHome 19:3f82c1161fd2 711 }
WiredHome 19:3f82c1161fd2 712
WiredHome 19:3f82c1161fd2 713 RetCode_t RA8875::background(unsigned char r, unsigned char g, unsigned char b)
WiredHome 19:3f82c1161fd2 714 {
WiredHome 19:3f82c1161fd2 715 WriteCommand(0x60, r);
WiredHome 19:3f82c1161fd2 716 WriteCommand(0x61, g);
WiredHome 19:3f82c1161fd2 717 WriteCommand(0x62, b);
WiredHome 19:3f82c1161fd2 718 return noerror;
WiredHome 19:3f82c1161fd2 719 }
WiredHome 19:3f82c1161fd2 720
WiredHome 19:3f82c1161fd2 721 RetCode_t RA8875::foreground(color_t color)
WiredHome 19:3f82c1161fd2 722 {
WiredHome 19:3f82c1161fd2 723 WriteCommand(0x63, (unsigned char)(color>>11));
WiredHome 19:3f82c1161fd2 724 WriteCommand(0x64, (unsigned char)(color>>5));
WiredHome 19:3f82c1161fd2 725 WriteCommand(0x65, (unsigned char)(color));
WiredHome 19:3f82c1161fd2 726 return noerror;
WiredHome 19:3f82c1161fd2 727 }
WiredHome 19:3f82c1161fd2 728
WiredHome 19:3f82c1161fd2 729 RetCode_t RA8875::foreground(unsigned char setR, unsigned char setG, unsigned char setB)
WiredHome 19:3f82c1161fd2 730 {
WiredHome 19:3f82c1161fd2 731 WriteCommand(0x63, setR);
WiredHome 19:3f82c1161fd2 732 WriteCommand(0x64, setG);
WiredHome 19:3f82c1161fd2 733 WriteCommand(0x65, setB);
WiredHome 19:3f82c1161fd2 734 return noerror;
WiredHome 19:3f82c1161fd2 735 }
WiredHome 19:3f82c1161fd2 736
WiredHome 19:3f82c1161fd2 737 unsigned int RA8875::GetForeColor(void)
WiredHome 19:3f82c1161fd2 738 {
WiredHome 19:3f82c1161fd2 739 color_t color;
WiredHome 19:3f82c1161fd2 740
WiredHome 19:3f82c1161fd2 741 color = (ReadCommand(0x63) & 0x1F) << 11;
WiredHome 19:3f82c1161fd2 742 color |= (ReadCommand(0x64) & 0x3F) << 5;
WiredHome 19:3f82c1161fd2 743 color |= (ReadCommand(0x65) & 0x1F);
WiredHome 19:3f82c1161fd2 744 return color;
WiredHome 19:3f82c1161fd2 745 }
WiredHome 19:3f82c1161fd2 746
WiredHome 19:3f82c1161fd2 747 color_t RA8875::DOSColor(int i)
WiredHome 19:3f82c1161fd2 748 {
WiredHome 19:3f82c1161fd2 749 const color_t colors[16] =
WiredHome 19:3f82c1161fd2 750 {
WiredHome 19:3f82c1161fd2 751 Black, Blue, Green, Cyan,
WiredHome 19:3f82c1161fd2 752 Red, Magenta, Brown, Gray,
WiredHome 19:3f82c1161fd2 753 Charcoal, BrightBlue, BrightGreen, BrightCyan,
WiredHome 19:3f82c1161fd2 754 Orange, Pink, Yellow, White
WiredHome 19:3f82c1161fd2 755 };
WiredHome 19:3f82c1161fd2 756 if (i < 16)
WiredHome 19:3f82c1161fd2 757 return colors[i];
WiredHome 19:3f82c1161fd2 758 else
WiredHome 19:3f82c1161fd2 759 return 0;
WiredHome 19:3f82c1161fd2 760 }
WiredHome 19:3f82c1161fd2 761
WiredHome 19:3f82c1161fd2 762 const char * RA8875::DOSColorNames(int i)
WiredHome 19:3f82c1161fd2 763 {
WiredHome 19:3f82c1161fd2 764 const char * names[16] =
WiredHome 19:3f82c1161fd2 765 {
WiredHome 19:3f82c1161fd2 766 "Black", "Blue", "Green", "Cyan",
WiredHome 19:3f82c1161fd2 767 "Red", "Magenta", "Brown", "Gray",
WiredHome 19:3f82c1161fd2 768 "Charcoal", "BrightBlue", "BrightGreen", "BrightCyan",
WiredHome 19:3f82c1161fd2 769 "Orange", "Pink", "Yellow", "White"
WiredHome 19:3f82c1161fd2 770 };
WiredHome 19:3f82c1161fd2 771 if (i < 16)
WiredHome 19:3f82c1161fd2 772 return names[i];
WiredHome 19:3f82c1161fd2 773 else
WiredHome 19:3f82c1161fd2 774 return NULL;
WiredHome 19:3f82c1161fd2 775 }
WiredHome 19:3f82c1161fd2 776
WiredHome 19:3f82c1161fd2 777
WiredHome 19:3f82c1161fd2 778 ///////////////////////////////////////////////////////////////
WiredHome 19:3f82c1161fd2 779 // Private functions
WiredHome 19:3f82c1161fd2 780
WiredHome 19:3f82c1161fd2 781 unsigned char RA8875::spiwrite(unsigned char data)
WiredHome 19:3f82c1161fd2 782 {
WiredHome 19:3f82c1161fd2 783 unsigned char retval;
WiredHome 19:3f82c1161fd2 784
WiredHome 19:3f82c1161fd2 785 retval = spi.write(data);
WiredHome 19:3f82c1161fd2 786 return retval;
WiredHome 19:3f82c1161fd2 787 }
WiredHome 19:3f82c1161fd2 788
WiredHome 19:3f82c1161fd2 789 unsigned char RA8875::spiread(void)
WiredHome 19:3f82c1161fd2 790 {
WiredHome 19:3f82c1161fd2 791 unsigned char retval;
WiredHome 19:3f82c1161fd2 792 unsigned char data = 0;
WiredHome 19:3f82c1161fd2 793
WiredHome 19:3f82c1161fd2 794 retval = spi.write(data);
WiredHome 19:3f82c1161fd2 795 return retval;
WiredHome 19:3f82c1161fd2 796 }
WiredHome 19:3f82c1161fd2 797
WiredHome 19:3f82c1161fd2 798 RetCode_t RA8875::select(bool chipsel)
WiredHome 19:3f82c1161fd2 799 {
WiredHome 19:3f82c1161fd2 800 cs = (chipsel == true) ? 0 : 1;
WiredHome 19:3f82c1161fd2 801 return noerror;
WiredHome 19:3f82c1161fd2 802 }
WiredHome 19:3f82c1161fd2 803
WiredHome 19:3f82c1161fd2 804 RetCode_t RA8875::init(void)
WiredHome 19:3f82c1161fd2 805 {
WiredHome 19:3f82c1161fd2 806 Backlight_u8(0);
WiredHome 19:3f82c1161fd2 807 WriteCommand(0x88, 0x0a); // PLLC1 - Phase Lock Loop registers
WiredHome 19:3f82c1161fd2 808 wait_ms(1);
WiredHome 19:3f82c1161fd2 809 WriteCommand(0x89, 0x02);
WiredHome 19:3f82c1161fd2 810 wait_ms(1);
WiredHome 19:3f82c1161fd2 811
WiredHome 19:3f82c1161fd2 812 //?
WiredHome 19:3f82c1161fd2 813 WriteCommand(0x10, 0x0C); //SYSR bit[4:3]=00 256 color bit[2:1]= 00 8bit MPU interface, 1x 64k color 1x 16bit
WiredHome 19:3f82c1161fd2 814
WiredHome 19:3f82c1161fd2 815 //?
WiredHome 19:3f82c1161fd2 816 WriteCommand(0x04, 0x82); //PCLK
WiredHome 19:3f82c1161fd2 817 wait_ms(1);
WiredHome 19:3f82c1161fd2 818
WiredHome 19:3f82c1161fd2 819 // Horizontal Settings
WiredHome 19:3f82c1161fd2 820 WriteCommand(0x14, RA8875_DISPLAY_WIDTH/8 - 1); //HDWR//Horizontal Display Width Setting Bit[6:0]
WiredHome 19:3f82c1161fd2 821 WriteCommand(0x15, 0x02); //HNDFCR//Horizontal Non-Display Period fine tune Bit[3:0]
WiredHome 19:3f82c1161fd2 822 WriteCommand(0x16, 0x03); //HNDR//Horizontal Non-Display Period Bit[4:0]
WiredHome 19:3f82c1161fd2 823 WriteCommand(0x17, 0x01); //HSTR//HSYNC Start Position[4:0]
WiredHome 19:3f82c1161fd2 824 WriteCommand(0x18, 0x03); //HPWR//HSYNC Polarity ,The period width of HSYNC.
WiredHome 19:3f82c1161fd2 825
WiredHome 19:3f82c1161fd2 826 // Vertical Settings
WiredHome 19:3f82c1161fd2 827 WriteCommand(0x19, (RA8875_DISPLAY_HEIGHT-1)&0xFF); //VDHR0 //Vertical Display Height Bit [7:0]
WiredHome 19:3f82c1161fd2 828 WriteCommand(0x1a, (RA8875_DISPLAY_HEIGHT-1)>>8); //VDHR1 //Vertical Display Height Bit [8]
WiredHome 19:3f82c1161fd2 829 WriteCommand(0x1b, 0x0F); //VNDR0 //Vertical Non-Display Period Bit [7:0]
WiredHome 19:3f82c1161fd2 830 WriteCommand(0x1c, 0x00); //VNDR1 //Vertical Non-Display Period Bit [8]
WiredHome 19:3f82c1161fd2 831 WriteCommand(0x1d, 0x0e); //VSTR0 //VSYNC Start Position[7:0]
WiredHome 19:3f82c1161fd2 832 WriteCommand(0x1e, 0x06); //VSTR1 //VSYNC Start Position[8]
WiredHome 19:3f82c1161fd2 833 WriteCommand(0x1f, 0x01); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]
WiredHome 19:3f82c1161fd2 834
WiredHome 19:3f82c1161fd2 835 // Clear ram image
WiredHome 19:3f82c1161fd2 836 SetWindow(0,0, width(), height()); // Initialize to full screen
WiredHome 19:3f82c1161fd2 837 foreground(Black);
WiredHome 19:3f82c1161fd2 838 background(Black);
WiredHome 19:3f82c1161fd2 839 cls();
WiredHome 19:3f82c1161fd2 840 return noerror;
WiredHome 19:3f82c1161fd2 841 }
WiredHome 19:3f82c1161fd2 842