Wrong colors in LVGL on Apalis iMX8QM

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:

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

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