Description
I developed with SquareLine Studio, TFT-eSPI and LVGL an application for tow GC9A01 displays ( 240 x240 and LV_COLOR_DEPTH 16) using Arduino (Cortex M4 - Adafruit feather CAN Express). The application works as expected in Arduino as well as in the PC simulator. When porting this application to a Cortex M4 of a Toradex / Aplais I get wrong colors.
What MCU/Processor/Board and compiler are you using?
Toradex Apalis iMX8QM - Cortex M4_1 (the second M4 of this NXP SoM).
What LVGL version are you using?
8.3
What do you want to achieve?
Correct the colors
What have you tried so far?
tested if White, Black Red, Green and Blue are displayed correctly (see images below)
considered if the toolchain I am using conflicts with LVGL. I used ARM GCC 13.2.rel1 and 12.2.rel.1 with newlib-nano and newlib (to see if there are some limitations in nano that impact on LVGL).
used a diferent display
checked the SPI interface and the driver for GC9A01. They work correctly as the display is initialized and the image works and the colors are displayed correctly.
Code to reproduce
N/A
The code block(s) should be formatted like:
Screenshot and/or video
- In Arduino
In Apalis LVGL
Any ideas why the colors are not correct?
Kind regards,
Florin
Hello, I think you got same issues with me, maybe wrong config init file when you config driver GC9A01. Could you take my config in this post and try again:
Hi all, because my init of the gc9a01 is wrong, that’s why it has displayed the wrong color. I have fixed it.
Now I have a good display.
[photo_2023-03-15_18-01-38]
My config init gc9a01
GC9A01A_INREGEN2, 0,
0xEB, 1, 0x14,
GC9A01A_INREGEN1, 0,
GC9A01A_INREGEN2, 0,
0xEB, 1, 0x14,
0x84, 1, 0x40,
0x85, 1, 0xFF,
0x86, 1, 0xFF,
0x87, 1, 0xFF,
0x88, 1, 0x0A,
0x89, 1, 0x21,
0x8A, 1, 0x00,
0x8B, 1, 0x80,
0x8C, 1, 0x01,
0x8D, 1, 0x01,
0x8E, 1, 0xFF,
0x8F, 1, 0xFF,
0xB6, 2, 0x00, 0x00,
GC9A01A_MADCTL…
Thank
Dear DucTaun,
Thanks for your suggestion. I checked your initialization file versus mine (below) and I cannot see the differences. Providing the codes you used will help spotting any differences (e.g. GC9A01A_TEON - 0x35). Please let me know if you find any.
The code below is based on the driver used by TFT_eSPI ( TFT_eSPI/TFT_Drivers at master · Bodmer/TFT_eSPI · GitHub .
Regards,
Florin
void GC9A01_Init(gc9a01_send_byte_t _writeData, gc9a01_send_byte_t _writeCommand)
{
//PRINTF(“In GC9A01 driver - init commands and data\r\n”);
_writeCommand(0xEF); //Inter register enable 2
_writeCommand(0xEB); // ?
_writeData(0x14);
_writeCommand(0xFE); // Inter Register Enable1
_writeCommand(0xEF); // Inter Register Enable2
_writeCommand(0xEB); // ?
_writeData(0x14);
_writeCommand(0x84);
_writeData(0x40);
_writeCommand(0x85);
_writeData(0xFF);
_writeCommand(0x86);
_writeData(0xFF);
_writeCommand(0x87);
_writeData(0xFF);
_writeCommand(0x88);
_writeData(0x0A);
_writeCommand(0x89);
_writeData(0x21);
_writeCommand(0x8A);
_writeData(0x00);
_writeCommand(0x8B);
_writeData(0x80);
_writeCommand(0x8C);
_writeData(0x01);
_writeCommand(0x8D);
_writeData(0x01);
_writeCommand(0x8E);
_writeData(0xFF);
_writeCommand(0x8F);
_writeData(0xFF);
_writeCommand(0xB6); //DISFNCTR: Display Function Control
_writeData(0x00);
_writeData(0x20); // 00??
_writeCommand(0x3A); // COLMOD: Pixel Format Set
_writeData(0x05); // 16 Bits per pixel
_writeCommand(0x90);
_writeData(0x08);
_writeData(0x08);
_writeData(0x08);
_writeData(0x08);
_writeCommand(0xBD);
_writeData(0x06);
_writeCommand(0xBC);
_writeData(0x00);
_writeCommand(0xFF);
_writeData(0x60);
_writeData(0x01);
_writeData(0x04);
_writeCommand(0xC3); // Power Control 2 - Vreg1a voltage control
_writeData(0x13);
_writeCommand(0xC4); // Power Control 3 - Vreg1b voltage control
_writeData(0x13);
_writeCommand(0xC9); // Power Control 4 - Vreg2a voltage control
_writeData(0x22);
_writeCommand(0xBE);
_writeData(0x11);
_writeCommand(0xE1); // Negative Gamma Correction
_writeData(0x10);
_writeData(0x0E);
_writeCommand(0xDF);
_writeData(0x21);
_writeData(0x0c);
_writeData(0x02);
_writeCommand(0xF0); // SET_GAMMA1
_writeData(0x45);
_writeData(0x09);
_writeData(0x08);
_writeData(0x08);
_writeData(0x26);
_writeData(0x2A);
_writeCommand(0xF1); // SET_GAMMA2
_writeData(0x43);
_writeData(0x70);
_writeData(0x72);
_writeData(0x36);
_writeData(0x37);
_writeData(0x6F);
_writeCommand(0xF2); // SET_GAMMA3
_writeData(0x45);
_writeData(0x09);
_writeData(0x08);
_writeData(0x08);
_writeData(0x26);
_writeData(0x2A);
_writeCommand(0xF3); // SET_GAMMA4
_writeData(0x43);
_writeData(0x70);
_writeData(0x72);
_writeData(0x36);
_writeData(0x37);
_writeData(0x6F);
_writeCommand(0xED);
_writeData(0x1B);
_writeData(0x0B);
_writeCommand(0xAE);
_writeData(0x77);
_writeCommand(0xCD); // ?
_writeData(0x63);
_writeCommand(0x70);
_writeData(0x07);
_writeData(0x07);
_writeData(0x04);
_writeData(0x0E);
_writeData(0x0F);
_writeData(0x09);
_writeData(0x07);
_writeData(0x08);
_writeData(0x03);
_writeCommand(0xE8); // Frame rate control
_writeData(0x34);
_writeCommand(0x62);
_writeData(0x18);
_writeData(0x0D);
_writeData(0x71);
_writeData(0xED);
_writeData(0x70);
_writeData(0x70);
_writeData(0x18);
_writeData(0x0F);
_writeData(0x71);
_writeData(0xEF);
_writeData(0x70);
_writeData(0x70);
_writeCommand(0x63);
_writeData(0x18);
_writeData(0x11);
_writeData(0x71);
_writeData(0xF1);
_writeData(0x70);
_writeData(0x70);
_writeData(0x18);
_writeData(0x13);
_writeData(0x71);
_writeData(0xF3);
_writeData(0x70);
_writeData(0x70);
_writeCommand(0x64);
_writeData(0x28);
_writeData(0x29);
_writeData(0xF1);
_writeData(0x01);
_writeData(0xF1);
_writeData(0x00);
_writeData(0x07);
_writeCommand(0x66);
_writeData(0x3C);
_writeData(0x00);
_writeData(0xCD);
_writeData(0x67);
_writeData(0x45);
_writeData(0x45);
_writeData(0x10);
_writeData(0x00);
_writeData(0x00);
_writeData(0x00);
_writeCommand(0x67);
_writeData(0x00);
_writeData(0x3C);
_writeData(0x00);
_writeData(0x00);
_writeData(0x00);
_writeData(0x01);
_writeData(0x54);
_writeData(0x10);
_writeData(0x32);
_writeData(0x98);
_writeCommand(0x74);
_writeData(0x10);
_writeData(0x85);
_writeData(0x80);
_writeData(0x00);
_writeData(0x00);
_writeData(0x4E);
_writeData(0x00);
_writeCommand(0x98);
_writeData(0x3e);
_writeData(0x07);
_writeCommand(0x35); // Tearing Effect Line ON
_writeCommand(0x21); // 0x21 - Display Inversion ON - 0x20 Display Inversion OFF
_writeCommand(0x11); // 0x11 - Sleep Out Mode - 0x10 Enter Sleep Mode
SDK_DelayAtLeastUs(120 * 1000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
_writeCommand(0x29); // turn on the screen - Display ON
SDK_DelayAtLeastUs(20 * 1000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
_writeCommand(0x36); // change order of RGB bits - Memory Access Control ??
_writeData(0x08); // 0x08 TFT_MAD_BGR - 0x00 - TFT_MAD_RGB - set by the Memory Acess Control - MADCRT
//_writeCommand(0xB0); // RGB Interface Signal Control
//_writeData(0x21); //
}
Hi Could you check with this file I saw that it have many difference
#define ILI9341_GMCTRP1 0xE0 ///< Positive Gamma Correction
#define ILI9341_GMCTRN1 0xE1 ///< Negative Gamma Correction
#define ILI9341_FRAMERATE 0xE8 ///< Frame rate control
#define GC9A01A_INREGEN2 0xEF ///< Inter register enable 2
#define GC9A01A_GAMMA1 0xF0 ///< Set gamma 1
#define GC9A01A_GAMMA2 0xF1 ///< Set gamma 2
#define GC9A01A_GAMMA3 0xF2 ///< Set gamma 3
#define GC9A01A_GAMMA4 0xF3 ///< Set gamma 4
#define GC9A01A_INREGEN1 0xFE ///< Inter register enable 1
#define MADCTL_MY 0x80 ///< Bottom to top
#define MADCTL_MX 0x40 ///< Right to left
#define MADCTL_MV 0x20 ///< Reverse Mode
#define MADCTL_ML 0x10 ///< LCD refresh Bottom to top
#define MADCTL_RGB 0x00 ///< Red-Green-Blue pixel order
#define MADCTL_BGR 0x08 ///< Blue-Green-Red pixel order
#define MADCTL_MH 0x04 ///< LCD refresh right to left
#define DISPLAY_WIDTH DT_INST_PROP(0, width)
Thanks again DucTaun! Unfortunately, I discovered only one diference between the initalization codes and that is not making a difference in terms of the colors displayed.
Kind regards,
Florin