175 lines
3.9 KiB
C
175 lines
3.9 KiB
C
/*
|
|
* Copyright (c) 2018 - 2019 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <drivers/display.h>
|
|
#include "display_ili9340.h"
|
|
|
|
/*
|
|
* Derived from Seeed 2.8 inch TFT Touch Shield v2.0 sample code.
|
|
*
|
|
* https://github.com/Seeed-Studio/TFT_Touch_Shield_V2
|
|
*/
|
|
|
|
void ili9340_lcd_init(struct ili9340_data *p_ili9340)
|
|
{
|
|
uint8_t cmd;
|
|
uint8_t data[15];
|
|
|
|
/* Software reset */
|
|
cmd = ILI9340_CMD_SOFTWARE_RESET;
|
|
ili9340_transmit(p_ili9340, cmd, NULL, 0);
|
|
|
|
k_sleep(K_MSEC(5));
|
|
|
|
cmd = ILI9341_CMD_POWER_CTRL_B;
|
|
data[0] = 0x00U;
|
|
data[1] = 0x8BU;
|
|
data[2] = 0x30U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 3);
|
|
|
|
cmd = ILI9341_CMD_POWER_ON_SEQ_CTRL;
|
|
data[0] = 0x67U;
|
|
data[1] = 0x03U;
|
|
data[2] = 0x12U;
|
|
data[3] = 0x81U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 4);
|
|
|
|
cmd = ILI9341_CMD_DRVR_TIMING_CTRL_A_I;
|
|
data[0] = 0x85U;
|
|
data[1] = 0x10U;
|
|
data[2] = 0x7AU;
|
|
ili9340_transmit(p_ili9340, cmd, data, 3);
|
|
|
|
cmd = ILI9341_CMD_POWER_CTRL_A;
|
|
data[0] = 0x39U;
|
|
data[1] = 0x2CU;
|
|
data[2] = 0x00U;
|
|
data[3] = 0x34U;
|
|
data[4] = 0x02U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 5);
|
|
|
|
cmd = ILI9341_CMD_PUMP_RATIO_CTRL;
|
|
data[0] = 0x20U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 1);
|
|
|
|
cmd = ILI9341_CMD_DRVR_TIMING_CTRL_B;
|
|
data[0] = 0x00U;
|
|
data[1] = 0x00U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 2);
|
|
|
|
/* Power control */
|
|
/* VRH[5:0] */
|
|
cmd = ILI9340_CMD_POWER_CTRL_1;
|
|
data[0] = 0x1BU;
|
|
ili9340_transmit(p_ili9340, cmd, data, 1);
|
|
|
|
/* Power control */
|
|
/* SAP[2:0];BT[3:0] */
|
|
cmd = ILI9340_CMD_POWER_CTRL_2;
|
|
data[0] = 0x10U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 1);
|
|
|
|
/* VCM control */
|
|
cmd = ILI9340_CMD_VCOM_CTRL_1;
|
|
data[0] = 0x3FU;
|
|
data[1] = 0x3CU;
|
|
ili9340_transmit(p_ili9340, cmd, data, 2);
|
|
|
|
/* VCM control2 */
|
|
cmd = ILI9340_CMD_VCOM_CTRL_2;
|
|
data[0] = 0xB7U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 1);
|
|
|
|
/* Memory Access Control */
|
|
cmd = ILI9340_CMD_MEM_ACCESS_CTRL;
|
|
data[0] = ILI9340_DATA_MEM_ACCESS_CTRL_MY |
|
|
ILI9340_DATA_MEM_ACCESS_CTRL_MV |
|
|
ILI9340_DATA_MEM_ACCESS_CTRL_ML |
|
|
ILI9340_DATA_MEM_ACCESS_CTRL_BGR;
|
|
ili9340_transmit(p_ili9340, cmd, data, 1);
|
|
|
|
/* Pixel Format Set */
|
|
cmd = ILI9340_CMD_PIXEL_FORMAT_SET;
|
|
#ifdef CONFIG_ILI9340_RGB565
|
|
data[0] = ILI9340_DATA_PIXEL_FORMAT_MCU_16_BIT |
|
|
ILI9340_DATA_PIXEL_FORMAT_RGB_16_BIT;
|
|
#else
|
|
data[0] = ILI9340_DATA_PIXEL_FORMAT_MCU_18_BIT |
|
|
ILI9340_DATA_PIXEL_FORMAT_RGB_18_BIT;
|
|
#endif
|
|
ili9340_transmit(p_ili9340, cmd, data, 1);
|
|
|
|
/* Frame Rate */
|
|
cmd = ILI9340_CMD_FRAME_CTRL_NORMAL_MODE;
|
|
data[0] = 0x00U;
|
|
data[1] = 0x1BU;
|
|
ili9340_transmit(p_ili9340, cmd, data, 2);
|
|
|
|
/* Display Function Control */
|
|
cmd = ILI9340_CMD_DISPLAY_FUNCTION_CTRL;
|
|
data[0] = 0x0AU;
|
|
data[1] = 0xA2U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 2);
|
|
|
|
/* 3Gamma Function Disable */
|
|
cmd = ILI9341_CMD_ENABLE_3G;
|
|
data[0] = 0x00U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 1);
|
|
|
|
/* Gamma curve selected */
|
|
cmd = ILI9340_CMD_GAMMA_SET;
|
|
data[0] = 0x01U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 1);
|
|
|
|
/* Positive Gamma Correction */
|
|
cmd = ILI9340_CMD_POSITIVE_GAMMA_CORRECTION;
|
|
data[0] = 0x0FU;
|
|
data[1] = 0x2AU;
|
|
data[2] = 0x28U;
|
|
data[3] = 0x08U;
|
|
data[4] = 0x0EU;
|
|
data[5] = 0x08U;
|
|
data[6] = 0x54U;
|
|
data[7] = 0xA9U;
|
|
data[8] = 0x43U;
|
|
data[9] = 0x0AU;
|
|
data[10] = 0x0FU;
|
|
data[11] = 0x00U;
|
|
data[12] = 0x00U;
|
|
data[13] = 0x00U;
|
|
data[14] = 0x00U;
|
|
ili9340_transmit(p_ili9340, cmd, data, 15);
|
|
|
|
/* Negative Gamma Correction */
|
|
cmd = ILI9340_CMD_NEGATIVE_GAMMA_CORRECTION;
|
|
data[0] = 0x00U;
|
|
data[1] = 0x15U;
|
|
data[2] = 0x17U;
|
|
data[3] = 0x07U;
|
|
data[4] = 0x11U;
|
|
data[5] = 0x06U;
|
|
data[6] = 0x2BU;
|
|
data[7] = 0x56U;
|
|
data[8] = 0x3CU;
|
|
data[9] = 0x05U;
|
|
data[10] = 0x10U;
|
|
data[11] = 0x0FU;
|
|
data[12] = 0x3FU;
|
|
data[13] = 0x3FU;
|
|
data[14] = 0x0FU;
|
|
ili9340_transmit(p_ili9340, cmd, data, 15);
|
|
|
|
/* Sleep Out */
|
|
cmd = ILI9340_CMD_EXIT_SLEEP;
|
|
ili9340_transmit(p_ili9340, cmd, NULL, 0);
|
|
|
|
k_sleep(K_MSEC(120));
|
|
|
|
/* Display Off */
|
|
cmd = ILI9340_CMD_DISPLAY_OFF;
|
|
ili9340_transmit(p_ili9340, cmd, NULL, 0);
|
|
}
|