|
@@ -73,14 +73,18 @@
|
73
|
73
|
extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count);
|
74
|
74
|
#endif
|
75
|
75
|
|
|
76
|
+#ifndef FSMC_UPSCALE
|
|
77
|
+ #define FSMC_UPSCALE 2
|
|
78
|
+#endif
|
|
79
|
+
|
76
|
80
|
#define WIDTH LCD_PIXEL_WIDTH
|
77
|
81
|
#define HEIGHT LCD_PIXEL_HEIGHT
|
78
|
82
|
#define PAGE_HEIGHT 8
|
79
|
83
|
|
80
|
84
|
#define X_LO LCD_PIXEL_OFFSET_X
|
81
|
85
|
#define Y_LO LCD_PIXEL_OFFSET_Y
|
82
|
|
-#define X_HI (X_LO + 2 * WIDTH - 1)
|
83
|
|
-#define Y_HI (Y_LO + 2 * HEIGHT - 1)
|
|
86
|
+#define X_HI (X_LO + (FSMC_UPSCALE) * WIDTH - 1)
|
|
87
|
+#define Y_HI (Y_LO + (FSMC_UPSCALE) * HEIGHT - 1)
|
84
|
88
|
|
85
|
89
|
// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html
|
86
|
90
|
|
|
@@ -526,8 +530,27 @@ static const uint16_t ili9341_init[] = {
|
526
|
530
|
B01111111,B11111111,B11111111,B11111110,
|
527
|
531
|
};
|
528
|
532
|
|
|
533
|
+ #define BUTTON_SIZE_X 32
|
|
534
|
+ #define BUTTON_SIZE_Y 20
|
|
535
|
+
|
|
536
|
+ // 14, 90, 166, 242, 185 are the original values upscaled 2x.
|
|
537
|
+ #define BUTTOND_X_LO (14 / 2) * (FSMC_UPSCALE)
|
|
538
|
+ #define BUTTOND_X_HI (BUTTOND_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1)
|
|
539
|
+
|
|
540
|
+ #define BUTTONA_X_LO (90 / 2) * (FSMC_UPSCALE)
|
|
541
|
+ #define BUTTONA_X_HI (BUTTONA_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1)
|
|
542
|
+
|
|
543
|
+ #define BUTTONB_X_LO (166 / 2) * (FSMC_UPSCALE)
|
|
544
|
+ #define BUTTONB_X_HI (BUTTONB_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1)
|
|
545
|
+
|
|
546
|
+ #define BUTTONC_X_LO (242 / 2) * (FSMC_UPSCALE)
|
|
547
|
+ #define BUTTONC_X_HI (BUTTONC_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1)
|
|
548
|
+
|
|
549
|
+ #define BUTTON_Y_LO (170 / 2) * (FSMC_UPSCALE)
|
|
550
|
+ #define BUTTON_Y_HI (BUTTON_Y_LO + (FSMC_UPSCALE) * BUTTON_SIZE_Y - 1)
|
|
551
|
+
|
529
|
552
|
void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) {
|
530
|
|
- uint16_t buffer[128];
|
|
553
|
+ uint16_t buffer[BUTTON_SIZE_X * sq(FSMC_UPSCALE)];
|
531
|
554
|
|
532
|
555
|
for (uint16_t i = 0; i < height; i++) {
|
533
|
556
|
uint16_t k = 0;
|
|
@@ -537,20 +560,17 @@ static const uint16_t ili9341_init[] = {
|
537
|
560
|
v = color;
|
538
|
561
|
else
|
539
|
562
|
v = TFT_MARLINBG_COLOR;
|
540
|
|
- buffer[k++] = v; buffer[k++] = v;
|
|
563
|
+ LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = v;
|
541
|
564
|
}
|
542
|
565
|
#ifdef LCD_USE_DMA_FSMC
|
543
|
|
- if (k <= 80) { // generally is... for our buttons
|
544
|
|
- memcpy(&buffer[k], &buffer[0], k * sizeof(uint16_t));
|
545
|
|
- LCD_IO_WriteSequence(buffer, k * sizeof(uint16_t));
|
546
|
|
- }
|
547
|
|
- else {
|
548
|
|
- LCD_IO_WriteSequence(buffer, k);
|
549
|
|
- LCD_IO_WriteSequence(buffer, k);
|
550
|
|
- }
|
|
566
|
+ LOOP_S_L_N(n, 1, FSMC_UPSCALE)
|
|
567
|
+ for (uint16_t l = 0; l < length * (FSMC_UPSCALE); l++)
|
|
568
|
+ buffer[l + (length * (FSMC_UPSCALE) * n)] = buffer[l];
|
|
569
|
+
|
|
570
|
+ LCD_IO_WriteSequence(buffer, COUNT(buffer));
|
551
|
571
|
#else
|
552
|
|
- u8g_WriteSequence(u8g, dev, k << 1, (uint8_t *)buffer);
|
553
|
|
- u8g_WriteSequence(u8g, dev, k << 1, (uint8_t *)buffer);
|
|
572
|
+ u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer);
|
|
573
|
+ u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer);
|
554
|
574
|
#endif
|
555
|
575
|
}
|
556
|
576
|
}
|
|
@@ -569,7 +589,7 @@ static uint8_t page;
|
569
|
589
|
uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
|
570
|
590
|
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
|
571
|
591
|
#ifdef LCD_USE_DMA_FSMC
|
572
|
|
- static uint16_t bufferA[512], bufferB[512];
|
|
592
|
+ static uint16_t bufferA[WIDTH * sq(FSMC_UPSCALE)], bufferB[WIDTH * sq(FSMC_UPSCALE)];
|
573
|
593
|
uint16_t* buffer = &bufferA[0];
|
574
|
594
|
bool allow_async = true;
|
575
|
595
|
#else
|
|
@@ -597,6 +617,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
|
597
|
617
|
setWindow = setWindow_ili9328;
|
598
|
618
|
break;
|
599
|
619
|
case 0x9341: // ILI9341
|
|
620
|
+ case 0x8066: // ILI9341 Anycubic / TronXY TFTs
|
600
|
621
|
#ifdef LCD_USE_DMA_FSMC
|
601
|
622
|
writeEscSequence(ili9341_init);
|
602
|
623
|
#else
|
|
@@ -645,16 +666,16 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
|
645
|
666
|
u8g_WriteSequence(u8g, dev, 150, (uint8_t *)buffer);
|
646
|
667
|
#endif
|
647
|
668
|
|
648
|
|
- setWindow(u8g, dev, 14, 185, 77, 224);
|
|
669
|
+ setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI);
|
649
|
670
|
drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR);
|
650
|
671
|
|
651
|
|
- setWindow(u8g, dev, 90, 185, 153, 224);
|
|
672
|
+ setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI);
|
652
|
673
|
drawImage(buttonA, u8g, dev, 32, 20, TFT_BTARROWS_COLOR);
|
653
|
674
|
|
654
|
|
- setWindow(u8g, dev, 166, 185, 229, 224);
|
|
675
|
+ setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI);
|
655
|
676
|
drawImage(buttonB, u8g, dev, 32, 20, TFT_BTARROWS_COLOR);
|
656
|
677
|
|
657
|
|
- setWindow(u8g, dev, 242, 185, 305, 224);
|
|
678
|
+ setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI);
|
658
|
679
|
drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR);
|
659
|
680
|
#endif // TOUCH_BUTTONS
|
660
|
681
|
|
|
@@ -678,19 +699,22 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
|
678
|
699
|
for (uint16_t i = 0; i < (uint32_t)pb->width; i++) {
|
679
|
700
|
const uint8_t b = *(((uint8_t *)pb->buf) + i);
|
680
|
701
|
const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR;
|
681
|
|
- buffer[k++] = c; buffer[k++] = c;
|
|
702
|
+ LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = c;
|
682
|
703
|
}
|
683
|
704
|
#ifdef LCD_USE_DMA_FSMC
|
684
|
|
- memcpy(&buffer[256], &buffer[0], 512);
|
|
705
|
+ LOOP_S_L_N(n, 1, FSMC_UPSCALE)
|
|
706
|
+ for (uint16_t l = 0; l < WIDTH * (FSMC_UPSCALE); l++)
|
|
707
|
+ buffer[l + WIDTH * (FSMC_UPSCALE) * n] = buffer[l];
|
|
708
|
+
|
685
|
709
|
if (allow_async) {
|
686
|
710
|
if (y > 0 || page > 1) LCD_IO_WaitSequence_Async();
|
687
|
711
|
if (y == 7 && page == 8)
|
688
|
|
- LCD_IO_WriteSequence(buffer, 512); // last line of last page
|
|
712
|
+ LCD_IO_WriteSequence(buffer, COUNT(bufferA)); // last line of last page
|
689
|
713
|
else
|
690
|
|
- LCD_IO_WriteSequence_Async(buffer, 512);
|
|
714
|
+ LCD_IO_WriteSequence_Async(buffer, COUNT(bufferA));
|
691
|
715
|
}
|
692
|
716
|
else
|
693
|
|
- LCD_IO_WriteSequence(buffer, 512);
|
|
717
|
+ LCD_IO_WriteSequence(buffer, COUNT(bufferA));
|
694
|
718
|
#else
|
695
|
719
|
uint8_t* bufptr = (uint8_t*) buffer;
|
696
|
720
|
for (uint8_t i = 2; i--;) {
|