| /* |
| * 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); |
| } |