NuMaker emWin HMI

Committer:
csyang2
Date:
Mon Mar 04 15:47:41 2024 +0800
Revision:
10:c8165817d92a
Support NuMaker-IoT-M467

Who changed what in which revision?

UserRevisionLine numberNew contents of line
csyang2 10:c8165817d92a 1 /**************************************************************************//**
csyang2 10:c8165817d92a 2 * @file ILI9341.c
csyang2 10:c8165817d92a 3 * @version V1.00
csyang2 10:c8165817d92a 4 * @brief Display controller configuration.
csyang2 10:c8165817d92a 5 *
csyang2 10:c8165817d92a 6 * SPDX-License-Identifier: Apache-2.0
csyang2 10:c8165817d92a 7 * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
csyang2 10:c8165817d92a 8 *****************************************************************************/
csyang2 10:c8165817d92a 9 #include <stddef.h>
csyang2 10:c8165817d92a 10 #include <stdio.h>
csyang2 10:c8165817d92a 11
csyang2 10:c8165817d92a 12 #include "GUI.h"
csyang2 10:c8165817d92a 13 #include "GUIDRV_FlexColor.h"
csyang2 10:c8165817d92a 14
csyang2 10:c8165817d92a 15 #include "NuMicro.h"
csyang2 10:c8165817d92a 16
csyang2 10:c8165817d92a 17 #include "mbed.h"
csyang2 10:c8165817d92a 18
csyang2 10:c8165817d92a 19 #ifdef __DEMO_320x240__
csyang2 10:c8165817d92a 20 #include "TouchPanel.h"
csyang2 10:c8165817d92a 21
csyang2 10:c8165817d92a 22 #include "lcm.h"
csyang2 10:c8165817d92a 23
csyang2 10:c8165817d92a 24 SPI spi(PA_8, PA_9, PA_10); // mosi, miso, sclk
csyang2 10:c8165817d92a 25 DigitalOut GPIO_SPI_SS(PA_11);
csyang2 10:c8165817d92a 26
csyang2 10:c8165817d92a 27 DigitalOut GPIO_LCM_DC(PB_2);
csyang2 10:c8165817d92a 28 DigitalOut ILI9341_LED(PB_5);
csyang2 10:c8165817d92a 29
csyang2 10:c8165817d92a 30 #define SPI_PANEL_PORT SPI2
csyang2 10:c8165817d92a 31 #define SPI_PANEL_FREQ 40000000
csyang2 10:c8165817d92a 32
csyang2 10:c8165817d92a 33 /*********************************************************************
csyang2 10:c8165817d92a 34 *
csyang2 10:c8165817d92a 35 * _Read1
csyang2 10:c8165817d92a 36 */
csyang2 10:c8165817d92a 37 U8 _Read1(void)
csyang2 10:c8165817d92a 38 {
csyang2 10:c8165817d92a 39 /* FIXME if panel supports read back feature */
csyang2 10:c8165817d92a 40 return 0;
csyang2 10:c8165817d92a 41 }
csyang2 10:c8165817d92a 42
csyang2 10:c8165817d92a 43 /*********************************************************************
csyang2 10:c8165817d92a 44 *
csyang2 10:c8165817d92a 45 * _ReadM1
csyang2 10:c8165817d92a 46 */
csyang2 10:c8165817d92a 47 void _ReadM1(U8 * pData, int NumItems)
csyang2 10:c8165817d92a 48 {
csyang2 10:c8165817d92a 49 /* FIXME if panel supports read back feature */
csyang2 10:c8165817d92a 50 }
csyang2 10:c8165817d92a 51
csyang2 10:c8165817d92a 52 /*********************************************************************
csyang2 10:c8165817d92a 53 *
csyang2 10:c8165817d92a 54 * _Write0
csyang2 10:c8165817d92a 55 */
csyang2 10:c8165817d92a 56 void _Write0(U8 Cmd)
csyang2 10:c8165817d92a 57 {
csyang2 10:c8165817d92a 58 GPIO_LCM_DC = 0;
csyang2 10:c8165817d92a 59 GPIO_SPI_SS = 0;
csyang2 10:c8165817d92a 60
csyang2 10:c8165817d92a 61 spi.write(Cmd);
csyang2 10:c8165817d92a 62
csyang2 10:c8165817d92a 63 GPIO_SPI_SS = 1;
csyang2 10:c8165817d92a 64 }
csyang2 10:c8165817d92a 65
csyang2 10:c8165817d92a 66 /*********************************************************************
csyang2 10:c8165817d92a 67 *
csyang2 10:c8165817d92a 68 * _Write1
csyang2 10:c8165817d92a 69 */
csyang2 10:c8165817d92a 70 void _Write1(U8 Data)
csyang2 10:c8165817d92a 71 {
csyang2 10:c8165817d92a 72 GPIO_LCM_DC = 1;
csyang2 10:c8165817d92a 73 GPIO_SPI_SS = 0;
csyang2 10:c8165817d92a 74
csyang2 10:c8165817d92a 75 spi.write(Data);
csyang2 10:c8165817d92a 76
csyang2 10:c8165817d92a 77 GPIO_SPI_SS = 1;
csyang2 10:c8165817d92a 78 }
csyang2 10:c8165817d92a 79
csyang2 10:c8165817d92a 80 /*********************************************************************
csyang2 10:c8165817d92a 81 *
csyang2 10:c8165817d92a 82 * _WriteM1
csyang2 10:c8165817d92a 83 */
csyang2 10:c8165817d92a 84 void _WriteM1(U8 * pData, int NumItems)
csyang2 10:c8165817d92a 85 {
csyang2 10:c8165817d92a 86 GPIO_LCM_DC = 1;
csyang2 10:c8165817d92a 87 GPIO_SPI_SS = 0;
csyang2 10:c8165817d92a 88
csyang2 10:c8165817d92a 89 while(NumItems--)
csyang2 10:c8165817d92a 90 {
csyang2 10:c8165817d92a 91 //spi.write(*pData++);
csyang2 10:c8165817d92a 92 #if 1
csyang2 10:c8165817d92a 93 SPI_WRITE_TX(SPI_PANEL_PORT, *pData++);
csyang2 10:c8165817d92a 94 while(SPI_IS_BUSY(SPI_PANEL_PORT));
csyang2 10:c8165817d92a 95 #endif
csyang2 10:c8165817d92a 96 }
csyang2 10:c8165817d92a 97
csyang2 10:c8165817d92a 98 GPIO_SPI_SS = 1;
csyang2 10:c8165817d92a 99 }
csyang2 10:c8165817d92a 100
csyang2 10:c8165817d92a 101 static void _Open_SPI(void)
csyang2 10:c8165817d92a 102 {
csyang2 10:c8165817d92a 103 spi.format(8, 0);
csyang2 10:c8165817d92a 104 spi.frequency(SPI_PANEL_FREQ);
csyang2 10:c8165817d92a 105 }
csyang2 10:c8165817d92a 106
csyang2 10:c8165817d92a 107 /*********************************************************************
csyang2 10:c8165817d92a 108 *
csyang2 10:c8165817d92a 109 * _InitController
csyang2 10:c8165817d92a 110 *
csyang2 10:c8165817d92a 111 * Purpose:
csyang2 10:c8165817d92a 112 * Initializes the display controller
csyang2 10:c8165817d92a 113 */
csyang2 10:c8165817d92a 114 void _InitController(void)
csyang2 10:c8165817d92a 115 {
csyang2 10:c8165817d92a 116 static uint8_t s_InitOnce = 0;
csyang2 10:c8165817d92a 117
csyang2 10:c8165817d92a 118 if(s_InitOnce == 0)
csyang2 10:c8165817d92a 119 s_InitOnce = 1;
csyang2 10:c8165817d92a 120 else
csyang2 10:c8165817d92a 121 return;
csyang2 10:c8165817d92a 122
csyang2 10:c8165817d92a 123 _Open_SPI();
csyang2 10:c8165817d92a 124
csyang2 10:c8165817d92a 125 //Because the Reset signal of Arduino's SPI LCD is pulled together with the Reset signal of M467HJ, the Reset signal cannot be controlled.
csyang2 10:c8165817d92a 126 // Reset signal = GPIO_LCM_RST
csyang2 10:c8165817d92a 127
csyang2 10:c8165817d92a 128 GPIO_LCM_DC = 0;
csyang2 10:c8165817d92a 129 // GPIO_LCM_RST = 0;
csyang2 10:c8165817d92a 130 ILI9341_LED = 0;
csyang2 10:c8165817d92a 131
csyang2 10:c8165817d92a 132 GPIO_LCM_DC = 1;
csyang2 10:c8165817d92a 133 // GPIO_LCM_RST = 0;
csyang2 10:c8165817d92a 134 // CLK_SysTickDelay(20000);
csyang2 10:c8165817d92a 135 // GPIO_LCM_RST = 1;
csyang2 10:c8165817d92a 136 // CLK_SysTickDelay(40000);
csyang2 10:c8165817d92a 137 //************* Start Initial Sequence **********//
csyang2 10:c8165817d92a 138
csyang2 10:c8165817d92a 139 _Write0(0xCF);
csyang2 10:c8165817d92a 140 _Write1(0x00);
csyang2 10:c8165817d92a 141 _Write1(0xD9);
csyang2 10:c8165817d92a 142 _Write1(0X30);
csyang2 10:c8165817d92a 143
csyang2 10:c8165817d92a 144 _Write0(0xED);
csyang2 10:c8165817d92a 145 _Write1(0x64);
csyang2 10:c8165817d92a 146 _Write1(0x03);
csyang2 10:c8165817d92a 147 _Write1(0X12);
csyang2 10:c8165817d92a 148 _Write1(0X81);
csyang2 10:c8165817d92a 149
csyang2 10:c8165817d92a 150 _Write0(0xE8);
csyang2 10:c8165817d92a 151 _Write1(0x85);
csyang2 10:c8165817d92a 152 _Write1(0x10);
csyang2 10:c8165817d92a 153 _Write1(0x78);
csyang2 10:c8165817d92a 154
csyang2 10:c8165817d92a 155 _Write0(0xCB);
csyang2 10:c8165817d92a 156 _Write1(0x39);
csyang2 10:c8165817d92a 157 _Write1(0x2C);
csyang2 10:c8165817d92a 158 _Write1(0x00);
csyang2 10:c8165817d92a 159 _Write1(0x34);
csyang2 10:c8165817d92a 160 _Write1(0x02);
csyang2 10:c8165817d92a 161
csyang2 10:c8165817d92a 162 _Write0(0xF7);
csyang2 10:c8165817d92a 163 _Write1(0x20);
csyang2 10:c8165817d92a 164
csyang2 10:c8165817d92a 165 _Write0(0xEA);
csyang2 10:c8165817d92a 166 _Write1(0x00);
csyang2 10:c8165817d92a 167 _Write1(0x00);
csyang2 10:c8165817d92a 168
csyang2 10:c8165817d92a 169 _Write0(0xC0); //Power control
csyang2 10:c8165817d92a 170 _Write1(0x21); //VRH[5:0]
csyang2 10:c8165817d92a 171
csyang2 10:c8165817d92a 172 _Write0(0xC1); //Power control
csyang2 10:c8165817d92a 173 _Write1(0x12); //SAP[2:0];BT[3:0]
csyang2 10:c8165817d92a 174
csyang2 10:c8165817d92a 175 _Write0(0xC5); //VCM control
csyang2 10:c8165817d92a 176 _Write1(0x32);
csyang2 10:c8165817d92a 177 _Write1(0x3C);
csyang2 10:c8165817d92a 178
csyang2 10:c8165817d92a 179 _Write0(0xC7); //VCM control2
csyang2 10:c8165817d92a 180 _Write1(0XC1);
csyang2 10:c8165817d92a 181
csyang2 10:c8165817d92a 182 _Write0(0x36); // Memory Access Control
csyang2 10:c8165817d92a 183 _Write1(0xe8);
csyang2 10:c8165817d92a 184
csyang2 10:c8165817d92a 185 _Write0(0x3A);
csyang2 10:c8165817d92a 186 _Write1(0x55);
csyang2 10:c8165817d92a 187
csyang2 10:c8165817d92a 188 _Write0(0xB1);
csyang2 10:c8165817d92a 189 _Write1(0x00);
csyang2 10:c8165817d92a 190 _Write1(0x18);
csyang2 10:c8165817d92a 191
csyang2 10:c8165817d92a 192 _Write0(0xB6); // Display Function Control
csyang2 10:c8165817d92a 193 _Write1(0x0A);
csyang2 10:c8165817d92a 194 _Write1(0xA2);
csyang2 10:c8165817d92a 195
csyang2 10:c8165817d92a 196 _Write0(0xF2); // 3Gamma Function Disable
csyang2 10:c8165817d92a 197 _Write1(0x00);
csyang2 10:c8165817d92a 198
csyang2 10:c8165817d92a 199 _Write0(0x26); //Gamma curve selected
csyang2 10:c8165817d92a 200 _Write1(0x01);
csyang2 10:c8165817d92a 201
csyang2 10:c8165817d92a 202 _Write0(0xE0); //Set Gamma
csyang2 10:c8165817d92a 203 _Write1(0x0F);
csyang2 10:c8165817d92a 204 _Write1(0x20);
csyang2 10:c8165817d92a 205 _Write1(0x1E);
csyang2 10:c8165817d92a 206 _Write1(0x09);
csyang2 10:c8165817d92a 207 _Write1(0x12);
csyang2 10:c8165817d92a 208 _Write1(0x0B);
csyang2 10:c8165817d92a 209 _Write1(0x50);
csyang2 10:c8165817d92a 210 _Write1(0XBA);
csyang2 10:c8165817d92a 211 _Write1(0x44);
csyang2 10:c8165817d92a 212 _Write1(0x09);
csyang2 10:c8165817d92a 213 _Write1(0x14);
csyang2 10:c8165817d92a 214 _Write1(0x05);
csyang2 10:c8165817d92a 215 _Write1(0x23);
csyang2 10:c8165817d92a 216 _Write1(0x21);
csyang2 10:c8165817d92a 217 _Write1(0x00);
csyang2 10:c8165817d92a 218
csyang2 10:c8165817d92a 219 _Write0(0XE1); //Set Gamma
csyang2 10:c8165817d92a 220 _Write1(0x00);
csyang2 10:c8165817d92a 221 _Write1(0x19);
csyang2 10:c8165817d92a 222 _Write1(0x19);
csyang2 10:c8165817d92a 223 _Write1(0x00);
csyang2 10:c8165817d92a 224 _Write1(0x12);
csyang2 10:c8165817d92a 225 _Write1(0x07);
csyang2 10:c8165817d92a 226 _Write1(0x2D);
csyang2 10:c8165817d92a 227 _Write1(0x28);
csyang2 10:c8165817d92a 228 _Write1(0x3F);
csyang2 10:c8165817d92a 229 _Write1(0x02);
csyang2 10:c8165817d92a 230 _Write1(0x0A);
csyang2 10:c8165817d92a 231 _Write1(0x08);
csyang2 10:c8165817d92a 232 _Write1(0x25);
csyang2 10:c8165817d92a 233 _Write1(0x2D);
csyang2 10:c8165817d92a 234 _Write1(0x0F);
csyang2 10:c8165817d92a 235
csyang2 10:c8165817d92a 236 _Write0(0x11); //Exit Sleep
csyang2 10:c8165817d92a 237 GUI_X_Delay(120);
csyang2 10:c8165817d92a 238 _Write0(0x29); //Display on
csyang2 10:c8165817d92a 239
csyang2 10:c8165817d92a 240 ILI9341_LED = 1;
csyang2 10:c8165817d92a 241 }
csyang2 10:c8165817d92a 242 #endif